@growthub/cli 0.7.8 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/assets/worker-kits/creative-strategist-v1/SKILL.md +95 -0
  2. package/assets/worker-kits/creative-strategist-v1/bundles/creative-strategist-v1.json +12 -2
  3. package/assets/worker-kits/creative-strategist-v1/helpers/README.md +29 -0
  4. package/assets/worker-kits/creative-strategist-v1/helpers/extract-muse-frames.sh +81 -0
  5. package/assets/worker-kits/creative-strategist-v1/helpers/grep-hooks.sh +62 -0
  6. package/assets/worker-kits/creative-strategist-v1/kit.json +20 -2
  7. package/assets/worker-kits/creative-strategist-v1/skills/README.md +23 -0
  8. package/assets/worker-kits/creative-strategist-v1/skills/frame-analysis/SKILL.md +88 -0
  9. package/assets/worker-kits/creative-strategist-v1/templates/project.md +48 -0
  10. package/assets/worker-kits/creative-strategist-v1/templates/self-eval.md +67 -0
  11. package/assets/worker-kits/creative-strategist-v1/workers/creative-strategist/CLAUDE.md +22 -0
  12. package/assets/worker-kits/growthub-ai-website-cloner-v1/SKILL.md +89 -0
  13. package/assets/worker-kits/growthub-ai-website-cloner-v1/bundles/growthub-ai-website-cloner-v1.json +9 -2
  14. package/assets/worker-kits/growthub-ai-website-cloner-v1/helpers/README.md +29 -0
  15. package/assets/worker-kits/growthub-ai-website-cloner-v1/kit.json +14 -2
  16. package/assets/worker-kits/growthub-ai-website-cloner-v1/skills/README.md +23 -0
  17. package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/project.md +48 -0
  18. package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/self-eval.md +67 -0
  19. package/assets/worker-kits/growthub-ai-website-cloner-v1/workers/ai-website-cloner-operator/CLAUDE.md +22 -0
  20. package/assets/worker-kits/growthub-custom-workspace-starter-v1/SKILL.md +122 -0
  21. package/assets/worker-kits/growthub-custom-workspace-starter-v1/bundles/growthub-custom-workspace-starter-v1.json +14 -2
  22. package/assets/worker-kits/growthub-custom-workspace-starter-v1/docs/governed-workspace-primitives.md +182 -0
  23. package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/README.md +44 -0
  24. package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +16 -2
  25. package/assets/worker-kits/growthub-custom-workspace-starter-v1/skills/README.md +55 -0
  26. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/project.md +55 -0
  27. package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/self-eval.md +67 -0
  28. package/assets/worker-kits/growthub-custom-workspace-starter-v1/workers/custom-workspace-operator/CLAUDE.md +24 -2
  29. package/assets/worker-kits/growthub-email-marketing-v1/SKILL.md +90 -0
  30. package/assets/worker-kits/growthub-email-marketing-v1/bundles/growthub-email-marketing-v1.json +9 -2
  31. package/assets/worker-kits/growthub-email-marketing-v1/helpers/README.md +29 -0
  32. package/assets/worker-kits/growthub-email-marketing-v1/kit.json +14 -2
  33. package/assets/worker-kits/growthub-email-marketing-v1/skills/README.md +23 -0
  34. package/assets/worker-kits/growthub-email-marketing-v1/templates/project.md +48 -0
  35. package/assets/worker-kits/growthub-email-marketing-v1/templates/self-eval.md +67 -0
  36. package/assets/worker-kits/growthub-email-marketing-v1/workers/email-marketing-strategist/CLAUDE.md +22 -0
  37. package/assets/worker-kits/growthub-geo-seo-v1/SKILL.md +90 -0
  38. package/assets/worker-kits/growthub-geo-seo-v1/bundles/growthub-geo-seo-v1.json +12 -3
  39. package/assets/worker-kits/growthub-geo-seo-v1/helpers/README.md +29 -0
  40. package/assets/worker-kits/growthub-geo-seo-v1/kit.json +23 -5
  41. package/assets/worker-kits/growthub-geo-seo-v1/skills/README.md +23 -0
  42. package/assets/worker-kits/growthub-geo-seo-v1/templates/project.md +48 -0
  43. package/assets/worker-kits/growthub-geo-seo-v1/templates/self-eval.md +67 -0
  44. package/assets/worker-kits/growthub-geo-seo-v1/workers/geo-seo-operator/CLAUDE.md +22 -0
  45. package/assets/worker-kits/growthub-hyperframes-studio-v1/SKILL.md +89 -0
  46. package/assets/worker-kits/growthub-hyperframes-studio-v1/bundles/growthub-hyperframes-studio-v1.json +6 -1
  47. package/assets/worker-kits/growthub-hyperframes-studio-v1/helpers/README.md +29 -0
  48. package/assets/worker-kits/growthub-hyperframes-studio-v1/kit.json +14 -2
  49. package/assets/worker-kits/growthub-hyperframes-studio-v1/skills/README.md +23 -0
  50. package/assets/worker-kits/growthub-hyperframes-studio-v1/templates/project.md +48 -0
  51. package/assets/worker-kits/growthub-hyperframes-studio-v1/templates/self-eval.md +67 -0
  52. package/assets/worker-kits/growthub-hyperframes-studio-v1/workers/hyperframes-studio-operator/CLAUDE.md +22 -0
  53. package/assets/worker-kits/growthub-marketing-skills-v1/SKILL.md +90 -0
  54. package/assets/worker-kits/growthub-marketing-skills-v1/bundles/growthub-marketing-skills-v1.json +12 -3
  55. package/assets/worker-kits/growthub-marketing-skills-v1/helpers/README.md +29 -0
  56. package/assets/worker-kits/growthub-marketing-skills-v1/kit.json +23 -5
  57. package/assets/worker-kits/growthub-marketing-skills-v1/skills/README.md +23 -0
  58. package/assets/worker-kits/growthub-marketing-skills-v1/templates/project.md +48 -0
  59. package/assets/worker-kits/growthub-marketing-skills-v1/templates/self-eval.md +67 -0
  60. package/assets/worker-kits/growthub-marketing-skills-v1/workers/marketing-operator/CLAUDE.md +22 -0
  61. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/SKILL.md +89 -0
  62. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/bundles/growthub-open-higgsfield-studio-v1.json +9 -2
  63. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/helpers/README.md +29 -0
  64. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/kit.json +14 -2
  65. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/skills/README.md +23 -0
  66. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/templates/project.md +48 -0
  67. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/templates/self-eval.md +67 -0
  68. package/assets/worker-kits/growthub-open-higgsfield-studio-v1/workers/open-higgsfield-studio-operator/CLAUDE.md +22 -0
  69. package/assets/worker-kits/growthub-open-montage-studio-v1/SKILL.md +89 -0
  70. package/assets/worker-kits/growthub-open-montage-studio-v1/bundles/growthub-open-montage-studio-v1.json +9 -2
  71. package/assets/worker-kits/growthub-open-montage-studio-v1/helpers/README.md +29 -0
  72. package/assets/worker-kits/growthub-open-montage-studio-v1/kit.json +14 -2
  73. package/assets/worker-kits/growthub-open-montage-studio-v1/skills/README.md +23 -0
  74. package/assets/worker-kits/growthub-open-montage-studio-v1/templates/project.md +48 -0
  75. package/assets/worker-kits/growthub-open-montage-studio-v1/templates/self-eval.md +67 -0
  76. package/assets/worker-kits/growthub-open-montage-studio-v1/workers/open-montage-studio-operator/CLAUDE.md +22 -0
  77. package/assets/worker-kits/growthub-postiz-social-v1/SKILL.md +90 -0
  78. package/assets/worker-kits/growthub-postiz-social-v1/bundles/growthub-postiz-social-v1.json +9 -2
  79. package/assets/worker-kits/growthub-postiz-social-v1/helpers/README.md +29 -0
  80. package/assets/worker-kits/growthub-postiz-social-v1/kit.json +14 -2
  81. package/assets/worker-kits/growthub-postiz-social-v1/skills/README.md +23 -0
  82. package/assets/worker-kits/growthub-postiz-social-v1/templates/project.md +48 -0
  83. package/assets/worker-kits/growthub-postiz-social-v1/templates/self-eval.md +67 -0
  84. package/assets/worker-kits/growthub-postiz-social-v1/workers/postiz-social-operator/CLAUDE.md +22 -0
  85. package/assets/worker-kits/growthub-twenty-crm-v1/SKILL.md +89 -0
  86. package/assets/worker-kits/growthub-twenty-crm-v1/bundles/growthub-twenty-crm-v1.json +9 -2
  87. package/assets/worker-kits/growthub-twenty-crm-v1/helpers/README.md +29 -0
  88. package/assets/worker-kits/growthub-twenty-crm-v1/kit.json +14 -2
  89. package/assets/worker-kits/growthub-twenty-crm-v1/skills/README.md +23 -0
  90. package/assets/worker-kits/growthub-twenty-crm-v1/templates/project.md +48 -0
  91. package/assets/worker-kits/growthub-twenty-crm-v1/templates/self-eval.md +67 -0
  92. package/assets/worker-kits/growthub-twenty-crm-v1/workers/twenty-crm-operator/CLAUDE.md +22 -0
  93. package/assets/worker-kits/growthub-video-use-studio-v1/.env.example +13 -0
  94. package/assets/worker-kits/growthub-video-use-studio-v1/QUICKSTART.md +47 -0
  95. package/assets/worker-kits/growthub-video-use-studio-v1/SKILL.md +89 -0
  96. package/assets/worker-kits/growthub-video-use-studio-v1/brands/NEW-CLIENT.md +3 -0
  97. package/assets/worker-kits/growthub-video-use-studio-v1/brands/_template/brand-kit.md +7 -0
  98. package/assets/worker-kits/growthub-video-use-studio-v1/brands/growthub/brand-kit.md +6 -0
  99. package/assets/worker-kits/growthub-video-use-studio-v1/bundles/growthub-video-use-studio-v1.json +54 -0
  100. package/assets/worker-kits/growthub-video-use-studio-v1/docs/provider-adapter-layer.md +15 -0
  101. package/assets/worker-kits/growthub-video-use-studio-v1/docs/video-use-discovery-path.md +13 -0
  102. package/assets/worker-kits/growthub-video-use-studio-v1/docs/video-use-fork-integration.md +35 -0
  103. package/assets/worker-kits/growthub-video-use-studio-v1/examples/video-brief-sample.md +11 -0
  104. package/assets/worker-kits/growthub-video-use-studio-v1/growthub-meta/README.md +3 -0
  105. package/assets/worker-kits/growthub-video-use-studio-v1/growthub-meta/kit-standard.md +6 -0
  106. package/assets/worker-kits/growthub-video-use-studio-v1/helpers/README.md +29 -0
  107. package/assets/worker-kits/growthub-video-use-studio-v1/kit.json +112 -0
  108. package/assets/worker-kits/growthub-video-use-studio-v1/output/README.md +9 -0
  109. package/assets/worker-kits/growthub-video-use-studio-v1/output-standards.md +19 -0
  110. package/assets/worker-kits/growthub-video-use-studio-v1/runtime-assumptions.md +9 -0
  111. package/assets/worker-kits/growthub-video-use-studio-v1/setup/check-deps.sh +21 -0
  112. package/assets/worker-kits/growthub-video-use-studio-v1/setup/clone-fork.sh +18 -0
  113. package/assets/worker-kits/growthub-video-use-studio-v1/setup/install-skill.sh +23 -0
  114. package/assets/worker-kits/growthub-video-use-studio-v1/setup/verify-env.mjs +23 -0
  115. package/assets/worker-kits/growthub-video-use-studio-v1/skills/README.md +23 -0
  116. package/assets/worker-kits/growthub-video-use-studio-v1/skills.md +21 -0
  117. package/assets/worker-kits/growthub-video-use-studio-v1/templates/edit-decision-list.md +17 -0
  118. package/assets/worker-kits/growthub-video-use-studio-v1/templates/edit-strategy.md +11 -0
  119. package/assets/worker-kits/growthub-video-use-studio-v1/templates/project.md +48 -0
  120. package/assets/worker-kits/growthub-video-use-studio-v1/templates/qa-checklist.md +21 -0
  121. package/assets/worker-kits/growthub-video-use-studio-v1/templates/render-plan.md +40 -0
  122. package/assets/worker-kits/growthub-video-use-studio-v1/templates/self-eval.md +67 -0
  123. package/assets/worker-kits/growthub-video-use-studio-v1/templates/video-brief.md +11 -0
  124. package/assets/worker-kits/growthub-video-use-studio-v1/validation-checklist.md +11 -0
  125. package/assets/worker-kits/growthub-video-use-studio-v1/workers/video-use-studio-operator/CLAUDE.md +93 -0
  126. package/assets/worker-kits/growthub-zernio-social-v1/SKILL.md +90 -0
  127. package/assets/worker-kits/growthub-zernio-social-v1/bundles/growthub-zernio-social-v1.json +9 -2
  128. package/assets/worker-kits/growthub-zernio-social-v1/helpers/README.md +29 -0
  129. package/assets/worker-kits/growthub-zernio-social-v1/kit.json +14 -2
  130. package/assets/worker-kits/growthub-zernio-social-v1/skills/README.md +23 -0
  131. package/assets/worker-kits/growthub-zernio-social-v1/templates/project.md +48 -0
  132. package/assets/worker-kits/growthub-zernio-social-v1/templates/self-eval.md +67 -0
  133. package/assets/worker-kits/growthub-zernio-social-v1/workers/zernio-social-operator/CLAUDE.md +22 -0
  134. package/dist/index.js +974 -233
  135. package/package.json +2 -2
