cohorte 2.10.1 → 3.0.0-dev.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.
- package/README.md +7 -0
- package/assets/manifest.json +193 -0
- package/assets/migrations/config/README.md +12 -0
- package/assets/migrations/state/0001_init.sql +154 -0
- package/assets/prompts/README.md +11 -0
- package/assets/prompts/agents/fixer.md +7 -0
- package/assets/prompts/agents/implementer.md +12 -0
- package/assets/prompts/agents/reviewer.md +8 -0
- package/assets/prompts/agents/security-reviewer.md +7 -0
- package/assets/prompts/phases/build.md +5 -0
- package/assets/prompts/phases/review.md +5 -0
- package/assets/prompts/phases/test.md +5 -0
- package/assets/prompts/system.md +11 -0
- package/assets/schemas/agent-output.schema.json +225 -0
- package/assets/schemas/auth-status.schema.json +87 -0
- package/assets/schemas/command-result.schema.json +192 -0
- package/assets/schemas/commands.schema.json +952 -0
- package/assets/schemas/config.schema.json +2259 -0
- package/assets/schemas/doctor-report.schema.json +104 -0
- package/assets/schemas/events.schema.json +8514 -0
- package/assets/schemas/fake-script.schema.json +549 -0
- package/assets/schemas/inspect.schema.json +3133 -0
- package/assets/schemas/manifest.schema.json +79 -0
- package/assets/schemas/ownership.schema.json +52 -0
- package/assets/schemas/policy-verdict.schema.json +282 -0
- package/assets/schemas/project-model.schema.json +783 -0
- package/assets/schemas/project-status.schema.json +217 -0
- package/assets/schemas/reconcile-plan.schema.json +155 -0
- package/assets/schemas/run-diff.schema.json +177 -0
- package/assets/schemas/run-snapshot-manifest.schema.json +2104 -0
- package/assets/schemas/run-state.schema.json +1755 -0
- package/assets/schemas/runtime-capabilities.schema.json +1545 -0
- package/assets/schemas/sandbox-capabilities.schema.json +116 -0
- package/assets/schemas/skill.schema.json +87 -0
- package/assets/schemas/spec.schema.json +202 -0
- package/assets/schemas/tool-catalogue.schema.json +655 -0
- package/assets/schemas/trust-record.schema.json +38 -0
- package/assets/skills/README.md +9 -0
- package/assets/skills/inspect-surface.md +4 -0
- package/dist/agent-host.mjs +50 -0
- package/dist/agent-host.mjs.map +1 -0
- package/dist/bundle-manifest.json +102 -0
- package/dist/chunks/__host-DgGPyco9.mjs +18 -0
- package/dist/chunks/__host-DgGPyco9.mjs.map +1 -0
- package/dist/chunks/approve-Cv135UqI.mjs +19 -0
- package/dist/chunks/approve-Cv135UqI.mjs.map +1 -0
- package/dist/chunks/auth-BT5oVp76.mjs +132 -0
- package/dist/chunks/auth-BT5oVp76.mjs.map +1 -0
- package/dist/chunks/auth-D8rCVY33.mjs +84 -0
- package/dist/chunks/auth-D8rCVY33.mjs.map +1 -0
- package/dist/chunks/brainstorm-CU10T1tm.mjs +7 -0
- package/dist/chunks/brainstorm-CU10T1tm.mjs.map +1 -0
- package/dist/chunks/cancel-KV_cpsqS.mjs +15 -0
- package/dist/chunks/cancel-KV_cpsqS.mjs.map +1 -0
- package/dist/chunks/canonical-C8UxeEmB.mjs +57 -0
- package/dist/chunks/canonical-C8UxeEmB.mjs.map +1 -0
- package/dist/chunks/catalogue-BvwSrM_j.mjs +1549 -0
- package/dist/chunks/catalogue-BvwSrM_j.mjs.map +1 -0
- package/dist/chunks/compose-Cr0hP0qm.mjs +7303 -0
- package/dist/chunks/compose-Cr0hP0qm.mjs.map +1 -0
- package/dist/chunks/config-DefHA2Lw.mjs +96 -0
- package/dist/chunks/config-DefHA2Lw.mjs.map +1 -0
- package/dist/chunks/contract-B0ra2-bm.mjs +295 -0
- package/dist/chunks/contract-B0ra2-bm.mjs.map +1 -0
- package/dist/chunks/contract-vYbwYr0Y.mjs +123 -0
- package/dist/chunks/contract-vYbwYr0Y.mjs.map +1 -0
- package/dist/chunks/deny-ClTxSvHJ.mjs +15 -0
- package/dist/chunks/deny-ClTxSvHJ.mjs.map +1 -0
- package/dist/chunks/diff-Qw0II0sj.mjs +101 -0
- package/dist/chunks/diff-Qw0II0sj.mjs.map +1 -0
- package/dist/chunks/discover-30Ciya_0.mjs +20 -0
- package/dist/chunks/discover-30Ciya_0.mjs.map +1 -0
- package/dist/chunks/doctor-DfCrKpfT.mjs +222 -0
- package/dist/chunks/doctor-DfCrKpfT.mjs.map +1 -0
- package/dist/chunks/fix-D4Tj8RVA.mjs +18 -0
- package/dist/chunks/fix-D4Tj8RVA.mjs.map +1 -0
- package/dist/chunks/gc-BBXlBF5w.mjs +161 -0
- package/dist/chunks/gc-BBXlBF5w.mjs.map +1 -0
- package/dist/chunks/init-Okz4mlhW.mjs +30 -0
- package/dist/chunks/init-Okz4mlhW.mjs.map +1 -0
- package/dist/chunks/inspect-Buby4cQD.mjs +22 -0
- package/dist/chunks/inspect-Buby4cQD.mjs.map +1 -0
- package/dist/chunks/logs-Giq5sUau.mjs +25 -0
- package/dist/chunks/logs-Giq5sUau.mjs.map +1 -0
- package/dist/chunks/migrate-DRoFUg53.mjs +19 -0
- package/dist/chunks/migrate-DRoFUg53.mjs.map +1 -0
- package/dist/chunks/models-Btp6X2YZ.mjs +24 -0
- package/dist/chunks/models-Btp6X2YZ.mjs.map +1 -0
- package/dist/chunks/pause-BASBfKLO.mjs +16 -0
- package/dist/chunks/pause-BASBfKLO.mjs.map +1 -0
- package/dist/chunks/policy-DUIgzF3W.mjs +139 -0
- package/dist/chunks/policy-DUIgzF3W.mjs.map +1 -0
- package/dist/chunks/providers-Dx78imKj.mjs +19 -0
- package/dist/chunks/providers-Dx78imKj.mjs.map +1 -0
- package/dist/chunks/reconcile-BfD785gd.mjs +26 -0
- package/dist/chunks/reconcile-BfD785gd.mjs.map +1 -0
- package/dist/chunks/render-DyZr5Lgi.mjs +53 -0
- package/dist/chunks/render-DyZr5Lgi.mjs.map +1 -0
- package/dist/chunks/resume-GJQRb2Eb.mjs +15 -0
- package/dist/chunks/resume-GJQRb2Eb.mjs.map +1 -0
- package/dist/chunks/retry-CLrUem1H.mjs +15 -0
- package/dist/chunks/retry-CLrUem1H.mjs.map +1 -0
- package/dist/chunks/review-BDdjb6kB.mjs +17 -0
- package/dist/chunks/review-BDdjb6kB.mjs.map +1 -0
- package/dist/chunks/run-CgTWYlcd.mjs +82 -0
- package/dist/chunks/run-CgTWYlcd.mjs.map +1 -0
- package/dist/chunks/run-tool-C3rAv4XF.mjs +26 -0
- package/dist/chunks/run-tool-C3rAv4XF.mjs.map +1 -0
- package/dist/chunks/schema-C9QbUW4H.mjs +578 -0
- package/dist/chunks/schema-C9QbUW4H.mjs.map +1 -0
- package/dist/chunks/send-BdnJ85Nz.mjs +19 -0
- package/dist/chunks/send-BdnJ85Nz.mjs.map +1 -0
- package/dist/chunks/ship-DTuLGoaJ.mjs +19 -0
- package/dist/chunks/ship-DTuLGoaJ.mjs.map +1 -0
- package/dist/chunks/shutdown-BM92Iyv2.mjs +15 -0
- package/dist/chunks/shutdown-BM92Iyv2.mjs.map +1 -0
- package/dist/chunks/skip-DZG5kpcH.mjs +18 -0
- package/dist/chunks/skip-DZG5kpcH.mjs.map +1 -0
- package/dist/chunks/spec-Bq0P3jVh.mjs +20 -0
- package/dist/chunks/spec-Bq0P3jVh.mjs.map +1 -0
- package/dist/chunks/src-CId6kMsY.mjs +1689 -0
- package/dist/chunks/src-CId6kMsY.mjs.map +1 -0
- package/dist/chunks/src-CfAOde7C.mjs +5403 -0
- package/dist/chunks/src-CfAOde7C.mjs.map +1 -0
- package/dist/chunks/src-Cu3TxNob.mjs +783 -0
- package/dist/chunks/src-Cu3TxNob.mjs.map +1 -0
- package/dist/chunks/src-DcU4IXMe.mjs +117 -0
- package/dist/chunks/src-DcU4IXMe.mjs.map +1 -0
- package/dist/chunks/src-JxawBQBn.mjs +446 -0
- package/dist/chunks/src-JxawBQBn.mjs.map +1 -0
- package/dist/chunks/src-s7YRvk0t.mjs +2116 -0
- package/dist/chunks/src-s7YRvk0t.mjs.map +1 -0
- package/dist/chunks/status-SMjiOMYy.mjs +29 -0
- package/dist/chunks/status-SMjiOMYy.mjs.map +1 -0
- package/dist/chunks/tail-BuhT-2PH.mjs +25 -0
- package/dist/chunks/tail-BuhT-2PH.mjs.map +1 -0
- package/dist/chunks/update-BXIppsbi.mjs +16 -0
- package/dist/chunks/update-BXIppsbi.mjs.map +1 -0
- package/dist/cli.mjs +175 -0
- package/dist/cli.mjs.map +1 -0
- package/package.json +17 -32
- package/CHANGELOG.md +0 -1461
- package/bin/cli.js +0 -817
- package/bin/report.js +0 -141
- package/core/adapter/render.js +0 -415
- package/core/agents/implementer.template.md +0 -142
- package/core/agents/profile-reader.md +0 -50
- package/core/agents/release.md +0 -58
- package/core/agents/review.md +0 -179
- package/core/commands/cohorte-align-ds.md +0 -33
- package/core/commands/cohorte-audit.md +0 -58
- package/core/commands/cohorte-brainstorm.md +0 -70
- package/core/commands/cohorte-build.md +0 -219
- package/core/commands/cohorte-doctor.md +0 -194
- package/core/commands/cohorte-fix.md +0 -80
- package/core/commands/cohorte-fleet.md +0 -103
- package/core/commands/cohorte-init-pipeline.md +0 -31
- package/core/commands/cohorte-intake.md +0 -92
- package/core/commands/cohorte-patch.md +0 -118
- package/core/commands/cohorte-refactor.md +0 -59
- package/core/commands/cohorte-retro.md +0 -85
- package/core/commands/cohorte-review.md +0 -270
- package/core/commands/cohorte-ship.md +0 -122
- package/core/commands/cohorte-spec.md +0 -101
- package/core/commands/cohorte-update-pipeline.md +0 -165
- package/core/hooks/gate.py +0 -588
- package/core/runtimes/claude.json +0 -74
- package/core/runtimes/codex.json +0 -85
- package/core/runtimes/cursor.json +0 -76
- package/core/runtimes/gemini.json +0 -76
- package/core/runtimes/opencode.json +0 -73
- package/core/templates/agent-handoff.md +0 -34
- package/core/templates/brainstorm-return.md +0 -36
- package/core/templates/decisions.template.md +0 -42
- package/core/templates/design-brief.md +0 -44
- package/core/templates/patch.template.md +0 -86
- package/core/templates/pr-body.md +0 -25
- package/core/templates/review-feedback.md +0 -38
- package/core/templates/spec.template.md +0 -87
- package/core/templates/steps/init-pipeline/01-detect-stack.md +0 -44
- package/core/templates/steps/init-pipeline/02-interview-gaps.md +0 -55
- package/core/templates/steps/init-pipeline/03-draft-profile.md +0 -10
- package/core/templates/steps/init-pipeline/04-write-render.md +0 -145
- package/core/templates/steps/init-pipeline/05-report.md +0 -12
- package/core/workflows/audit.js +0 -240
- package/core/workflows/loop.js +0 -641
- package/core/workflows/refactor.js +0 -276
- package/core/workflows/review.js +0 -456
- package/install.ps1 +0 -103
- package/install.sh +0 -114
- package/lib/doctor.js +0 -534
- package/lib/runtime.js +0 -139
- package/lib/versions.js +0 -149
- package/lib/yaml.js +0 -129
- package/profile/PIPELINE.template.md +0 -259
- package/profile/SCHEMA.md +0 -735
- package/profile/cohorte.config.template.yaml +0 -43
- package/scripts/assert-gate-hook.mjs +0 -75
- package/scripts/kanban-move.sh +0 -313
- package/scripts/metrics/collect.mjs +0 -531
- package/scripts/metrics/prices.json +0 -42
- package/scripts/new-feature.sh.template +0 -98
- package/scripts/preflight.sh +0 -124
- package/scripts/remove-feature.sh.template +0 -56
- package/scripts/test-adapter.mjs +0 -437
- package/scripts/test-gate.mjs +0 -443
- package/scripts/test-kanban.mjs +0 -304
- package/scripts/test-lib.mjs +0 -356
- package/scripts/test-metrics.mjs +0 -156
- package/scripts/test-workflows.mjs +0 -758
- package/scripts/validate-core.mjs +0 -325
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
# PIPELINE.md — <PROJECT_NAME> profile
|
|
2
|
-
|
|
3
|
-
> **Generated by `/cohorte-init-pipeline`.** This is the project profile: the single place the
|
|
4
|
-
> portable multi-agent pipeline reads for everything stack-specific. The pipeline core
|
|
5
|
-
> in the pipeline core is generic and references THIS file by section — keep project facts
|
|
6
|
-
> here, never hardcoded into agent prompts. Kept current by `/cohorte-update-pipeline` (reconcile:
|
|
7
|
-
> new fields are topped up, your values never overwritten). Rendered agent files are
|
|
8
|
-
> regenerated from this profile on every reconcile — customize agents through §Conventions
|
|
9
|
-
> here, never by editing the agent files. Free-form notes belong in `CLAUDE.md`.
|
|
10
|
-
>
|
|
11
|
-
> **Machine block first, prose after.** The fenced `yaml pipeline-profile` block below is
|
|
12
|
-
> the deterministic contract (flags, surfaces, commands) — commands parse it and branch on
|
|
13
|
-
> it. The prose sections carry conventions agents read.
|
|
14
|
-
|
|
15
|
-
```yaml pipeline-profile
|
|
16
|
-
# ── identity ────────────────────────────────────────────────────────────────
|
|
17
|
-
name: <PROJECT_NAME>
|
|
18
|
-
one_liner: <one sentence: what this product is>
|
|
19
|
-
ui_language: <English | French | …> # language of ALL user-facing copy
|
|
20
|
-
package_manager: <pnpm | npm | yarn | bun | pip | cargo | go>
|
|
21
|
-
|
|
22
|
-
# ── vcs ─────────────────────────────────────────────────────────────────────
|
|
23
|
-
vcs:
|
|
24
|
-
host: <github | gitlab | none>
|
|
25
|
-
remote: <owner/repo> # e.g. acme/webapp
|
|
26
|
-
default_branch: <main>
|
|
27
|
-
feature_branch_prefix: feature/ # branch = <prefix><feature_id>
|
|
28
|
-
patch_branch_prefix: fix/ # same, for /cohorte-patch specs (kind: patch)
|
|
29
|
-
|
|
30
|
-
# ── repo shape ──────────────────────────────────────────────────────────────
|
|
31
|
-
repo:
|
|
32
|
-
layout: <monorepo | single>
|
|
33
|
-
workspace_tool: <turborepo | nx | none>
|
|
34
|
-
|
|
35
|
-
# ── code retrieval (semantic navigation — cuts agent read time) ─────────────
|
|
36
|
-
# Agents prefer symbol/graph MCP queries over grep-and-read when a provider is
|
|
37
|
-
# wired. serena = live LSP symbol navigation (default, no index to maintain);
|
|
38
|
-
# graphify = persistent tree-sitter knowledge graph over code + docs (needs an
|
|
39
|
-
# index step + rescans); none = agents fall back to Grep/Glob/Read.
|
|
40
|
-
# Registered by /cohorte-init-pipeline in the runtime's project MCP configuration.
|
|
41
|
-
retrieval:
|
|
42
|
-
provider: serena # serena | graphify | none
|
|
43
|
-
|
|
44
|
-
# ── surfaces ────────────────────────────────────────────────────────────────
|
|
45
|
-
# One entry per independently-implemented code area. /cohorte-build dispatches ONE
|
|
46
|
-
# implementer agent per surface, in parallel. Each surface is rendered by
|
|
47
|
-
# /cohorte-init-pipeline into its own agent file (agent field) with the tools listed.
|
|
48
|
-
# This list GROWS automatically: /cohorte-build §1.5 adds a surface (and renders its
|
|
49
|
-
# agent) when a spec touches a tree no surface owns, or splits a bottleneck
|
|
50
|
-
# surface into specialized sub-surfaces. Keep one owner per tree; shared code
|
|
51
|
-
# (routing/state/DS) is its own single-owner surface. See SCHEMA.md §Specialization.
|
|
52
|
-
surfaces:
|
|
53
|
-
- key: backend # short id, used as agent name + scope
|
|
54
|
-
path: apps/api # the ONLY tree this surface's agent may touch
|
|
55
|
-
label: backend (AdonisJS)
|
|
56
|
-
agent: backend # rendered in the runtime's project agents dir
|
|
57
|
-
tools: [Read, Write, Edit, Bash, Grep, Glob, mcp__serena] # mcp__<provider> mirrors retrieval.provider
|
|
58
|
-
<!-- cohorte:if runtime:codex -->
|
|
59
|
-
model: inherit # omit the TOML model pin; explicit Codex models also allowed
|
|
60
|
-
<!-- cohorte:else -->
|
|
61
|
-
model: sonnet # frontmatter model tier: sonnet | haiku | inherit
|
|
62
|
-
# sonnet = default (applies the frozen contract — cheap
|
|
63
|
-
# vs the Opus lead); haiku = purely mechanical scaffolding;
|
|
64
|
-
# inherit = only for surfaces with real design decisions
|
|
65
|
-
<!-- cohorte:endif -->
|
|
66
|
-
test_cmd: pnpm --filter api test
|
|
67
|
-
# Bridled variants — what agents actually RUN (dot reporter / failures-only /
|
|
68
|
-
# --quiet), so a green run costs lines, not pages. "" ⇒ callers fall back to
|
|
69
|
-
# `<cmd> 2>&1 | tail -40`. /cohorte-init-pipeline asks for these; never store a bare
|
|
70
|
-
# `pnpm test` as the thing agents execute.
|
|
71
|
-
test_quiet_cmd: pnpm --filter api test --reporter=dot
|
|
72
|
-
lint_cmd: pnpm --filter api lint
|
|
73
|
-
lint_quiet_cmd: pnpm --filter api lint --quiet
|
|
74
|
-
format_cmd: pnpm --filter api format
|
|
75
|
-
typecheck_cmd: pnpm --filter api exec tsc --noEmit
|
|
76
|
-
build_cmd: ""
|
|
77
|
-
uses_design: false
|
|
78
|
-
- key: frontend
|
|
79
|
-
path: apps/web
|
|
80
|
-
label: frontend (React/TanStack)
|
|
81
|
-
agent: frontend
|
|
82
|
-
tools: [Read, Write, Edit, Bash, Grep, Glob, DesignSync, mcp__serena]
|
|
83
|
-
<!-- cohorte:if runtime:codex -->
|
|
84
|
-
model: inherit # use the session model unless explicitly configured
|
|
85
|
-
<!-- cohorte:else -->
|
|
86
|
-
model: sonnet # default even for design surfaces — designs + contract are
|
|
87
|
-
# frozen inputs the agent applies; `inherit` (bills at the
|
|
88
|
-
# lead's tier, often Opus) ONLY if this surface must make
|
|
89
|
-
# novel design decisions
|
|
90
|
-
<!-- cohorte:endif -->
|
|
91
|
-
test_cmd: pnpm --filter web test
|
|
92
|
-
test_quiet_cmd: pnpm --filter web test --reporter=dot
|
|
93
|
-
lint_cmd: pnpm --filter web lint
|
|
94
|
-
lint_quiet_cmd: pnpm --filter web lint --quiet
|
|
95
|
-
format_cmd: pnpm --filter web format
|
|
96
|
-
typecheck_cmd: pnpm check-types
|
|
97
|
-
build_cmd: pnpm --filter web build
|
|
98
|
-
uses_design: true
|
|
99
|
-
|
|
100
|
-
# ── contract (the only cross-surface sync channel) ──────────────────────────
|
|
101
|
-
contract:
|
|
102
|
-
enabled: <true | false> # false ⇒ no shared contract; skip §2 of /cohorte-build
|
|
103
|
-
mechanism: <shared-types-zod | openapi | protobuf | json-schema | none>
|
|
104
|
-
path: packages/shared-types/src # where <feature_id>.<ext> is authored
|
|
105
|
-
ext: ts
|
|
106
|
-
index: packages/shared-types/src/index.ts # barrel to export from, or "" if none
|
|
107
|
-
authored_by: lead # NEVER the implementer agents
|
|
108
|
-
|
|
109
|
-
# ── release notes (optional) ────────────────────────────────────────────────
|
|
110
|
-
# A per-feature release note the project's versioning tool consumes. When
|
|
111
|
-
# enabled, /cohorte-ship authors it BEFORE dispatching the release agent, so it
|
|
112
|
-
# ships inside the release commit. Repos whose CI fails a PR that lacks one
|
|
113
|
-
# (Changesets' `changeset` job) MUST set this — otherwise every ship goes red.
|
|
114
|
-
release_notes:
|
|
115
|
-
enabled: <true | false> # false ⇒ /cohorte-ship §2b is a no-op
|
|
116
|
-
tool: <changesets | none> # what consumes the file
|
|
117
|
-
dir: .changeset # where the note is authored
|
|
118
|
-
filename: "<feature_id>.md" # one file per feature
|
|
119
|
-
anchor_package: shared-types # sole key in the front-matter; a lockstep/fixed group propagates the bump
|
|
120
|
-
language: <ui_language | English> # language of the note's prose
|
|
121
|
-
forbid_levels: [] # bumps project policy refuses, e.g. [major] while 0.x
|
|
122
|
-
empty_cmd: "pnpm changeset --empty" # when no version should move; "" if the tool has no such escape hatch
|
|
123
|
-
ci_job: changeset # CI job that fails when the note is missing (name it so /cohorte-ship §5 recognizes the red)
|
|
124
|
-
guidance: | # rules the lead follows when writing the note (project policy)
|
|
125
|
-
major = the deploy needs an operator action; minor = a user-visible capability;
|
|
126
|
-
patch = fix/perf/refactor with no change of use. No client names, no internal
|
|
127
|
-
paths, no exploitable attack vector.
|
|
128
|
-
|
|
129
|
-
# ── repo-wide commands (root unless noted) ──────────────────────────────────
|
|
130
|
-
commands:
|
|
131
|
-
install: pnpm install
|
|
132
|
-
dev: pnpm dev
|
|
133
|
-
lint: pnpm lint
|
|
134
|
-
lint_quiet: pnpm lint --quiet # bridled variant (see surfaces[].*_quiet_cmd)
|
|
135
|
-
format: pnpm format
|
|
136
|
-
typecheck: pnpm check-types
|
|
137
|
-
test: pnpm test
|
|
138
|
-
test_quiet: pnpm test --reporter=dot # bridled variant — what the /cohorte-review preflight runs
|
|
139
|
-
# migration commands — omit / leave "" if the project has no DB migrations
|
|
140
|
-
migrate: "cd apps/api && node ace migration:run"
|
|
141
|
-
make_migration: "cd apps/api && node ace make:migration"
|
|
142
|
-
|
|
143
|
-
# ── rbac (optional) ─────────────────────────────────────────────────────────
|
|
144
|
-
rbac:
|
|
145
|
-
enabled: <true | false>
|
|
146
|
-
hierarchy: [super-admin, admin, editor, member] # highest → lowest, or []
|
|
147
|
-
note: "the platform must serve EVERY role, not just admins"
|
|
148
|
-
|
|
149
|
-
# ── design system (optional) ────────────────────────────────────────────────
|
|
150
|
-
design:
|
|
151
|
-
enabled: <true | false> # false ⇒ /cohorte-align-ds + design gates are no-ops
|
|
152
|
-
provider: <claude-design | figma | none>
|
|
153
|
-
design_system_project: <uuid-or-id> # the UI-kit source of truth
|
|
154
|
-
design_project: none # legacy fallback for bare-filename design_files only; keep `none` — new specs use full links that carry their own project, so nothing here goes stale on a DS rebuild
|
|
155
|
-
snapshot_dir: apps/web/design-reference # committed DS snapshot for /cohorte-align-ds diff
|
|
156
|
-
direction: design-to-code # NEVER push code→design for a curated DS
|
|
157
|
-
ui_kit_path: apps/web/src/components/ui
|
|
158
|
-
tokens_path: apps/web/src/index.css
|
|
159
|
-
|
|
160
|
-
# ── isolation / parallelism (optional) ──────────────────────────────────────
|
|
161
|
-
isolation:
|
|
162
|
-
enabled: <true | false> # false ⇒ features run in the main checkout
|
|
163
|
-
unit: git-worktree
|
|
164
|
-
db_per_worktree: <true | false>
|
|
165
|
-
db_name_pattern: "<name>_<id>" # e.g. myapp_<id>
|
|
166
|
-
port_base: { api: 3333, web: 5173 } # each worktree gets base+slot
|
|
167
|
-
compose_file: docker-compose.yml
|
|
168
|
-
registry: .worktrees/slots.tsv
|
|
169
|
-
|
|
170
|
-
# ── gate (drives the pipeline gate hook + permissions) ─────────────────────
|
|
171
|
-
# Confirm-first or hard-deny on dangerous Bash, inspecting the FULL command
|
|
172
|
-
# string (so chained `cd x && …` forms are caught).
|
|
173
|
-
gate:
|
|
174
|
-
# Three tiers. `deny` = always hard-blocked. `ask` = always confirm (branch-independent risk).
|
|
175
|
-
# `ask_on_default_branch` = confirm ONLY when the checked-out branch is `default_branch`; on
|
|
176
|
-
# feature branches these run freely. gate.py resolves the branch at run time (git rev-parse);
|
|
177
|
-
# unknown branch (no repo / detached) ⇒ gated, to stay safe. Keep git + docker here so agents
|
|
178
|
-
# move fast on feature branches but main stays protected.
|
|
179
|
-
default_branch: main # the protected branch (mirror vcs.default_branch)
|
|
180
|
-
deny: # never allowed, on any branch
|
|
181
|
-
- "node ace migration:fresh"
|
|
182
|
-
- "node ace migration:reset"
|
|
183
|
-
- "node ace migration:rollback"
|
|
184
|
-
- "node ace db:wipe"
|
|
185
|
-
ask: # always confirm, on any branch
|
|
186
|
-
- "node ace migration:run"
|
|
187
|
-
- "node ace db:"
|
|
188
|
-
- "psql"
|
|
189
|
-
ask_on_default_branch: # free on feature branches, confirm on default_branch
|
|
190
|
-
- "git commit"
|
|
191
|
-
- "git push"
|
|
192
|
-
- "git merge"
|
|
193
|
-
- "git rebase"
|
|
194
|
-
- "git reset"
|
|
195
|
-
- "docker compose"
|
|
196
|
-
# Phase gate: review dispatches require a fresh `preflight.ok` stamp,
|
|
197
|
-
# written by pipeline/scripts/preflight.sh when typecheck+lint+tests are green —
|
|
198
|
-
# gate.py "ask"s the dispatch when the stamp is missing, stale, or the code changed since.
|
|
199
|
-
# The stamp is local: keep `preflight.ok` gitignored, never committed.
|
|
200
|
-
preflight:
|
|
201
|
-
enabled: true
|
|
202
|
-
agents: [review] # subagent_types the stamp gates
|
|
203
|
-
max_age_minutes: 30
|
|
204
|
-
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
> **Note.** The **kanban** board link is **user-scoped** — NOT configured here. Its facts live in the
|
|
208
|
-
> consolidated user config (`~/.claude/cohorte.config.yaml`, or `~/.cohorte/cohorte.config.yaml` on
|
|
209
|
-
> a non-Claude runtime), read at runtime (the kanban board is keyed by this
|
|
210
|
-
> profile's `name`). This project profile only governs the dev pipeline (`/cohorte-brainstorm…/cohorte-ship`).
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## Conventions
|
|
215
|
-
|
|
216
|
-
> Read by the implementer + review agents. Keep these terse and rule-shaped; the machine
|
|
217
|
-
> block above holds the paths/commands they enforce against.
|
|
218
|
-
|
|
219
|
-
### Shared
|
|
220
|
-
|
|
221
|
-
- User-facing copy (API messages, UI text) in **<ui_language>**.
|
|
222
|
-
- <e.g. Zod v4 syntax `z.email()`/`z.uuid()`; ESM `.js` import extensions — project-specific>
|
|
223
|
-
|
|
224
|
-
### Surface: `backend` (`apps/api`)
|
|
225
|
-
|
|
226
|
-
- <one-action controllers · validator on every write · standardized response envelope · base model / UUID PK · `#`-alias imports · additive-only migrations · …>
|
|
227
|
-
|
|
228
|
-
### Surface: `frontend` (`apps/web`)
|
|
229
|
-
|
|
230
|
-
- <file-based routes with loaders/guards · domain `lib/api` modules over the shared client · design-system primitives, `cn()`+CVA · **mobile-first, fully responsive** · consume contract types, never redefine · …>
|
|
231
|
-
|
|
232
|
-
### Testing — strict TDD (red → green → refactor)
|
|
233
|
-
|
|
234
|
-
- <backend test runner + what a contract test must cover (status, validation, auth, payload) · DB isolation per test>
|
|
235
|
-
- <frontend test runner + what to cover (hooks, api modules, component behavior); note layout is not unit-testable>
|
|
236
|
-
|
|
237
|
-
---
|
|
238
|
-
|
|
239
|
-
## Design brief note (feeds `/cohorte-spec` §8 and Claude Design)
|
|
240
|
-
|
|
241
|
-
- <design system name + primitives to use · mobile-first · copy language · brand/theming constraints>
|
|
242
|
-
- A feature lists its design pages in the spec front-matter `design_files` as **full links** of the form
|
|
243
|
-
`https://claude.ai/design/p/<projectId>?file=<file>` — each carries its own project (`/p/<projectId>`)
|
|
244
|
-
and page (`?file=`), so an agent extracts both and reads it via `DesignSync get_file(<projectId>,
|
|
245
|
-
<file>)`. Paste the link at `/cohorte-build`'s design gate. No stored project id ⇒ a design-system rebuild
|
|
246
|
-
(new project) just means pasting the new links. (Bare file names are legacy, resolved in `design_project`.)
|
|
247
|
-
|
|
248
|
-
---
|
|
249
|
-
|
|
250
|
-
## Personas for `/cohorte-brainstorm` (optional — the panel)
|
|
251
|
-
|
|
252
|
-
<Panel members with a job AND a personality who challenge the idea from their angle and
|
|
253
|
-
disagree with each other. Include a role-coverage guard if `rbac.enabled`. Example:>
|
|
254
|
-
|
|
255
|
-
- **PM** (pragmatic, scope-cutting) — real value? what do we drop?
|
|
256
|
-
- **Skeptical senior engineer** (blunt) — feasibility, edge cases, tech debt.
|
|
257
|
-
- **UX/product designer** — mobile-first flows, accessibility, empty/error states.
|
|
258
|
-
- **Security & RBAC** (paranoid) — permission leaks, cross-tenant exposure, least privilege.
|
|
259
|
-
- <one persona per RBAC role so the feature serves every role, not just admins>
|