Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 20 additions & 2 deletions package-index.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,23 @@
{
"schemaVersion": 1,
"indexRevision": "initial-empty",
"packages": []
"indexRevision": "context-kit-1.0.1",
"packages": [
{
"id": "context-kit",
"name": "Context Kit",
"description": "Builds the brand knowledge that makes every Runneth answer sharper. Seeds a brain skeleton, a Context Kit board app, and the Context Kit skill. Install first, then ad-naming for naming conventions and query contract, then creative-corpus for the full creative library.",
"version": "1.0.1",
"categories": ["baseline"],
"packageManagerVersion": 1,
"source": {
"type": "github",
"owner": "Motion-Creative",
"repo": "runneth-apps",
"ref": "main",
"path": "packages/context-kit"
},
"updatePolicy": "manual",
"uninstallPolicy": "allowed"
}
]
}
27 changes: 27 additions & 0 deletions packages/context-kit/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Context Kit package

Builds the institutional knowledge that makes every Runneth answer sharper: brain scaffolds, a board app
(read-only mirror of completeness), and the "build my Context Kit" skill.

## App build gotchas (learned in staging — read before editing the app)

- **`buildeth.app.json` must be v3** with `name: "context-kit"`, `route: "/context-kit"`,
`conversationId`, `workspaceId`, `oauthEnabled: true`, `data: { "dir": "data" }`, and
`static: { "dist": "dist", "index": "index.html" }`. It ships as a template with
`__CONVERSATION_ID__` / `__WORKSPACE_ID__` tokens the skill substitutes before `app build`.
- **`astro.config.mjs` must set `base: "/context-kit"`** (and `trailingSlash: "never"`). Without a base,
Astro emits absolute `/_astro/...` asset URLs and `app build` rejects the static output.
- **Use `<style is:global>`.** Astro scopes `<style>` by default via a build-time `data-astro-cid` attribute
that JS-created elements never get, so scoped rules (including `display:none` on panels) silently do not
apply to dynamically rendered DOM. This board renders cards in JS, so styles must be global.
- **State is fetched at runtime, not imported at build.** `index.astro` fetches
`/context-kit/data/context-kit-state.json` and the Bucket B `data/*.md` files on load, so brain updates
show on refresh with no rebuild. Never go back to a static `import` of the state JSON.
- **Package sync does not run `app build`.** The skill (or an operator) builds on first run.
- **Motion calls stay in agent turns.** Task-scoped bash cannot access trusted Motion
tools, so refresh routines prompt an agent to run the skill directly.

## Manifest note

The VM installer reads `package.json`; the runneth-apps index validator reads `runneth-package.json`.
Both are shipped with identical resource lists until that contract is reconciled.
6 changes: 6 additions & 0 deletions packages/context-kit/apps/context-kit/astro.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { defineConfig } from "astro/config";

export default defineConfig({
base: "/context-kit",
trailingSlash: "never",
});
10 changes: 10 additions & 0 deletions packages/context-kit/apps/context-kit/buildeth.app.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"version": 3,
"name": "context-kit",
"route": "/context-kit",
"conversationId": "__CONVERSATION_ID__",
"workspaceId": "__WORKSPACE_ID__",
"oauthEnabled": true,
"data": { "dir": "data" },
"static": { "dist": "dist", "index": "index.html" }
}
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/brand-context.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# brand-context

_Not filled in yet. Runneth writes this to /agent/brain/context-kit/brand-context.md and mirrors it here when the Context Kit skill fills it._
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# briefing-template

_Not filled in yet. Runneth writes this to /agent/brain/context-kit/briefing-template.md and mirrors it here when the Context Kit skill fills it._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/competitors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# competitors

