@growthub/cli 0.7.9 → 0.8.1
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.
- package/assets/worker-kits/creative-strategist-v1/SKILL.md +95 -0
- package/assets/worker-kits/creative-strategist-v1/bundles/creative-strategist-v1.json +12 -2
- package/assets/worker-kits/creative-strategist-v1/helpers/README.md +29 -0
- package/assets/worker-kits/creative-strategist-v1/helpers/extract-muse-frames.sh +81 -0
- package/assets/worker-kits/creative-strategist-v1/helpers/grep-hooks.sh +62 -0
- package/assets/worker-kits/creative-strategist-v1/kit.json +20 -2
- package/assets/worker-kits/creative-strategist-v1/skills/README.md +23 -0
- package/assets/worker-kits/creative-strategist-v1/skills/frame-analysis/SKILL.md +88 -0
- package/assets/worker-kits/creative-strategist-v1/templates/project.md +48 -0
- package/assets/worker-kits/creative-strategist-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/creative-strategist-v1/workers/creative-strategist/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/.env.example +53 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/QUICKSTART.md +98 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/.env.example +25 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/README.md +36 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/api/settings/integrations/route.js +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/api/workspace/route.js +27 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/globals.css +237 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/layout.jsx +14 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/page.jsx +165 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/app/settings/integrations/page.jsx +134 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/auth/index.js +21 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/env.js +28 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/integrations/growthub-connection-normalizer.js +95 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/integrations/index.js +178 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/payments/index.js +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/index.js +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/postgres.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/provider-managed.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/adapters/persistence/qstash-kv.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/domain/integrations.js +185 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/lib/domain/portal.js +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/next.config.js +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/package-lock.json +976 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/package.json +17 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/postcss.config.mjs +3 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/apps/agency-portal/vercel.json +5 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/brands/NEW-CLIENT.md +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/brands/_template/brand-kit.md +27 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/brands/growthub/brand-kit.md +25 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/bundles/growthub-agency-portal-starter-v1.json +65 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/adapter-contracts.md +79 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/fork-sync-integration.md +32 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/governed-workspace-primitives.md +182 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/starter-kit-overview.md +30 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/vercel-serverless-deployment.md +46 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/docs/vite-ui-shell-guide.md +24 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/examples/portal-brief-sample.md +44 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/examples/workspace-sample.md +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/growthub-meta/README.md +11 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/growthub-meta/kit-standard.md +16 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/helpers/README.md +49 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/kit.json +156 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/output/README.md +13 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/output-standards.md +25 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/runtime-assumptions.md +15 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/setup/check-deps.sh +20 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/setup/verify-env.mjs +92 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/skills/README.md +55 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/skills.md +133 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/index.html +12 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/package-lock.json +1677 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/package.json +20 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/serve.mjs +42 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/src/App.jsx +162 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/src/app.css +138 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/src/main.jsx +10 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/studio/vite.config.js +8 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/agent-contract.md +9 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/client-onboarding-plan.md +56 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/deployment-handoff.md +61 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/deployment-plan.md +22 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/portal-brief.md +65 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/project.md +55 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/supabase-setup-plan.md +26 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/templates/workspace-brief.md +11 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/validation-checklist.md +32 -0
- package/assets/worker-kits/growthub-agency-portal-starter-v1/workers/agency-portal-operator/CLAUDE.md +75 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/bundles/growthub-ai-website-cloner-v1.json +9 -2
- package/assets/worker-kits/growthub-ai-website-cloner-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-ai-website-cloner-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-ai-website-cloner-v1/workers/ai-website-cloner-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/SKILL.md +122 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/bundles/growthub-custom-workspace-starter-v1.json +14 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/docs/governed-workspace-primitives.md +182 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/helpers/README.md +44 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/kit.json +16 -2
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/skills/README.md +55 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/project.md +55 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-custom-workspace-starter-v1/workers/custom-workspace-operator/CLAUDE.md +24 -2
- package/assets/worker-kits/growthub-email-marketing-v1/SKILL.md +90 -0
- package/assets/worker-kits/growthub-email-marketing-v1/bundles/growthub-email-marketing-v1.json +9 -2
- package/assets/worker-kits/growthub-email-marketing-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-email-marketing-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-email-marketing-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-email-marketing-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-email-marketing-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-email-marketing-v1/workers/email-marketing-strategist/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-geo-seo-v1/SKILL.md +90 -0
- package/assets/worker-kits/growthub-geo-seo-v1/bundles/growthub-geo-seo-v1.json +12 -3
- package/assets/worker-kits/growthub-geo-seo-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-geo-seo-v1/kit.json +23 -5
- package/assets/worker-kits/growthub-geo-seo-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-geo-seo-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-geo-seo-v1/workers/geo-seo-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-hyperframes-studio-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-hyperframes-studio-v1/bundles/growthub-hyperframes-studio-v1.json +6 -1
- package/assets/worker-kits/growthub-hyperframes-studio-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-hyperframes-studio-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-hyperframes-studio-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-hyperframes-studio-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-hyperframes-studio-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-hyperframes-studio-v1/workers/hyperframes-studio-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-marketing-skills-v1/SKILL.md +90 -0
- package/assets/worker-kits/growthub-marketing-skills-v1/bundles/growthub-marketing-skills-v1.json +12 -3
- package/assets/worker-kits/growthub-marketing-skills-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-marketing-skills-v1/kit.json +23 -5
- package/assets/worker-kits/growthub-marketing-skills-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-marketing-skills-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-marketing-skills-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-marketing-skills-v1/workers/marketing-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/bundles/growthub-open-higgsfield-studio-v1.json +9 -2
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-open-higgsfield-studio-v1/workers/open-higgsfield-studio-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/bundles/growthub-open-montage-studio-v1.json +9 -2
- package/assets/worker-kits/growthub-open-montage-studio-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-open-montage-studio-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-open-montage-studio-v1/workers/open-montage-studio-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-postiz-social-v1/SKILL.md +90 -0
- package/assets/worker-kits/growthub-postiz-social-v1/bundles/growthub-postiz-social-v1.json +9 -2
- package/assets/worker-kits/growthub-postiz-social-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-postiz-social-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-postiz-social-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-postiz-social-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-postiz-social-v1/workers/postiz-social-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/bundles/growthub-twenty-crm-v1.json +9 -2
- package/assets/worker-kits/growthub-twenty-crm-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-twenty-crm-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-twenty-crm-v1/workers/twenty-crm-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-video-use-studio-v1/SKILL.md +89 -0
- package/assets/worker-kits/growthub-video-use-studio-v1/bundles/growthub-video-use-studio-v1.json +6 -1
- package/assets/worker-kits/growthub-video-use-studio-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-video-use-studio-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-video-use-studio-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-video-use-studio-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-video-use-studio-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-video-use-studio-v1/workers/video-use-studio-operator/CLAUDE.md +22 -0
- package/assets/worker-kits/growthub-zernio-social-v1/SKILL.md +90 -0
- package/assets/worker-kits/growthub-zernio-social-v1/bundles/growthub-zernio-social-v1.json +9 -2
- package/assets/worker-kits/growthub-zernio-social-v1/helpers/README.md +29 -0
- package/assets/worker-kits/growthub-zernio-social-v1/kit.json +14 -2
- package/assets/worker-kits/growthub-zernio-social-v1/skills/README.md +23 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/project.md +48 -0
- package/assets/worker-kits/growthub-zernio-social-v1/templates/self-eval.md +67 -0
- package/assets/worker-kits/growthub-zernio-social-v1/workers/zernio-social-operator/CLAUDE.md +22 -0
- package/dist/index.js +970 -241
- package/package.json +2 -2
|
@@ -0,0 +1,49 @@
|
|
|
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
|
+
## Agency portal helper policy
|
|
43
|
+
|
|
44
|
+
This kit intentionally keeps helper scripts minimal. Local validation currently uses first-party setup scripts:
|
|
45
|
+
|
|
46
|
+
- `bash setup/check-deps.sh`
|
|
47
|
+
- `node setup/verify-env.mjs`
|
|
48
|
+
|
|
49
|
+
Do not add helpers that read provider secrets, call the hosted GH app, or mutate fork authority. Those flows belong to Growthub CLI commands or the configured Growthub bridge adapter.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 2,
|
|
3
|
+
"kit": {
|
|
4
|
+
"id": "growthub-agency-portal-starter-v1",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"name": "Growthub Agency Portal Starter Kit",
|
|
7
|
+
"description": "First-party governed workspace starter for composable agency portals. Built from the custom workspace starter primitives, preserving the local-first Vite operator shell while adding a Vercel-ready portal app with thin persistence, auth, and payment adapter contracts for Postgres, Qstash KV, and provider-managed deployments.",
|
|
8
|
+
"type": "worker",
|
|
9
|
+
"visibility": "public-open-source",
|
|
10
|
+
"sourceRepo": "growthub-local",
|
|
11
|
+
"family": "studio"
|
|
12
|
+
},
|
|
13
|
+
"entrypoint": {
|
|
14
|
+
"workerId": "agency-portal-operator",
|
|
15
|
+
"path": "workers/agency-portal-operator/CLAUDE.md"
|
|
16
|
+
},
|
|
17
|
+
"workerIds": [
|
|
18
|
+
"agency-portal-operator"
|
|
19
|
+
],
|
|
20
|
+
"agentContractPath": "workers/agency-portal-operator/CLAUDE.md",
|
|
21
|
+
"brandTemplatePath": "brands/_template/brand-kit.md",
|
|
22
|
+
"publicExampleBrandPaths": [
|
|
23
|
+
"brands/growthub/brand-kit.md"
|
|
24
|
+
],
|
|
25
|
+
"frozenAssetPaths": [
|
|
26
|
+
"QUICKSTART.md",
|
|
27
|
+
".env.example",
|
|
28
|
+
"SKILL.md",
|
|
29
|
+
"skills.md",
|
|
30
|
+
"output-standards.md",
|
|
31
|
+
"runtime-assumptions.md",
|
|
32
|
+
"validation-checklist.md",
|
|
33
|
+
"workers/agency-portal-operator/CLAUDE.md",
|
|
34
|
+
"brands/_template/brand-kit.md",
|
|
35
|
+
"brands/growthub/brand-kit.md",
|
|
36
|
+
"brands/NEW-CLIENT.md",
|
|
37
|
+
"setup/verify-env.mjs",
|
|
38
|
+
"setup/check-deps.sh",
|
|
39
|
+
"output/README.md",
|
|
40
|
+
"templates/workspace-brief.md",
|
|
41
|
+
"templates/portal-brief.md",
|
|
42
|
+
"templates/client-onboarding-plan.md",
|
|
43
|
+
"templates/agent-contract.md",
|
|
44
|
+
"templates/deployment-plan.md",
|
|
45
|
+
"templates/deployment-handoff.md",
|
|
46
|
+
"templates/supabase-setup-plan.md",
|
|
47
|
+
"templates/project.md",
|
|
48
|
+
"templates/self-eval.md",
|
|
49
|
+
"helpers/README.md",
|
|
50
|
+
"skills/README.md",
|
|
51
|
+
"examples/workspace-sample.md",
|
|
52
|
+
"examples/portal-brief-sample.md",
|
|
53
|
+
"docs/starter-kit-overview.md",
|
|
54
|
+
"docs/fork-sync-integration.md",
|
|
55
|
+
"docs/vite-ui-shell-guide.md",
|
|
56
|
+
"docs/governed-workspace-primitives.md",
|
|
57
|
+
"docs/adapter-contracts.md",
|
|
58
|
+
"docs/vercel-serverless-deployment.md",
|
|
59
|
+
"studio/index.html",
|
|
60
|
+
"studio/package.json",
|
|
61
|
+
"studio/package-lock.json",
|
|
62
|
+
"studio/vite.config.js",
|
|
63
|
+
"studio/serve.mjs",
|
|
64
|
+
"studio/src/main.jsx",
|
|
65
|
+
"studio/src/App.jsx",
|
|
66
|
+
"studio/src/app.css",
|
|
67
|
+
"apps/agency-portal/README.md",
|
|
68
|
+
"apps/agency-portal/.env.example",
|
|
69
|
+
"apps/agency-portal/package.json",
|
|
70
|
+
"apps/agency-portal/package-lock.json",
|
|
71
|
+
"apps/agency-portal/next.config.js",
|
|
72
|
+
"apps/agency-portal/postcss.config.mjs",
|
|
73
|
+
"apps/agency-portal/vercel.json",
|
|
74
|
+
"apps/agency-portal/app/layout.jsx",
|
|
75
|
+
"apps/agency-portal/app/page.jsx",
|
|
76
|
+
"apps/agency-portal/app/globals.css",
|
|
77
|
+
"apps/agency-portal/app/settings/integrations/page.jsx",
|
|
78
|
+
"apps/agency-portal/app/api/workspace/route.js",
|
|
79
|
+
"apps/agency-portal/app/api/settings/integrations/route.js",
|
|
80
|
+
"apps/agency-portal/lib/domain/portal.js",
|
|
81
|
+
"apps/agency-portal/lib/domain/integrations.js",
|
|
82
|
+
"apps/agency-portal/lib/adapters/env.js",
|
|
83
|
+
"apps/agency-portal/lib/adapters/auth/index.js",
|
|
84
|
+
"apps/agency-portal/lib/adapters/integrations/index.js",
|
|
85
|
+
"apps/agency-portal/lib/adapters/integrations/growthub-connection-normalizer.js",
|
|
86
|
+
"apps/agency-portal/lib/adapters/payments/index.js",
|
|
87
|
+
"apps/agency-portal/lib/adapters/persistence/index.js",
|
|
88
|
+
"apps/agency-portal/lib/adapters/persistence/postgres.js",
|
|
89
|
+
"apps/agency-portal/lib/adapters/persistence/qstash-kv.js",
|
|
90
|
+
"apps/agency-portal/lib/adapters/persistence/provider-managed.js",
|
|
91
|
+
"growthub-meta/README.md",
|
|
92
|
+
"growthub-meta/kit-standard.md"
|
|
93
|
+
],
|
|
94
|
+
"setupPaths": {
|
|
95
|
+
"quickstart": "QUICKSTART.md",
|
|
96
|
+
"setupDir": "setup/",
|
|
97
|
+
"outputDir": "output/"
|
|
98
|
+
},
|
|
99
|
+
"outputStandard": {
|
|
100
|
+
"type": "working-directory",
|
|
101
|
+
"description": "Exported folder is a governed Growthub workspace. The local-first Vite operator shell remains under studio/. The Vercel-ready agency portal app lives under apps/agency-portal/ and depends on thin adapter contracts selected by environment variables.",
|
|
102
|
+
"requiredPaths": [
|
|
103
|
+
"QUICKSTART.md",
|
|
104
|
+
"kit.json",
|
|
105
|
+
".env.example",
|
|
106
|
+
"bundles/growthub-agency-portal-starter-v1.json",
|
|
107
|
+
"SKILL.md",
|
|
108
|
+
"skills.md",
|
|
109
|
+
"workers/agency-portal-operator/CLAUDE.md",
|
|
110
|
+
"brands/_template/brand-kit.md",
|
|
111
|
+
"brands/growthub/brand-kit.md",
|
|
112
|
+
"brands/NEW-CLIENT.md",
|
|
113
|
+
"setup/verify-env.mjs",
|
|
114
|
+
"setup/check-deps.sh",
|
|
115
|
+
"output/README.md",
|
|
116
|
+
"studio",
|
|
117
|
+
"studio/package-lock.json",
|
|
118
|
+
"apps/agency-portal",
|
|
119
|
+
"apps/agency-portal/package-lock.json",
|
|
120
|
+
"apps/agency-portal/next.config.js",
|
|
121
|
+
"apps/agency-portal/lib/adapters",
|
|
122
|
+
"templates",
|
|
123
|
+
"templates/project.md",
|
|
124
|
+
"templates/self-eval.md",
|
|
125
|
+
"templates/portal-brief.md",
|
|
126
|
+
"templates/deployment-handoff.md",
|
|
127
|
+
"helpers",
|
|
128
|
+
"helpers/README.md",
|
|
129
|
+
"skills",
|
|
130
|
+
"skills/README.md",
|
|
131
|
+
"docs",
|
|
132
|
+
"docs/governed-workspace-primitives.md",
|
|
133
|
+
"docs/adapter-contracts.md",
|
|
134
|
+
"docs/vercel-serverless-deployment.md",
|
|
135
|
+
"growthub-meta"
|
|
136
|
+
]
|
|
137
|
+
},
|
|
138
|
+
"bundles": [
|
|
139
|
+
{
|
|
140
|
+
"id": "growthub-agency-portal-starter-v1",
|
|
141
|
+
"version": "1.0.0",
|
|
142
|
+
"path": "bundles/growthub-agency-portal-starter-v1.json"
|
|
143
|
+
}
|
|
144
|
+
],
|
|
145
|
+
"executionMode": "export",
|
|
146
|
+
"activationModes": [
|
|
147
|
+
"export"
|
|
148
|
+
],
|
|
149
|
+
"compatibility": {
|
|
150
|
+
"cliMinVersion": "0.4.0"
|
|
151
|
+
},
|
|
152
|
+
"provenance": {
|
|
153
|
+
"sourceRepo": "growthub-local",
|
|
154
|
+
"frozenAt": "2026-04-23T00:00:00.000Z"
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Output Directory
|
|
2
|
+
|
|
3
|
+
All artifacts produced for a given project land here at `output/<client-slug>/<project-slug>/`. This directory is intentionally empty in the starter; the agent will create the first sub-folder on its first run.
|
|
4
|
+
|
|
5
|
+
Expected first-run files:
|
|
6
|
+
|
|
7
|
+
- `portal-brief.md`
|
|
8
|
+
- `client-onboarding-plan.md`
|
|
9
|
+
- `adapter-plan.md`
|
|
10
|
+
- `deployment-handoff.md`
|
|
11
|
+
- `trace-summary.md`
|
|
12
|
+
|
|
13
|
+
Keep generated artifacts out of `studio/` and `apps/agency-portal/` unless the user explicitly asks for implementation changes.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Agency Portal Starter — Output Standards
|
|
2
|
+
|
|
3
|
+
Generated planning and implementation artifacts write to:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
output/<client-slug>/<project-slug>/
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Required artifacts per production customization:
|
|
10
|
+
|
|
11
|
+
- `portal-brief.md` — business requirements, client scope, data pipeline objects, and MCP integration needs.
|
|
12
|
+
- `client-onboarding-plan.md` — first client setup, settings, roles, and source connection plan.
|
|
13
|
+
- `adapter-plan.md` — persistence/auth/payment/reporting adapter selections.
|
|
14
|
+
- `deployment-handoff.md` — local validation, Vercel root/env, GitHub/Vercel CI handoff, and bridge/BYO integration decision.
|
|
15
|
+
- `trace-summary.md` — human-readable summary of governed fork events.
|
|
16
|
+
|
|
17
|
+
Application source changes belong in `apps/agency-portal/` or `studio/` according to runtime surface. Do not write generated artifacts into app source directories.
|
|
18
|
+
|
|
19
|
+
Every handoff must explicitly state:
|
|
20
|
+
|
|
21
|
+
- whether integrations use `growthub-bridge`, `byo-api-key`, or `static`;
|
|
22
|
+
- whether Windsor AI is connected through hosted authority or explicit `WINDSOR_API_KEY`;
|
|
23
|
+
- which data pipeline objects are active;
|
|
24
|
+
- which MCP connection integrations are active;
|
|
25
|
+
- which fork id was validated with `growthub kit fork status`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Agency Portal Starter — Runtime Assumptions
|
|
2
|
+
|
|
3
|
+
- **Node**: >= v20 for Growthub CLI parity and Next.js/Vite local development.
|
|
4
|
+
- **Git**: required on PATH for fork-sync and remote operations.
|
|
5
|
+
- **Local-first shell**: `studio/` uses Vite + React and must remain runnable without Vercel.
|
|
6
|
+
- **Cloud app**: `apps/agency-portal/` is the Vercel/serverless app payload.
|
|
7
|
+
- **Persistence**: selected by `AGENCY_PORTAL_DATA_ADAPTER`, not by kit identity.
|
|
8
|
+
- **Auth**: selected by `AGENCY_PORTAL_AUTH_ADAPTER`.
|
|
9
|
+
- **Payments**: selected by `AGENCY_PORTAL_PAYMENT_ADAPTER`.
|
|
10
|
+
- **Integrations**: selected by `AGENCY_PORTAL_INTEGRATION_ADAPTER` as `static`, `growthub-bridge`, or `byo-api-key`.
|
|
11
|
+
- **Growthub bridge**: the first-party hosted path reads normalized connection state from GH app MCP authority. The starter never queries `mcp_connections` directly and never stores raw provider tokens in source.
|
|
12
|
+
- **BYO API key**: supported through `AGENCY_PORTAL_BYO_CONNECTIONS_JSON` and named env vars, using the same normalized integration object shape as the bridge path.
|
|
13
|
+
- **Windsor AI**: first-class data pipeline object. It is not a database adapter. Google Sheets blended data is modeled as a companion data pipeline destination.
|
|
14
|
+
- **Fork registration**: exported workspaces carry `.growthub-fork/fork.json`, `policy.json`, `project.md`, and `trace.jsonl`.
|
|
15
|
+
- **Bundled sources**: paths in `kit.json.frozenAssetPaths` are upstream-owned and reviewed by fork sync.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Starter kit — dependency check. Verifies the local runtime is ready.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
have() { command -v "$1" >/dev/null 2>&1; }
|
|
6
|
+
|
|
7
|
+
missing=0
|
|
8
|
+
for cmd in node npm git; do
|
|
9
|
+
if ! have "$cmd"; then
|
|
10
|
+
echo " [check-deps] MISSING: $cmd"
|
|
11
|
+
missing=1
|
|
12
|
+
else
|
|
13
|
+
echo " [check-deps] ok: $cmd ($(command -v "$cmd"))"
|
|
14
|
+
fi
|
|
15
|
+
done
|
|
16
|
+
|
|
17
|
+
if [ "$missing" -ne 0 ]; then
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
echo " [check-deps] All prerequisites satisfied."
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Agency Portal Starter — adapter-first env verification.
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
|
|
5
|
+
const allowed = {
|
|
6
|
+
AGENCY_PORTAL_DATA_ADAPTER: ["postgres", "qstash-kv", "provider-managed"],
|
|
7
|
+
AGENCY_PORTAL_AUTH_ADAPTER: ["oidc", "clerk", "authjs", "provider-managed"],
|
|
8
|
+
AGENCY_PORTAL_PAYMENT_ADAPTER: ["stripe", "polar", "none"],
|
|
9
|
+
AGENCY_PORTAL_INTEGRATION_ADAPTER: ["growthub-bridge", "byo-api-key", "static"],
|
|
10
|
+
AGENCY_PORTAL_DEPLOY_TARGET: ["vercel"],
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const defaults = {
|
|
14
|
+
AGENCY_PORTAL_DATA_ADAPTER: "provider-managed",
|
|
15
|
+
AGENCY_PORTAL_AUTH_ADAPTER: "provider-managed",
|
|
16
|
+
AGENCY_PORTAL_PAYMENT_ADAPTER: "none",
|
|
17
|
+
AGENCY_PORTAL_INTEGRATION_ADAPTER: "static",
|
|
18
|
+
AGENCY_PORTAL_DEPLOY_TARGET: "vercel",
|
|
19
|
+
AGENCY_PORTAL_APP_ROOT: "apps/agency-portal",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
let errors = 0;
|
|
23
|
+
|
|
24
|
+
function value(key) {
|
|
25
|
+
return process.env[key] || defaults[key] || "";
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function fail(message) {
|
|
29
|
+
console.error(`[verify-env] ${message}`);
|
|
30
|
+
errors += 1;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (const [key, values] of Object.entries(allowed)) {
|
|
34
|
+
const actual = value(key);
|
|
35
|
+
if (!values.includes(actual)) {
|
|
36
|
+
fail(`${key} must be one of: ${values.join(", ")}`);
|
|
37
|
+
} else {
|
|
38
|
+
console.log(`[verify-env] ok: ${key}=${actual}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const dataAdapter = value("AGENCY_PORTAL_DATA_ADAPTER");
|
|
43
|
+
if (dataAdapter === "postgres" && !process.env.DATABASE_URL) {
|
|
44
|
+
fail("DATABASE_URL is required when AGENCY_PORTAL_DATA_ADAPTER=postgres");
|
|
45
|
+
}
|
|
46
|
+
if (dataAdapter === "qstash-kv") {
|
|
47
|
+
if (!process.env.QSTASH_KV_REST_URL) fail("QSTASH_KV_REST_URL is required when AGENCY_PORTAL_DATA_ADAPTER=qstash-kv");
|
|
48
|
+
if (!process.env.QSTASH_KV_REST_TOKEN) fail("QSTASH_KV_REST_TOKEN is required when AGENCY_PORTAL_DATA_ADAPTER=qstash-kv");
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const authAdapter = value("AGENCY_PORTAL_AUTH_ADAPTER");
|
|
52
|
+
if (authAdapter === "oidc") {
|
|
53
|
+
for (const key of ["AUTH_SECRET", "AUTH_ISSUER", "AUTH_CLIENT_ID", "AUTH_CLIENT_SECRET"]) {
|
|
54
|
+
if (!process.env[key]) fail(`${key} is required when AGENCY_PORTAL_AUTH_ADAPTER=oidc`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const paymentAdapter = value("AGENCY_PORTAL_PAYMENT_ADAPTER");
|
|
59
|
+
if ((paymentAdapter === "stripe" || paymentAdapter === "polar") && !process.env.PAYMENT_SECRET_KEY) {
|
|
60
|
+
fail("PAYMENT_SECRET_KEY is required when a payment adapter is enabled");
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const integrationAdapter = value("AGENCY_PORTAL_INTEGRATION_ADAPTER");
|
|
64
|
+
if (integrationAdapter === "growthub-bridge") {
|
|
65
|
+
if (!process.env.GROWTHUB_BRIDGE_BASE_URL) fail("GROWTHUB_BRIDGE_BASE_URL is required when AGENCY_PORTAL_INTEGRATION_ADAPTER=growthub-bridge");
|
|
66
|
+
if (!process.env.GROWTHUB_BRIDGE_ACCESS_TOKEN) fail("GROWTHUB_BRIDGE_ACCESS_TOKEN is required when AGENCY_PORTAL_INTEGRATION_ADAPTER=growthub-bridge");
|
|
67
|
+
}
|
|
68
|
+
if (integrationAdapter === "byo-api-key") {
|
|
69
|
+
const raw = process.env.AGENCY_PORTAL_BYO_CONNECTIONS_JSON;
|
|
70
|
+
const hasWindsorKey = Boolean(process.env.WINDSOR_API_KEY);
|
|
71
|
+
if (!raw && !hasWindsorKey) {
|
|
72
|
+
fail("AGENCY_PORTAL_BYO_CONNECTIONS_JSON or WINDSOR_API_KEY is required when AGENCY_PORTAL_INTEGRATION_ADAPTER=byo-api-key");
|
|
73
|
+
} else {
|
|
74
|
+
if (raw) {
|
|
75
|
+
try {
|
|
76
|
+
const parsed = JSON.parse(raw);
|
|
77
|
+
if (!Array.isArray(parsed) && (!parsed || typeof parsed !== "object")) {
|
|
78
|
+
fail("AGENCY_PORTAL_BYO_CONNECTIONS_JSON must be a JSON array or object");
|
|
79
|
+
}
|
|
80
|
+
} catch {
|
|
81
|
+
fail("AGENCY_PORTAL_BYO_CONNECTIONS_JSON must be valid JSON");
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
console.log(`[verify-env] app root: ${value("AGENCY_PORTAL_APP_ROOT")}`);
|
|
88
|
+
console.log(`[verify-env] reporting adapter: ${process.env.AGENCY_PORTAL_REPORTING_ADAPTER || "(unset)"}`);
|
|
89
|
+
console.log(`[verify-env] integration adapter: ${integrationAdapter}`);
|
|
90
|
+
console.log(`[verify-env] windsor api key: ${process.env.WINDSOR_API_KEY ? "set" : "(unset)"}`);
|
|
91
|
+
|
|
92
|
+
process.exit(errors > 0 ? 1 : 0);
|
|
@@ -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,133 @@
|
|
|
1
|
+
# Agency Portal Starter — Operator Runbook
|
|
2
|
+
|
|
3
|
+
This runbook specializes the custom workspace starter into an agnostic agency portal worker kit.
|
|
4
|
+
|
|
5
|
+
## Non-negotiable architecture
|
|
6
|
+
|
|
7
|
+
1. The governed workspace is the root artifact.
|
|
8
|
+
2. The Vite shell in `studio/` remains the local-first Growthub operator surface.
|
|
9
|
+
3. The Vercel app lives in `apps/agency-portal/`.
|
|
10
|
+
4. Persistence, auth, payments, and reporting are selected through thin adapters and environment variables.
|
|
11
|
+
5. Integration state is resolved through a static local catalog or Growthub GH app MCP bridge, never by moving provider secrets into this starter.
|
|
12
|
+
6. BYO API key setup is supported, but it must normalize into the same object contract as Growthub bridge output.
|
|
13
|
+
7. Prior app examples are reference material only; this kit contract is defined by the governed workspace primitives and adapter model.
|
|
14
|
+
|
|
15
|
+
## Capability map
|
|
16
|
+
|
|
17
|
+
The portal starter must preserve these business capabilities:
|
|
18
|
+
|
|
19
|
+
- Dashboard: revenue, tasks, health, and alerts.
|
|
20
|
+
- Clients: profiles, contacts, status, notes, onboarding, targets.
|
|
21
|
+
- Pipeline: leads, opportunities, stages, won/lost state.
|
|
22
|
+
- Content: calendar, platform, owner, status.
|
|
23
|
+
- Tasks: priorities, recurring templates, due dates.
|
|
24
|
+
- Finance: invoices, expenses, payment state.
|
|
25
|
+
- Reports: performance report generation and review.
|
|
26
|
+
- Metrics: period-based agency health.
|
|
27
|
+
- Operations: SOPs, links, internal docs.
|
|
28
|
+
- Settings: profile, workspace, adapters, deployment.
|
|
29
|
+
- Settings integrations: data sources and workspace integrations resolved through static local catalog or Growthub bridge authority.
|
|
30
|
+
|
|
31
|
+
## Adapter model
|
|
32
|
+
|
|
33
|
+
### Persistence
|
|
34
|
+
|
|
35
|
+
Use `AGENCY_PORTAL_DATA_ADAPTER`:
|
|
36
|
+
|
|
37
|
+
- `postgres` with `DATABASE_URL`
|
|
38
|
+
- `qstash-kv` with `QSTASH_KV_REST_URL` and `QSTASH_KV_REST_TOKEN`
|
|
39
|
+
- `provider-managed` for a hosted database surface outside the kit
|
|
40
|
+
|
|
41
|
+
### Auth
|
|
42
|
+
|
|
43
|
+
Use `AGENCY_PORTAL_AUTH_ADAPTER`:
|
|
44
|
+
|
|
45
|
+
- `oidc`
|
|
46
|
+
- `clerk`
|
|
47
|
+
- `authjs`
|
|
48
|
+
- `provider-managed`
|
|
49
|
+
|
|
50
|
+
### Payments
|
|
51
|
+
|
|
52
|
+
Use `AGENCY_PORTAL_PAYMENT_ADAPTER`:
|
|
53
|
+
|
|
54
|
+
- `none`
|
|
55
|
+
- `stripe`
|
|
56
|
+
- `polar`
|
|
57
|
+
|
|
58
|
+
### Integrations
|
|
59
|
+
|
|
60
|
+
Use `AGENCY_PORTAL_INTEGRATION_ADAPTER`:
|
|
61
|
+
|
|
62
|
+
- `static` for local starter catalog output.
|
|
63
|
+
- `growthub-bridge` for hosted authority through the Growthub GH app MCP connection bridge.
|
|
64
|
+
- `byo-api-key` for explicit workspace-owned provider setup through `AGENCY_PORTAL_BYO_CONNECTIONS_JSON`, with `WINDSOR_API_KEY` supported directly for the Windsor data pipeline object.
|
|
65
|
+
|
|
66
|
+
Keep the lanes distinct:
|
|
67
|
+
|
|
68
|
+
- Data sources: Windsor AI, Google Sheets blended data, Google Analytics, Shopify, Meta Facebook/Instagram.
|
|
69
|
+
- Workspace integrations: Asana, Slack, GoHighLevel, Google Drive, Notion.
|
|
70
|
+
|
|
71
|
+
The GH app owns user auth, provider tokens, account IDs, scopes, verification, and MCP connection metadata. The starter consumes normalized bridge output only.
|
|
72
|
+
|
|
73
|
+
The normalized object mirrors the GH app integration primitive and adds worker-kit lane metadata:
|
|
74
|
+
|
|
75
|
+
- `id`, `name`, `label`, `icon`
|
|
76
|
+
- `provider`
|
|
77
|
+
- `description`
|
|
78
|
+
- `category`
|
|
79
|
+
- `authType`
|
|
80
|
+
- `isConnected`
|
|
81
|
+
- `isActive`
|
|
82
|
+
- `connectionId`
|
|
83
|
+
- `connectionMetadata`
|
|
84
|
+
- `lane`
|
|
85
|
+
- `objectType`
|
|
86
|
+
- `status`
|
|
87
|
+
- `authPath`
|
|
88
|
+
- `setupMode`
|
|
89
|
+
|
|
90
|
+
Use `growthub-bridge` when the user has existing hosted connections. Use `byo-api-key` only when the user explicitly needs local/provider-owned setup; that path is more manual but still composable. Windsor BYO setup is intentionally direct: set `WINDSOR_API_KEY` and the Windsor AI data pipeline object renders as connected.
|
|
91
|
+
|
|
92
|
+
## Real-world QA script
|
|
93
|
+
|
|
94
|
+
Run these before calling the kit v1-ready:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
growthub kit list --family studio --json
|
|
98
|
+
growthub kit download growthub-agency-portal-starter-v1 --out /tmp/agency-portal-qa --yes
|
|
99
|
+
growthub kit fork register /tmp/agency-portal-qa/growthub-agent-worker-kit-agency-portal-starter-v1
|
|
100
|
+
growthub kit fork status <fork-id>
|
|
101
|
+
cd /tmp/agency-portal-qa/growthub-agent-worker-kit-agency-portal-starter-v1
|
|
102
|
+
bash setup/check-deps.sh
|
|
103
|
+
node setup/verify-env.mjs
|
|
104
|
+
cd studio && npm install && npm run build
|
|
105
|
+
cd ../apps/agency-portal && npm install && npm run build
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Then open the app and verify `/settings/integrations`.
|
|
109
|
+
|
|
110
|
+
## Local-first workflow
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
bash setup/check-deps.sh
|
|
114
|
+
node setup/verify-env.mjs
|
|
115
|
+
cd studio && npm install && npm run dev
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The local operator shell must work without cloud deployment.
|
|
119
|
+
|
|
120
|
+
## Vercel workflow
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
cd apps/agency-portal
|
|
124
|
+
npm install
|
|
125
|
+
npm run dev
|
|
126
|
+
npm run build
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Vercel root directory: `apps/agency-portal`.
|
|
130
|
+
|
|
131
|
+
## Self-evaluation unit
|
|
132
|
+
|
|
133
|
+
The unit of work is one adapter contract change, one portal capability change, one deployment surface change, or one governed primitive change. Enforce `SKILL.md` `maxRetries: 3`.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Growthub Custom Workspace Starter</title>
|
|
7
|
+
</head>
|
|
8
|
+
<body>
|
|
9
|
+
<div id="root"></div>
|
|
10
|
+
<script type="module" src="/src/main.jsx"></script>
|
|
11
|
+
</body>
|
|
12
|
+
</html>
|