@izkac/forgekit 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.
Files changed (143) hide show
  1. package/bin/forge.mjs +100 -0
  2. package/bin/forgekit.mjs +84 -0
  3. package/bin/review.mjs +82 -0
  4. package/package.json +46 -0
  5. package/scripts/prepack.mjs +78 -0
  6. package/scripts/run-tests.mjs +43 -0
  7. package/src/adr.mjs +236 -0
  8. package/src/adr.test.mjs +170 -0
  9. package/src/change.mjs +234 -0
  10. package/src/change.test.mjs +83 -0
  11. package/src/cleanup-sessions.mjs +70 -0
  12. package/src/config.mjs +103 -0
  13. package/src/defer.mjs +75 -0
  14. package/src/doctor.mjs +341 -0
  15. package/src/doctor.test.mjs +114 -0
  16. package/src/init.mjs +575 -0
  17. package/src/install.mjs +777 -0
  18. package/src/install.test.mjs +104 -0
  19. package/src/integrity-check.mjs +58 -0
  20. package/src/integrity.mjs +317 -0
  21. package/src/integrity.test.mjs +296 -0
  22. package/src/lib/workspaces.mjs +55 -0
  23. package/src/lib.mjs +138 -0
  24. package/src/models.defaults.json +41 -0
  25. package/src/new-session.mjs +82 -0
  26. package/src/openspec-overlays/README.md +19 -0
  27. package/src/openspec-overlays/openspec-apply-change-footer.md +14 -0
  28. package/src/openspec-overlays/opsx-apply-completion-step.md +1 -0
  29. package/src/openspec-overlays/opsx-apply-implement-step.md +11 -0
  30. package/src/paths.mjs +92 -0
  31. package/src/plan-engine.mjs +260 -0
  32. package/src/plan-engine.test.mjs +245 -0
  33. package/src/preferences.defaults.json +78 -0
  34. package/src/preferences.mjs +438 -0
  35. package/src/preferences.test.mjs +174 -0
  36. package/src/record-evidence.mjs +204 -0
  37. package/src/record-evidence.test.mjs +260 -0
  38. package/src/resolve-model.mjs +312 -0
  39. package/src/resolve-model.test.mjs +194 -0
  40. package/src/review/carryforward.mjs +413 -0
  41. package/src/review/carryforward.test.mjs +587 -0
  42. package/src/review/cli.test.mjs +117 -0
  43. package/src/review/export.mjs +172 -0
  44. package/src/review/export.test.mjs +197 -0
  45. package/src/review/fixtures/valid-review.json +42 -0
  46. package/src/review/lib.mjs +894 -0
  47. package/src/review/lib.test.mjs +266 -0
  48. package/src/review/merge-tentative.mjs +292 -0
  49. package/src/review/merge-tentative.test.mjs +363 -0
  50. package/src/review/new-review.mjs +200 -0
  51. package/src/review/render.mjs +108 -0
  52. package/src/review/schema-consistency.test.mjs +83 -0
  53. package/src/review/schema.json +196 -0
  54. package/src/review/signals.mjs +144 -0
  55. package/src/review/signals.test.mjs +62 -0
  56. package/src/score-cli.mjs +68 -0
  57. package/src/score.mjs +489 -0
  58. package/src/score.test.mjs +253 -0
  59. package/src/session-reminder.mjs +168 -0
  60. package/src/session-status.mjs +70 -0
  61. package/src/set-models.mjs +186 -0
  62. package/src/set-phase.mjs +177 -0
  63. package/src/set-phase.test.mjs +317 -0
  64. package/src/set-prefs.mjs +294 -0
  65. package/src/spine.mjs +91 -0
  66. package/src/triage-prompt.mjs +175 -0
  67. package/src/triage-prompt.test.mjs +50 -0
  68. package/src/vendor-openspec-overlays.mjs +176 -0
  69. package/src/vendor-openspec-overlays.test.mjs +62 -0
  70. package/vendor/skills/archive-to-adr/SKILL.md +149 -0
  71. package/vendor/skills/forge/SKILL.md +136 -0
  72. package/vendor/skills/forge/phases/brainstorm.md +23 -0
  73. package/vendor/skills/forge/phases/finish.md +87 -0
  74. package/vendor/skills/forge/phases/implement.md +76 -0
  75. package/vendor/skills/forge/phases/plan-openspec.md +40 -0
  76. package/vendor/skills/forge/phases/plan-specs.md +97 -0
  77. package/vendor/skills/forge/phases/review.md +25 -0
  78. package/vendor/skills/forge/phases/verify.md +120 -0
  79. package/vendor/skills/forge/references/forge-layout.md +85 -0
  80. package/vendor/skills/forge/references/pace.md +115 -0
  81. package/vendor/skills/forge/references/plan-routing.md +51 -0
  82. package/vendor/skills/forge/references/runtime-integrity.md +157 -0
  83. package/vendor/skills/forge/references/substantial-work.md +37 -0
  84. package/vendor/skills/forge/references/tdd-core.md +29 -0
  85. package/vendor/skills/forge/references/test-evidence.md +30 -0
  86. package/vendor/skills/forge/references/test-strategy.md +68 -0
  87. package/vendor/skills/forge/skills/NOTICE.md +17 -0
  88. package/vendor/skills/forge/skills/brainstorming/SKILL.md +120 -0
  89. package/vendor/skills/forge/skills/requesting-code-review/SKILL.md +67 -0
  90. package/vendor/skills/forge/skills/requesting-code-review/code-reviewer.md +146 -0
  91. package/vendor/skills/forge/skills/subagent-driven-development/SKILL.md +87 -0
  92. package/vendor/skills/forge/skills/systematic-debugging/SKILL.md +234 -0
  93. package/vendor/skills/forge/skills/systematic-debugging/condition-based-waiting.md +115 -0
  94. package/vendor/skills/forge/skills/systematic-debugging/defense-in-depth.md +122 -0
  95. package/vendor/skills/forge/skills/systematic-debugging/find-polluter.sh +63 -0
  96. package/vendor/skills/forge/skills/systematic-debugging/root-cause-tracing.md +169 -0
  97. package/vendor/skills/forge/skills/test-driven-development/SKILL.md +290 -0
  98. package/vendor/skills/forge/skills/test-driven-development/testing-anti-patterns.md +299 -0
  99. package/vendor/skills/forge/skills/verification-before-completion/SKILL.md +59 -0
  100. package/vendor/skills/forge/subagents/final-reviewer-prompt.md +53 -0
  101. package/vendor/skills/forge/subagents/implementer-prompt.md +38 -0
  102. package/vendor/skills/forge/subagents/task-reviewer-prompt.md +61 -0
  103. package/vendor/skills/git-resolve-adr-conflict/SKILL.md +132 -0
  104. package/vendor/skills/thorough-code-review/SKILL.md +290 -0
  105. package/vendor/skills/thorough-code-review/examples/accepted-risks-janus.md +32 -0
  106. package/vendor/skills/thorough-code-review/examples.md +133 -0
  107. package/vendor/skills/thorough-code-review/reference/accepted-risks.md +26 -0
  108. package/vendor/skills/thorough-code-review/reference/lenses.md +96 -0
  109. package/vendor/skills/thorough-code-review/reference/phase1-scout.md +62 -0
  110. package/vendor/skills/thorough-code-review/reference/phase1c-coverage.md +44 -0
  111. package/vendor/skills/thorough-code-review/reference/phase2-skeptic.md +105 -0
  112. package/vendor/skills/thorough-code-review/reference/report-schema.json +222 -0
  113. package/vendor/skills/thorough-code-review/reference/report-template.md +115 -0
  114. package/vendor/skills/thorough-code-review/reference/severity-rubric.md +49 -0
  115. package/vendor/skills/thorough-code-review/reference/signals-preflight.md +55 -0
  116. package/vendor/templates/adr/README.md +7 -0
  117. package/vendor/templates/adr/decisions.md +141 -0
  118. package/vendor/templates/adr/hooks/check-pending-adrs.mjs +74 -0
  119. package/vendor/templates/adr/hooks/check-pending-adrs.sh +3 -0
  120. package/vendor/templates/adr/hooks/openspec-archive-agent-message.mjs +52 -0
  121. package/vendor/templates/adr/hooks/openspec-archive-agent-message.sh +3 -0
  122. package/vendor/templates/project/claude/commands/forge-apply.md +75 -0
  123. package/vendor/templates/project/claude/commands/forge-brainstorm.md +7 -0
  124. package/vendor/templates/project/claude/commands/forge-build.md +17 -0
  125. package/vendor/templates/project/claude/commands/forge-plan.md +12 -0
  126. package/vendor/templates/project/claude/commands/forge-skip.md +14 -0
  127. package/vendor/templates/project/claude/commands/forge-status.md +16 -0
  128. package/vendor/templates/project/claude/commands/forge.md +16 -0
  129. package/vendor/templates/project/claude/hooks/forge-prompt-hook.mjs +73 -0
  130. package/vendor/templates/project/claude/hooks/forge-session-start.mjs +19 -0
  131. package/vendor/templates/project/claude/hooks/forge-triage-hook.mjs +77 -0
  132. package/vendor/templates/project/claude/rules/forge.md +16 -0
  133. package/vendor/templates/project/codex/rules/forge.md +10 -0
  134. package/vendor/templates/project/cursor/commands/forge-apply.md +75 -0
  135. package/vendor/templates/project/cursor/commands/forge-brainstorm.md +10 -0
  136. package/vendor/templates/project/cursor/commands/forge-build.md +17 -0
  137. package/vendor/templates/project/cursor/commands/forge-plan.md +15 -0
  138. package/vendor/templates/project/cursor/commands/forge-skip.md +14 -0
  139. package/vendor/templates/project/cursor/commands/forge-status.md +16 -0
  140. package/vendor/templates/project/cursor/commands/forge.md +16 -0
  141. package/vendor/templates/project/cursor/hooks/forge-session-start.mjs +30 -0
  142. package/vendor/templates/project/cursor/hooks/forge-session-start.sh +3 -0
  143. package/vendor/templates/project/cursor/rules/forge.mdc +21 -0
