@firatcand/forge 0.1.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/ETHOS.md +81 -0
- package/LICENSE +21 -0
- package/README.md +134 -0
- package/agents/backend-dev.md +36 -0
- package/agents/code-reviewer.md +37 -0
- package/agents/db-architect.md +36 -0
- package/agents/design-reviewer.md +31 -0
- package/agents/devops-engineer.md +34 -0
- package/agents/frontend-dev.md +36 -0
- package/agents/learning-curator.md +35 -0
- package/agents/linear-syncer.md +36 -0
- package/agents/phase-gatekeeper.md +23 -0
- package/agents/product-decomposer.md +39 -0
- package/agents/qa-engineer.md +31 -0
- package/agents/security-auditor.md +34 -0
- package/bin/forge.js +368 -0
- package/lib/companions.js +67 -0
- package/lib/github-helpers.sh +148 -0
- package/lib/linear-helpers.sh +188 -0
- package/lib/paths.js +13 -0
- package/lib/tools.js +68 -0
- package/lib/validators.sh +284 -0
- package/lib/worktree-helpers.sh +136 -0
- package/package.json +53 -0
- package/skills/codex/SKILL.md +50 -0
- package/skills/decompose/SKILL.md +47 -0
- package/skills/draft-design/SKILL.md +55 -0
- package/skills/draft-prd/SKILL.md +47 -0
- package/skills/draft-spec/SKILL.md +42 -0
- package/skills/fix/SKILL.md +23 -0
- package/skills/forge/SKILL.md +87 -0
- package/skills/implement/SKILL.md +24 -0
- package/skills/ingest-spec/SKILL.md +46 -0
- package/skills/investigate/SKILL.md +26 -0
- package/skills/learn/SKILL.md +53 -0
- package/skills/phase-gate/SKILL.md +37 -0
- package/skills/pickup-task/SKILL.md +53 -0
- package/skills/plan-task/SKILL.md +22 -0
- package/skills/push-to-linear/SKILL.md +42 -0
- package/skills/qa/SKILL.md +22 -0
- package/skills/retro/SKILL.md +27 -0
- package/skills/review/SKILL.md +20 -0
- package/skills/setup-repo/SKILL.md +63 -0
- package/skills/ship/SKILL.md +34 -0
- package/skills/sync-status/SKILL.md +14 -0
- package/templates/BRIEF.template.md +34 -0
- package/templates/CLAUDE.project.template.md +37 -0
- package/templates/CRITICAL.template.md +11 -0
- package/templates/DESIGN.template.md +37 -0
- package/templates/PRD.template.md +30 -0
- package/templates/SPEC.template.md +49 -0
- package/templates/github-workflows/claude-issue.yml +27 -0
- package/templates/github-workflows/claude-pr-review.yml +22 -0
- package/templates/github-workflows/claude-scheduled.yml +23 -0
- package/templates/github-workflows/test.yml +18 -0
- package/templates/learning.template.md +14 -0
- package/templates/phases.template.yaml +45 -0
- package/templates/retro.template.md +27 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: push-to-linear
|
|
3
|
+
description: Push phases.yaml to Linear — creates project, cycles per phase, issues with depends_on relations. Lightweight; uses user's Linear MCP.
|
|
4
|
+
tools: Read, Edit
|
|
5
|
+
subagent: linear-syncer
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /push-to-linear
|
|
9
|
+
|
|
10
|
+
Delegate to the `linear-syncer` subagent.
|
|
11
|
+
|
|
12
|
+
## Preconditions
|
|
13
|
+
|
|
14
|
+
- `plans/phases.yaml` exists
|
|
15
|
+
- Linear MCP configured globally OR user has Linear API key
|
|
16
|
+
|
|
17
|
+
## If Linear MCP available
|
|
18
|
+
|
|
19
|
+
linear-syncer subagent uses MCP directly:
|
|
20
|
+
1. Create Linear project (or find existing if `linear_project_id` set)
|
|
21
|
+
2. For each phase: create a Linear Cycle
|
|
22
|
+
3. For each task: create issue with priority, estimate, parent (if any), and "blocked by" relations
|
|
23
|
+
4. Link Linear project to GitHub repo (enables native sync)
|
|
24
|
+
5. Update phases.yaml with `linear_project_id`, `linear_team_id`, and `linear_id` per task
|
|
25
|
+
|
|
26
|
+
## If no Linear MCP
|
|
27
|
+
|
|
28
|
+
Print phases.yaml in Linear-import-friendly format. Tell user:
|
|
29
|
+
- Open Linear → Import
|
|
30
|
+
- Paste the structured tasks
|
|
31
|
+
- Link the project to the GitHub repo manually in Linear settings
|
|
32
|
+
|
|
33
|
+
## Linear ↔ GitHub sync
|
|
34
|
+
|
|
35
|
+
Once linked:
|
|
36
|
+
- Branch `feat/{LINEAR-ID}-slug` auto-links to issue
|
|
37
|
+
- PR opened with `[LINEAR-ID]` in title → issue moves to "In Review"
|
|
38
|
+
- PR merged → issue moves to "Done"
|
|
39
|
+
|
|
40
|
+
## Output
|
|
41
|
+
|
|
42
|
+
Linear project URL. Confirmation that GH sync is active. Updated phases.yaml committed.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qa
|
|
3
|
+
description: Run test suite, browser checks, and verify acceptance criteria. Bootstrap test framework if missing.
|
|
4
|
+
tools: Bash(*), Read, Edit
|
|
5
|
+
subagent: qa-engineer
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /qa
|
|
9
|
+
|
|
10
|
+
Delegate to `qa-engineer` subagent.
|
|
11
|
+
|
|
12
|
+
## Process
|
|
13
|
+
|
|
14
|
+
1. Detect test framework — if absent, offer to bootstrap (Vitest + Playwright defaults)
|
|
15
|
+
2. Run unit + integration tests
|
|
16
|
+
3. For UI tasks: run Playwright on key flows from PRD
|
|
17
|
+
4. Verify acceptance criteria from Linear issue are met
|
|
18
|
+
5. Report failures; auto-suggest fixes for trivial ones
|
|
19
|
+
|
|
20
|
+
## Test-or-die enforcement
|
|
21
|
+
|
|
22
|
+
If task is a bug fix and there's no regression test, REFUSE to pass /qa. Generate the regression test first.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: retro
|
|
3
|
+
description: Write a phase retrospective. Auto-invoked by /phase-gate but can run standalone.
|
|
4
|
+
tools: Read, Write, Bash(git*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /retro
|
|
8
|
+
|
|
9
|
+
## Args
|
|
10
|
+
|
|
11
|
+
- `phase-{N}` (e.g., `phase-1`)
|
|
12
|
+
|
|
13
|
+
## Process
|
|
14
|
+
|
|
15
|
+
1. Gather data from Linear (closed tasks in cycle N) + git log (commits during cycle) + learnings written during cycle
|
|
16
|
+
2. Synthesize:
|
|
17
|
+
- What shipped (count + highlights)
|
|
18
|
+
- Cycle time avg
|
|
19
|
+
- Decisions made (with PR links)
|
|
20
|
+
- Scope changes from original phases.yaml
|
|
21
|
+
- Learnings (count + key ones)
|
|
22
|
+
- What to do differently next phase
|
|
23
|
+
3. Write to `docs/retros/phase-{N}.md` using `templates/retro.template.md`
|
|
24
|
+
|
|
25
|
+
## Output
|
|
26
|
+
|
|
27
|
+
Retro file path + 5-bullet summary printed to terminal.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review
|
|
3
|
+
description: Run code-reviewer, security-auditor (if CRITICAL.md path touched), and design-reviewer (if UI task) on current diff.
|
|
4
|
+
tools: Read, Bash(git*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /review
|
|
8
|
+
|
|
9
|
+
## Process
|
|
10
|
+
|
|
11
|
+
1. Run `git diff dev...HEAD` to get current diff
|
|
12
|
+
2. Always invoke `code-reviewer` subagent
|
|
13
|
+
3. If diff touches paths in CRITICAL.md, invoke `security-auditor`
|
|
14
|
+
4. If task type is "design" or "frontend", invoke `design-reviewer`
|
|
15
|
+
5. Aggregate findings; categorize by severity (block / improvement / nit)
|
|
16
|
+
6. Print summary; ask user to address blocks before /ship
|
|
17
|
+
|
|
18
|
+
## Output
|
|
19
|
+
|
|
20
|
+
Markdown summary of findings per reviewer, with file:line references.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-repo
|
|
3
|
+
description: Bootstrap the GitHub repo for a forge project — repo creation, branch protection, GitHub Environments, CI workflows, secrets configuration.
|
|
4
|
+
tools: Read, Write, Edit, Bash(gh*), Bash(git*)
|
|
5
|
+
subagent: devops-engineer
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /setup-repo
|
|
9
|
+
|
|
10
|
+
Delegate to the `devops-engineer` subagent.
|
|
11
|
+
|
|
12
|
+
## Preconditions
|
|
13
|
+
|
|
14
|
+
- `gh` CLI installed and authenticated
|
|
15
|
+
- spec/PRD.md exists
|
|
16
|
+
- Run from inside the project directory
|
|
17
|
+
|
|
18
|
+
## Steps (transparent — show each to user, don't hide)
|
|
19
|
+
|
|
20
|
+
1. **Verify gh CLI**: `gh auth status`
|
|
21
|
+
2. **Create repo**: `gh repo create [name] --private --source=. --remote=origin`
|
|
22
|
+
- Or skip if origin already exists
|
|
23
|
+
3. **Initial commit**: if no commits, commit current state to `main`
|
|
24
|
+
4. **Branch dev from main**: `git checkout -b dev && git push origin dev`
|
|
25
|
+
5. **Branch protection on main**:
|
|
26
|
+
- Require PR review (1)
|
|
27
|
+
- Require `test` status check
|
|
28
|
+
- No direct pushes
|
|
29
|
+
- No force pushes
|
|
30
|
+
6. **Branch protection on dev**:
|
|
31
|
+
- Require PR review (1)
|
|
32
|
+
- Require `test` status check
|
|
33
|
+
7. **GitHub Environments**:
|
|
34
|
+
- `development` (auto-deploy, no approval)
|
|
35
|
+
- `production` (manual approval)
|
|
36
|
+
8. **Copy CI workflows** from `templates/github-workflows/` to `.github/workflows/`:
|
|
37
|
+
- `claude-issue.yml`
|
|
38
|
+
- `claude-pr-review.yml`
|
|
39
|
+
- `test.yml`
|
|
40
|
+
- `claude-scheduled.yml`
|
|
41
|
+
9. **Generate `.env.example`** from SPEC.md env_vars list
|
|
42
|
+
10. **Setup Claude Code OAuth token**:
|
|
43
|
+
- Prompt user: `claude setup-token`
|
|
44
|
+
- Read token from clipboard or stdin
|
|
45
|
+
- Set as repo secret: `gh secret set CLAUDE_CODE_OAUTH_TOKEN`
|
|
46
|
+
11. **Commit and push**: `.github/`, updated `.env.example`
|
|
47
|
+
|
|
48
|
+
## Each step shown to user
|
|
49
|
+
|
|
50
|
+
Don't run all 11 steps silently. Print each:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
[1/11] Verifying gh CLI authentication... ✓
|
|
54
|
+
[2/11] Creating repo firatcand/time-logger... ✓
|
|
55
|
+
[3/11] Initial commit on main... ✓
|
|
56
|
+
...
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
User can interrupt at any step.
|
|
60
|
+
|
|
61
|
+
## Output
|
|
62
|
+
|
|
63
|
+
Repo URL + summary of what was configured. Branch protection rules summary. Workflow files list.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ship
|
|
3
|
+
description: Push branch, run final gates (tests, secrets scan, conventional commit), open PR with Linear issue ID, mark issue In Review.
|
|
4
|
+
tools: Bash(*), Read
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /ship
|
|
8
|
+
|
|
9
|
+
## Gates (all must pass)
|
|
10
|
+
|
|
11
|
+
1. **Tests**: `npm test` (or detected equivalent) passes
|
|
12
|
+
2. **Type check**: `npm run typecheck` (if applicable) passes
|
|
13
|
+
3. **Lint**: `npm run lint` (if applicable) passes
|
|
14
|
+
4. **Secrets scan**: `gitleaks detect` on the diff
|
|
15
|
+
5. **Conventional commit**: at least one commit on this branch follows `feat|fix|chore|docs(scope): message`
|
|
16
|
+
6. **Test-or-die**: new code has new tests; bug fixes have regression tests
|
|
17
|
+
7. **Multi-model review**: if diff touches CRITICAL.md paths, `/codex review` was run
|
|
18
|
+
|
|
19
|
+
If any gate fails, list what's missing. Do not proceed.
|
|
20
|
+
|
|
21
|
+
## Push and PR
|
|
22
|
+
|
|
23
|
+
1. `git push origin HEAD`
|
|
24
|
+
2. `gh pr create --base dev --title "[LINEAR-ID] {title from issue}" --body "{description}"`
|
|
25
|
+
3. PR body template:
|
|
26
|
+
- What changed (3-5 bullets)
|
|
27
|
+
- Why
|
|
28
|
+
- How to test
|
|
29
|
+
- Linked: closes #LINEAR-ID
|
|
30
|
+
4. Linear native sync: issue auto-moves to "In Review"
|
|
31
|
+
|
|
32
|
+
## Output
|
|
33
|
+
|
|
34
|
+
PR URL. Linear issue link. Reminder to run `/learn` if anything notable happened.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sync-status
|
|
3
|
+
description: Pull current Linear state and reconcile with local phases.yaml. Useful when issues were closed/reopened in Linear directly.
|
|
4
|
+
tools: Read, Edit
|
|
5
|
+
subagent: linear-syncer
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# /sync-status
|
|
9
|
+
|
|
10
|
+
Read `plans/phases.yaml`. For each task with a `linear_id`, query Linear for current status. Update `phases.yaml` task status fields if drifted.
|
|
11
|
+
|
|
12
|
+
Report any divergence to user (e.g., "TLOG-103 closed in Linear but local says Todo").
|
|
13
|
+
|
|
14
|
+
This isn't usually needed — Linear ↔ GitHub native sync handles most cases. Use when manual closes happen in Linear.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Brief
|
|
2
|
+
|
|
3
|
+
> Forged: {{ISO_DATE}}
|
|
4
|
+
> Status: draft (Gate 1 pending)
|
|
5
|
+
|
|
6
|
+
## The pain
|
|
7
|
+
<!-- REQUIRED: Synthesized from forge Q1. Concrete, not abstract. -->
|
|
8
|
+
|
|
9
|
+
## The user
|
|
10
|
+
<!-- REQUIRED: Specific persona. JTBD format: When ___, I want ___, so I ___. -->
|
|
11
|
+
|
|
12
|
+
## The unfair advantage
|
|
13
|
+
<!-- REQUIRED: From Q2. Honest list of what's defensible vs aspirational. -->
|
|
14
|
+
|
|
15
|
+
## The smallest valuable thing
|
|
16
|
+
<!-- REQUIRED: From Q3. 3-5 sentence v1 description. -->
|
|
17
|
+
|
|
18
|
+
## Non-goals
|
|
19
|
+
<!-- REQUIRED: From Q4. The trap list. At least 3 bullets. -->
|
|
20
|
+
-
|
|
21
|
+
-
|
|
22
|
+
-
|
|
23
|
+
|
|
24
|
+
## North-star metric
|
|
25
|
+
<!-- REQUIRED: From Q5. Single number with target value and timeframe. -->
|
|
26
|
+
|
|
27
|
+
## Kill criteria
|
|
28
|
+
<!-- REQUIRED: From Q6. Structured by horizon. -->
|
|
29
|
+
- At week 4:
|
|
30
|
+
- At week 12:
|
|
31
|
+
- At month 6:
|
|
32
|
+
|
|
33
|
+
## Open questions
|
|
34
|
+
<!-- Anything Q&A didn't fully resolve. Carry forward to /draft-prd. -->
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# {{PROJECT_NAME}}
|
|
2
|
+
|
|
3
|
+
## Stack
|
|
4
|
+
<!-- Auto-populated by /draft-spec — keep in sync with spec/SPEC.md -->
|
|
5
|
+
|
|
6
|
+
## Branch strategy
|
|
7
|
+
- `main` → production (protected, no direct push)
|
|
8
|
+
- `dev` → integration (protected, PRs only)
|
|
9
|
+
- `feat/{LINEAR-ID}-{slug}` → working branches in worktrees
|
|
10
|
+
|
|
11
|
+
## Commands
|
|
12
|
+
- Build: `npm run build`
|
|
13
|
+
- Test: `npm test`
|
|
14
|
+
- Type check: `npm run typecheck`
|
|
15
|
+
- Lint: `npm run lint`
|
|
16
|
+
- Dev: `npm run dev`
|
|
17
|
+
|
|
18
|
+
## Conventions
|
|
19
|
+
<!-- Project-specific. Examples: -->
|
|
20
|
+
- Functional components only, no class components
|
|
21
|
+
- Always handle errors explicitly — no silent catches
|
|
22
|
+
- New API routes must have input validation
|
|
23
|
+
- See `spec/` for full conventions
|
|
24
|
+
|
|
25
|
+
## Forge principles (auto-applied — see ~/.forge/ETHOS.md)
|
|
26
|
+
1. Boil the Lake — refuse weak inputs
|
|
27
|
+
2. Iron Law of Investigation — no fixes without RCA
|
|
28
|
+
3. Confusion Protocol — clarify, don't guess
|
|
29
|
+
4. Test-or-die — every PR ships with tests
|
|
30
|
+
5. Compound Learning — capture notable learnings
|
|
31
|
+
6. Multi-model Second Opinion — Codex on critical paths
|
|
32
|
+
7. Plan Mode Mandatory — no multi-file changes without /plan-task
|
|
33
|
+
8. 12-Factor Env Discipline — never commit secrets
|
|
34
|
+
|
|
35
|
+
## Critical paths
|
|
36
|
+
<!-- Files matching these patterns trigger /codex auto-review on /ship -->
|
|
37
|
+
See CRITICAL.md
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Files requiring multi-model review (/codex auto-triggers on /ship)
|
|
2
|
+
# Edit this list to match your project's critical paths
|
|
3
|
+
|
|
4
|
+
src/lib/auth/**
|
|
5
|
+
src/lib/billing/**
|
|
6
|
+
src/app/api/webhooks/**
|
|
7
|
+
src/app/api/auth/**
|
|
8
|
+
infrastructure/**
|
|
9
|
+
.github/workflows/**
|
|
10
|
+
prisma/schema.prisma
|
|
11
|
+
supabase/migrations/**
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — DESIGN
|
|
2
|
+
|
|
3
|
+
## Tokens
|
|
4
|
+
<!-- Reference brand assets via @inherit pattern. -->
|
|
5
|
+
|
|
6
|
+
@inherit ~/{{BRAND_PATH}}/DESIGN-SYSTEM.md#tokens
|
|
7
|
+
|
|
8
|
+
Project-specific overrides:
|
|
9
|
+
-
|
|
10
|
+
|
|
11
|
+
## Components
|
|
12
|
+
<!-- Reference primitives from design-system. List project-specific composites. -->
|
|
13
|
+
|
|
14
|
+
@inherit ~/{{BRAND_PATH}}/DESIGN-SYSTEM.md#components
|
|
15
|
+
|
|
16
|
+
Project additions:
|
|
17
|
+
-
|
|
18
|
+
|
|
19
|
+
## Layouts
|
|
20
|
+
<!-- Project-unique page templates. -->
|
|
21
|
+
|
|
22
|
+
## Voice & tone
|
|
23
|
+
@inherit ~/{{BRAND_PATH}}/VOICE.md
|
|
24
|
+
|
|
25
|
+
Project-specific calibration:
|
|
26
|
+
<!-- Any shifts from brand voice for this product context. -->
|
|
27
|
+
-
|
|
28
|
+
|
|
29
|
+
## Accessibility
|
|
30
|
+
- WCAG AA minimum
|
|
31
|
+
- AAA for text contrast
|
|
32
|
+
- All interactive elements have visible focus
|
|
33
|
+
- Keyboard navigation tested
|
|
34
|
+
- Screen reader patterns:
|
|
35
|
+
|
|
36
|
+
## States
|
|
37
|
+
<!-- For every interactive element: loading, error, empty, success. -->
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — PRD
|
|
2
|
+
|
|
3
|
+
## Problem
|
|
4
|
+
<!-- REQUIRED: Concrete pain, who feels it, when. -->
|
|
5
|
+
|
|
6
|
+
## Target user
|
|
7
|
+
<!-- REQUIRED: Specific persona, JTBD format. -->
|
|
8
|
+
|
|
9
|
+
## Acceptance Criteria (the MVP)
|
|
10
|
+
<!-- REQUIRED: Concrete, testable bullets. -->
|
|
11
|
+
- [ ] User can ___
|
|
12
|
+
- [ ] System enforces ___
|
|
13
|
+
- [ ] Performance: ___ in < ___ ms
|
|
14
|
+
- [ ] Accessibility: ___
|
|
15
|
+
|
|
16
|
+
## Explicit non-goals
|
|
17
|
+
<!-- REQUIRED: Must include all from BRIEF non-goals. -->
|
|
18
|
+
- Not building ___
|
|
19
|
+
- Out of scope: ___
|
|
20
|
+
|
|
21
|
+
## Success metrics
|
|
22
|
+
<!-- REQUIRED: Must include north-star from BRIEF. -->
|
|
23
|
+
- North-star: ___ (target value, timeframe)
|
|
24
|
+
- Leading indicators: ___, ___, ___
|
|
25
|
+
|
|
26
|
+
## Constraints
|
|
27
|
+
<!-- REQUIRED: Budget, timeline, regulatory, integration. -->
|
|
28
|
+
|
|
29
|
+
## User flows
|
|
30
|
+
<!-- For each primary flow: numbered steps + edge cases. -->
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — SPEC
|
|
2
|
+
|
|
3
|
+
## Stack
|
|
4
|
+
<!-- REQUIRED: All choices. -->
|
|
5
|
+
- Runtime:
|
|
6
|
+
- Frontend:
|
|
7
|
+
- Backend:
|
|
8
|
+
- Database:
|
|
9
|
+
- Hosting: ___ (dev) / ___ (prod)
|
|
10
|
+
- Auth:
|
|
11
|
+
|
|
12
|
+
## Data model
|
|
13
|
+
<!-- REQUIRED: Tables/collections with fields, relationships, indexes. -->
|
|
14
|
+
|
|
15
|
+
```sql
|
|
16
|
+
-- Pseudo-schema or actual DDL
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Key flows
|
|
20
|
+
<!-- For each primary user journey: -->
|
|
21
|
+
|
|
22
|
+
### Flow 1: ___
|
|
23
|
+
1. User ___
|
|
24
|
+
2. System ___
|
|
25
|
+
3. Edge cases: ___
|
|
26
|
+
|
|
27
|
+
## Integration points
|
|
28
|
+
<!-- External services: APIs, webhooks, queues. -->
|
|
29
|
+
|
|
30
|
+
## Security model
|
|
31
|
+
<!-- REQUIRED -->
|
|
32
|
+
- AuthN:
|
|
33
|
+
- AuthZ: ___ (RLS, RBAC, claims-based?)
|
|
34
|
+
- Sensitive data: ___ (encryption at rest, in transit)
|
|
35
|
+
- Rate limiting:
|
|
36
|
+
|
|
37
|
+
## Environment variables
|
|
38
|
+
<!-- REQUIRED: 12-Factor compliant. List with descriptions. -->
|
|
39
|
+
- `DATABASE_URL` —
|
|
40
|
+
- `API_KEY` —
|
|
41
|
+
|
|
42
|
+
## Performance targets
|
|
43
|
+
- p95 page load:
|
|
44
|
+
- p95 API response:
|
|
45
|
+
|
|
46
|
+
## Observability
|
|
47
|
+
- Logs:
|
|
48
|
+
- Metrics:
|
|
49
|
+
- Errors:
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: Claude — Issue Assistant
|
|
2
|
+
on:
|
|
3
|
+
issue_comment:
|
|
4
|
+
types: [created]
|
|
5
|
+
issues:
|
|
6
|
+
types: [opened, assigned]
|
|
7
|
+
pull_request_review_comment:
|
|
8
|
+
types: [created]
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
claude:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
if: |
|
|
14
|
+
contains(github.event.comment.body, '@claude') ||
|
|
15
|
+
(github.event.action == 'assigned' && github.event.assignee.login == 'claude-bot')
|
|
16
|
+
permissions:
|
|
17
|
+
contents: write
|
|
18
|
+
pull-requests: write
|
|
19
|
+
issues: write
|
|
20
|
+
steps:
|
|
21
|
+
- uses: actions/checkout@v4
|
|
22
|
+
with:
|
|
23
|
+
fetch-depth: 0
|
|
24
|
+
- uses: anthropics/claude-code-action@v1
|
|
25
|
+
with:
|
|
26
|
+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
27
|
+
allowed_tools: "Edit,Read,Bash(git*),Bash(npm run*),Bash(npx tsc*)"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
name: Claude — PR Security Review
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
types: [opened, synchronize]
|
|
5
|
+
branches: [dev, main]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
security-review:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
pull-requests: write
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
with:
|
|
16
|
+
fetch-depth: 0
|
|
17
|
+
ref: ${{ github.event.pull_request.head.sha }}
|
|
18
|
+
- uses: anthropics/claude-code-security-review@main
|
|
19
|
+
with:
|
|
20
|
+
comment-pr: true
|
|
21
|
+
claude-api-key: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
22
|
+
fail-on-findings: false
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
name: Claude — Scheduled Tasks
|
|
2
|
+
on:
|
|
3
|
+
schedule:
|
|
4
|
+
- cron: '0 9 * * 1' # Mondays 9am UTC
|
|
5
|
+
workflow_dispatch:
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
tech-debt:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
contents: write
|
|
12
|
+
pull-requests: write
|
|
13
|
+
issues: write
|
|
14
|
+
steps:
|
|
15
|
+
- uses: actions/checkout@v4
|
|
16
|
+
- uses: anthropics/claude-code-action@v1
|
|
17
|
+
with:
|
|
18
|
+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
19
|
+
prompt: |
|
|
20
|
+
Review the codebase for tech debt: duplicated code, dead code,
|
|
21
|
+
outdated dependencies, missing tests on critical paths.
|
|
22
|
+
Create branch chore/tech-debt-{date}, propose fixes, open PR to dev.
|
|
23
|
+
allowed_tools: "Edit,Read,Bash(git*),Bash(npm run*)"
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
branches: [dev, main]
|
|
5
|
+
|
|
6
|
+
jobs:
|
|
7
|
+
test:
|
|
8
|
+
runs-on: ubuntu-latest
|
|
9
|
+
steps:
|
|
10
|
+
- uses: actions/checkout@v4
|
|
11
|
+
- uses: actions/setup-node@v4
|
|
12
|
+
with:
|
|
13
|
+
node-version: '20'
|
|
14
|
+
cache: 'npm'
|
|
15
|
+
- run: npm ci
|
|
16
|
+
- run: npm run typecheck
|
|
17
|
+
- run: npm run lint
|
|
18
|
+
- run: npm test
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
project: "{{PROJECT_NAME}}"
|
|
2
|
+
linear_project_id: "" # populated by /push-to-linear
|
|
3
|
+
linear_team_id: "" # populated by /push-to-linear
|
|
4
|
+
github_repo: "" # populated by /setup-repo
|
|
5
|
+
gate_check_command: "npm run e2e && npm run typecheck && npm run lint"
|
|
6
|
+
|
|
7
|
+
phases:
|
|
8
|
+
- id: phase-1
|
|
9
|
+
name: "Foundations"
|
|
10
|
+
status: active
|
|
11
|
+
goal: "Working skeleton end-to-end with seed data"
|
|
12
|
+
gate_criteria:
|
|
13
|
+
- "All P0 + P1 tasks closed in Linear"
|
|
14
|
+
- "Dev deploy succeeds"
|
|
15
|
+
- "No P0 bugs open"
|
|
16
|
+
tasks:
|
|
17
|
+
- id: P1-T01
|
|
18
|
+
linear_id: "" # populated by /push-to-linear
|
|
19
|
+
title: ""
|
|
20
|
+
description: ""
|
|
21
|
+
type: foundation
|
|
22
|
+
priority: P0
|
|
23
|
+
depends_on: []
|
|
24
|
+
estimate: M
|
|
25
|
+
owner_type: backend-dev
|
|
26
|
+
acceptance:
|
|
27
|
+
- ""
|
|
28
|
+
|
|
29
|
+
- id: phase-2
|
|
30
|
+
name: "Core Features"
|
|
31
|
+
status: blocked
|
|
32
|
+
blocked_by: phase-1
|
|
33
|
+
goal: ""
|
|
34
|
+
gate_criteria:
|
|
35
|
+
- ""
|
|
36
|
+
tasks: []
|
|
37
|
+
|
|
38
|
+
- id: phase-3
|
|
39
|
+
name: "Polish & Launch"
|
|
40
|
+
status: blocked
|
|
41
|
+
blocked_by: phase-2
|
|
42
|
+
goal: ""
|
|
43
|
+
gate_criteria:
|
|
44
|
+
- ""
|
|
45
|
+
tasks: []
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# {{PROJECT_NAME}} — Phase {{N}} Retro
|
|
2
|
+
> Closed: {{ISO_DATE}}
|
|
3
|
+
|
|
4
|
+
## What shipped
|
|
5
|
+
- {{COUNT}} tasks closed
|
|
6
|
+
- Highlights:
|
|
7
|
+
|
|
8
|
+
## Cycle metrics
|
|
9
|
+
- Avg cycle time: {{AVG_HOURS}} hours
|
|
10
|
+
- Tasks at P0: {{P0_COUNT}}
|
|
11
|
+
- Bugs found post-merge: {{BUG_COUNT}}
|
|
12
|
+
|
|
13
|
+
## Decisions made
|
|
14
|
+
- {{DECISION}} (PR #{{PR}})
|
|
15
|
+
|
|
16
|
+
## Scope changes from original phases.yaml
|
|
17
|
+
- Added:
|
|
18
|
+
- Removed:
|
|
19
|
+
- Re-prioritized:
|
|
20
|
+
|
|
21
|
+
## Learnings harvested
|
|
22
|
+
- `docs/learnings/{{Q}}/{{LEARNING_SLUG}}.md`
|
|
23
|
+
|
|
24
|
+
## Different next phase
|
|
25
|
+
1.
|
|
26
|
+
2.
|
|
27
|
+
3.
|