@opengsd/gsd-core 1.16.0 → 1.17.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 (58) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -2
  3. package/.opencode/plugins/gsd-core.js +251 -1
  4. package/.opencode/plugins/gsd-statusline/tui.tsx +55 -0
  5. package/GEMINI.md +1 -1
  6. package/agents/gsd-debug-session-manager.compact.md +6 -0
  7. package/agents/gsd-debug-session-manager.md +6 -0
  8. package/bin/gsd-mcp-server.js +3 -1
  9. package/bin/install.js +361 -94
  10. package/gsd-core/bin/gsd-tools.cjs +17 -2
  11. package/gsd-core/bin/lib/adr-parser.cjs +37 -5
  12. package/gsd-core/bin/lib/capability-registry.cjs +132 -80
  13. package/gsd-core/bin/lib/capability-validator.cjs +2 -1
  14. package/gsd-core/bin/lib/capability-writer.cjs +2 -1
  15. package/gsd-core/bin/lib/commands.cjs +28 -8
  16. package/gsd-core/bin/lib/gate-context-drift.cjs +5 -4
  17. package/gsd-core/bin/lib/gate-ui-safety.cjs +2 -1
  18. package/gsd-core/bin/lib/graphify.cjs +3 -2
  19. package/gsd-core/bin/lib/init.cjs +32 -12
  20. package/gsd-core/bin/lib/install-engine.cjs +11 -0
  21. package/gsd-core/bin/lib/install-shadow-report.cjs +12 -0
  22. package/gsd-core/bin/lib/installer-migrations/011-opencode-mcp-no-prompts.cjs +99 -0
  23. package/gsd-core/bin/lib/installer-migrations.cjs +54 -1
  24. package/gsd-core/bin/lib/jsonc-edit.cjs +418 -0
  25. package/gsd-core/bin/lib/loop-host-contract.cjs +2 -1
  26. package/gsd-core/bin/lib/mcp-server.cjs +5 -1
  27. package/gsd-core/bin/lib/opencode-mcp-entry.cjs +39 -0
  28. package/gsd-core/bin/lib/opencode-version.cjs +486 -0
  29. package/gsd-core/bin/lib/phase.cjs +21 -0
  30. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +2 -1
  31. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +95 -4
  32. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +58 -3
  33. package/gsd-core/bin/lib/runtime-slash.cjs +13 -0
  34. package/gsd-core/bin/lib/smart-entry.cjs +92 -53
  35. package/gsd-core/bin/lib/state-transition.cjs +67 -9
  36. package/gsd-core/bin/lib/state.cjs +454 -66
  37. package/gsd-core/bin/lib/update-context.cjs +18 -1
  38. package/gsd-core/bin/lib/verification.cjs +107 -17
  39. package/gsd-core/workflows/code-review.md +16 -1
  40. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +1 -1
  41. package/gsd-core/workflows/execute-phase.md +3 -1
  42. package/gsd-core/workflows/resume-project.md +14 -10
  43. package/hooks/dist/gsd-check-update.js +26 -20
  44. package/hooks/dist/gsd-context-monitor.js +14 -5
  45. package/hooks/dist/gsd-secret-read-guard.js +117 -1
  46. package/hooks/dist/gsd-statusline.js +321 -22
  47. package/hooks/gsd-check-update.js +26 -20
  48. package/hooks/gsd-context-monitor.js +14 -5
  49. package/hooks/gsd-secret-read-guard.js +117 -1
  50. package/hooks/gsd-statusline.js +321 -22
  51. package/package.json +1 -1
  52. package/scripts/gen-capability-registry.cjs +7 -1
  53. package/scripts/gen-loop-host-contract.cjs +4 -1
  54. package/scripts/lib/macos-conformance-tier.generated.cjs +4 -0
  55. package/scripts/lib/platform-conformance-tier.generated.cjs +10 -0
  56. package/scripts/mutation-matrix.cjs +3 -1
  57. package/scripts/release-tarball-smoke.cjs +14 -7
  58. package/vscode/package.json +1 -1