@@ -0,0 +1,75 @@
1
+ ---
2
+ name: /forge:apply
3
+ id: forge-apply
4
+ category: Workflow
5
+ description: Forge — apply a tracked change with subagent TDD, verify, and review
6
+ ---
7
+
8
+ **Forge-owned command.** Use this instead of bare `/opsx:apply` for disciplined implementation of a tracked change (OpenSpec or built-in specs engine — `.forge/config.json` → `plan.engine`).
9
+
10
+ Read the Forge skill (`~/.cursor/skills/forge/SKILL.md`) and forgekit `docs/forge.md`.
11
+
12
+ **Input**: Optionally specify a change name (e.g., `/forge:apply add-auth`). If omitted, infer from context or active Forge session.
13
+
14
+ ## 0. Forge session
15
+
16
+ 1. Announce: "Using Forge apply."
17
+ 2. Resume `.forge/active.json` or bootstrap: `forge new <slug>`
18
+ 3. Set phase (use the project's engine as plan-type):
19
+ ```bash
20
+ forge phase implement --plan-type openspec|specs --openspec "<change>"
21
+ ```
22
+
23
+ ## 1–5. Load the change
24
+
25
+ **OpenSpec engine** — vendor CLI, follow `openspec-apply-change` (same as `/opsx:apply` steps 1–5):
26
+
27
+ 1. **Select the change** — announce "Using change: \<name\>"
28
+ 2. `openspec status --change "<name>" --json`
29
+ 3. `openspec instructions apply --change "<name>" --json`
30
+ 4. Read all `contextFiles` from CLI output
31
+ 5. Show progress (N/M tasks, schema, remaining tasks)
32
+
33
+ Handle blocked / all_done states per vendor skill before implementing.
34
+
35
+ **Specs engine** — no CLI:
36
+
37
+ 1. **Select the change** under `specs/changes/<name>/` — announce "Using change: \<name\>"
38
+ 2. Read `proposal.md`, `design.md` (if present), `tasks.md`
39
+ 3. Show progress (N/M checkboxes, remaining tasks)
40
+
41
+ ## 6. Implement (Forge — REQUIRED)
42
+
43
+ Follow ~/.cursor/skills/forge/phases/implement.md`:
44
+
45
+ - **Do not** implement all tasks inline in coordinator context
46
+ - Per pending task: brief → **implementer** subagent (TDD first) → **spec reviewer** → **quality reviewer** → mark `- [x]` in `tasks.md`
47
+ - Bundled skills: `skills/subagent-driven-development` + `skills/test-driven-development`
48
+
49
+ Pause on unclear tasks, design issues, errors, or user interrupt.
50
+
51
+ ## 7. Verify (Forge — REQUIRED when all tasks done)
52
+
53
+ Follow ~/.cursor/skills/forge/phases/verify.md`:
54
+
55
+ ```bash
56
+ forge phase verify
57
+ ```
58
+
59
+ Run affected workspace tests — **audit per-task `test-evidence.md`**; do not re-run the same commands if subagents already recorded passing runs (see verify phase).
60
+
61
+ ## 8. Review (Forge — REQUIRED)
62
+
63
+ Follow ~/.cursor/skills/forge/phases/review.md`:
64
+
65
+ ```bash
66
+ forge phase review
67
+ ```
68
+
69
+ Final reviewer; save to `.forge/sessions/<id>/reviews/final-review.md`.
70
+
71
+ ## 9. Finish
72
+
73
+ When verify + review pass: suggest archive — `/opsx:archive` (OpenSpec) or the dated move into `specs/changes/archive/` (specs) — per [finish phase](~/.cursor/skills/forge/phases/finish.md).
74
+
75
+ **Skip Forge for this task only:** `/forge:skip` (runs work without brainstorm/plan/verify chain).
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: /forge:brainstorm
3
+ id: forge-brainstorm
4
+ category: Workflow
5
+ description: Forge — brainstorm phase only
6
+ ---
7
+
8
+ Brainstorm phase only. Follow ~/.cursor/skills/forge/phases/brainstorm.md`.
9
+
10
+ Invoke bundled **skills/brainstorming** (see forge skill). Save notes to `.forge/sessions/<id>/brainstorm/`. Terminal state: **OpenSpec propose** (`/opsx:propose`) — do not implement until artefacts are approved.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: /forge:build
3
+ id: forge-build
4
+ category: Workflow
5
+ description: Forge — implement phase (subagent-driven + TDD)
6
+ ---
7
+
8
+ Implement phase. Follow ~/.cursor/skills/forge/phases/implement.md`.
9
+
10
+ **REQUIRED:** forge `skills/subagent-driven-development` + `skills/test-driven-development` per task.
11
+
12
+ - OpenSpec plan → **`/forge:apply`** (preferred) or `openspec-apply-change` / `/opsx:apply` wrapped in subagent loop
13
+ - Specs plan (`planType: specs`) → **`/forge:apply`** — tasks from `specs/changes/<name>/tasks.md`, no vendor CLI steps
14
+ - Throwaway plan → tasks from `.forge/.../plan.md`
15
+ - Direct → brief from `.forge/.../brainstorm/notes.md` + `decisions.md`
16
+
17
+ Then verify and review phases.
@@ -0,0 +1,15 @@
1
+ ---
2
+ name: /forge:plan
3
+ id: forge-plan
4
+ category: Workflow
5
+ description: Forge — plan phase (tracked change propose)
6
+ ---
7
+
8
+ Plan phase. Follow ~/.cursor/skills/forge/references/plan-routing.md`.
9
+
10
+ **Engine from `.forge/config.json` → `plan.engine`** — do not ask for a plan mode:
11
+
12
+ - `openspec` → run `/opsx:propose <prefix>-<slug>` or the `openspec-propose` skill per [plan-openspec.md](~/.cursor/skills/forge/phases/plan-openspec.md)
13
+ - `specs` → author `specs/changes/<name>/{proposal,tasks}.md` per [plan-specs.md](~/.cursor/skills/forge/phases/plan-specs.md)
14
+
15
+ Get user approval on the change artefacts before `/forge:build` or `/forge:apply`.
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: /forge:skip
3
+ id: forge-skip
4
+ category: Workflow
5
+ description: Explicitly skip Forge for this task
6
+ ---
7
+
8
+ User opted out of Forge for **this task only**.
9
+
10
+ 1. If active session exists: `forge phase skipped`
11
+ 2. Do **not** brainstorm or plan
12
+ 3. Execute the request under normal project rules
13
+
14
+ Triage defaults to Forge; `/forge:skip` is the explicit override.
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: /forge:status
3
+ id: forge-status
4
+ category: Workflow
5
+ description: Forge — show active session progress
6
+ ---
7
+
8
+ Show Forge session status:
9
+
10
+ ```bash
11
+ forge status
12
+ ```
13
+
14
+ Summarize `phase`, `planType`, `openspecChange`, and task progress for the user.
15
+
16
+ Reference: forgekit `docs/forge.md`
@@ -0,0 +1,16 @@
1
+ ---
2
+ name: /forge
3
+ id: forge
4
+ category: Workflow
5
+ description: Forge — start or resume disciplined development (brainstorm → plan → build → review)
6
+ ---
7
+
8
+ Run the **Forge** workflow for substantial work.
9
+
10
+ Read and follow the Forge skill (`~/.cursor/skills/forge/SKILL.md`) and forgekit `docs/forge.md`.
11
+
12
+ 1. Triage — substantial work? (skip only if user said `/forge:skip`)
13
+ 2. Resume from `.forge/active.json` or `forge new <slug>`
14
+ 3. Continue from current `phase` in `session.json`
15
+
16
+ Subcommands: `/forge:brainstorm`, `/forge:plan`, `/forge:apply`, `/forge:build`, `/forge:status`, `/forge:skip`
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cursor sessionStart: remind when a Forge session is active (.forge/active.json).
4
+ */
5
+
6
+ import { spawnSync } from 'node:child_process';
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+
10
+ function gitRoot() {
11
+ const r = spawnSync('git', ['rev-parse', '--show-toplevel'], {
12
+ encoding: 'utf8',
13
+ shell: process.platform === 'win32',
14
+ });
15
+ if (r.status !== 0) return null;
16
+ return String(r.stdout || '').trim() || null;
17
+ }
18
+
19
+ const root = gitRoot();
20
+ if (!root) process.exit(0);
21
+
22
+ if (!fs.existsSync(path.join(root, '.forge', 'active.json'))) process.exit(0);
23
+
24
+ const reminder = spawnSync('forge', ['reminder', '--format', 'cursor'], {
25
+ cwd: root,
26
+ encoding: 'utf8',
27
+ shell: process.platform === 'win32',
28
+ stdio: ['ignore', 'inherit', 'ignore'],
29
+ });
30
+ process.exit(reminder.status === 0 ? 0 : 0);
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bash
2
+ # Thin wrapper — prefer the Node implementation on Windows-friendly hosts.
3
+ exec node "$(dirname "$0")/forge-session-start.mjs" "$@"
@@ -0,0 +1,21 @@
1
+ ---
2
+ description: Forge triage and workflow (thin rule)
3
+ alwaysApply: true
4
+ ---
5
+
6
+ # Forge (thin rule)
7
+
8
+ Full workflow: forgekit `docs/forge.md` · Skill: user-installed **Forge** (`~/.cursor/skills/forge/SKILL.md` after `forge install`).
9
+
10
+ **Default:** triage before implementation. Substantial work → **Forge**
11
+ (brainstorm → OpenSpec → subagent TDD implement → review).
12
+
13
+ **Forge = OpenSpec:** after brainstorm, proceed directly to `/opsx:propose` — do not ask for a plan mode. Work too small for OpenSpec should skip Forge (`/forge:skip` or direct execution).
14
+
15
+ **Skip Forge** only when work is trivial OR user sends **`/forge:skip`**.
16
+
17
+ Scratch sessions: `.forge/sessions/` (14-day retention). Active pointer: `.forge/active.json`.
18
+
19
+ CLI: `forge new`, `forge status`, `forge prefs`, `forge models`, `forge phase`, `forge doctor`.
20
+
21
+ Do not edit vendor OpenSpec skills — Forge orchestrates them. Workflow skills are bundled under the Forge skill’s `skills/` folder.