@opengsd/gsd-core 1.5.0-rc.3 → 1.5.0-rc.5
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/.claude-plugin/plugin.json +1 -1
- package/agents/gsd-advisor-researcher.md +1 -1
- package/agents/gsd-assumptions-analyzer.md +1 -1
- package/agents/gsd-code-fixer.md +1 -1
- package/agents/gsd-code-reviewer.md +1 -1
- package/agents/gsd-codebase-mapper.md +1 -1
- package/agents/gsd-debugger.md +1 -1
- package/agents/gsd-doc-writer.md +1 -1
- package/agents/gsd-eval-auditor.md +1 -1
- package/agents/gsd-executor.md +1 -1
- package/agents/gsd-integration-checker.md +1 -1
- package/agents/gsd-nyquist-auditor.md +1 -0
- package/agents/gsd-phase-researcher.md +1 -1
- package/agents/gsd-plan-checker.md +1 -1
- package/agents/gsd-planner.md +5 -1
- package/agents/gsd-project-researcher.md +1 -1
- package/agents/gsd-research-synthesizer.md +1 -1
- package/agents/gsd-roadmapper.md +55 -2
- package/agents/gsd-security-auditor.md +1 -0
- package/agents/gsd-ui-auditor.md +1 -1
- package/agents/gsd-ui-checker.md +1 -1
- package/agents/gsd-ui-researcher.md +1 -1
- package/agents/gsd-verifier.md +58 -15
- package/bin/install.js +39 -58
- package/commands/gsd/progress.md +2 -1
- package/gemini-extension.json +1 -1
- package/gsd-core/bin/gsd-tools.cjs +205 -40
- package/gsd-core/bin/lib/active-workstream-store.cjs +6 -0
- package/gsd-core/bin/lib/agent-command-router.cjs +2 -2
- package/gsd-core/bin/lib/agent-install-check.cjs +143 -0
- package/gsd-core/bin/lib/audit-command-router.cjs +4 -4
- package/gsd-core/bin/lib/capability-activation.cjs +37 -10
- package/gsd-core/bin/lib/capability-registry.cjs +2 -0
- package/gsd-core/bin/lib/capability-state.cjs +177 -33
- package/gsd-core/bin/lib/capability-writer.cjs +355 -0
- package/gsd-core/bin/lib/check-command-router.cjs +50 -51
- package/gsd-core/bin/lib/commands.cjs +20 -2
- package/gsd-core/bin/lib/config-loader.cjs +3 -4
- package/gsd-core/bin/lib/config-schema.cjs +1 -1
- package/gsd-core/bin/lib/config-types.cjs +2 -1
- package/gsd-core/bin/lib/config.cjs +85 -26
- package/gsd-core/bin/lib/docs.cjs +14 -2
- package/gsd-core/bin/lib/edge-probe.cjs +25 -2
- package/gsd-core/bin/lib/frontmatter.cjs +55 -3
- package/gsd-core/bin/lib/gap-checker.cjs +5 -2
- package/gsd-core/bin/lib/git-base-branch.cjs +220 -0
- package/gsd-core/bin/lib/graphify-command-router.cjs +6 -8
- package/gsd-core/bin/lib/graphify.cjs +7 -31
- package/gsd-core/bin/lib/gsd2-import.cjs +2 -2
- package/gsd-core/bin/lib/init.cjs +58 -10
- package/gsd-core/bin/lib/install-profiles.cjs +55 -0
- package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
- package/gsd-core/bin/lib/intel-command-router.cjs +6 -3
- package/gsd-core/bin/lib/intel.cjs +28 -34
- package/gsd-core/bin/lib/io.cjs +2 -4
- package/gsd-core/bin/lib/learnings.cjs +2 -2
- package/gsd-core/bin/lib/loop-resolver.cjs +45 -167
- package/gsd-core/bin/lib/milestone.cjs +13 -5
- package/gsd-core/bin/lib/model-resolver.cjs +3 -4
- package/gsd-core/bin/lib/phase-id.cjs +2 -4
- package/gsd-core/bin/lib/phase-locator.cjs +3 -6
- package/gsd-core/bin/lib/phase.cjs +46 -19
- package/gsd-core/bin/lib/plan-drift-guard.cjs +117 -0
- package/gsd-core/bin/lib/probe-core.cjs +139 -1
- package/gsd-core/bin/lib/profile-output.cjs +5 -2
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +485 -0
- package/gsd-core/bin/lib/roadmap-command-router.cjs +2 -2
- package/gsd-core/bin/lib/roadmap-parser.cjs +16 -8
- package/gsd-core/bin/lib/roadmap.cjs +9 -4
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +246 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +34 -2
- package/gsd-core/bin/lib/state.cjs +251 -61
- package/gsd-core/bin/lib/task-command-router.cjs +2 -2
- package/gsd-core/bin/lib/template.cjs +11 -2
- package/gsd-core/bin/lib/uat.cjs +8 -2
- package/gsd-core/bin/lib/verification.cjs +8 -5
- package/gsd-core/bin/lib/verify.cjs +384 -8
- package/gsd-core/bin/lib/workstream-inventory.cjs +2 -2
- package/gsd-core/bin/lib/workstream.cjs +8 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +39 -3
- package/gsd-core/bin/shared/config-schema.manifest.json +2 -0
- package/gsd-core/references/edge-probe.md +11 -0
- package/gsd-core/references/planner-antipatterns.md +46 -0
- package/gsd-core/references/planning-config.md +5 -1
- package/gsd-core/references/prohibition-probe-fixtures/01-streak-reminder/expected.json +14 -0
- package/gsd-core/references/prohibition-probe-fixtures/02-clean-utility/expected.json +4 -0
- package/gsd-core/references/prohibition-probe-fixtures/03-multi-prohibition/expected.json +32 -0
- package/gsd-core/references/prohibition-probe.md +297 -0
- package/gsd-core/templates/spec.md +14 -0
- package/gsd-core/templates/verification-report.md +16 -3
- package/gsd-core/workflows/complete-milestone.md +1 -5
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +9 -0
- package/gsd-core/workflows/execute-phase.md +9 -4
- package/gsd-core/workflows/execute-plan.md +21 -6
- package/gsd-core/workflows/help/modes/full.md +4 -0
- package/gsd-core/workflows/next.md +50 -2
- package/gsd-core/workflows/pause-work.md +7 -1
- package/gsd-core/workflows/plan-phase.md +2 -0
- package/gsd-core/workflows/plan-review-convergence.md +14 -4
- package/gsd-core/workflows/pr-branch.md +4 -2
- package/gsd-core/workflows/quick.md +6 -2
- package/gsd-core/workflows/resume-project.md +17 -1
- package/gsd-core/workflows/settings-advanced.md +5 -5
- package/gsd-core/workflows/settings-integrations.md +5 -5
- package/gsd-core/workflows/settings.md +27 -1
- package/gsd-core/workflows/ship.md +1 -5
- package/gsd-core/workflows/spec-phase.md +98 -0
- package/gsd-core/workflows/verify-phase.md +33 -8
- package/hooks/dist/gsd-ensure-canonical-path.js +305 -0
- package/hooks/dist/gsd-statusline.js +1 -1
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-ensure-canonical-path.js +305 -0
- package/hooks/gsd-statusline.js +1 -1
- package/hooks/hooks.json +1 -0
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +4 -4
- package/scripts/build-hooks.js +7 -0
- package/scripts/changeset/new.cjs +17 -3
- package/scripts/fix-slash-commands.cjs +15 -3
- package/scripts/gen-capability-registry.cjs +41 -2
- package/scripts/lint-allow-test-rule-refs.allowlist.json +2 -3
- package/scripts/lint-test-file-count.allowlist.json +6 -0
- package/scripts/mutation-matrix.cjs +108 -7
- package/scripts/pr-target-policy.cjs +63 -0
- package/scripts/research-profiles.cjs +5 -5
- package/scripts/run-tests.cjs +107 -6
- package/gsd-core/bin/lib/core.cjs +0 -345
package/bin/install.js
CHANGED
|
@@ -265,9 +265,11 @@ const _gsdLibDir = path.join(__dirname, '..', 'gsd-core', 'bin', 'lib');
|
|
|
265
265
|
const { MODEL_PROFILES: GSD_MODEL_PROFILES } = require(path.join(_gsdLibDir, 'model-profiles.cjs'));
|
|
266
266
|
const {
|
|
267
267
|
RUNTIME_PROFILE_MAP: GSD_RUNTIME_PROFILE_MAP,
|
|
268
|
+
} = require(path.join(_gsdLibDir, 'model-catalog.cjs'));
|
|
269
|
+
const {
|
|
268
270
|
resolveTierEntry: gsdResolveTierEntry,
|
|
269
271
|
EFFORT_SET: GSD_EFFORT_SET,
|
|
270
|
-
} = require(path.join(_gsdLibDir, '
|
|
272
|
+
} = require(path.join(_gsdLibDir, 'model-resolver.cjs'));
|
|
271
273
|
|
|
272
274
|
// #443 — model-catalog and config-defaults.manifest.json exports needed only
|
|
273
275
|
// by effort-resolution code paths (resolveInstallTimeEffort /
|
|
@@ -930,13 +932,11 @@ function readSettings(settingsPath) {
|
|
|
930
932
|
if (fs.existsSync(settingsPath)) {
|
|
931
933
|
try {
|
|
932
934
|
const raw = fs.readFileSync(settingsPath, 'utf8');
|
|
935
|
+
let parsed;
|
|
933
936
|
// Try standard JSON first (fast path)
|
|
934
|
-
try {
|
|
935
|
-
|
|
936
|
-
}
|
|
937
|
-
// Fall back to JSONC stripping
|
|
938
|
-
return JSON.parse(stripJsonComments(raw));
|
|
939
|
-
}
|
|
937
|
+
try { parsed = JSON.parse(raw); }
|
|
938
|
+
catch { parsed = JSON.parse(stripJsonComments(raw)); }
|
|
939
|
+
return parsed === null ? {} : parsed; // valid JSON null = empty settings, not malformed
|
|
940
940
|
} catch (e) {
|
|
941
941
|
// If even JSONC stripping fails, warn instead of silently returning {}
|
|
942
942
|
console.warn(' ' + yellow + '⚠' + reset + ' Warning: Could not parse ' + settingsPath + ' — file may be malformed. Existing settings preserved.');
|
|
@@ -2335,22 +2335,6 @@ const claudeToCursorTools = {
|
|
|
2335
2335
|
SlashCommand: null, // No equivalent — skills are auto-discovered
|
|
2336
2336
|
};
|
|
2337
2337
|
|
|
2338
|
-
/**
|
|
2339
|
-
* Convert a Claude Code tool name to Cursor CLI format
|
|
2340
|
-
* @returns {string|null} Cursor tool name, or null if tool should be excluded
|
|
2341
|
-
*/
|
|
2342
|
-
function convertCursorToolName(claudeTool) {
|
|
2343
|
-
if (claudeTool in claudeToCursorTools) {
|
|
2344
|
-
return claudeToCursorTools[claudeTool];
|
|
2345
|
-
}
|
|
2346
|
-
// MCP tools keep their format (Cursor supports MCP)
|
|
2347
|
-
if (claudeTool.startsWith('mcp__')) {
|
|
2348
|
-
return claudeTool;
|
|
2349
|
-
}
|
|
2350
|
-
// Most tools share the same name (Read, Write, Glob, Grep, Task, WebSearch, WebFetch, TodoWrite)
|
|
2351
|
-
return claudeTool;
|
|
2352
|
-
}
|
|
2353
|
-
|
|
2354
2338
|
function convertSlashCommandsToCursorSkillMentions(content) {
|
|
2355
2339
|
// Keep leading "/" for slash commands; only normalize gsd: -> gsd-.
|
|
2356
2340
|
// This preserves rendered "next step" commands like "/gsd-execute-phase 17".
|
|
@@ -2477,22 +2461,6 @@ const claudeToWindsurfTools = {
|
|
|
2477
2461
|
SlashCommand: null, // No equivalent — skills are auto-discovered
|
|
2478
2462
|
};
|
|
2479
2463
|
|
|
2480
|
-
/**
|
|
2481
|
-
* Convert a Claude Code tool name to Windsurf Cascade format
|
|
2482
|
-
* @returns {string|null} Windsurf tool name, or null if tool should be excluded
|
|
2483
|
-
*/
|
|
2484
|
-
function convertWindsurfToolName(claudeTool) {
|
|
2485
|
-
if (claudeTool in claudeToWindsurfTools) {
|
|
2486
|
-
return claudeToWindsurfTools[claudeTool];
|
|
2487
|
-
}
|
|
2488
|
-
// MCP tools keep their format (Windsurf supports MCP)
|
|
2489
|
-
if (claudeTool.startsWith('mcp__')) {
|
|
2490
|
-
return claudeTool;
|
|
2491
|
-
}
|
|
2492
|
-
// Most tools share the same name (Read, Write, Glob, Grep, Task, WebSearch, WebFetch, TodoWrite)
|
|
2493
|
-
return claudeTool;
|
|
2494
|
-
}
|
|
2495
|
-
|
|
2496
2464
|
function convertSlashCommandsToWindsurfSkillMentions(content) {
|
|
2497
2465
|
// Keep leading "/" for slash commands; only normalize gsd: -> gsd-.
|
|
2498
2466
|
return content.replace(/gsd:/gi, 'gsd-');
|
|
@@ -2605,25 +2573,6 @@ const claudeToAugmentTools = {
|
|
|
2605
2573
|
TodoWrite: 'add_tasks',
|
|
2606
2574
|
};
|
|
2607
2575
|
|
|
2608
|
-
function convertAugmentToolName(claudeTool) {
|
|
2609
|
-
if (claudeTool in claudeToAugmentTools) {
|
|
2610
|
-
return claudeToAugmentTools[claudeTool];
|
|
2611
|
-
}
|
|
2612
|
-
if (claudeTool.startsWith('mcp__')) {
|
|
2613
|
-
return claudeTool;
|
|
2614
|
-
}
|
|
2615
|
-
const toolMapping = {
|
|
2616
|
-
Read: 'view',
|
|
2617
|
-
Write: 'save-file',
|
|
2618
|
-
Glob: 'view',
|
|
2619
|
-
Grep: 'grep',
|
|
2620
|
-
Task: null,
|
|
2621
|
-
WebSearch: 'web-search',
|
|
2622
|
-
WebFetch: 'web-fetch',
|
|
2623
|
-
};
|
|
2624
|
-
return toolMapping[claudeTool] || claudeTool;
|
|
2625
|
-
}
|
|
2626
|
-
|
|
2627
2576
|
function convertSlashCommandsToAugmentSkillMentions(content) {
|
|
2628
2577
|
return content.replace(/gsd:/gi, 'gsd-');
|
|
2629
2578
|
}
|
|
@@ -8365,6 +8314,10 @@ function uninstall(isGlobal, runtime = 'claude') {
|
|
|
8365
8314
|
console.log(` ${green}✓${reset} Removed scripts/lib/ GSD files`);
|
|
8366
8315
|
}
|
|
8367
8316
|
}
|
|
8317
|
+
// Remove scripts/fix-slash-commands.cjs (#1223) — must come before the scripts/ rmdir
|
|
8318
|
+
const fixSlashUninstallPath = path.join(targetDir, 'scripts', 'fix-slash-commands.cjs');
|
|
8319
|
+
try { fs.unlinkSync(fixSlashUninstallPath); } catch (_) { /* best-effort */ }
|
|
8320
|
+
|
|
8368
8321
|
// If scripts/ dir is now empty, remove it too
|
|
8369
8322
|
const scriptsUninstallDir = path.join(targetDir, 'scripts');
|
|
8370
8323
|
if (fs.existsSync(scriptsUninstallDir)) {
|
|
@@ -9080,6 +9033,12 @@ function writeManifest(configDir, runtime = 'claude', options = {}) {
|
|
|
9080
9033
|
}
|
|
9081
9034
|
}
|
|
9082
9035
|
|
|
9036
|
+
// Track scripts/fix-slash-commands.cjs (top-level scripts/ file, not covered by changeset/lib loops)
|
|
9037
|
+
const fixSlashInstallPath = path.join(configDir, 'scripts', 'fix-slash-commands.cjs');
|
|
9038
|
+
if (fs.existsSync(fixSlashInstallPath)) {
|
|
9039
|
+
manifest.files['scripts/fix-slash-commands.cjs'] = fileHash(fixSlashInstallPath);
|
|
9040
|
+
}
|
|
9041
|
+
|
|
9083
9042
|
fs.writeFileSync(path.join(configDir, MANIFEST_NAME), JSON.stringify(manifest, null, 2));
|
|
9084
9043
|
return manifest;
|
|
9085
9044
|
}
|
|
@@ -10472,6 +10431,25 @@ function install(isGlobal, runtime = 'claude', options = {}) {
|
|
|
10472
10431
|
}
|
|
10473
10432
|
}
|
|
10474
10433
|
|
|
10434
|
+
// Copy scripts/fix-slash-commands.cjs — required by gsd-core/bin/lib/command-roster.cjs
|
|
10435
|
+
// at load time via require('../../../scripts/fix-slash-commands.cjs'). Without this file
|
|
10436
|
+
// every gsd-tools command crashes with MODULE_NOT_FOUND (#1223).
|
|
10437
|
+
// This copy is independent of scripts/changeset/ — it must land even when the
|
|
10438
|
+
// changeset CLI source is absent.
|
|
10439
|
+
{
|
|
10440
|
+
const fixSlashSrc = path.join(src, 'scripts', 'fix-slash-commands.cjs');
|
|
10441
|
+
const fixSlashDest = path.join(targetDir, 'scripts', 'fix-slash-commands.cjs');
|
|
10442
|
+
fs.mkdirSync(path.join(targetDir, 'scripts'), { recursive: true });
|
|
10443
|
+
if (!fs.existsSync(fixSlashSrc)) {
|
|
10444
|
+
failures.push('scripts/fix-slash-commands.cjs (source missing from package — reinstall from npm)');
|
|
10445
|
+
} else {
|
|
10446
|
+
fs.copyFileSync(fixSlashSrc, fixSlashDest);
|
|
10447
|
+
if (!verifyFileInstalled(fixSlashDest, 'scripts/fix-slash-commands.cjs')) {
|
|
10448
|
+
failures.push('scripts/fix-slash-commands.cjs');
|
|
10449
|
+
}
|
|
10450
|
+
}
|
|
10451
|
+
}
|
|
10452
|
+
|
|
10475
10453
|
// Remove legacy get-shit-done-cc artifacts and stale update caches (#607).
|
|
10476
10454
|
// cleanupLegacyGsdCc handles both the legacy shared cache and the per-package
|
|
10477
10455
|
// cache (formerly an inline unlinkSync here). A cleanup failure must never
|
|
@@ -12282,6 +12260,9 @@ module.exports = {
|
|
|
12282
12260
|
parseConfigDirFromArgs,
|
|
12283
12261
|
cleanupLegacyGsdCc,
|
|
12284
12262
|
_applyRuntimeRewrites,
|
|
12263
|
+
// #1191 — exported so tests exercise the REAL readSettings, not a replica
|
|
12264
|
+
readSettings,
|
|
12265
|
+
stripJsonComments,
|
|
12285
12266
|
...runtimeArtifactConversion,
|
|
12286
12267
|
};
|
|
12287
12268
|
|
package/commands/gsd/progress.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: gsd:progress
|
|
3
3
|
description: Check progress, advance workflow, or dispatch freeform intent — the unified GSD situational command
|
|
4
|
-
argument-hint: "[--forensic | --next | --do \"task description\"]"
|
|
4
|
+
argument-hint: "[--forensic | --next [--auto] [--converge] | --do \"task description\"]"
|
|
5
5
|
effort: low
|
|
6
6
|
allowed-tools:
|
|
7
7
|
- Read
|
|
@@ -25,6 +25,7 @@ Three modes:
|
|
|
25
25
|
<flags>
|
|
26
26
|
- **--next**: Detect current project state and automatically invoke the next logical GSD workflow step. Scans all prior phases for incomplete work before routing. `--next --force` bypasses safety gates.
|
|
27
27
|
- **--next --auto**: Like `--next`, but after the determined step completes, automatically re-invokes `/gsd:progress --next --auto` to continue chaining steps until completion or a blocking decision. Enables hands-free plan→execute→verify→complete progression.
|
|
28
|
+
- **--next --converge**: When the next action is planning (Route 3), route it through the plan-review **convergence** loop instead of the standard planner. Requires `workflow.plan_review_convergence=true` (enable with `gsd config-set workflow.plan_review_convergence true`). `--cross-ai` is an alias. Reviewer flags (`--codex`, `--gemini`, `--claude`, `--opencode`, `--ollama`, `--lm-studio`, `--llama-cpp`, `--all`) and `--max-cycles N` are forwarded to the convergence loop.
|
|
28
29
|
- **--do "..."**: Smart dispatcher — match freeform intent to the best GSD command using routing rules, confirm the match, then hand off.
|
|
29
30
|
- **--forensic**: Run 6-check integrity audit after the standard progress report.
|
|
30
31
|
- **(no flag)**: Standard progress check + intelligent routing (Routes A through F).
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-core",
|
|
3
|
-
"version": "1.5.0-rc.
|
|
3
|
+
"version": "1.5.0-rc.5",
|
|
4
4
|
"description": "GSD Core — a meta-prompting, context engineering, and spec-driven development system for AI coding agents. Loads gsd's operating context into every Gemini CLI session.",
|
|
5
5
|
"contextFileName": "GEMINI.md"
|
|
6
6
|
}
|