@izkac/forgekit 0.3.11 → 0.3.13
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/bin/forge.mjs +107 -107
- package/bin/forgekit.mjs +83 -83
- package/bin/review.mjs +81 -81
- package/package.json +1 -1
- package/scripts/prepack.mjs +78 -78
- package/scripts/run-tests.mjs +50 -50
- package/src/adr.mjs +236 -236
- package/src/adr.test.mjs +170 -170
- package/src/change.mjs +327 -234
- package/src/change.test.mjs +145 -83
- package/src/cleanup-sessions.mjs +84 -84
- package/src/config.mjs +103 -103
- package/src/defer.mjs +75 -75
- package/src/doctor.mjs +350 -341
- package/src/doctor.test.mjs +114 -114
- package/src/init.mjs +680 -621
- package/src/install.mjs +815 -815
- package/src/install.test.mjs +180 -180
- package/src/integrity-check.mjs +60 -60
- package/src/integrity.mjs +682 -682
- package/src/integrity.test.mjs +566 -566
- package/src/lib.mjs +143 -143
- package/src/models.defaults.json +41 -41
- package/src/new-session.mjs +99 -99
- package/src/openspec-overlays/README.md +19 -19
- package/src/openspec-overlays/openspec-apply-change-footer.md +14 -14
- package/src/openspec-overlays/opsx-apply-completion-step.md +1 -1
- package/src/openspec-overlays/opsx-apply-implement-step.md +11 -11
- package/src/paths.mjs +92 -92
- package/src/plan-engine.mjs +321 -278
- package/src/plan-engine.test.mjs +447 -283
- package/src/preferences.defaults.json +78 -78
- package/src/preferences.mjs +438 -438
- package/src/preferences.test.mjs +174 -174
- package/src/record-evidence.mjs +204 -204
- package/src/resolve-model.mjs +312 -312
- package/src/resolve-model.test.mjs +194 -194
- package/src/review/cli.test.mjs +117 -117
- package/src/review/export.mjs +172 -172
- package/src/review/export.test.mjs +197 -197
- package/src/review/fixtures/valid-review.json +42 -42
- package/src/review/lib.mjs +894 -894
- package/src/review/lib.test.mjs +266 -266
- package/src/review/schema.json +196 -196
- package/src/review/signals.test.mjs +62 -62
- package/src/score-cli.mjs +68 -68
- package/src/score.mjs +568 -566
- package/src/score.test.mjs +366 -340
- package/src/session-reminder.mjs +207 -207
- package/src/session-status.mjs +70 -70
- package/src/set-models.mjs +186 -186
- package/src/set-phase.mjs +205 -205
- package/src/set-prefs.mjs +294 -294
- package/src/specs-sync.mjs +234 -0
- package/src/specs-sync.test.mjs +114 -0
- package/src/spine.mjs +93 -93
- package/src/triage-prompt.mjs +175 -175
- package/src/triage-prompt.test.mjs +50 -50
- package/src/vendor-openspec-overlays.mjs +176 -176
- package/src/vendor-openspec-overlays.test.mjs +62 -62
- package/vendor/skills/archive-to-adr/SKILL.md +149 -149
- package/vendor/skills/forge/SKILL.md +136 -136
- package/vendor/skills/forge/docs/forge.md +650 -647
- package/vendor/skills/forge/phases/brainstorm.md +23 -23
- package/vendor/skills/forge/phases/finish.md +90 -87
- package/vendor/skills/forge/phases/implement.md +77 -77
- package/vendor/skills/forge/phases/plan-openspec.md +60 -60
- package/vendor/skills/forge/phases/plan-specs.md +163 -117
- package/vendor/skills/forge/phases/review.md +25 -25
- package/vendor/skills/forge/phases/verify.md +124 -124
- package/vendor/skills/forge/references/forge-layout.md +85 -85
- package/vendor/skills/forge/references/pace.md +115 -115
- package/vendor/skills/forge/references/plan-routing.md +52 -51
- package/vendor/skills/forge/references/runtime-integrity.md +232 -225
- package/vendor/skills/forge/references/substantial-work.md +37 -37
- package/vendor/skills/forge/references/test-evidence.md +30 -30
- package/vendor/skills/forge/references/test-strategy.md +68 -68
- package/vendor/skills/forge/skills/subagent-driven-development/SKILL.md +87 -87
- package/vendor/skills/forge/subagents/final-reviewer-prompt.md +56 -56
- package/vendor/skills/forge/subagents/implementer-prompt.md +38 -38
- package/vendor/skills/git-resolve-adr-conflict/SKILL.md +132 -132
- package/vendor/skills/thorough-code-review/SKILL.md +290 -290
- package/vendor/skills/thorough-code-review/examples.md +133 -133
- package/vendor/skills/thorough-code-review/reference/accepted-risks.md +26 -26
- package/vendor/skills/thorough-code-review/reference/lenses.md +96 -96
- package/vendor/skills/thorough-code-review/reference/phase1-scout.md +62 -62
- package/vendor/skills/thorough-code-review/reference/phase2-skeptic.md +105 -105
- package/vendor/skills/thorough-code-review/reference/report-schema.json +222 -222
- package/vendor/skills/thorough-code-review/reference/report-template.md +115 -115
- package/vendor/skills/thorough-code-review/reference/severity-rubric.md +49 -49
- package/vendor/skills/thorough-code-review/reference/signals-preflight.md +55 -55
- package/vendor/templates/adr/README.md +7 -7
- package/vendor/templates/adr/decisions.md +141 -141
- package/vendor/templates/adr/hooks/check-pending-adrs.mjs +74 -74
- package/vendor/templates/adr/hooks/check-pending-adrs.sh +3 -3
- package/vendor/templates/adr/hooks/openspec-archive-agent-message.mjs +52 -52
- package/vendor/templates/adr/hooks/openspec-archive-agent-message.sh +3 -3
- package/vendor/templates/project/claude/commands/forge-apply.md +75 -75
- package/vendor/templates/project/claude/commands/forge-brainstorm.md +7 -7
- package/vendor/templates/project/claude/commands/forge-build.md +17 -17
- package/vendor/templates/project/claude/commands/forge-plan.md +12 -12
- package/vendor/templates/project/claude/commands/forge-skip.md +14 -14
- package/vendor/templates/project/claude/commands/forge-status.md +16 -16
- package/vendor/templates/project/claude/commands/forge.md +16 -16
- package/vendor/templates/project/claude/hooks/forge-prompt-hook.mjs +73 -73
- package/vendor/templates/project/claude/hooks/forge-session-start.mjs +19 -19
- package/vendor/templates/project/claude/hooks/forge-triage-hook.mjs +77 -77
- package/vendor/templates/project/cursor/commands/forge-apply.md +75 -75
- package/vendor/templates/project/cursor/commands/forge-brainstorm.md +10 -10
- package/vendor/templates/project/cursor/commands/forge-build.md +17 -17
- package/vendor/templates/project/cursor/commands/forge-plan.md +15 -15
- package/vendor/templates/project/cursor/commands/forge-skip.md +14 -14
- package/vendor/templates/project/cursor/commands/forge-status.md +16 -16
- package/vendor/templates/project/cursor/commands/forge.md +16 -16
- package/vendor/templates/project/cursor/hooks/forge-session-start.mjs +30 -30
- package/vendor/templates/project/cursor/hooks/forge-session-start.sh +3 -3
package/bin/forge.mjs
CHANGED
|
@@ -1,107 +1,107 @@
|
|
|
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
|
+
|
|
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);
|
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);
|