_Not filled in yet. Runneth mirrors this from /agent/brain/brand-audit/<slug>/ when the Context Kit skill drafts it._
244 changes: 244 additions & 0 deletions packages/context-kit/apps/context-kit/data/context-kit-state.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,244 @@
{
"version": 1,
"brandName": "",
"levels": [
{
"id": "L1",
"name": "Answers questions",
"state": "passed"
},
{
"id": "L2",
"name": "On-brand outputs",
"state": "current"
},
{
"id": "L3",
"name": "Runs with full context",
"state": "locked"
}
],
"items": [
{
"id": "brand-context",
"label": "Brand context",
"bucket": "A",
"status": "missing",
"why": "Keeps every output unmistakably on-brand.",
"preview": "",
"dataFile": "brand-context.md"
},
{
"id": "kpis-goal",
"label": "KPIs & goal",
"bucket": "A",
"status": "missing",
"why": "Every readout leads with the metric you care about.",
"preview": "",
"dataFile": "kpis-goal.md"
},
{
"id": "spend-threshold",
"label": "Spend threshold",
"bucket": "A",
"status": "missing",
"why": "Separates a proven winner from early noise.",
"preview": "",
"dataFile": "spend-threshold.md"
},
{
"id": "competitors",
"label": "Competitors",
"bucket": "B",
"status": "missing",
"why": "Angles to attack the gaps rivals leave open.",
"dataFile": "competitors.md",
"enrich": "Follow brands in Motion Inspo so Runneth can research their live ads and creative angles automatically."
},
{
"id": "products",
"label": "Products & SKUs",
"bucket": "B",
"status": "missing",
"why": "Grounds every ad in real product facts.",
"dataFile": "products.md",
"enrich": "Connect your Shopify store for live product data, pricing, and bestseller rankings."
},
{
"id": "positioning",
"label": "Positioning & personas",
"bucket": "B",
"status": "missing",
"why": "Right audience, right angle.",
"dataFile": "positioning.md"
},
{
"id": "voice",
"label": "Voice & tone",
"bucket": "B",
"status": "missing",
"why": "Copy that sounds like you wrote it.",
"dataFile": "voice.md"
},
{
"id": "voc",
"label": "Voice-of-customer",
"bucket": "B",
"status": "missing",
"why": "How your customers actually talk about the problem.",
"dataFile": "voc.md",
"enrich": "Connect your reviews platform (Yotpo, Okendo, Trustpilot) for real customer language, the richest VoC source available."
},
{
"id": "legal",
"label": "Legal & compliance",
"bucket": "C",
"status": "missing",
"why": "Clears review on the first pass.",
"dataFile": "legal-compliance.md",
"thoughtStarters": [
"Any claims you legally can't make? (clinically proven, #1, cures, guaranteed)",
"Required disclaimers or fine print on specific claims?",
"Regulated categories that apply? (health, finance, beauty, supplements, kids)",
"Words or comparisons legal has flagged before?"
]
},
{
"id": "briefing-template",
"label": "Briefing template",
"bucket": "C",
"status": "missing",
"why": "Briefs come back in your exact format.",
"dataFile": "briefing-template.md",
"thoughtStarters": [
"Do you have an existing brief format you want matched? Drop it in chat.",
"What sections does every brief need? (hook, angle, format, CTA)",
"Who reads the brief, and what do they need from it?"
]
},
{
"id": "source-of-truth",
"label": "Source of truth",
"bucket": "C",
"status": "missing",
"why": "Reports never fight your dashboard.",
"dataFile": "source-of-truth.md",
"enrich": "Connect your attribution platform (Northbeam, Triple Whale, or similar) so Runneth always reports from your preferred source.",
"thoughtStarters": [
"When the ad platform and your attribution tool disagree, which wins?",
"What's your primary success metric and attribution window?",
"Any metric you explicitly don't trust or want ignored?",
"Which dashboard does your team review in meetings?"
]
},
{
"id": "guardrails",
"label": "Guardrails",
"bucket": "C",
"status": "missing",
"why": "Always/never rules for creative.",
"dataFile": "guardrails.md",
"thoughtStarters": [
"What should Runneth NEVER suggest in a creative concept?",
"Any visual styles or creative directions that are always off-limits?",
"Non-negotiables for claims, tone, or offers?",
"Any past ad types or messages to avoid repeating?"
]
},
{
"id": "media-buying",
"label": "Media buying model",
"bucket": "C",
"status": "missing",
"why": "Keeps creative recommendations aligned with how you actually buy.",
"dataFile": "media-buying.md",
"thoughtStarters": [
"How do you primarily buy? (ABO, CBO, Advantage+)",
"What does a typical campaign structure look like?",
"Any budget rules or pacing preferences Runneth should know?"
]
},
{
"id": "business-team",
"label": "Business & team",
"bucket": "C",
"status": "missing",
"why": "Runneth works better knowing who is using it and how decisions get made.",
"dataFile": "business-team.md",
"thoughtStarters": [
"Who reviews and approves creatives?",
"Who owns the brief-to-production pipeline?",
"Any team rules or review steps Runneth should respect?"
]
},
{
"id": "landing-pages",
"label": "Landing pages",
"bucket": "C",
"status": "missing",
"why": "Briefs land harder when Runneth knows what the ad is sending to.",
"dataFile": "landing-pages.md",
"thoughtStarters": [
"What are your main landing page URLs or page types?",
"What is the primary CTA on your top pages?",
"Any pages that are off-limits for ads?"
]
},
{
"id": "integration-ad-platform",
"label": "Ad platform",
"bucket": "D",
"status": "missing",
"why": "How you want Runneth to read your ad data.",
"dataFile": "integrations/ad-platform.md",
"enrich": "Connect your ad platform (Meta, TikTok) so Runneth can draft this from your live account.",
"thoughtStarters": [
"Which metric should Runneth grade on?",
"Any spend floor before a result counts?",
"Campaigns that are always-on and shouldn't be flagged as new?"
]
},
{
"id": "integration-asset-library",
"label": "Asset library",
"bucket": "D",
"status": "missing",
"why": "Which assets Runneth can safely use.",
"dataFile": "integrations/asset-library.md",
"enrich": "Connect your asset library (Google Drive, a DAM) so Runneth pulls only approved, brand-safe assets.",
"thoughtStarters": [
"Which folder holds cleared, approved assets?",
"What's off-limits (WIP, legal review)?",
"How do you mark a final, shippable version?"
]
},
{
"id": "integration-data-warehouse",
"label": "Data warehouse",
"bucket": "D",
"status": "missing",
"why": "How Runneth should read your warehouse.",
"dataFile": "integrations/data-warehouse.md",
"enrich": "Connect your warehouse (Snowflake, BigQuery) for blended reporting Runneth can reconcile against.",
"thoughtStarters": [
"Which table is the source of truth for revenue?",
"Net or gross of fees?",
"What should Runneth NOT pull from here?"
]
},
{
"id": "integration-reviews",
"label": "Reviews platform",
"bucket": "D",
"status": "missing",
"why": "How Runneth should use your reviews.",
"dataFile": "integrations/reviews.md",
"enrich": "Connect your reviews platform (Yotpo, Okendo, Trustpilot) so Runneth mines real customer language.",
"thoughtStarters": [
"Which products' reviews matter most?",
"Any themes you already know customers repeat?",
"Anything to exclude (spam, off-topic)?"
]
}
]
}
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/guardrails.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# guardrails