@@ -1593,7 +1593,16 @@ function dispatchOverlayCapabilityCommand({ command, args, cwd, raw, error, load
1593
1593
  const fsx = require('node:fs');
1594
1594
  const os = require('node:os');
1595
1595
  const { REVIEWER_LANES, mergeReviewerLanes } = require('./lib/review-lane-descriptor.cjs');
1596
- const { resolveLanePlan, resolveLaneEffort, resolveLaneBudget } = require('./lib/review-lane-invocation.cjs');
1596
+ const { resolveLanePlan: resolveLanePlanBase, resolveLaneEffort, resolveLaneBudget } = require('./lib/review-lane-invocation.cjs');
1597
+ // OpenCode 2.x argv differs from 1.x (no --variant; effort rides on the model as `#variant`;
1598
+ // ADR-5331 D5/D8). The generation is probed lazily, only when the opencode lane is resolved.
1599
+ const resolveLanePlan = (laneInput) => {
1600
+ if (!laneInput || !laneInput.lane || laneInput.lane.slug !== 'opencode') return resolveLanePlanBase(laneInput);
1601
+ const ocv = require('./lib/opencode-version.cjs');
1602
+ const adapted = ocv.adaptLaneInputForGeneration(laneInput, ocv.detectOpencodeGeneration().generation);
1603
+ for (const w of adapted.warnings) process.stderr.write('gsd: ' + w + '\n');
1604
+ return ocv.adaptLanePlanForGeneration(resolveLanePlanBase(adapted.input), ocv.detectOpencodeGeneration().generation);
1605
+ };
1597
1606
  const modelCatalog = require('./lib/model-catalog.cjs');
1598
1607
  const runner = require('./lib/review-lane-runner.cjs');
1599
1608
  const cfgLoader = require('./lib/config-loader.cjs');
@@ -2675,8 +2684,14 @@ function dispatchOverlayCapabilityCommand({ command, args, cwd, raw, error, load
2675
2684
  'gsd-executor', readGsdEffectiveModelOverrides(cwd), null);
2676
2685
  model = resolveDispatchModelPin('gsd-executor', pinned);
2677
2686
  }
2687
+ let orchestratorExec = runtimeEntry?.runtime?.orchestratorExec;
2688
+ if (orchestratorExec && orchestratorExec.cwdFlag === '--dir' && runtimeId === 'opencode') {
2689
+ // OpenCode 2.x `run` has no --dir: bind the worktree through the process cwd (ADR-5331 D5).
2690
+ const ocv = require('./lib/opencode-version.cjs');
2691
+ orchestratorExec = ocv.adaptOrchestratorExecForGeneration(orchestratorExec, ocv.detectOpencodeGeneration().generation);
2692
+ }
2678
2693
  const resolution = hostIntegration.resolveOrchestratorExec(
2679
- runtimeEntry?.runtime?.orchestratorExec,
2694
+ orchestratorExec,
2680
2695
  cwdTarget,
2681
2696
  promptArg,
2682
2697
  model,
@@ -221,13 +221,45 @@ function classifyHeader(normalizedHeader) {
221
221
  }
222
222
  return null;
223
223
  }
224
+ // A list item starts with a bullet (-, *, +) or an ordered marker (1. or 1)).
225
+ const LIST_MARKER = /^([-*+]|\d+[.)])\s+/;
226
+ /**
227
+ * Split a section body into one entry per top-level list item (#5227).
228
+ *
229
+ * A line that opens a list item starts a new entry with its marker stripped. Any
230
+ * other non-blank line, and any marker line indented deeper than the first item
231
+ * (a nested sub-bullet), joins the current entry with a single space, so a
232
+ * hard-wrapped item stays one entry. Text before the first marker is its own
233
+ * entry. A block with no list marker at all keeps one entry per line, so a plain
234
+ * `## Status` body still yields its first line.
235
+ */
224
236
  function splitEntries(blockText) {
225
- return (typeof blockText === 'string' ? blockText : '')
237
+ const lines = (typeof blockText === 'string' ? blockText : '')
226
238
  .split(/\r?\n/)
227
- .map((line) => line.trim())
228
- .filter(Boolean)
229
- .map((line) => line.replace(/^[-*+]\s+/, '').trim())
230
- .filter(Boolean);
239
+ .filter((line) => line.trim() !== '');
240
+ if (!lines.some((line) => LIST_MARKER.test(line.trim())))
241
+ return lines.map((line) => line.trim());
242
+ const entries = [];
243
+ let topIndent = -1;
244
+ let open = false;
245
+ for (const raw of lines) {
246
+ const text = raw.trim();
247
+ const indent = raw.length - raw.trimStart().length;
248
+ const isMarker = LIST_MARKER.test(text);
249
+ if (isMarker && (topIndent < 0 || indent <= topIndent)) {
250
+ if (topIndent < 0)
251
+ topIndent = indent;
252
+ entries.push(text.replace(LIST_MARKER, '').trim());
253
+ open = true;
254
+ }
255
+ else if (open) {
256
+ entries[entries.length - 1] = `${entries[entries.length - 1]} ${text}`;
257
+ }
258
+ else {
259
+ entries.push(text);
260
+ }
261
+ }
262
+ return entries.filter(Boolean);
231
263
  }
232
264
  /**
233
265
  * Thin adapter: wraps the seam's `collectSections` to produce the same