@izkac/forgekit 0.3.12 → 0.3.14

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 (120) hide show
  1. package/bin/forge.mjs +119 -107
  2. package/bin/forgekit.mjs +83 -83
  3. package/bin/review.mjs +81 -81
  4. package/package.json +2 -1
  5. package/scripts/prepack.mjs +78 -78
  6. package/scripts/run-tests.mjs +50 -50
  7. package/src/adr.mjs +236 -236
  8. package/src/adr.test.mjs +170 -170
  9. package/src/change.mjs +327 -234
  10. package/src/change.test.mjs +145 -83
  11. package/src/cleanup-sessions.mjs +84 -84
  12. package/src/config.mjs +103 -103
  13. package/src/defer.mjs +75 -75
  14. package/src/doctor.mjs +350 -341
  15. package/src/doctor.test.mjs +114 -114
  16. package/src/fleet.test.mjs +50 -0
  17. package/src/init.mjs +680 -621
  18. package/src/install.mjs +815 -815
  19. package/src/install.test.mjs +180 -180
  20. package/src/integrity-check.mjs +60 -60
  21. package/src/integrity.mjs +688 -682
  22. package/src/integrity.test.mjs +612 -566
  23. package/src/lib/fleet.mjs +61 -4
  24. package/src/lib.mjs +160 -143
  25. package/src/lib.test.mjs +128 -0
  26. package/src/models.defaults.json +41 -41
  27. package/src/new-session.mjs +99 -99
  28. package/src/openspec-overlays/README.md +19 -19
  29. package/src/openspec-overlays/openspec-apply-change-footer.md +14 -14
  30. package/src/openspec-overlays/opsx-apply-completion-step.md +1 -1
  31. package/src/openspec-overlays/opsx-apply-implement-step.md +11 -11
  32. package/src/paths.mjs +92 -92
  33. package/src/plan-engine.mjs +321 -278
  34. package/src/plan-engine.test.mjs +447 -283
  35. package/src/preferences.defaults.json +78 -78
  36. package/src/preferences.mjs +438 -438
  37. package/src/preferences.test.mjs +174 -174
  38. package/src/record-evidence.mjs +204 -204
  39. package/src/repo-root.mjs +33 -0
  40. package/src/resolve-model.mjs +312 -312
  41. package/src/resolve-model.test.mjs +194 -194
  42. package/src/review/cli.test.mjs +117 -117
  43. package/src/review/export.mjs +172 -172
  44. package/src/review/export.test.mjs +197 -197
  45. package/src/review/fixtures/valid-review.json +42 -42
  46. package/src/review/lib.mjs +894 -894
  47. package/src/review/lib.test.mjs +266 -266
  48. package/src/review/schema.json +196 -196
  49. package/src/review/signals.test.mjs +62 -62
  50. package/src/score-cli.mjs +68 -68
  51. package/src/score.mjs +568 -568
  52. package/src/score.test.mjs +366 -366
  53. package/src/session-reminder.mjs +207 -207
  54. package/src/session-status.mjs +70 -70
  55. package/src/set-models.mjs +186 -186
  56. package/src/set-phase.mjs +205 -205
  57. package/src/set-prefs.mjs +294 -294
  58. package/src/specs-sync.mjs +232 -0
  59. package/src/specs-sync.test.mjs +114 -0
  60. package/src/spine.mjs +93 -93
  61. package/src/triage-prompt.mjs +175 -175
  62. package/src/triage-prompt.test.mjs +50 -50
  63. package/src/vendor-openspec-overlays.mjs +176 -176
  64. package/src/vendor-openspec-overlays.test.mjs +62 -62
  65. package/vendor/skills/archive-to-adr/SKILL.md +149 -149
  66. package/vendor/skills/forge/SKILL.md +136 -136
  67. package/vendor/skills/forge/docs/forge.md +650 -647
  68. package/vendor/skills/forge/phases/brainstorm.md +23 -23
  69. package/vendor/skills/forge/phases/finish.md +90 -87
  70. package/vendor/skills/forge/phases/implement.md +77 -77
  71. package/vendor/skills/forge/phases/plan-openspec.md +60 -60
  72. package/vendor/skills/forge/phases/plan-specs.md +163 -117
  73. package/vendor/skills/forge/phases/review.md +25 -25
  74. package/vendor/skills/forge/phases/verify.md +124 -124
  75. package/vendor/skills/forge/references/forge-layout.md +85 -85
  76. package/vendor/skills/forge/references/pace.md +115 -115
  77. package/vendor/skills/forge/references/plan-routing.md +52 -51
  78. package/vendor/skills/forge/references/runtime-integrity.md +232 -232
  79. package/vendor/skills/forge/references/substantial-work.md +37 -37
  80. package/vendor/skills/forge/references/test-evidence.md +30 -30
  81. package/vendor/skills/forge/references/test-strategy.md +68 -68
  82. package/vendor/skills/forge/skills/subagent-driven-development/SKILL.md +87 -87
  83. package/vendor/skills/forge/subagents/final-reviewer-prompt.md +56 -56
  84. package/vendor/skills/forge/subagents/implementer-prompt.md +38 -38
  85. package/vendor/skills/git-resolve-adr-conflict/SKILL.md +132 -132
  86. package/vendor/skills/thorough-code-review/SKILL.md +290 -290
  87. package/vendor/skills/thorough-code-review/examples.md +133 -133
  88. package/vendor/skills/thorough-code-review/reference/accepted-risks.md +26 -26
  89. package/vendor/skills/thorough-code-review/reference/lenses.md +96 -96
  90. package/vendor/skills/thorough-code-review/reference/phase1-scout.md +62 -62
  91. package/vendor/skills/thorough-code-review/reference/phase2-skeptic.md +105 -105
  92. package/vendor/skills/thorough-code-review/reference/report-schema.json +222 -222
  93. package/vendor/skills/thorough-code-review/reference/report-template.md +115 -115
  94. package/vendor/skills/thorough-code-review/reference/severity-rubric.md +49 -49
  95. package/vendor/skills/thorough-code-review/reference/signals-preflight.md +55 -55
  96. package/vendor/templates/adr/README.md +7 -7
  97. package/vendor/templates/adr/decisions.md +141 -141
  98. package/vendor/templates/adr/hooks/check-pending-adrs.mjs +74 -74
  99. package/vendor/templates/adr/hooks/check-pending-adrs.sh +3 -3
  100. package/vendor/templates/adr/hooks/openspec-archive-agent-message.mjs +52 -52
  101. package/vendor/templates/adr/hooks/openspec-archive-agent-message.sh +3 -3
  102. package/vendor/templates/project/claude/commands/forge-apply.md +75 -75
  103. package/vendor/templates/project/claude/commands/forge-brainstorm.md +7 -7
  104. package/vendor/templates/project/claude/commands/forge-build.md +17 -17
  105. package/vendor/templates/project/claude/commands/forge-plan.md +12 -12
  106. package/vendor/templates/project/claude/commands/forge-skip.md +14 -14
  107. package/vendor/templates/project/claude/commands/forge-status.md +16 -16
  108. package/vendor/templates/project/claude/commands/forge.md +16 -16
  109. package/vendor/templates/project/claude/hooks/forge-prompt-hook.mjs +73 -73
  110. package/vendor/templates/project/claude/hooks/forge-session-start.mjs +19 -19
  111. package/vendor/templates/project/claude/hooks/forge-triage-hook.mjs +77 -77
  112. package/vendor/templates/project/cursor/commands/forge-apply.md +75 -75
  113. package/vendor/templates/project/cursor/commands/forge-brainstorm.md +10 -10
  114. package/vendor/templates/project/cursor/commands/forge-build.md +17 -17
  115. package/vendor/templates/project/cursor/commands/forge-plan.md +15 -15
  116. package/vendor/templates/project/cursor/commands/forge-skip.md +14 -14
  117. package/vendor/templates/project/cursor/commands/forge-status.md +16 -16
  118. package/vendor/templates/project/cursor/commands/forge.md +16 -16
  119. package/vendor/templates/project/cursor/hooks/forge-session-start.mjs +30 -30
  120. package/vendor/templates/project/cursor/hooks/forge-session-start.sh +3 -3