_Not filled in yet. Runneth writes this to /agent/brain/context-kit/guardrails.md and mirrors it here when the Context Kit skill fills it._
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# ad-platform

_Not filled in yet. When you connect this source or tell Runneth how you want it used, Runneth writes your rules to /agent/brain/context-kit/integrations/ad-platform.md and mirrors them here. Each guide covers: what it applies to, what to use it for, what to avoid, your rules, and any open question._
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# asset-library

_Not filled in yet. When you connect this source or tell Runneth how you want it used, Runneth writes your rules to /agent/brain/context-kit/integrations/asset-library.md and mirrors them here. Each guide covers: what it applies to, what to use it for, what to avoid, your rules, and any open question._
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# data-warehouse

_Not filled in yet. When you connect this source or tell Runneth how you want it used, Runneth writes your rules to /agent/brain/context-kit/integrations/data-warehouse.md and mirrors them here. Each guide covers: what it applies to, what to use it for, what to avoid, your rules, and any open question._
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# reviews

_Not filled in yet. When you connect this source or tell Runneth how you want it used, Runneth writes your rules to /agent/brain/context-kit/integrations/reviews.md and mirrors them here. Each guide covers: what it applies to, what to use it for, what to avoid, your rules, and any open question._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/kpis-goal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# kpis-goal

_Not filled in yet. Runneth writes this to /agent/brain/context-kit/kpis-goal.md and mirrors it here when the Context Kit skill fills it._
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# legal-compliance

_Not filled in yet. Runneth writes this to /agent/brain/context-kit/legal-compliance.md and mirrors it here when the Context Kit skill fills it._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/positioning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# positioning

_Not filled in yet. Runneth mirrors this from /agent/brain/brand-audit/<slug>/ when the Context Kit skill drafts it._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/products.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# products

_Not filled in yet. Runneth mirrors this from /agent/brain/brand-audit/<slug>/ when the Context Kit skill drafts it._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/source-of-truth.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# source-of-truth

_Not filled in yet. Runneth writes this to /agent/brain/context-kit/source-of-truth.md and mirrors it here when the Context Kit skill fills it._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/spend-threshold.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# spend-threshold

_Not filled in yet. Runneth writes this to /agent/brain/context-kit/spend-threshold.md and mirrors it here when the Context Kit skill fills it._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/voc.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Voice-of-customer

_Not filled in yet. This is how your customers actually talk about the problem, drawn from real reviews, Reddit, and social language, not your ad scripts. Connect your reviews platform in chat to make it much richer. Runneth writes this to /agent/brain/context-kit/voc.md and mirrors it here._
3 changes: 3 additions & 0 deletions packages/context-kit/apps/context-kit/data/voice.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# voice

_Not filled in yet. Runneth mirrors this from /agent/brain/brand-audit/<slug>/ when the Context Kit skill drafts it._
12 changes: 12 additions & 0 deletions packages/context-kit/apps/context-kit/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "context-kit",
"private": true,
"type": "module",
"scripts": {
"build": "astro build",
"dev": "astro dev"
},
"dependencies": {
"astro": "^4.15.0"
}
}
Loading
Loading