@opengsd/gsd-core 1.6.1 → 1.7.0-rc.2

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 (119) hide show
  1. package/.claude-plugin/marketplace.json +20 -0
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +711 -0
  4. package/agents/gsd-advisor-researcher.md +2 -0
  5. package/agents/gsd-ai-researcher.md +1 -1
  6. package/agents/gsd-assumptions-analyzer.md +2 -0
  7. package/agents/gsd-code-fixer.md +2 -0
  8. package/agents/gsd-code-reviewer.md +2 -0
  9. package/agents/gsd-codebase-mapper.md +2 -0
  10. package/agents/gsd-debugger.md +2 -0
  11. package/agents/gsd-doc-writer.md +2 -0
  12. package/agents/gsd-eval-auditor.md +2 -0
  13. package/agents/gsd-executor.md +9 -6
  14. package/agents/gsd-integration-checker.md +2 -0
  15. package/agents/gsd-nyquist-auditor.md +2 -0
  16. package/agents/gsd-phase-researcher.md +2 -0
  17. package/agents/gsd-plan-checker.md +2 -0
  18. package/agents/gsd-planner.md +2 -0
  19. package/agents/gsd-project-researcher.md +2 -0
  20. package/agents/gsd-research-synthesizer.md +2 -0
  21. package/agents/gsd-roadmapper.md +2 -0
  22. package/agents/gsd-security-auditor.md +2 -0
  23. package/agents/gsd-ui-auditor.md +2 -0
  24. package/agents/gsd-ui-checker.md +2 -0
  25. package/agents/gsd-ui-researcher.md +2 -0
  26. package/agents/gsd-verifier.md +5 -2
  27. package/bin/gsd-mcp-server.js +31 -0
  28. package/bin/install.js +411 -1146
  29. package/commands/gsd/review.md +6 -0
  30. package/gemini-extension.json +1 -1
  31. package/gsd-core/bin/gsd-tools.cjs +134 -8
  32. package/gsd-core/bin/lib/adapter-declarative.cjs +35 -0
  33. package/gsd-core/bin/lib/adapter-imperative.cjs +52 -0
  34. package/gsd-core/bin/lib/assumption-delta.cjs +231 -0
  35. package/gsd-core/bin/lib/capability-lifecycle.cjs +7 -7
  36. package/gsd-core/bin/lib/capability-loader.cjs +45 -9
  37. package/gsd-core/bin/lib/capability-lock.cjs +2 -2
  38. package/gsd-core/bin/lib/capability-registry.cjs +891 -82
  39. package/gsd-core/bin/lib/capability-source.cjs +26 -11
  40. package/gsd-core/bin/lib/capability-validator.cjs +222 -2
  41. package/gsd-core/bin/lib/cli-skew-check.cjs +44 -0
  42. package/gsd-core/bin/lib/command-aliases.cjs +8 -0
  43. package/gsd-core/bin/lib/commands.cjs +2 -1
  44. package/gsd-core/bin/lib/config.cjs +27 -0
  45. package/gsd-core/bin/lib/embedding-adapter.cjs +27 -0
  46. package/gsd-core/bin/lib/external-descriptor-trust.cjs +70 -0
  47. package/gsd-core/bin/lib/frontmatter.cjs +53 -6
  48. package/gsd-core/bin/lib/handshake-serialized.cjs +70 -0
  49. package/gsd-core/bin/lib/hook-bus.cjs +81 -0
  50. package/gsd-core/bin/lib/host-integration-sdk.cjs +53 -0
  51. package/gsd-core/bin/lib/host-integration.cjs +469 -0
  52. package/gsd-core/bin/lib/init.cjs +35 -7
  53. package/gsd-core/bin/lib/install-engine.cjs +755 -0
  54. package/gsd-core/bin/lib/install-profiles.cjs +35 -4
  55. package/gsd-core/bin/lib/installer-migrations.cjs +1 -1
  56. package/gsd-core/bin/lib/mcp-server.cjs +194 -0
  57. package/gsd-core/bin/lib/milestone.cjs +68 -40
  58. package/gsd-core/bin/lib/model-adapter.cjs +50 -0
  59. package/gsd-core/bin/lib/phase-id.cjs +18 -0
  60. package/gsd-core/bin/lib/phase.cjs +57 -90
  61. package/gsd-core/bin/lib/phases-command-router.cjs +4 -3
  62. package/gsd-core/bin/lib/planning-workspace.cjs +1 -1
  63. package/gsd-core/bin/lib/probe-core.cjs +132 -2
  64. package/gsd-core/bin/lib/review-reviewer-selection.cjs +129 -13
  65. package/gsd-core/bin/lib/roadmap-command-router.cjs +3 -2
  66. package/gsd-core/bin/lib/roadmap-parser.cjs +21 -11
  67. package/gsd-core/bin/lib/roadmap-upgrade.cjs +3 -2
  68. package/gsd-core/bin/lib/roadmap.cjs +33 -22
  69. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +65 -9
  70. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +54 -4
  71. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +5 -2
  72. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +1 -1
  73. package/gsd-core/bin/lib/runtime-name-policy.cjs +160 -30
  74. package/gsd-core/bin/lib/shell-command-projection.cjs +16 -0
  75. package/gsd-core/bin/lib/stale-bake-guard.cjs +254 -0
  76. package/gsd-core/bin/lib/state-command-router.cjs +4 -0
  77. package/gsd-core/bin/lib/state-io.cjs +55 -0
  78. package/gsd-core/bin/lib/state-transition.cjs +1603 -0
  79. package/gsd-core/bin/lib/state.cjs +327 -683
  80. package/gsd-core/bin/lib/surface.cjs +4 -1
  81. package/gsd-core/bin/lib/validate.cjs +2 -1
  82. package/gsd-core/bin/lib/verify.cjs +6 -4
  83. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +12 -2
  84. package/gsd-core/bin/lib/workstream-inventory.cjs +28 -0
  85. package/gsd-core/bin/lib/workstream.cjs +4 -4
  86. package/gsd-core/bin/shared/config-schema.manifest.json +9 -0
  87. package/gsd-core/references/agent-skills-bootstrap.md +60 -0
  88. package/gsd-core/references/honest-verifier.md +105 -0
  89. package/gsd-core/references/model-profiles.md +27 -0
  90. package/gsd-core/references/reviewer-instances.md +99 -0
  91. package/gsd-core/workflows/autonomous.md +30 -32
  92. package/gsd-core/workflows/complete-milestone.md +6 -10
  93. package/gsd-core/workflows/execute-phase.md +1 -1
  94. package/gsd-core/workflows/forensics.md +3 -3
  95. package/gsd-core/workflows/help/modes/full.md +1 -1
  96. package/gsd-core/workflows/manager.md +15 -15
  97. package/gsd-core/workflows/milestone-summary.md +3 -3
  98. package/gsd-core/workflows/new-milestone.md +6 -0
  99. package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +42 -0
  100. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +102 -0
  101. package/gsd-core/workflows/plan-phase/steps/windows-troubleshooting.md +23 -0
  102. package/gsd-core/workflows/plan-phase.md +4 -159
  103. package/gsd-core/workflows/review.md +33 -2
  104. package/gsd-core/workflows/thread.md +4 -4
  105. package/gsd-core/workflows/verify-phase.md +11 -4
  106. package/gsd-core/workflows/verify-work.md +1 -2
  107. package/hooks/dist/gsd-graphify-update.sh +7 -1
  108. package/hooks/gsd-graphify-update.sh +7 -1
  109. package/package.json +6 -4
  110. package/scripts/ci-test-scope.cjs +38 -9
  111. package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -1
  112. package/scripts/lint-regression-test-names.allowlist.json +3 -0
  113. package/scripts/lint-test-file-count.allowlist.json +19 -5
  114. package/scripts/mutation-matrix.cjs +45 -3
  115. package/scripts/prompt-injection-scan.sh +8 -0
  116. package/scripts/run-tests.cjs +51 -1
  117. package/scripts/sync-manifest-versions.cjs +66 -14
  118. package/skills/gsd-review/SKILL.md +6 -0
  119. package/scripts/lint-windows-test-portability.cjs +0 -178