@@ -0,0 +1,182 @@
1
+ # Governed-Workspace Primitives — How Your Workspace Coordinates Agents at Enterprise Scale
2
+
3
+ Every workspace you create with Growthub Local — greenfield via `growthub starter init`, or imported via `growthub starter import-repo` / `import-skill`, or materialised from any worker kit via `growthub kit download` — inherits six architectural primitives that make the workspace **self-describing to agents**, **continuous across sessions**, and **auditable for enterprise operators**.
4
+
5
+ This doc explains **why** each primitive exists and **what it buys your team**. The protocol reference lives at [`docs/SKILLS_MCP_DISCOVERY.md`](../../../../docs/SKILLS_MCP_DISCOVERY.md) at the repo level; this file is written for the human and the agent who are about to operate inside the workspace you just exported.
6
+
7
+ > TL;DR — The primitives turn a folder of files into a **coordinated execution substrate** that Claude, Cursor, Codex, and custom harnesses all read the same way, that remembers what has happened across sessions, and that refuses to run away on a retry loop.
8
+
9
+ ---
10
+
11
+ ## The problem these primitives solve
12
+
13
+ Most agent stacks give you one of:
14
+
15
+ - a raw repo an agent can edit, with no governance;
16
+ - a prompt pack that works once and then decays;
17
+ - a hosted product that locks your customisation behind a vendor.
18
+
19
+ None of those scale to enterprise work where many agents, many sessions, and many operators act on the same substrate over time. You need a **workspace** that is:
20
+
21
+ - **discoverable** — agents know what's here without reading everything
22
+ - **continuous** — day 3 of a brief remembers day 1
23
+ - **bounded** — a broken generation doesn't loop forever
24
+ - **auditable** — every material change produces a receipt a human can review
25
+ - **composable** — heavy work spawns into its own lane without poisoning the parent context
26
+ - **safe** — side-effecting shell calls are reviewable files, not one-off prompts
27
+
28
+ The six primitives below each answer one of those needs, and the Growthub SDK (`@growthub/api-contract/skills`) is the capability-agnostic contract that lets every worker kit, every fork, and every agent harness read them the same way.
29
+
30
+ ---
31
+
32
+ ## 1. `SKILL.md` — The Discovery Entry
33
+
34
+ **What it is.** A single file at the root of every kit with YAML frontmatter (`name`, `description`, `triggers`, `sessionMemory`, `selfEval`, `helpers`, `subSkills`, `mcpTools`) and a short markdown routing body.
35
+
36
+ **Why it exists.** Claude / Cursor / Codex agents scan the frontmatter at session start to catalog what's available — they do **not** load the full runbook (`skills.md`) until the user actually engages the skill. That cuts token cost on discovery and lets an agent know, within milliseconds, that your workspace has a Creative Strategist, a Hyperframes studio, and a Postiz social scheduler available — without reading a single line of the detailed operator runbook.
37
+
38
+ **What it buys you.**
39
+ - Agents route faster and more predictably across many kits.
40
+ - A new team member (or a fresh agent session) gets oriented without re-explaining the repo.
41
+ - Cross-agent compatibility is automatic — the same `SKILL.md` is read identically by Claude, Cursor, Codex, and custom harnesses.
42
+
43
+ **Enterprise use case.** A creative ops team with 30 worker kits across 6 brands can expose all 30 to every agent surface in the org without a custom integration per tool. The manifest *is* the integration.
44
+
45
+ ---
46
+
47
+ ## 2. Symlinked Pointer — AGENTS.md as Single Source of Truth
48
+
49
+ **What it is.** The repo root has exactly one authoritative agent contract (`AGENTS.md`). `CLAUDE.md` and `.cursorrules` are plain-text pointers that say "see AGENTS.md". No duplicated rules, no drift.
50
+
51
+ **Why it exists.** Multi-agent environments drift the second a rule lives in two places. Someone updates the Cursor file and forgets the Claude file. The pointer pattern makes that impossible: there is only one file to edit.
52
+
53
+ **What it buys you.**
54
+ - Agent rules updated in one place, picked up by every surface on next session load.
55
+ - Audit is simpler — reviewers look at one file, not three.
56
+ - Cross-OS safety — pointer files work on Windows clones where symlinks don't.
57
+
58
+ **Enterprise use case.** Compliance or InfoSec can sign off on one agent-behaviour file; no more "but the Cursor rules differ from the Claude rules" gaps.
59
+
60
+ ---
61
+
62
+ ## 3. `.growthub-fork/project.md` — Session Memory
63
+
64
+ **What it is.** A human-readable, append-only journal seeded inside the fork's governed state directory (alongside `fork.json`, `policy.json`, `trace.jsonl`, optional `authority.json`). Written by the CLI at init/import time from the kit's `templates/project.md`.
65
+
66
+ **Why it exists.** The machine-readable `trace.jsonl` is perfect for systems to replay history, but it is lossy to humans. `project.md` is the narrative layer — "what we tried, what we approved, what we rejected, where we stopped" — so the next session (yours or another agent's) can resume without re-explaining.
67
+
68
+ **What it buys you.**
69
+ - Day 3 of a multi-day brief opens with yesterday's context already in scope.
70
+ - Approvals, rejections, and self-eval outcomes are preserved across handoffs.
71
+ - Operators who return to a workspace after a month see exactly where work paused.
72
+
73
+ **Enterprise use case.** Hand-offs between a contract creative team and an in-house team stop losing context. An agent in the in-house session reads the last 3 entries in `project.md` and picks up where the contractor left off.
74
+
75
+ ---
76
+
77
+ ## 4. Self-Evaluation — Bounded Retry Loop
78
+
79
+ **What it is.** Every `SKILL.md` declares `selfEval.criteria[]` (what good looks like) and `selfEval.maxRetries` (default `3`). The agent runs `generate → apply → evaluate → record`, records each attempt to both `project.md` and `trace.jsonl`, and **must stop** when it hits the retry ceiling. The CLI primitive `recordSelfEval()` (`cli/src/skills/self-eval.ts`) is the single place that writes both surfaces.
80
+
81
+ **Why it exists.** Unbounded agent loops are the #1 source of cost overruns and silent failures. A governed self-eval contract guarantees every attempt is observable *and* gives the agent a principled stopping point.
82
+
83
+ **What it buys you.**
84
+ - Runaway jobs are impossible — the ceiling is enforced in the bookkeeping primitive.
85
+ - Every retry produces a receipt a human can read.
86
+ - The Fork Sync Agent's existing `preview → apply → trace` loop is reused, not reinvented — so operators who already trust Fork Sync get the same governance here.
87
+
88
+ **Enterprise use case.** A marketing ops team approves "at most 3 retries per creative unit" as policy. The SDK enforces it. Failed attempts surface in `project.md` immediately; nobody has to write a watchdog.
89
+
90
+ ---
91
+
92
+ ## 5. Sub-Skills — Parallel Agent Lanes
93
+
94
+ **What it is.** A kit can declare nested skills under `<kit>/skills/<slug>/SKILL.md`. The parent skill spawns a sub-agent for a sub-skill when the work is (a) heavy enough to pollute the parent's context, or (b) narrow enough to benefit from a specialist lane. Both parent and sub-skill share the same `project.md` journal — so the parent reads the sub-agent's outcome on return without losing continuity.
95
+
96
+ **Why it exists.** Heavy work (frame extraction, Manim render, PIL compositing, audit passes) shouldn't share the parent's context budget. And specialist work is easier to govern as its own unit.
97
+
98
+ **What it buys you.**
99
+ - Lower token cost on the parent — the parent stays focused on the user-facing artifact.
100
+ - Clean audit trail — each sub-skill run appends to `project.md::subSkillRuns` with its own start/result.
101
+ - Reusable lanes — a sub-skill like `frame-analysis` can be shared across multiple parent kits.
102
+
103
+ **Enterprise use case.** Video / creative pipelines get the EDL-per-cut pattern as a sub-skill spawned by the parent brief skill, while non-video kits (CRM, email, SEO) stay on a simple flat loop — one SDK, both patterns, same governance.
104
+
105
+ ---
106
+
107
+ ## 6. `helpers/` — Safe Shell Tool Layer
108
+
109
+ **What it is.** Small, deterministic scripts (`helpers/<verb>.{sh,mjs,py}`) that agents invoke via one shell call instead of reconstructing a raw pipeline inline.
110
+
111
+ **Why it exists.** Raw shell in a prompt is fragile, unreviewable, and drifts every session. Moving the same snippets into reviewable files in the kit makes them (a) inspectable, (b) testable, (c) safer — and agents read *one line* ("run helpers/grep-hooks.sh") instead of reconstructing a 4-line pipeline.
112
+
113
+ **What it buys you.**
114
+ - Reliability — the same inputs always produce the same outputs.
115
+ - Reviewable by security — helpers live in the repo and diff cleanly.
116
+ - Lower cognitive load for agents — one invocation is easier than four.
117
+
118
+ **Enterprise use case.** A security review of your agent workflow doesn't require reading agent transcripts — it reads the `helpers/` folder once. That's the full list of side-effecting operations.
119
+
120
+ ---
121
+
122
+ ## How the primitives compose: the export guarantee
123
+
124
+ Every kit export (`scripts/export-worker-kit.mjs --qa`) asserts all six primitives are present before shipping. The assertions are:
125
+
126
+ 1. `SKILL.md` exists with well-formed frontmatter (`name`, `description`).
127
+ 2. `templates/project.md` exists (session memory seed).
128
+ 3. `templates/self-eval.md` exists (self-eval pattern).
129
+ 4. `helpers/README.md` exists (safe-shell convention).
130
+ 5. `skills/README.md` exists (sub-skill convention).
131
+ 6. `kit.json.frozenAssetPaths` declares all five paths.
132
+
133
+ A kit that forgets any of these **cannot ship** — the export script refuses to produce a bundle. That guarantee is what makes the primitive layer trustworthy at scale: every workspace your team exports will have them, every time.
134
+
135
+ ---
136
+
137
+ ## How to operate inside this workspace
138
+
139
+ 1. **At session start.** Read `.growthub-fork/project.md` (what happened last time) → `SKILL.md` (what's here) → `skills.md` (how to do the work).
140
+ 2. **During work.** After every material change, write a dated bullet to `project.md`'s "Session log" AND call `appendKitForkTraceEvent` for the machine log. The CLI primitive `recordSelfEval` does both in one call — use it.
141
+ 3. **On retry.** Every attempt goes to both surfaces. At `attempt === maxRetries`, park with a `needs_confirmation` note and stop.
142
+ 4. **On heavy work.** Spawn a sub-skill from `skills/<slug>/` when context isolation helps. The sub-skill shares this fork's `project.md` — no separate journal.
143
+ 5. **On side effects.** Use a helper from `helpers/`. If you're about to write raw shell for the third time, promote it to a helper first.
144
+
145
+ ---
146
+
147
+ ## Command surface from inside the workspace
148
+
149
+ ```bash
150
+ # Catalog every SKILL.md reachable from here (root + nested sub-skills)
151
+ growthub skills list [--json]
152
+
153
+ # Strict shape check — frontmatter + helper/sub-skill path existence
154
+ growthub skills validate
155
+
156
+ # Read the session memory for this fork
157
+ growthub skills session show [--body]
158
+
159
+ # (Re-)seed the session memory if it is missing
160
+ growthub skills session init [--kit <id>]
161
+ ```
162
+
163
+ ## What this substrate is NOT
164
+
165
+ - **Not a sandbox.** It's a set of conventions. The filesystem is still yours to edit.
166
+ - **Not a lock-in.** Every primitive file is plain markdown or JSON — readable without Growthub tooling.
167
+ - **Not a replacement for policy.** `policy.json` and the Fork Sync Agent remain the safety envelope. The primitives ride on top.
168
+ - **Not capability-specific.** The SDK contract (`@growthub/api-contract/skills::SkillSelfEval`) is intentionally agnostic. Creative, code, content, CRM, social, audit — all specialise inside their own `skills.md` without changing the contract.
169
+
170
+ ---
171
+
172
+ ## Further reading
173
+
174
+ - [`../SKILL.md`](../SKILL.md) — the discovery entry for this kit
175
+ - [`../skills.md`](../skills.md) — the operator runbook (the deep how-to)
176
+ - [`../workers/custom-workspace-operator/CLAUDE.md`](../workers/custom-workspace-operator/CLAUDE.md) — the worker agent contract
177
+ - [`../templates/project.md`](../templates/project.md) — session-memory template
178
+ - [`../templates/self-eval.md`](../templates/self-eval.md) — self-evaluation template
179
+ - [`../helpers/README.md`](../helpers/README.md) — safe-shell convention
180
+ - [`../skills/README.md`](../skills/README.md) — sub-skill convention
181
+ - Repo-level protocol reference: `docs/SKILLS_MCP_DISCOVERY.md`
182
+ - SDK source of truth: `@growthub/api-contract/skills`
@@ -0,0 +1,44 @@
1
+ # `helpers/` — safe shell tool layer (primitive #6)
2
+
3
+ A **helper** is a small, deterministic script an agent invokes via one shell call instead of reconstructing a raw pipeline inline. Helpers are:
4
+
5
+ - **Reviewable.** They live in the repo; diffs are inspectable.
6
+ - **Deterministic.** Pinned inputs and outputs; no hidden state.
7
+ - **Safer.** Agents call `bash helpers/<verb>.sh <args>` instead of re-assembling a 4-line `ffmpeg` / `grep` / `python` pipeline every session.
8
+
9
+ Helpers are **not** capability nodes, and they do not cross policy boundaries. Anything that requires auth, hosted execution, or network reach lives in the CLI (`growthub <verb>`) or in MCP routing — not here.
10
+
11
+ ## Convention
12
+
13
+ ```
14
+ helpers/
15
+ ├── README.md # this file
16
+ ├── <verb>.sh # short, single-purpose shell scripts
17
+ ├── <verb>.mjs # optional: Node-based helper when shell is too weak
18
+ └── <verb>.py # optional: Python-based helper for CSV / data work
19
+ ```
20
+
21
+ Every helper ships with:
22
+
23
+ 1. A one-line comment at the top: what it does + the one command that invokes it.
24
+ 2. `set -euo pipefail` (or the language equivalent) — no silent failures.
25
+ 3. A matching row in the parent `SKILL.md`'s `helpers[]` frontmatter array:
26
+ ```yaml
27
+ helpers:
28
+ - path: helpers/grep-hooks.sh
29
+ description: 3-pass hook-library search against the frozen 500-hook CSV
30
+ ```
31
+ 4. A matching entry in `skills.md` pointing to the helper at the place the agent should invoke it (no duplicated shell bodies).
32
+
33
+ ## When to promote an inline snippet into a helper
34
+
35
+ Promote when any of these are true:
36
+
37
+ - The same snippet appears in `skills.md` more than once.
38
+ - The snippet has fragile quoting or path interpolation.
39
+ - The snippet calls a side-effecting binary (`ffmpeg`, `git`, `gh`, `osascript`, `npm install`).
40
+ - Multiple sub-skills invoke the same snippet.
41
+
42
+ ## Baseline ships zero helpers on purpose
43
+
44
+ The starter kit carries the convention only. Individual worker kits (creative-strategist, hyperframes, video-use, etc.) populate `helpers/` with concrete scripts — those are the reference implementations. This keeps the baseline surface minimal and predictable.
@@ -25,6 +25,7 @@
25
25
  "frozenAssetPaths": [
26
26
  "QUICKSTART.md",
27
27
  ".env.example",
28
+ "SKILL.md",
28
29
  "skills.md",
29
30
  "output-standards.md",
30
31
  "runtime-assumptions.md",
@@ -39,6 +40,10 @@
39
40
  "templates/workspace-brief.md",
40
41
  "templates/agent-contract.md",
41
42
  "templates/deployment-plan.md",
43
+ "templates/project.md",
44
+ "templates/self-eval.md",
45
+ "helpers/README.md",
46
+ "skills/README.md",
42
47
  "examples/workspace-sample.md",
43
48
  "docs/starter-kit-overview.md",
44
49
  "docs/fork-sync-integration.md",
@@ -51,7 +56,8 @@
51
56
  "studio/src/App.jsx",
52
57
  "studio/src/app.css",
53
58
  "growthub-meta/README.md",
54
- "growthub-meta/kit-standard.md"
59
+ "growthub-meta/kit-standard.md",
60
+ "docs/governed-workspace-primitives.md"
55
61
  ],
56
62
  "setupPaths": {
57
63
  "quickstart": "QUICKSTART.md",
@@ -66,6 +72,7 @@
66
72
  "kit.json",
67
73
  ".env.example",
68
74
  "bundles/growthub-custom-workspace-starter-v1.json",
75
+ "SKILL.md",
69
76
  "skills.md",
70
77
  "workers/custom-workspace-operator/CLAUDE.md",
71
78
  "brands/_template/brand-kit.md",
@@ -76,8 +83,15 @@
76
83
  "output/README.md",
77
84
  "studio",
78
85
  "templates",
86
+ "templates/project.md",
87
+ "templates/self-eval.md",
88
+ "helpers",
89
+ "helpers/README.md",
90
+ "skills",
91
+ "skills/README.md",
79
92
  "docs",
80
- "growthub-meta"
93
+ "growthub-meta",
94
+ "docs/governed-workspace-primitives.md"
81
95
  ]
82
96
  },
83
97
  "bundles": [
@@ -0,0 +1,55 @@
1
+ # `skills/` — nested sub-skill convention (primitive #5)
2
+
3
+ A **sub-skill** is a full `SKILL.md`-addressable lane that a parent skill can spawn as a parallel sub-agent. Use sub-skills when work is:
4
+
5
+ - **Heavy** — isolating the context keeps the parent lean (e.g. frame extraction, Manim render, PIL compositing).
6
+ - **Narrow** — a specialist lane is clearer than a generalist lane (e.g. hook-library lookup, scene-module assembly).
7
+
8
+ Sub-skills are **not** CLI commands and **not** capability nodes. They are local-to-the-kit Claude/Cursor/Codex skills, discovered by walking the tree.
9
+
10
+ ## Convention
11
+
12
+ ```
13
+ skills/
14
+ ├── README.md # this file
15
+ └── <slug>/ # kebab-case; matches the SKILL.md `name`
16
+ ├── SKILL.md # frontmatter + routing body (≤ 500 lines)
17
+ ├── references/ # optional — long docs loaded on demand
18
+ ├── templates/ # optional — reusable text/JS templates
19
+ └── scripts/ # optional — deterministic helpers
20
+ ```
21
+
22
+ Each sub-skill's `SKILL.md` follows the same shape as the parent (see `@growthub/api-contract/skills::SkillManifest`):
23
+
24
+ ```yaml
25
+ ---
26
+ name: <slug>
27
+ description: <trigger + capability, <=1024 chars>
28
+ triggers: [ ... ]
29
+ sessionMemory:
30
+ path: .growthub-fork/project.md # same fork journal — sub-skills do not branch the journal
31
+ selfEval:
32
+ criteria: [ ... ]
33
+ maxRetries: 3
34
+ traceTo: .growthub-fork/trace.jsonl
35
+ helpers: []
36
+ mcpTools: []
37
+ ---
38
+ ```
39
+
40
+ ## Parallelism
41
+
42
+ A parent skill spawns a sub-skill sub-agent when (a) the sub-skill's work is fully scoped by its own criteria, and (b) the parent's next step does not depend on intermediate state from the sub-skill. Each sub-skill run appends a row to the fork's `project.md::subSkillRuns` frontmatter so the parent can read the outcome on return.
43
+
44
+ Example wiring:
45
+
46
+ ```
47
+ creative-strategist-v1/
48
+ └── skills/
49
+ └── frame-analysis/
50
+ └── SKILL.md — parent delegates Step 2b (ffprobe + ffmpeg + frame read)
51
+ ```
52
+
53
+ ## Baseline ships zero sub-skills on purpose
54
+
55
+ The starter kit carries the convention only. Individual worker kits populate `skills/` as they discover specialist lanes during operation.
@@ -0,0 +1,55 @@
1
+ ---
2
+ # .growthub-fork/project.md — session memory primitive (v1)
3
+ #
4
+ # This file is written by `growthub starter init` / `import-repo` / `import-skill`
5
+ # (and by `growthub skills session init` inside an existing fork). It is the
6
+ # human-readable continuity surface across agent sessions — it sits alongside
7
+ # the machine-readable `trace.jsonl` without duplicating it.
8
+ #
9
+ # Rules:
10
+ # - Append-only. Never delete a dated entry; cross it out instead.
11
+ # - Every material change to the fork gets a paragraph here AND a typed event
12
+ # in `.growthub-fork/trace.jsonl`. The two are kept in sync.
13
+ # - Approvals, rejections, and self-eval outcomes all land here.
14
+ #
15
+ # Replaceable tokens (seeded at init time):
16
+ # {{KIT_ID}} {{FORK_ID}} {{STARTED_AT}} {{SOURCE}} {{SOURCE_REF}}
17
+
18
+ kitId: "{{KIT_ID}}"
19
+ forkId: "{{FORK_ID}}"
20
+ startedAt: "{{STARTED_AT}}"
21
+ source: "{{SOURCE}}"
22
+ sourceRef: "{{SOURCE_REF}}"
23
+ skillManifestVersion: 1
24
+ approvals: []
25
+ selfEvalHistory: []
26
+ subSkillRuns: []
27
+ ---
28
+
29
+ # Project journal — fork `{{FORK_ID}}`
30
+
31
+ Baseline primitive: `{{KIT_ID}}`. Seeded at `{{STARTED_AT}}` from `{{SOURCE}}` (`{{SOURCE_REF}}`).
32
+
33
+ This is your cross-session continuity surface. Return here at the start of every session; append to it at the end of every session and at every self-eval boundary.
34
+
35
+ ## How to use this file
36
+
37
+ 1. **Session start.** Read the last 3 entries in the "Session log" below + tail 20 events in `.growthub-fork/trace.jsonl`. State what you plan to do.
38
+ 2. **Material change.** Record the change as a dated bullet in "Session log" (what, why, outcome). Simultaneously append a typed event to `trace.jsonl` via the Fork Sync Agent — never bypass.
39
+ 3. **Approval boundary.** Add a row to `approvals` in the frontmatter above (include the operator's decision verbatim).
40
+ 4. **Self-eval boundary.** Append to `selfEvalHistory` in the frontmatter: `attempt`, `criteria`, `outcome`, `notes`. Enforce `maxRetries: 3` from the active skill's frontmatter.
41
+ 5. **Sub-skill spawn.** Append to `subSkillRuns` in the frontmatter: `subSkill`, `startedAt`, `result`.
42
+
43
+ ## Session log
44
+
45
+ <!-- Append entries below, newest at the bottom. Format:
46
+
47
+ ### {{YYYY-MM-DD HH:mm UTC}} · {{skill-slug}}
48
+ - **Plan.** What you intend to do this session.
49
+ - **Changes.** What you actually did (material changes only; each must correspond to a trace event).
50
+ - **Outcome.** Pass / fail / parked. Reference the self-eval criteria you checked.
51
+ - **Next.** What the next session should pick up.
52
+
53
+ -->
54
+
55
+ _No sessions recorded yet. This block is populated as the fork is operated._
@@ -0,0 +1,67 @@
1
+ # Self-evaluation template — v1 primitive (Growthub, capability-agnostic)
2
+
3
+ A skill's `selfEval` contract declares **what good looks like** (`criteria[]`) and **the retry ceiling** (`maxRetries`). The agent drives the loop; this file is the pattern the agent follows at every unit of work.
4
+
5
+ The contract is defined in `@growthub/api-contract/skills::SkillSelfEval` and is **capability-agnostic** — the same primitive applies to code edits, copy drafts, CRM rules, API payloads, asset renders, audit passes, and every other domain. The "unit of work" is the smallest reversible change the skill operates on; concrete boundaries are defined in the kit's own `skills.md` operator runbook, not here.
6
+
7
+ ## Loop
8
+
9
+ ```
10
+ for attempt in 1..maxRetries: # default maxRetries = 3
11
+ generate — produce a proposal (whatever the skill produces)
12
+ apply — materialise the proposal against the fork
13
+ self-evaluate — for each criterion in skill.selfEval.criteria:
14
+ check → pass / fail / needs-confirmation
15
+ record — append to project.md (human) + trace.jsonl (machine)
16
+
17
+ if all criteria pass: break
18
+ if attempt == maxRetries: park with needs_confirmation note. Stop.
19
+ ```
20
+
21
+ ## What each attempt writes
22
+
23
+ ### Human row — append to `.growthub-fork/project.md` "Session log"
24
+
25
+ ```md
26
+ ### 2026-04-23 18:40 UTC · <skill-slug>
27
+ - **Plan.** What you intend to do this unit of work.
28
+ - **Changes.** Material change applied (must correspond to a trace event).
29
+ - **Self-eval.** attempt 2/3 — criterion "<one of skill.selfEval.criteria>" ✗ (<note>). Retrying.
30
+ - **Outcome.** retry-pending / pass / parked.
31
+ - **Next.** What the next attempt (or next session) should pick up.
32
+ ```
33
+
34
+ ### Machine row — append to `.growthub-fork/trace.jsonl` (via `appendKitForkTraceEvent`)
35
+
36
+ ```json
37
+ {
38
+ "ts": "2026-04-23T18:40:00.000Z",
39
+ "forkId": "<fork-id>",
40
+ "kitId": "<kit-id>",
41
+ "type": "self_eval_recorded",
42
+ "summary": "attempt 2/3 failed on <criterion>",
43
+ "detail": {
44
+ "skill": "<skill-slug>",
45
+ "attempt": 2,
46
+ "maxRetries": 3,
47
+ "criterion": "<one of skill.selfEval.criteria>",
48
+ "outcome": "fail",
49
+ "notes": "<short explanation>"
50
+ }
51
+ }
52
+ ```
53
+
54
+ ## Hard rules
55
+
56
+ 1. **Never exceed `maxRetries`.** At the ceiling, park with a `needs_confirmation` note and stop. Do not loop forever.
57
+ 2. **Record every attempt.** Even the first pass. Continuity depends on a complete journal.
58
+ 3. **Keep `project.md` and `trace.jsonl` in sync.** One without the other is a protocol violation.
59
+ 4. **Preserve prior entries.** Append-only. Never rewrite history.
60
+
61
+ ## Bound the blast radius
62
+
63
+ Evaluate at the smallest unit of work the skill operates on, not only at the end of a multi-step run. The retry ceiling applies to that unit — so a bad attempt does not sink the whole job.
64
+
65
+ What counts as a "unit of work" is **kit-specific** and lives in that kit's `skills.md` operator runbook — not in this agnostic template. A kit picks its own smallest reversible boundary and documents it in `skills.md`; this template does not prescribe one.
66
+
67
+ The agnostic SDK (`@growthub/api-contract/skills::SkillSelfEval`) does not encode any domain-specific boundaries — it only carries `criteria[]`, `maxRetries`, and `traceTo`. See `SKILL.md::selfEval.criteria` in this kit for the concrete checks, and `skills.md` for the kit-specific unit of work.
@@ -4,28 +4,50 @@ You are the Custom Workspace Operator — the agent wired to this Growthub custo
4
4
 
5
5
  ## Inputs you always have
6
6
 
7
+ - `SKILL.md` — the routing menu. **Read first on every session.**
8
+ - `skills.md` — the operator runbook. Progressively disclosed from `SKILL.md`.
7
9
  - `kit.json` — the manifest, schema v2, family `studio`
8
10
  - `bundles/growthub-custom-workspace-starter-v1.json` — the bundle contract
9
11
  - `brands/_template/brand-kit.md` — empty brand scaffold
10
12
  - `brands/growthub/brand-kit.md` — reference brand
11
13
  - `studio/` — the Vite UI shell (React + Vite 5)
14
+ - `templates/project.md` — session-memory template (seed for `.growthub-fork/project.md`)
15
+ - `templates/self-eval.md` — self-evaluation pattern
16
+ - `helpers/` — safe shell tool layer (starts empty; promote inline shell here over time)
17
+ - `skills/` — nested sub-skill convention (parallel sub-agents for heavy or narrow work)
12
18
  - `workers/custom-workspace-operator/CLAUDE.md` — this file
13
- - `.growthub-fork/fork.json`, `.growthub-fork/policy.json`, `.growthub-fork/trace.jsonl` — the fork state the CLI registered for this workspace
19
+ - `.growthub-fork/fork.json`, `.growthub-fork/policy.json`, `.growthub-fork/trace.jsonl`, `.growthub-fork/project.md` — the fork state the CLI registered for this workspace
20
+
21
+ ## The six primitives (architectural, carried into every exported fork)
22
+
23
+ 1. **`SKILL.md`** — single source of truth + discovery entry (primitive #1).
24
+ 2. **Symlinked pointer** — repo-root `AGENTS.md` is the authoritative agent contract; `CLAUDE.md` and `.cursorrules` point to it (primitive #2).
25
+ 3. **`.growthub-fork/project.md`** — session memory, append-only, human-readable; written from `templates/project.md` at init time (primitive #3).
26
+ 4. **Self-evaluation** — generate → apply → evaluate → record; retry up to `selfEval.maxRetries` (default 3); mirrors the Fork Sync Agent's preview → apply → trace loop (primitive #4). Contract: `@growthub/api-contract/skills::SkillSelfEval`.
27
+ 5. **`skills/<slug>/SKILL.md`** — sub-skill + parallel-agent convention (primitive #5).
28
+ 6. **`helpers/<verb>.{sh,mjs,py}`** — safe shell tool layer; agents call one script instead of reconstructing raw commands (primitive #6).
14
29
 
15
30
  ## Non-negotiables
16
31
 
32
+ - Read `SKILL.md` first, then `.growthub-fork/project.md`, then `skills.md`.
17
33
  - Never modify files under `skills/`, `custom/`, `.env`, `.env.local`, or any path listed in `policy.untouchablePaths`.
18
34
  - Never perform a destructive remote operation (`push --force`, `reset --hard`) without explicit user confirmation.
19
- - Every significant action appends an event to `trace.jsonl` via the Fork Sync Agent — do not bypass.
35
+ - Every significant action appends an event to `trace.jsonl` via the Fork Sync Agent AND a dated entry to `project.md` — do not bypass; do not write one without the other.
20
36
  - Respect `policy.autoApprove` + `policy.autoApproveDepUpdates`. If a change is outside scope, mark it `needsConfirmation` and park.
37
+ - Self-eval hard ceiling: `maxRetries: 3` per skill run. At the ceiling, stop and park with a `needs_confirmation` note in `project.md`.
21
38
 
22
39
  ## Execution verbs
23
40
 
24
41
  - `growthub starter init --name <workspace> --out <path>` — scaffold a new workspace from this starter
42
+ - `growthub starter import-repo <owner/repo> --out <path>` — scaffold from a GitHub repo
43
+ - `growthub starter import-skill <owner/repo/skill> --out <path>` — scaffold from a skills.sh skill
25
44
  - `growthub kit fork status <fork-id>` — check drift
26
45
  - `growthub kit fork heal <fork-id> [--dry-run | --background]` — propose + apply heal
27
46
  - `growthub kit fork policy --fork-id <fork-id> --set <key=value>` — configure safety envelope
28
47
  - `growthub kit fork trace --fork-id <fork-id> --tail N` — replay the event log
48
+ - `growthub skills list [--json]` — enumerate every SKILL.md in this fork (root + nested `skills/`)
49
+ - `growthub skills validate` — check SKILL.md frontmatter + helper/sub-skill paths
50
+ - `growthub skills session show` — print the current `.growthub-fork/project.md`
29
51
 
30
52
  ## Output contract
31
53
 
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: growthub-email-marketing-v1
3
+ description: "Self-contained workspace for Growthub-focused email marketing — brand-aware email campaigns, nurture flows, drip sequences. Use when the user says: \"email campaign\", \"drip sequence\", \"email marketing strategist\". Session memory tracks brand inputs, list segments, and subject-line self-eval pass/fail history."
4
+ triggers:
5
+ - email marketing
6
+ - email marketing strategist
7
+ - fork growthub-email-marketing-v1
8
+ progressiveDisclosure: true
9
+ sessionMemory:
10
+ path: .growthub-fork/project.md
11
+ selfEval:
12
+ criteria:
13
+ - Operator contract (workers/email-marketing-strategist/CLAUDE.md) read before any material change.
14
+ - .growthub-fork/project.md appended to at each material change.
15
+ - .growthub-fork/trace.jsonl receives a typed event for each material change.
16
+ - Kit-specific QUICKSTART / runtime-assumptions / output-standards honoured.
17
+ maxRetries: 3
18
+ traceTo: .growthub-fork/trace.jsonl
19
+ helpers: []
20
+ subSkills: []
21
+ mcpTools: []
22
+ ---
23
+
24
+ # Growthub Agent Worker Kit — Email Marketing Strategist
25
+
26
+ Discovery entry + routing menu for the `growthub-email-marketing-v1` worker kit. Family: `operator`. Agent contract: `workers/email-marketing-strategist/CLAUDE.md`.
27
+
28
+ ## When to use this skill
29
+
30
+ When the user's intent matches any of the triggers above — or when an agent has been dropped into a fork whose `.growthub-fork/fork.json` declares `kitId: "growthub-email-marketing-v1"`.
31
+
32
+ ## Decision tree
33
+
34
+ ```
35
+ Fork exists (this directory contains .growthub-fork/fork.json)?
36
+ ├── No → run: growthub starter init --out <path> (or import-repo / import-skill)
37
+ │ then: growthub kit download growthub-email-marketing-v1 --out <path>
38
+
39
+ └── Yes → read in this order:
40
+ 1. .growthub-fork/project.md — session memory (primitive #3)
41
+ 2. SKILL.md (this file) — routing menu (primitive #1)
42
+ 3. skills.md — operator runbook
43
+ 4. workers/email-marketing-strategist/CLAUDE.md — agent contract
44
+ 5. QUICKSTART.md — first-run steps
45
+ 6. runtime-assumptions.md — host expectations
46
+ 7. .growthub-fork/policy.json — what you may touch
47
+ 8. .growthub-fork/trace.jsonl (tail 20) — recent machine history
48
+ ```
49
+
50
+ ## The six primitives (same shape across every Growthub worker kit)
51
+
52
+ 1. **`SKILL.md`** — this file.
53
+ 2. **Symlinked pointer** — repo-root `AGENTS.md` is authoritative.
54
+ 3. **`.growthub-fork/project.md`** — session memory, seeded by the CLI from `templates/project.md` at init/import time.
55
+ 4. **Self-evaluation** — generate → apply → evaluate → record; retry up to `selfEval.maxRetries` (default 3); mirrors the Fork Sync Agent's preview → apply → trace loop (primitive #4). Contract: `@growthub/api-contract/skills::SkillSelfEval`.
56
+ 5. **`skills/`** — nested sub-skills for parallel sub-agents on heavy / narrow work.
57
+ 6. **`helpers/`** — safe shell tool layer. Promote inline shell here whenever the same snippet is re-used.
58
+
59
+ ## Self-evaluation (primitive #4)
60
+
61
+ Enforce `selfEval.maxRetries: 3`. At the ceiling, park with a `needs_confirmation` note in `project.md` and stop. Record every attempt to both `project.md` and `trace.jsonl`.
62
+
63
+ ## Session memory (primitive #3)
64
+
65
+ `.growthub-fork/project.md` is the only cross-session continuity surface for this fork. Append at every material change, approval boundary, and self-eval outcome.
66
+
67
+ ## Sub-skills (primitive #5)
68
+
69
+ (None declared at the baseline; populate `skills/` and the frontmatter `subSkills[]` array as specialist lanes emerge.)
70
+
71
+ ## Helpers (primitive #6)
72
+
73
+ (None declared at the baseline; populate `helpers/` and the frontmatter `helpers[]` array as inline shell matures.)
74
+
75
+ ## MCP routing (optional)
76
+
77
+ List concrete MCP tool IDs in `mcpTools[]` when a fork runs an MCP server for auth-heavy actions. Declarative only at v1.
78
+
79
+ ## Related files
80
+
81
+ - `skills.md` — operator runbook (deep)
82
+ - `QUICKSTART.md` — first-run steps
83
+ - `runtime-assumptions.md` — host expectations
84
+ - `output-standards.md` — output locations + manifest shape
85
+ - `validation-checklist.md` — pre-flight checklist (if present)
86
+ - `templates/project.md` — session-memory template
87
+ - `templates/self-eval.md` — self-evaluation template
88
+ - `helpers/README.md` — safe shell tool layer convention
89
+ - `skills/README.md` — sub-skill convention
90
+ - `workers/email-marketing-strategist/CLAUDE.md` — agent contract
@@ -55,12 +55,19 @@
55
55
  "templates/broadcast-formats/lead-magnet-traffic.md",
56
56
  "templates/broadcast-formats/showcase-proof.md",
57
57
  "templates/broadcast-formats/engagement-nudge.md",
58
- "templates/broadcast-formats/activation-booking.md"
58
+ "templates/broadcast-formats/activation-booking.md",
59
+ "SKILL.md",
60
+ "templates/project.md",
61
+ "templates/self-eval.md",
62
+ "helpers/README.md",
63
+ "skills/README.md"
59
64
  ],
60
65
  "optionalPresets": [],
61
66
  "export": {
62
67
  "folderName": "growthub-agent-worker-kit-email-marketing-v1",
63
68
  "zipFileName": "growthub-agent-worker-kit-email-marketing-v1.zip"
64
69
  },
65
- "activationModes": ["export"]
70
+ "activationModes": [
71
+ "export"
72
+ ]
66
73
  }
@@ -0,0 +1,29 @@
1
+ # `helpers/` — safe shell tool layer (primitive #6)
2
+
3
+ A **helper** is a small, deterministic script an agent invokes via one shell call instead of reconstructing a raw pipeline inline. Helpers are reviewable, deterministic, and safer than raw commands.
4
+
5
+ ## Convention
6
+
7
+ ```
8
+ helpers/
9
+ ├── README.md # this file
10
+ ├── <verb>.sh # single-purpose shell scripts
11
+ ├── <verb>.mjs # optional: Node-based helper
12
+ └── <verb>.py # optional: Python-based helper
13
+ ```
14
+
15
+ Every helper:
16
+
17
+ 1. Carries a one-line header comment: what it does + how to invoke it.
18
+ 2. Uses `set -euo pipefail` (or equivalent) — no silent failures.
19
+ 3. Has a matching row in the parent `SKILL.md`'s `helpers[]` frontmatter.
20
+ 4. Is referenced from `skills.md` at the step the agent should invoke it (no duplicated shell bodies).
21
+
22
+ ## When to promote an inline snippet
23
+
24
+ - Appears more than once in `skills.md`.
25
+ - Has fragile quoting or path interpolation.
26
+ - Calls a side-effecting binary (ffmpeg, git, gh, npm install).
27
+ - Multiple sub-skills invoke it.
28
+
29
+ See the parent `SKILL.md` `helpers[]` array for the current roster.