package/bin/forge.mjs CHANGED
@@ -1,107 +1,119 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Forge CLI — session orchestration, prefs, models, project init.
4
- *
5
- * Usage: forge <command> [args...]
6
- * Install: forge install → forgekit install --skills forge …
7
- */
8
-
9
- import path from 'node:path';
10
- import { fileURLToPath } from 'node:url';
11
- import { spawnSync } from 'node:child_process';
12
-
13
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
- const SRC = path.join(__dirname, '..', 'src');
15
-
16
- /** @type {Record<string, { script: string, aliases?: string[], prependArgs?: string[] }>} */
17
- const COMMANDS = {
18
- new: { script: 'new-session.mjs', aliases: ['session-new'] },
19
- status: { script: 'session-status.mjs' },
20
- cleanup: { script: 'cleanup-sessions.mjs' },
21
- phase: { script: 'set-phase.mjs', aliases: ['set-phase'] },
22
- prefs: { script: 'set-prefs.mjs' },
23
- models: { script: 'set-models.mjs' },
24
- 'resolve-model': { script: 'resolve-model.mjs' },
25
- doctor: { script: 'doctor.mjs' },
26
- evidence: { script: 'record-evidence.mjs' },
27
- reminder: { script: 'session-reminder.mjs' },
28
- overlay: { script: 'vendor-openspec-overlays.mjs', aliases: ['overlays'] },
29
- install: { script: 'install.mjs', prependArgs: ['--skills', 'forge'] },
30
- init: { script: 'init.mjs' },
31
- triage: { script: 'triage-prompt.mjs' },
32
- change: { script: 'change.mjs' },
33
- spine: { script: 'spine.mjs' },
34
- e2e: { script: 'e2e.mjs' },
35
- defer: { script: 'defer.mjs' },
36
- 'integrity-check': { script: 'integrity-check.mjs', aliases: ['integrity'] },
37
- score: { script: 'score-cli.mjs', aliases: ['scorecard'] },
38
- fleet: { script: 'fleet.mjs' },
39
- brief: { script: 'brief-cli.mjs' },
40
- };
41
-
42
- function printHelp() {
43
- process.stdout.write(`Forge — disciplined development workflow
44
-
45
- Usage:
46
- forge <command> [args...]
47
-
48
- Commands:
49
- new <slug> Create a Forge session under .forge/
50
- status Show active session
51
- phase <phase> Update session phase
52
- cleanup Prune old/finished sessions
53
- prefs [pace] Get/set pace preferences
54
- models [lane] Get/set subagent billing (included|metered)
55
- resolve-model --tier … Resolve subagent model JSON
56
- doctor Plan-engine readiness (OpenSpec or specs)
57
- evidence Stamp tier-2 test-evidence.md
58
- reminder Session reminder (for hooks)
59
- overlay Re-apply OpenSpec vendor overlays in this project
60
- install Alias forgekit install --skills forge
61
- init Wire Forge commands/hooks/rules into this project
62
- triage Classify whether a prompt needs Forge triage
63
- change new|archive Specs-engine change scaffold / archive
64
- spine init|check Capability→runtime spine matrix (spine.json)
65
- e2e init|run|check Executable product-loop acceptance (e2e.json)
66
- e2e disable|enable Operator-only project e2e off switch
67
- defer add|resolve|list Deferral registry (deferred wiring = tracked debt)
68
- integrity-check Mechanical integrity gate (runs at phase done)
69
- score [--write] L2 session scorecard (auto-written at phase done)
70
- fleet list|watch|view|send Cross-project session control terminal
71
- brief stamp|check|open Operator brief (plain-language HTML, gates implement)
72
-
73
- Prefer \`forgekit install\` to pick multiple skills + agents at once.
74
-
75
- Global:
76
- forge --help
77
- forge <command> --help
78
- `);
79
- }
80
-
81
- const argv = process.argv.slice(2);
82
- if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
83
- printHelp();
84
- process.exit(0);
85
- }
86
-
87
- const [cmd, ...rest] = argv;
88
- const entry = COMMANDS[cmd] ?? Object.values(COMMANDS).find((c) => c.aliases?.includes(cmd));
89
-
90
- if (!entry) {
91
- process.stderr.write(`Unknown command: ${cmd}\n\n`);
92
- printHelp();
93
- process.exit(1);
94
- }
95
-
96
- const args = [...(entry.prependArgs ?? []), ...rest];
97
- const r = spawnSync(process.execPath, [path.join(SRC, entry.script), ...args], {
98
- stdio: 'inherit',
99
- cwd: process.cwd(),
100
- env: {
101
- ...process.env,
102
- FORGEKIT_ROOT: path.resolve(__dirname, '..', '..', '..'),
103
- FORGEKIT_CLI_ROOT: path.resolve(__dirname, '..'),
104
- },
105
- });
106
-
107
- process.exit(r.status ?? 1);
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Forge CLI — session orchestration, prefs, models, project init.
4
+ *
5
+ * Usage: forge <command> [args...]
6
+ * Install: forge install → forgekit install --skills forge …
7
+ */
8
+
9
+ import path from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { spawnSync } from 'node:child_process';
12
+ import { findRepoRoot } from '../src/repo-root.mjs';
13
+
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+ const SRC = path.join(__dirname, '..', 'src');
16
+
17
+ /** @type {Record<string, { script: string, aliases?: string[], prependArgs?: string[] }>} */
18
+ const COMMANDS = {
19
+ new: { script: 'new-session.mjs', aliases: ['session-new'] },
20
+ status: { script: 'session-status.mjs' },
21
+ cleanup: { script: 'cleanup-sessions.mjs' },
22
+ phase: { script: 'set-phase.mjs', aliases: ['set-phase'] },
23
+ prefs: { script: 'set-prefs.mjs' },
24
+ models: { script: 'set-models.mjs' },
25
+ 'resolve-model': { script: 'resolve-model.mjs' },
26
+ doctor: { script: 'doctor.mjs' },
27
+ evidence: { script: 'record-evidence.mjs' },
28
+ reminder: { script: 'session-reminder.mjs' },
29
+ overlay: { script: 'vendor-openspec-overlays.mjs', aliases: ['overlays'] },
30
+ install: { script: 'install.mjs', prependArgs: ['--skills', 'forge'] },
31
+ init: { script: 'init.mjs' },
32
+ triage: { script: 'triage-prompt.mjs' },
33
+ change: { script: 'change.mjs' },
34
+ spine: { script: 'spine.mjs' },
35
+ e2e: { script: 'e2e.mjs' },
36
+ defer: { script: 'defer.mjs' },
37
+ 'integrity-check': { script: 'integrity-check.mjs', aliases: ['integrity'] },
38
+ score: { script: 'score-cli.mjs', aliases: ['scorecard'] },
39
+ fleet: { script: 'fleet.mjs' },
40
+ brief: { script: 'brief-cli.mjs' },
41
+ };
42
+
43
+ function printHelp() {
44
+ process.stdout.write(`Forge — disciplined development workflow
45
+
46
+ Usage:
47
+ forge <command> [args...]
48
+
49
+ Commands:
50
+ new <slug> Create a Forge session under .forge/
51
+ status Show active session
52
+ phase <phase> Update session phase
53
+ cleanup Prune old/finished sessions
54
+ prefs [pace] Get/set pace preferences
55
+ models [lane] Get/set subagent billing (included|metered)
56
+ resolve-model --tier … Resolve subagent model JSON
57
+ doctor Plan-engine readiness (OpenSpec or specs)
58
+ evidence Stamp tier-2 test-evidence.md
59
+ reminder Session reminder (for hooks)
60
+ overlay Re-apply OpenSpec vendor overlays in this project
61
+ install Alias forgekit install --skills forge
62
+ init Wire Forge commands/hooks/rules into this project
63
+ triage Classify whether a prompt needs Forge triage
64
+ change new|archive Specs-engine change scaffold / archive
65
+ spine init|check Capability→runtime spine matrix (spine.json)
66
+ e2e init|run|check Executable product-loop acceptance (e2e.json)
67
+ e2e disable|enable Operator-only project e2e off switch
68
+ defer add|resolve|list Deferral registry (deferred wiring = tracked debt)
69
+ integrity-check Mechanical integrity gate (runs at phase done)
70
+ score [--write] L2 session scorecard (auto-written at phase done)
71
+ fleet list|watch|view|send Cross-project session control terminal
72
+ brief stamp|check|open Operator brief (plain-language HTML, gates implement)
73
+
74
+ Prefer \`forgekit install\` to pick multiple skills + agents at once.
75
+
76
+ Global:
77
+ forge --help
78
+ forge <command> --help
79
+ `);
80
+ }
81
+
82
+ const argv = process.argv.slice(2);
83
+ if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
84
+ printHelp();
85
+ process.exit(0);
86
+ }
87
+
88
+ const [cmd, ...rest] = argv;
89
+ const entry = COMMANDS[cmd] ?? Object.values(COMMANDS).find((c) => c.aliases?.includes(cmd));
90
+
91
+ if (!entry) {
92
+ process.stderr.write(`Unknown command: ${cmd}\n\n`);
93
+ printHelp();
94
+ process.exit(1);
95
+ }
96
+
97
+ // Every subcommand is project-scoped, so run it from the project root rather
98
+ // than wherever the shell happens to sit: `cd crates && forge status` used to
99
+ // report "no session" and `forge new` would have written a second .forge tree
100
+ // inside the workspace. An explicit relative `--cwd` still means what the
101
+ // caller typed, so absolutize it against the invocation dir first.
102
+ const invokedFrom = process.cwd();
103
+ const repoRoot = findRepoRoot(invokedFrom);
104
+ const args = [...(entry.prependArgs ?? []), ...rest].map((arg, i, all) =>
105
+ i > 0 && all[i - 1] === '--cwd' && !path.isAbsolute(arg) ? path.resolve(invokedFrom, arg) : arg,
106
+ );
107
+
108
+ const r = spawnSync(process.execPath, [path.join(SRC, entry.script), ...args], {
109
+ stdio: 'inherit',
110
+ cwd: repoRoot,
111
+ env: {
112
+ ...process.env,
113
+ FORGE_INVOKED_FROM: invokedFrom,
114
+ FORGEKIT_ROOT: path.resolve(__dirname, '..', '..', '..'),
115
+ FORGEKIT_CLI_ROOT: path.resolve(__dirname, '..'),
116
+ },
117
+ });
118
+
119
+ process.exit(r.status ?? 1);
package/bin/forgekit.mjs CHANGED
@@ -1,84 +1,84 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Forgekit meta CLI — install / list / update / uninstall skills across agents.
4
- *
5
- * Skill day-to-day commands stay on `forge` and `review`.
6
- *
7
- * Usage: forgekit <command> [args...]
8
- */
9
-
10
- import path from 'node:path';
11
- import { fileURLToPath } from 'node:url';
12
- import { spawnSync } from 'node:child_process';
13
-
14
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
- const SRC = path.join(__dirname, '..', 'src');
16
-
17
- /** @type {Record<string, { script: string, prependArgs?: string[] }>} */
18
- const COMMANDS = {
19
- install: { script: 'install.mjs' },
20
- list: { script: 'install.mjs', prependArgs: ['--list'] },
21
- update: { script: 'install.mjs', prependArgs: ['--update'] },
22
- uninstall: { script: 'install.mjs', prependArgs: ['--uninstall'] },
23
- };
24
-
25
- function printHelp() {
26
- process.stdout.write(`Forgekit — portable agent skills
27
-
28
- Usage:
29
- forgekit <command> [args...]
30
-
31
- Commands:
32
- install Install skills into ~/.cursor|claude|codex/skills/
33
- list Show installed / missing / outdated (skill × agent)
34
- update Reinstall outdated skills
35
- uninstall Remove installed skill directories
36
-
37
- Install picks skills and agents (interactive on TTY, or via flags).
38
- Also asks about planning engine (OpenSpec vs specs) and ADRs:
39
-
40
- forgekit install
41
- forgekit install --skills forge,thorough-code-review --agents cursor,claude
42
- forgekit install --adr --adr-dir docs/adr --adr-project
43
- forgekit install --all-skills --all-agents --force
44
- forgekit list
45
- forgekit update
46
- forgekit uninstall --skills forge --agents cursor
47
-
48
- Day-to-day skill CLIs (same package):
49
-
50
- forge … Forge workflow sessions
51
- review … Thorough code review pipeline
52
-
53
- forge install … Alias → forgekit install --skills forge …
54
- review install … Alias → forgekit install --skills thorough-code-review …
55
- `);
56
- }
57
-
58
- const argv = process.argv.slice(2);
59
- if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
60
- printHelp();
61
- process.exit(0);
62
- }
63
-
64
- const [cmd, ...rest] = argv;
65
- const entry = COMMANDS[cmd];
66
-
67
- if (!entry) {
68
- process.stderr.write(`Unknown command: ${cmd}\n\n`);
69
- printHelp();
70
- process.exit(1);
71
- }
72
-
73
- const args = [...(entry.prependArgs ?? []), ...rest];
74
- const r = spawnSync(process.execPath, [path.join(SRC, entry.script), ...args], {
75
- stdio: 'inherit',
76
- cwd: process.cwd(),
77
- env: {
78
- ...process.env,
79
- FORGEKIT_ROOT: path.resolve(__dirname, '..', '..', '..'),
80
- FORGEKIT_CLI_ROOT: path.resolve(__dirname, '..'),
81
- },
82
- });
83
-
84
- process.exit(r.status ?? 1);
2
+ /**
3
+ * Forgekit meta CLI — install / list / update / uninstall skills across agents.
4
+ *
5
+ * Skill day-to-day commands stay on `forge` and `review`.
6
+ *
7
+ * Usage: forgekit <command> [args...]
8
+ */
9
+
10
+ import path from 'node:path';
11
+ import { fileURLToPath } from 'node:url';
12
+ import { spawnSync } from 'node:child_process';
13
+
14
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
15
+ const SRC = path.join(__dirname, '..', 'src');
16
+
17
+ /** @type {Record<string, { script: string, prependArgs?: string[] }>} */
18
+ const COMMANDS = {
19
+ install: { script: 'install.mjs' },
20
+ list: { script: 'install.mjs', prependArgs: ['--list'] },
21
+ update: { script: 'install.mjs', prependArgs: ['--update'] },
22
+ uninstall: { script: 'install.mjs', prependArgs: ['--uninstall'] },
23
+ };
24
+
25
+ function printHelp() {
26
+ process.stdout.write(`Forgekit — portable agent skills
27
+
28
+ Usage:
29
+ forgekit <command> [args...]
30
+
31
+ Commands:
32
+ install Install skills into ~/.cursor|claude|codex/skills/
33
+ list Show installed / missing / outdated (skill × agent)
34
+ update Reinstall outdated skills
35
+ uninstall Remove installed skill directories
36
+
37
+ Install picks skills and agents (interactive on TTY, or via flags).
38
+ Also asks about planning engine (OpenSpec vs specs) and ADRs:
39
+
40
+ forgekit install
41
+ forgekit install --skills forge,thorough-code-review --agents cursor,claude
42
+ forgekit install --adr --adr-dir docs/adr --adr-project
43
+ forgekit install --all-skills --all-agents --force
44
+ forgekit list
45
+ forgekit update
46
+ forgekit uninstall --skills forge --agents cursor
47
+
48
+ Day-to-day skill CLIs (same package):
49
+
50
+ forge … Forge workflow sessions
51
+ review … Thorough code review pipeline
52
+
53
+ forge install … Alias → forgekit install --skills forge …
54
+ review install … Alias → forgekit install --skills thorough-code-review …
55
+ `);
56
+ }
57
+
58
+ const argv = process.argv.slice(2);
59
+ if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
60
+ printHelp();
61
+ process.exit(0);
62
+ }
63
+
64
+ const [cmd, ...rest] = argv;
65
+ const entry = COMMANDS[cmd];
66
+
67
+ if (!entry) {
68
+ process.stderr.write(`Unknown command: ${cmd}\n\n`);
69
+ printHelp();
70
+ process.exit(1);
71
+ }
72
+
73
+ const args = [...(entry.prependArgs ?? []), ...rest];
74
+ const r = spawnSync(process.execPath, [path.join(SRC, entry.script), ...args], {
75
+ stdio: 'inherit',
76
+ cwd: process.cwd(),
77
+ env: {
78
+ ...process.env,
79
+ FORGEKIT_ROOT: path.resolve(__dirname, '..', '..', '..'),
80
+ FORGEKIT_CLI_ROOT: path.resolve(__dirname, '..'),
81
+ },
82
+ });
83
+
84
+ process.exit(r.status ?? 1);
package/bin/review.mjs CHANGED
@@ -1,82 +1,82 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * Review CLI — thorough-code-review scaffolding, render, export, signals.
4
- *
5
- * Usage: review <command> [args...]
6
- * Install: review install → forgekit install --skills thorough-code-review …
7
- */
8
-
9
- import path from 'node:path';
10
- import { fileURLToPath } from 'node:url';
11
- import { spawnSync } from 'node:child_process';
12
-
13
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
- const SRC = path.join(__dirname, '..', 'src');
15
- const REVIEW_SRC = path.join(SRC, 'review');
16
-
17
- /** @type {Record<string, { script: string, prependArgs?: string[] }>} */
18
- const COMMANDS = {
19
- new: { script: path.join(REVIEW_SRC, 'new-review.mjs') },
20
- render: { script: path.join(REVIEW_SRC, 'render.mjs') },
21
- export: { script: path.join(REVIEW_SRC, 'export.mjs') },
22
- carryforward: { script: path.join(REVIEW_SRC, 'carryforward.mjs') },
23
- merge: { script: path.join(REVIEW_SRC, 'merge-tentative.mjs') },
24
- signals: { script: path.join(REVIEW_SRC, 'signals.mjs') },
25
- install: {
26
- script: path.join(SRC, 'install.mjs'),
27
- prependArgs: ['--skills', 'thorough-code-review'],
28
- },
29
- };
30
-
31
- function printHelp() {
32
- process.stdout.write(`Review — thorough code review tooling
33
-
34
- Usage:
35
- review <command> [args...]
36
-
37
- Commands:
38
- new <slug> Scaffold .reviews/<id>-review.json
39
- render Generate markdown from JSON
40
- export Validate + summarize (+ optional CI gate)
41
- carryforward Inherit prior verdicts for unchanged files
42
- merge Merge scout tentative JSON shards
43
- signals Plan typecheck/lint/test grounding commands
44
- install Alias → forgekit install --skills thorough-code-review
45
-
46
- Prefer \`forgekit install\` to pick multiple skills + agents at once.
47
-
48
- Global:
49
- review --help
50
- review <command> --help
51
-
52
- After install, invoke the skill explicitly in your agent (it does not auto-load).
53
- `);
54
- }
55
-
56
- const argv = process.argv.slice(2);
57
- if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
58
- printHelp();
59
- process.exit(0);
60
- }
61
-
62
- const [cmd, ...rest] = argv;
63
- const entry = COMMANDS[cmd];
64
-
65
- if (!entry) {
66
- process.stderr.write(`Unknown command: ${cmd}\n\n`);
67
- printHelp();
68
- process.exit(1);
69
- }
70
-
71
- const args = [...(entry.prependArgs ?? []), ...rest];
72
- const r = spawnSync(process.execPath, [entry.script, ...args], {
73
- stdio: 'inherit',
74
- cwd: process.cwd(),
75
- env: {
76
- ...process.env,
77
- FORGEKIT_ROOT: path.resolve(__dirname, '..', '..', '..'),
78
- FORGEKIT_CLI_ROOT: path.resolve(__dirname, '..'),
79
- },
80
- });
81
-
82
- process.exit(r.status ?? 1);
2
+ /**
3
+ * Review CLI — thorough-code-review scaffolding, render, export, signals.
4
+ *
5
+ * Usage: review <command> [args...]
6
+ * Install: review install → forgekit install --skills thorough-code-review …
7
+ */
8
+
9
+ import path from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { spawnSync } from 'node:child_process';
12
+
13
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
14
+ const SRC = path.join(__dirname, '..', 'src');
15
+ const REVIEW_SRC = path.join(SRC, 'review');
16
+
17
+ /** @type {Record<string, { script: string, prependArgs?: string[] }>} */
18
+ const COMMANDS = {
19
+ new: { script: path.join(REVIEW_SRC, 'new-review.mjs') },
20
+ render: { script: path.join(REVIEW_SRC, 'render.mjs') },
21
+ export: { script: path.join(REVIEW_SRC, 'export.mjs') },
22
+ carryforward: { script: path.join(REVIEW_SRC, 'carryforward.mjs') },
23
+ merge: { script: path.join(REVIEW_SRC, 'merge-tentative.mjs') },
24
+ signals: { script: path.join(REVIEW_SRC, 'signals.mjs') },
25
+ install: {
26
+ script: path.join(SRC, 'install.mjs'),
27
+ prependArgs: ['--skills', 'thorough-code-review'],
28
+ },
29
+ };
30
+
31
+ function printHelp() {
32
+ process.stdout.write(`Review — thorough code review tooling
33
+
34
+ Usage:
35
+ review <command> [args...]
36
+
37
+ Commands:
38
+ new <slug> Scaffold .reviews/<id>-review.json
39
+ render Generate markdown from JSON
40
+ export Validate + summarize (+ optional CI gate)
41
+ carryforward Inherit prior verdicts for unchanged files
42
+ merge Merge scout tentative JSON shards
43
+ signals Plan typecheck/lint/test grounding commands
44
+ install Alias → forgekit install --skills thorough-code-review
45
+
46
+ Prefer \`forgekit install\` to pick multiple skills + agents at once.
47
+
48
+ Global:
49
+ review --help
50
+ review <command> --help
51
+
52
+ After install, invoke the skill explicitly in your agent (it does not auto-load).
53
+ `);
54
+ }
55
+
56
+ const argv = process.argv.slice(2);
57
+ if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
58
+ printHelp();
59
+ process.exit(0);
60
+ }
61
+
62
+ const [cmd, ...rest] = argv;
63
+ const entry = COMMANDS[cmd];
64
+
65
+ if (!entry) {
66
+ process.stderr.write(`Unknown command: ${cmd}\n\n`);
67
+ printHelp();
68
+ process.exit(1);
69
+ }
70
+
71
+ const args = [...(entry.prependArgs ?? []), ...rest];
72
+ const r = spawnSync(process.execPath, [entry.script, ...args], {
73
+ stdio: 'inherit',
74
+ cwd: process.cwd(),
75
+ env: {
76
+ ...process.env,
77
+ FORGEKIT_ROOT: path.resolve(__dirname, '..', '..', '..'),
78
+ FORGEKIT_CLI_ROOT: path.resolve(__dirname, '..'),
79
+ },
80
+ });
81
+
82
+ process.exit(r.status ?? 1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@izkac/forgekit",
3
- "version": "0.3.12",
3
+ "version": "0.3.14",
4
4
  "description": "Forgekit CLIs — forgekit (install), forge (workflow), review (code review)",
5
5
  "type": "module",
6
6
  "bin": {
@@ -16,6 +16,7 @@
16
16
  ],
17
17
  "scripts": {
18
18
  "prepack": "node scripts/prepack.mjs",
19
+ "prepublishOnly": "npm run lint && npm test",
19
20
  "test": "node scripts/run-tests.mjs",
20
21
  "lint": "eslint src bin scripts"
21
22
  },