@@ -67,6 +67,7 @@ var __importStar = (this && this.__importStar) || (function () {
67
67
  };
68
68
  })();
69
69
  Object.defineProperty(exports, "__esModule", { value: true });
70
+ exports.readHostVersion = readHostVersion;
70
71
  exports.loadRegistry = loadRegistry;
71
72
  const fs = __importStar(require("node:fs"));
72
73
  const os = __importStar(require("node:os"));
@@ -110,17 +111,33 @@ function _setValidatorForTest(v) {
110
111
  function _setGeneratorForTest(g) {
111
112
  _generatorOverride = g;
112
113
  }
113
- /** Resolve the running GSD version; fail-closed to '0.0.0' if it cannot be read. */
114
- function readHostVersion() {
114
+ /**
115
+ * Resolve the running GSD version; fail-closed to '0.0.0' if it cannot be read.
116
+ *
117
+ * Prefer the authoritative `gsd-core/VERSION` the installer writes for EVERY runtime
118
+ * (libDir = gsd-core/bin/lib/, so `../../VERSION` = gsd-core/VERSION). This is reliable
119
+ * across all installed layouts — including runtimes that get no marker package.json, and
120
+ * local installs where the walked-up `../../../package.json` would resolve to the USER's
121
+ * own project and report a wrong version (#1920). Fall back to the runtime-root
122
+ * package.json for the dev/source tree, then fail-closed. Mirrors resolveVersionFrom()
123
+ * (#1383). `libDir` is injectable for tests; it defaults to this module's directory.
124
+ */
125
+ function readHostVersion(libDir = __dirname) {
126
+ const SEMVER_PREFIX = /^\d+\.\d+\.\d+/;
115
127
  try {
116
- // gsd-core/bin/lib/ -> repo/package root is three levels up.
117
- // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment
118
- const pkg = require('../../../package.json');
119
- return typeof pkg.version === 'string' && pkg.version ? pkg.version : '0.0.0';
128
+ const v = fs.readFileSync(path.join(libDir, '..', '..', 'VERSION'), 'utf8').trim();
129
+ if (SEMVER_PREFIX.test(v))
130
+ return v;
120
131
  }
121
- catch {
122
- return '0.0.0';
132
+ catch { /* not an installed tree (no gsd-core/VERSION) */ }
133
+ try {
134
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment
135
+ const pkg = require(path.join(libDir, '..', '..', '..', 'package.json'));
136
+ if (pkg && typeof pkg.version === 'string' && SEMVER_PREFIX.test(pkg.version))
137
+ return pkg.version;
123
138
  }
139
+ catch { /* runtime root has no package.json */ }
140
+ return '0.0.0';
124
141
  }
125
142
  /**
126
143
  * Canonicalize a directory path for dedup/scope-escalation comparison. #1459 finding 1 (HIGH): the dedup
@@ -397,6 +414,10 @@ function loadRegistry(options = {}) {
397
414
  const ledgerMod = require('./capability-ledger.cjs');
398
415
  // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment
399
416
  const consentMod = require('./capability-consent.cjs');
417
+ // ADR-1239 Phase C-2 (#1681): load-time configHome confinement for installed
418
+ // third-party descriptors. Accessed via module ref for stub compatibility.
419
+ // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-unsafe-assignment
420
+ const externalDescriptorTrust = require('./external-descriptor-trust.cjs');
400
421
  const cwd = options.cwd || process.cwd();
401
422
  const hostVersion = options.hostVersion || readHostVersion();
402
423
  // The user-owned consent home — SAME `gsdHome || GSD_HOME || homedir()` rule the CLI uses, so the
@@ -681,6 +702,20 @@ function loadRegistry(options = {}) {
681
702
  skip('cross-capability validation failed: ' + crossErrs.slice(0, 3).join('; '));
682
703
  continue;
683
704
  }
705
+ // ADR-1239 Phase C-2 (#1681): load-time configHome confinement — reject
706
+ // (skip + warn) any installed third-party descriptor whose declared
707
+ // destSubpath escapes the user-approved configHome, BEFORE it is composed.
708
+ // Defense-in-depth on top of the install-time gate (#1679 AC3).
709
+ if (typeof options.configHome === 'string' && options.configHome.length > 0) {
710
+ try {
711
+ externalDescriptorTrust.assertDescriptorConfined(cap, options.configHome);
712
+ }
713
+ catch (confineErr) {
714
+ acceptedMap.delete(id);
715
+ skip('configHome confinement rejected: ' + errMessage(confineErr));
716
+ continue;
717
+ }
718
+ }
684
719
  // Accepted.
685
720
  overlayCaps.push(cap);
686
721
  acceptedIds.add(id);
@@ -761,4 +796,5 @@ function loadRegistry(options = {}) {
761
796
  return withOverlayMeta(base, meta);
762
797
  }
763
798
  }
764
- module.exports = { loadRegistry, _setValidatorForTest, _setGeneratorForTest };
799
+ // readHostVersion is exported for the #1920 regression (VERSION-first host-version resolution).
800
+ module.exports = { loadRegistry, readHostVersion, _setValidatorForTest, _setGeneratorForTest };
@@ -42,7 +42,7 @@ const node_os_1 = __importDefault(require("node:os"));
42
42
  const node_crypto_1 = __importDefault(require("node:crypto"));
43
43
  /* eslint-disable @typescript-eslint/no-require-imports */
44
44
  const ledgerMod = require('./capability-ledger.cjs');
45
- const { execTool } = require('./shell-command-projection.cjs');
45
+ const { execTool, retryRenameSync } = require('./shell-command-projection.cjs');
46
46
  /* eslint-enable @typescript-eslint/no-require-imports */
47
47
  // ---------------------------------------------------------------------------
48
48
  // Constants
@@ -475,7 +475,7 @@ function acquireLock(lockPath, opts) {
475
475
  // Steal atomically (only one racer can rename the inode).
476
476
  const stolen = `${lockPath}.stale-${process.pid}-${Date.now()}-${node_crypto_1.default.randomBytes(4).toString('hex')}`;
477
477
  try {
478
- node_fs_1.default.renameSync(lockPath, stolen);
478
+ retryRenameSync(lockPath, stolen);
479
479
  }
480
480
  catch {
481
481
  return null;