@opengsd/gsd-core 1.12.0 → 1.14.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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.opencode/plugins/gsd-core.js +12 -0
- package/agents/gsd-advisor-researcher.compact.md +85 -0
- package/agents/gsd-ai-researcher.compact.md +96 -0
- package/agents/gsd-assumptions-analyzer.compact.md +81 -0
- package/agents/gsd-code-fixer.compact.md +458 -0
- package/agents/gsd-code-fixer.md +5 -5
- package/agents/gsd-code-reviewer.compact.md +269 -0
- package/agents/gsd-code-reviewer.md +15 -3
- package/agents/gsd-codebase-mapper.compact.md +760 -0
- package/agents/gsd-debug-session-manager.compact.md +345 -0
- package/agents/gsd-doc-classifier.compact.md +192 -0
- package/agents/gsd-doc-synthesizer.compact.md +200 -0
- package/agents/gsd-doc-verifier.compact.md +143 -0
- package/agents/gsd-doc-writer.compact.md +440 -0
- package/agents/gsd-dom-verifier.compact.md +138 -0
- package/agents/gsd-domain-researcher.compact.md +141 -0
- package/agents/gsd-eval-auditor.compact.md +160 -0
- package/agents/gsd-eval-planner.compact.md +137 -0
- package/agents/gsd-executor.md +63 -35
- package/agents/gsd-framework-selector.compact.md +82 -0
- package/agents/gsd-integration-checker.compact.md +245 -0
- package/agents/gsd-intel-updater.compact.md +226 -0
- package/agents/gsd-mempalace-curator.compact.md +45 -0
- package/agents/gsd-nyquist-auditor.compact.md +179 -0
- package/agents/gsd-pattern-mapper.compact.md +275 -0
- package/agents/gsd-plan-checker.md +76 -57
- package/agents/gsd-planner.md +14 -0
- package/agents/gsd-project-researcher.compact.md +587 -0
- package/agents/gsd-research-synthesizer.compact.md +212 -0
- package/agents/gsd-roadmapper.compact.md +454 -0
- package/agents/gsd-roadmapper.md +13 -0
- package/agents/gsd-security-auditor.compact.md +162 -0
- package/agents/gsd-ui-auditor.compact.md +404 -0
- package/agents/gsd-ui-checker.compact.md +277 -0
- package/agents/gsd-ui-checker.md +19 -3
- package/agents/gsd-ui-researcher.compact.md +282 -0
- package/agents/gsd-ui-researcher.md +29 -0
- package/agents/gsd-user-profiler.compact.md +108 -0
- package/agents/gsd-verifier.md +23 -1
- package/bin/install.js +444 -134
- package/commands/gsd/cleanup.md +1 -0
- package/commands/gsd/code-review.md +2 -1
- package/commands/gsd/complete-milestone.md +1 -0
- package/commands/gsd/config.md +1 -0
- package/commands/gsd/debug.md +1 -0
- package/commands/gsd/execute-phase.md +1 -1
- package/commands/gsd/graphify.md +1 -0
- package/commands/gsd/health.md +1 -0
- package/commands/gsd/mempalace-capture.md +1 -0
- package/commands/gsd/mempalace-recall.md +1 -0
- package/commands/gsd/new-milestone.md +1 -0
- package/commands/gsd/new-project.md +1 -0
- package/commands/gsd/next.md +1 -0
- package/commands/gsd/ns-workflow.md +2 -1
- package/commands/gsd/pause-work.md +1 -0
- package/commands/gsd/phase.md +2 -1
- package/commands/gsd/pr-branch.md +1 -0
- package/commands/gsd/quick-batch.md +105 -0
- package/commands/gsd/resume-work.md +1 -0
- package/commands/gsd/review-backlog.md +1 -0
- package/commands/gsd/settings.md +2 -1
- package/commands/gsd/stats.md +1 -0
- package/commands/gsd/surface.md +18 -8
- package/commands/gsd/thread.md +1 -0
- package/commands/gsd/workspace.md +1 -0
- package/commands/gsd/workstreams.md +1 -0
- package/gsd-core/bin/check-latest-version.cjs +8 -3
- package/gsd-core/bin/gsd-tools.cjs +532 -174
- package/gsd-core/bin/lib/adr-parser.cjs +1 -1
- package/gsd-core/bin/lib/artifacts.cjs +2 -1
- package/gsd-core/bin/lib/audit.cjs +39 -22
- package/gsd-core/bin/lib/broken-windows.cjs +168 -49
- package/gsd-core/bin/lib/capability-activation.cjs +27 -0
- package/gsd-core/bin/lib/capability-lifecycle.cjs +10 -6
- package/gsd-core/bin/lib/capability-loader.cjs +135 -1
- package/gsd-core/bin/lib/capability-registry.cjs +528 -116
- package/gsd-core/bin/lib/capability-source.cjs +19 -2
- package/gsd-core/bin/lib/capability-state.cjs +7 -1
- package/gsd-core/bin/lib/capability-validator.cjs +134 -5
- package/gsd-core/bin/lib/capability-writer.cjs +14 -4
- package/gsd-core/bin/lib/check-command-router.cjs +198 -38
- package/gsd-core/bin/lib/claude-orchestration.cjs +10 -25
- package/gsd-core/bin/lib/clusters.cjs +1 -0
- package/gsd-core/bin/lib/code-review-depth.cjs +2 -2
- package/gsd-core/bin/lib/command-aliases.cjs +16 -0
- package/gsd-core/bin/lib/commands.cjs +981 -79
- package/gsd-core/bin/lib/config-loader.cjs +4 -0
- package/gsd-core/bin/lib/config.cjs +153 -38
- package/gsd-core/bin/lib/core-utils.cjs +34 -7
- package/gsd-core/bin/lib/coverage.cjs +1 -1
- package/gsd-core/bin/lib/decisions.cjs +343 -28
- package/gsd-core/bin/lib/edge-probe.cjs +14 -1
- package/gsd-core/bin/lib/external-descriptor-trust.cjs +29 -14
- package/gsd-core/bin/lib/file-overlap-partitioner.cjs +74 -0
- package/gsd-core/bin/lib/frontmatter.cjs +137 -23
- package/gsd-core/bin/lib/gap-checker.cjs +22 -13
- package/gsd-core/bin/lib/git-base-branch.cjs +10 -2
- package/gsd-core/bin/lib/gsd2-import.cjs +1 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +8 -2
- package/gsd-core/bin/lib/health-diagnostic-rules/roadmap-disk-consistency.cjs +54 -11
- package/gsd-core/bin/lib/health-diagnostic-rules/state-consistency.cjs +87 -23
- package/gsd-core/bin/lib/health-diagnostic-rules/worktree-health.cjs +1 -1
- package/gsd-core/bin/lib/host-integration.cjs +57 -5
- package/gsd-core/bin/lib/init-command-router.cjs +14 -0
- package/gsd-core/bin/lib/init.cjs +539 -60
- package/gsd-core/bin/lib/install-engine.cjs +199 -14
- package/gsd-core/bin/lib/install-model-override-resolver.cjs +45 -0
- package/gsd-core/bin/lib/install-profiles.cjs +36 -14
- package/gsd-core/bin/lib/installer-migration-report.cjs +1 -0
- package/gsd-core/bin/lib/installer-migrations.cjs +33 -4
- package/gsd-core/bin/lib/io.cjs +35 -0
- package/gsd-core/bin/lib/loop-resolver.cjs +64 -39
- package/gsd-core/bin/lib/markdown-table.cjs +123 -0
- package/gsd-core/bin/lib/mcp-catalog.cjs +2 -2
- package/gsd-core/bin/lib/milestone.cjs +41 -10
- package/gsd-core/bin/lib/model-resolver.cjs +101 -10
- package/gsd-core/bin/lib/phase-command-router.cjs +20 -7
- package/gsd-core/bin/lib/phase-id.cjs +412 -31
- package/gsd-core/bin/lib/phase-lifecycle.cjs +61 -0
- package/gsd-core/bin/lib/phase.cjs +941 -98
- package/gsd-core/bin/lib/plan-document.cjs +10 -0
- package/gsd-core/bin/lib/planning-inspect.cjs +34 -18
- package/gsd-core/bin/lib/planning-snapshot.cjs +206 -30
- package/gsd-core/bin/lib/planning-workspace.cjs +153 -29
- package/gsd-core/bin/lib/pristine-baseline.cjs +182 -0
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +91 -4
- package/gsd-core/bin/lib/quick-batch-command-router.cjs +285 -0
- package/gsd-core/bin/lib/quick-batch-dispatch.cjs +250 -0
- package/gsd-core/bin/lib/quick-batch.cjs +840 -0
- package/gsd-core/bin/lib/refactor-trigger-command-router.cjs +61 -2
- package/gsd-core/bin/lib/research-store.cjs +11 -12
- package/gsd-core/bin/lib/review-lane-descriptor.cjs +53 -5
- package/gsd-core/bin/lib/review-lane-invocation.cjs +96 -1
- package/gsd-core/bin/lib/review-lane-runner.cjs +136 -10
- package/gsd-core/bin/lib/reviewer-step-dispatch.cjs +337 -0
- package/gsd-core/bin/lib/roadmap-parser.cjs +555 -41
- package/gsd-core/bin/lib/roadmap.cjs +292 -69
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +260 -43
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +28 -20
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +294 -108
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +408 -47
- package/gsd-core/bin/lib/security.cjs +126 -7
- package/gsd-core/bin/lib/shell-command-projection.cjs +4 -0
- package/gsd-core/bin/lib/smart-entry.cjs +7 -9
- package/gsd-core/bin/lib/state-document.cjs +159 -32
- package/gsd-core/bin/lib/state-md-schema.cjs +44 -27
- package/gsd-core/bin/lib/state-transition.cjs +465 -62
- package/gsd-core/bin/lib/state.cjs +906 -151
- package/gsd-core/bin/lib/surface.cjs +83 -10
- package/gsd-core/bin/lib/task-command-router.cjs +12 -6
- package/gsd-core/bin/lib/tdd-red-evidence.cjs +133 -0
- package/gsd-core/bin/lib/uat.cjs +1420 -516
- package/gsd-core/bin/lib/update-context.cjs +36 -26
- package/gsd-core/bin/lib/validate.cjs +230 -12
- package/gsd-core/bin/lib/vendor/js-yaml.cjs +11 -3
- package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
- package/gsd-core/bin/lib/verification.cjs +316 -23
- package/gsd-core/bin/lib/verify-command-grounding.cjs +1 -1
- package/gsd-core/bin/lib/verify-command-router.cjs +1 -0
- package/gsd-core/bin/lib/verify.cjs +531 -36
- package/gsd-core/bin/lib/workstream-inventory.cjs +21 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +21 -7
- package/gsd-core/bin/shared/config-defaults.manifest.json +1 -0
- package/gsd-core/bin/shared/config-schema.manifest.json +13 -0
- package/gsd-core/bin/verify-reapply-patches.cjs +507 -81
- package/gsd-core/references/agent-contracts.md +3 -3
- package/gsd-core/references/compact-content-gate.md +66 -0
- package/gsd-core/references/edge-probe.md +17 -13
- package/gsd-core/references/execute-mvp-tdd.md +18 -16
- package/gsd-core/references/execute-phase-response-language.md +6 -0
- package/gsd-core/references/executor-examples.md +42 -0
- package/gsd-core/references/few-shot-examples/plan-checker.md +15 -15
- package/gsd-core/references/loop-hook-dispatch.md +18 -0
- package/gsd-core/references/model-profiles.md +12 -3
- package/gsd-core/references/mvp-concepts.md +2 -2
- package/gsd-core/references/plan-checker-examples.md +41 -0
- package/gsd-core/references/planner-antipatterns.md +25 -0
- package/gsd-core/references/planner-chunked.md +5 -1
- package/gsd-core/references/planner-coupling.md +42 -0
- package/gsd-core/references/planner-quick-batch.md +71 -0
- package/gsd-core/references/planner-reviews.md +47 -0
- package/gsd-core/references/planner-revision.md +75 -2
- package/gsd-core/references/planning-config.md +5 -1
- package/gsd-core/references/response-language-directive.md +9 -0
- package/gsd-core/references/revision-loop.md +118 -11
- package/gsd-core/references/tdd.md +17 -9
- package/gsd-core/references/thinking-models-planning.md +18 -2
- package/gsd-core/references/verification-patterns.md +17 -4
- package/gsd-core/references/verifier-evidence-gate.md +160 -0
- package/gsd-core/references/worktree-path-safety.md +112 -2
- package/gsd-core/templates/README.md +7 -1
- package/gsd-core/templates/phase-prompt.md +4 -0
- package/gsd-core/templates/state.md +6 -3
- package/gsd-core/templates/summary.compact.md +212 -0
- package/gsd-core/templates/user-setup.compact.md +199 -0
- package/gsd-core/templates/user-setup.md +0 -9
- package/gsd-core/templates/verification-report.md +5 -0
- package/gsd-core/workflows/add-backlog.md +2 -0
- package/gsd-core/workflows/add-phase.md +2 -0
- package/gsd-core/workflows/add-tests.md +1 -1
- package/gsd-core/workflows/add-todo.md +4 -3
- package/gsd-core/workflows/ai-integration-phase.md +1 -1
- package/gsd-core/workflows/analyze-dependencies.md +2 -0
- package/gsd-core/workflows/audit-fix.md +2 -0
- package/gsd-core/workflows/audit-milestone.md +2 -0
- package/gsd-core/workflows/audit-uat.md +2 -0
- package/gsd-core/workflows/autonomous.md +15 -10
- package/gsd-core/workflows/check-todos.md +5 -3
- package/gsd-core/workflows/cleanup.md +4 -2
- package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +22 -13
- package/gsd-core/workflows/code-review-fix.md +5 -3
- package/gsd-core/workflows/code-review.md +211 -43
- package/gsd-core/workflows/complete-milestone/detail/elaboration.md +274 -0
- package/gsd-core/workflows/complete-milestone.md +40 -254
- package/gsd-core/workflows/debug.md +1 -1
- package/gsd-core/workflows/diagnose-issues.md +5 -1
- package/gsd-core/workflows/discuss-phase/modes/advisor.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/all.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/analyze.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/auto.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/batch.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/chain.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/default.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/power.md +2 -0
- package/gsd-core/workflows/discuss-phase/modes/text.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/context.md +2 -0
- package/gsd-core/workflows/discuss-phase/templates/discussion-log.md +2 -0
- package/gsd-core/workflows/discuss-phase-assumptions.md +1 -1
- package/gsd-core/workflows/discuss-phase-power.md +2 -0
- package/gsd-core/workflows/discuss-phase.md +1 -1
- package/gsd-core/workflows/do.md +43 -13
- package/gsd-core/workflows/docs-update/detail/elaboration.md +179 -0
- package/gsd-core/workflows/docs-update.md +15 -156
- package/gsd-core/workflows/edit-phase.md +2 -0
- package/gsd-core/workflows/eval-review.md +1 -1
- package/gsd-core/workflows/execute-phase/detail/elaboration.md +124 -0
- package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +20 -3
- package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +56 -0
- package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +24 -3
- package/gsd-core/workflows/execute-phase/steps/executor-progress-policy.md +43 -0
- package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +8 -2
- package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +2 -0
- package/gsd-core/workflows/execute-phase/steps/sequential-root-pin.md +35 -0
- package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +25 -0
- package/gsd-core/workflows/execute-phase/steps/worktree-recovery-policy.md +2 -0
- package/gsd-core/workflows/execute-phase.md +78 -159
- package/gsd-core/workflows/execute-plan.md +28 -15
- package/gsd-core/workflows/explore.md +2 -0
- package/gsd-core/workflows/extract-learnings.md +2 -0
- package/gsd-core/workflows/fast.md +6 -0
- package/gsd-core/workflows/forensics.md +2 -0
- package/gsd-core/workflows/graduation.md +1 -1
- package/gsd-core/workflows/health.md +1 -1
- package/gsd-core/workflows/help/modes/brief.md +2 -0
- package/gsd-core/workflows/help/modes/default.md +2 -0
- package/gsd-core/workflows/help/modes/full.compact.md +398 -0
- package/gsd-core/workflows/help/modes/full.md +12 -0
- package/gsd-core/workflows/help/modes/topic.md +2 -0
- package/gsd-core/workflows/help.md +3 -1
- package/gsd-core/workflows/import.md +3 -3
- package/gsd-core/workflows/inbox.md +1 -1
- package/gsd-core/workflows/ingest-docs.md +1 -1
- package/gsd-core/workflows/insert-phase.md +2 -0
- package/gsd-core/workflows/list-phase-assumptions.md +2 -0
- package/gsd-core/workflows/list-seeds.md +2 -0
- package/gsd-core/workflows/list-workspaces.md +2 -0
- package/gsd-core/workflows/manager.md +3 -3
- package/gsd-core/workflows/map-codebase.md +52 -3
- package/gsd-core/workflows/milestone-summary.md +2 -0
- package/gsd-core/workflows/mvp-phase.md +1 -1
- package/gsd-core/workflows/new-milestone.md +55 -13
- package/gsd-core/workflows/new-project/detail/elaboration.md +216 -0
- package/gsd-core/workflows/new-project.md +37 -205
- package/gsd-core/workflows/new-workspace.md +1 -1
- package/gsd-core/workflows/next.md +2 -0
- package/gsd-core/workflows/node-repair.md +2 -0
- package/gsd-core/workflows/note.md +2 -0
- package/gsd-core/workflows/onboard.md +1 -1
- package/gsd-core/workflows/pause-work.md +19 -4
- package/gsd-core/workflows/plan-phase/detail/elaboration.md +209 -0
- package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +100 -18
- package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +2 -0
- package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +9 -0
- package/gsd-core/workflows/plan-phase.md +144 -185
- package/gsd-core/workflows/plan-review-convergence.md +102 -10
- package/gsd-core/workflows/plant-seed.md +1 -1
- package/gsd-core/workflows/pr-branch.md +30 -10
- package/gsd-core/workflows/profile-user.md +1 -1
- package/gsd-core/workflows/progress/steps/forensic-audit.md +1 -1
- package/gsd-core/workflows/progress.md +25 -3
- package/gsd-core/workflows/quick/steps/plan-checker-loop.md +37 -2
- package/gsd-core/workflows/quick/steps/research-phase.md +3 -3
- package/gsd-core/workflows/quick-batch/steps/batch-init.md +55 -0
- package/gsd-core/workflows/quick-batch/steps/completion.md +65 -0
- package/gsd-core/workflows/quick-batch/steps/merge-wave.md +100 -0
- package/gsd-core/workflows/quick-batch/steps/plan-checker-loop.md +147 -0
- package/gsd-core/workflows/quick-batch/steps/planner-wave.md +158 -0
- package/gsd-core/workflows/quick-batch/steps/research-phase.md +95 -0
- package/gsd-core/workflows/quick-batch/steps/resume-mode.md +49 -0
- package/gsd-core/workflows/quick-batch/steps/verification-wave.md +73 -0
- package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +169 -0
- package/gsd-core/workflows/quick-batch.md +203 -0
- package/gsd-core/workflows/quick.md +21 -4
- package/gsd-core/workflows/reapply-patches.md +79 -3
- package/gsd-core/workflows/remove-phase.md +2 -0
- package/gsd-core/workflows/remove-workspace.md +1 -1
- package/gsd-core/workflows/resume-project.md +6 -2
- package/gsd-core/workflows/review.md +215 -10
- package/gsd-core/workflows/scan.md +2 -0
- package/gsd-core/workflows/section-manifest.json +12 -0
- package/gsd-core/workflows/secure-phase.md +1 -1
- package/gsd-core/workflows/session-report.md +2 -0
- package/gsd-core/workflows/settings-advanced.md +2 -0
- package/gsd-core/workflows/settings-integrations.md +9 -8
- package/gsd-core/workflows/settings.md +19 -6
- package/gsd-core/workflows/ship.md +10 -10
- package/gsd-core/workflows/sketch-wrap-up.md +2 -0
- package/gsd-core/workflows/sketch.md +1 -1
- package/gsd-core/workflows/smart-entry.md +1 -1
- package/gsd-core/workflows/spec-phase.md +24 -19
- package/gsd-core/workflows/spike-wrap-up.md +2 -0
- package/gsd-core/workflows/spike.md +1 -1
- package/gsd-core/workflows/stats.md +2 -0
- package/gsd-core/workflows/sync-skills.md +12 -4
- package/gsd-core/workflows/thread.md +2 -0
- package/gsd-core/workflows/transition.md +2 -0
- package/gsd-core/workflows/ui-phase.md +26 -5
- package/gsd-core/workflows/ui-review.md +1 -1
- package/gsd-core/workflows/ultraplan-phase.md +2 -0
- package/gsd-core/workflows/undo.md +1 -1
- package/gsd-core/workflows/update.md +48 -43
- package/gsd-core/workflows/validate-phase.md +1 -1
- package/gsd-core/workflows/verify-work/detail/elaboration.md +230 -0
- package/gsd-core/workflows/verify-work.md +68 -182
- package/hooks/dist/gsd-agent-isolation-guard.js +42 -16
- package/hooks/dist/gsd-check-update-worker.js +19 -2
- package/hooks/dist/gsd-context-monitor.js +371 -27
- package/hooks/dist/gsd-cursor-subagent-start.js +34 -14
- package/hooks/dist/gsd-node-runner.sh +1 -0
- package/hooks/dist/gsd-prompt-guard.js +30 -5
- package/hooks/dist/gsd-read-guard.js +2 -0
- package/hooks/dist/gsd-read-injection-scanner.js +5 -5
- package/hooks/dist/gsd-secret-read-guard.js +1105 -0
- package/hooks/dist/gsd-statusline.js +18 -10
- package/hooks/dist/gsd-validate-commit.sh +474 -7
- package/hooks/dist/gsd-workflow-guard.js +2 -1
- package/hooks/dist/gsd-worktree-path-guard.js +25 -14
- package/hooks/dist/gsd-write-guard.js +46 -1
- package/hooks/dist/lib/dispatch-identity.js +187 -0
- package/hooks/dist/lib/filename-classification.js +64 -0
- package/hooks/dist/lib/git-cmd.js +210 -1
- package/hooks/dist/lib/injection-patterns.js +36 -6
- package/hooks/dist/lib/isolation-deny-reason.js +53 -1
- package/hooks/dist/lib/isolation-sentinel.js +58 -19
- package/hooks/dist/managed-hooks-registry.cjs +1 -0
- package/hooks/gsd-agent-isolation-guard.js +42 -16
- package/hooks/gsd-check-update-worker.js +19 -2
- package/hooks/gsd-context-monitor.js +371 -27
- package/hooks/gsd-cursor-subagent-start.js +34 -14
- package/hooks/gsd-node-runner.sh +1 -0
- package/hooks/gsd-prompt-guard.js +30 -5
- package/hooks/gsd-read-guard.js +2 -0
- package/hooks/gsd-read-injection-scanner.js +5 -5
- package/hooks/gsd-secret-read-guard.js +1105 -0
- package/hooks/gsd-statusline.js +18 -10
- package/hooks/gsd-validate-commit.sh +474 -7
- package/hooks/gsd-workflow-guard.js +2 -1
- package/hooks/gsd-worktree-path-guard.js +25 -14
- package/hooks/gsd-write-guard.js +46 -1
- package/hooks/hooks.json +6 -0
- package/hooks/lib/dispatch-identity.js +187 -0
- package/hooks/lib/filename-classification.js +64 -0
- package/hooks/lib/git-cmd.js +210 -1
- package/hooks/lib/injection-patterns.js +36 -6
- package/hooks/lib/isolation-deny-reason.js +53 -1
- package/hooks/lib/isolation-sentinel.js +58 -19
- package/hooks/managed-hooks-registry.cjs +1 -0
- package/package.json +13 -9
- package/scripts/benchmark-compact-content-variants.cjs +298 -0
- package/scripts/benchmark-compact-content.cjs +368 -0
- package/scripts/build-hooks.js +11 -4
- package/scripts/check-contract-drift.cjs +4 -1
- package/scripts/check-env.cjs +36 -8
- package/scripts/check-glossary-refs.cjs +25 -21
- package/scripts/ci-next-health.cjs +271 -0
- package/scripts/ci-prepare-test-scope.cjs +7 -7
- package/scripts/ci-test-scope.cjs +133 -20
- package/scripts/ci-timeout-report.cjs +1 -1
- package/scripts/diff-touches-shipped-paths.cjs +1 -1
- package/scripts/docs-guard-registry.cjs +17 -2
- package/scripts/gen-adr-index.cjs +8 -2
- package/scripts/gen-inventory-manifest.cjs +12 -0
- package/scripts/gen-loop-host-contract.cjs +67 -15
- package/scripts/gen-platform-conformance-tier.cjs +557 -0
- package/scripts/lib/drift-scan.cjs +1 -1
- package/scripts/lib/macos-conformance-tier.generated.cjs +210 -0
- package/scripts/lib/npm-version-check-diagnosis.cjs +59 -0
- package/scripts/lib/platform-conformance-tier.generated.cjs +276 -0
- package/scripts/lib/shellcheck-fetch.cjs +247 -0
- package/scripts/lib/suite-detection.cjs +32 -0
- package/scripts/lint-allow-test-rule-refs.allowlist.json +0 -6
- package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
- package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
- package/scripts/lint-allowed-tools-parity.cjs +221 -0
- package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +24 -2
- package/scripts/lint-phase-enumeration-drift.cjs +24 -6
- package/scripts/lint-phase-id-drift.cjs +465 -15
- package/scripts/lint-portable-grep.cjs +176 -0
- package/scripts/lint-response-language-coverage.cjs +530 -0
- package/scripts/lint-source-test-name-collision.cjs +1 -1
- package/scripts/lint-test-file-count.allowlist.json +4 -1
- package/scripts/lint-vendored-deps.cjs +128 -17
- package/scripts/lint-workflow-shellcheck-baseline.json +1112 -0
- package/scripts/lint-workflow-shellcheck.cjs +614 -0
- package/scripts/npm-audit-baseline.cjs +376 -0
- package/scripts/prompt-injection-scan.sh +22 -0
- package/scripts/require-issue-link-policy.cjs +16 -1
- package/scripts/workflow-size.cjs +139 -0
- package/skills/gsd-cleanup/SKILL.md +1 -0
- package/skills/gsd-code-review/SKILL.md +2 -1
- package/skills/gsd-complete-milestone/SKILL.md +1 -0
- package/skills/gsd-config/SKILL.md +1 -0
- package/skills/gsd-debug/SKILL.md +1 -0
- package/skills/gsd-execute-phase/SKILL.md +1 -1
- package/skills/gsd-graphify/SKILL.md +1 -0
- package/skills/gsd-health/SKILL.md +1 -0
- package/skills/gsd-mempalace-capture/SKILL.md +1 -0
- package/skills/gsd-mempalace-recall/SKILL.md +1 -0
- package/skills/gsd-new-milestone/SKILL.md +1 -0
- package/skills/gsd-new-project/SKILL.md +1 -0
- package/skills/gsd-next/SKILL.md +1 -0
- package/skills/gsd-ns-workflow/SKILL.md +1 -0
- package/skills/gsd-pause-work/SKILL.md +1 -0
- package/skills/gsd-phase/SKILL.md +2 -1
- package/skills/gsd-pr-branch/SKILL.md +1 -0
- package/skills/gsd-quick-batch/SKILL.md +105 -0
- package/skills/gsd-resume-work/SKILL.md +1 -0
- package/skills/gsd-review-backlog/SKILL.md +1 -0
- package/skills/gsd-settings/SKILL.md +2 -1
- package/skills/gsd-stats/SKILL.md +1 -0
- package/skills/gsd-surface/SKILL.md +18 -8
- package/skills/gsd-thread/SKILL.md +1 -0
- package/skills/gsd-workspace/SKILL.md +1 -0
- package/skills/gsd-workstreams/SKILL.md +1 -0
- package/vscode/package.json +1 -1
- package/gsd-core/templates/claude-md.md +0 -145
- package/gsd-core/templates/codebase/concerns.md +0 -310
- package/gsd-core/templates/codebase/conventions.md +0 -307
- package/gsd-core/templates/codebase/integrations.md +0 -280
- package/gsd-core/templates/codebase/structure.md +0 -285
- package/gsd-core/templates/codebase/testing.md +0 -480
- package/gsd-core/templates/debug-subagent-prompt.md +0 -91
- package/gsd-core/templates/discovery.md +0 -146
|
@@ -24,7 +24,12 @@ const node_os_1 = __importDefault(require("node:os"));
|
|
|
24
24
|
// unless the top-level installRuntimeArtifacts call injected a `deps.fs`.
|
|
25
25
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
26
26
|
const installFsAdapter = require("./install-fs-adapter.cjs");
|
|
27
|
+
const security_cjs_1 = require("./security.cjs");
|
|
27
28
|
const { installFs, mkInstallTempDir } = installFsAdapter;
|
|
29
|
+
// Reuse the install manifest's existing parser and streamed SHA-256
|
|
30
|
+
// classification instead of deriving a second integrity implementation here.
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
32
|
+
const installerMigrations = require("./installer-migrations.cjs");
|
|
28
33
|
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
29
34
|
const installProfiles = require("./install-profiles.cjs");
|
|
30
35
|
const { stageSkillsForProfile, stageAgentsForRuntimeWithConverter, stageSkillsForRuntimeAsSkills, stageCommandsForRuntimeFlat, } = installProfiles;
|
|
@@ -48,127 +53,295 @@ const shell_command_projection_cjs_1 = require("./shell-command-projection.cjs")
|
|
|
48
53
|
const install_scope_cjs_1 = require("./install-scope.cjs");
|
|
49
54
|
// In .cts (CommonJS output) files, `require` is available as a global.
|
|
50
55
|
const _require = require;
|
|
56
|
+
function requiredRuntimeSurfaceSourceClasses(kinds) {
|
|
57
|
+
const required = new Set();
|
|
58
|
+
for (const kind of kinds) {
|
|
59
|
+
if (kind.kind === 'commands' || kind.kind === 'skills')
|
|
60
|
+
required.add('commands');
|
|
61
|
+
if (kind.kind === 'agents' || kind.kind === 'kimi-agents')
|
|
62
|
+
required.add('agents');
|
|
63
|
+
}
|
|
64
|
+
return required;
|
|
65
|
+
}
|
|
51
66
|
// ---------------------------------------------------------------------------
|
|
52
67
|
// Source root finders
|
|
53
68
|
// ---------------------------------------------------------------------------
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
function isReadableDirectory(candidate, routed) {
|
|
70
|
+
try {
|
|
71
|
+
const io = routed ? installFs() : node_fs_1.default;
|
|
72
|
+
const stat = io.lstatSync(candidate);
|
|
73
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
74
|
+
return false;
|
|
75
|
+
const entries = io.readdirSync(candidate);
|
|
76
|
+
let readableFiles = 0;
|
|
77
|
+
for (const name of entries) {
|
|
78
|
+
const child = node_path_1.default.join(candidate, name);
|
|
79
|
+
const childStat = io.lstatSync(child);
|
|
80
|
+
if (childStat.isSymbolicLink())
|
|
81
|
+
return false;
|
|
82
|
+
if (childStat.isDirectory()) {
|
|
83
|
+
if (!isReadableDirectory(child, routed))
|
|
84
|
+
return false;
|
|
85
|
+
readableFiles += 1;
|
|
86
|
+
}
|
|
87
|
+
else if (childStat.isFile()) {
|
|
88
|
+
if (routed)
|
|
89
|
+
io.readFileSync(child);
|
|
90
|
+
else
|
|
91
|
+
node_fs_1.default.accessSync(child, node_fs_1.default.constants.R_OK);
|
|
92
|
+
readableFiles += 1;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
return false;
|
|
73
96
|
}
|
|
74
|
-
catch { /* fall through */ }
|
|
75
97
|
}
|
|
98
|
+
return readableFiles > 0;
|
|
76
99
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
//
|
|
83
|
-
//
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
//
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function isPhysicallyConfinedTo(root, candidate) {
|
|
105
|
+
// ADR-4650 decision 6: lexical family on already-realpath'd operands — the
|
|
106
|
+
// surrounding try/catch must survive verbatim, since a non-existent
|
|
107
|
+
// candidate throwing out of realpathSync (not `tryWithinRootLexical`, which
|
|
108
|
+
// would accept it) is exactly the "incomplete manifest" signal this
|
|
109
|
+
// function's callers depend on.
|
|
110
|
+
try {
|
|
111
|
+
const physicalRoot = installFs().realpathSync(root);
|
|
112
|
+
const physicalCandidate = installFs().realpathSync(candidate);
|
|
113
|
+
return (0, security_cjs_1.tryWithinRootLexical)(physicalCandidate, physicalRoot) !== null;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function installedManifestIsComplete(runtimeConfigDir, required) {
|
|
120
|
+
// This synchronous admission check binds provider selection to the corpus
|
|
121
|
+
// observed here. Same-user mutation after resolution is outside #4132's
|
|
122
|
+
// threat model and would require a broader snapshot/transaction design.
|
|
123
|
+
const io = installFs();
|
|
124
|
+
const manifestPath = node_path_1.default.join(runtimeConfigDir, 'gsd-file-manifest.json');
|
|
125
|
+
if (!io.existsSync(manifestPath))
|
|
126
|
+
return false;
|
|
127
|
+
if (!isPhysicallyConfinedTo(runtimeConfigDir, manifestPath))
|
|
128
|
+
return false;
|
|
129
|
+
try {
|
|
130
|
+
const manifest = installerMigrations.readInstallManifest(runtimeConfigDir);
|
|
131
|
+
if (manifest.manifestVersion === null)
|
|
132
|
+
return false;
|
|
133
|
+
const keys = Object.keys(manifest.files);
|
|
134
|
+
const prefixes = [];
|
|
135
|
+
if (required.has('commands'))
|
|
136
|
+
prefixes.push('gsd-core/commands/gsd/');
|
|
137
|
+
if (required.has('agents'))
|
|
138
|
+
prefixes.push('gsd-core/agents/');
|
|
139
|
+
for (const prefix of prefixes) {
|
|
140
|
+
const expected = keys.filter((key) => key.startsWith(prefix));
|
|
141
|
+
if (expected.length === 0)
|
|
142
|
+
return false;
|
|
143
|
+
const expectedSet = new Set(expected);
|
|
144
|
+
const corpusRoot = node_path_1.default.resolve(runtimeConfigDir, ...prefix.slice(0, -1).split('/'));
|
|
145
|
+
if (!isPhysicallyConfinedTo(runtimeConfigDir, corpusRoot))
|
|
146
|
+
return false;
|
|
147
|
+
let actualFiles = 0;
|
|
148
|
+
const visit = (dir) => {
|
|
149
|
+
for (const name of io.readdirSync(dir)) {
|
|
150
|
+
const candidate = node_path_1.default.join(dir, name);
|
|
151
|
+
const stat = io.lstatSync(candidate);
|
|
152
|
+
if (stat.isSymbolicLink())
|
|
153
|
+
return false;
|
|
154
|
+
if (stat.isDirectory()) {
|
|
155
|
+
if (!visit(candidate))
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
else if (stat.isFile()) {
|
|
159
|
+
const relative = node_path_1.default.relative(corpusRoot, candidate).split(node_path_1.default.sep).join('/');
|
|
160
|
+
if (!expectedSet.has(prefix + relative))
|
|
161
|
+
return false;
|
|
162
|
+
actualFiles += 1;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return true;
|
|
169
|
+
};
|
|
170
|
+
if (!visit(corpusRoot) || actualFiles !== expected.length)
|
|
171
|
+
return false;
|
|
172
|
+
for (const key of expected) {
|
|
173
|
+
const parts = key.split('/');
|
|
174
|
+
if (parts.some((part) => part === '' || part === '.' || part === '..'))
|
|
175
|
+
return false;
|
|
176
|
+
// ADR-4650 decision 6: lexical family — the object is lstat'd (never
|
|
177
|
+
// stat'd) and refused if it is a symlink just below, so this gate must
|
|
178
|
+
// refuse rather than resolve.
|
|
179
|
+
const candidate = (0, security_cjs_1.tryWithinRootLexical)(parts.join('/'), runtimeConfigDir);
|
|
180
|
+
if (candidate === null || candidate === node_path_1.default.resolve(runtimeConfigDir))
|
|
181
|
+
return false;
|
|
182
|
+
const stat = io.lstatSync(candidate);
|
|
183
|
+
if (!stat.isFile() || stat.isSymbolicLink())
|
|
184
|
+
return false;
|
|
185
|
+
if (installerMigrations.classifyArtifact(runtimeConfigDir, key, manifest).classification !== 'managed-pristine') {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
106
189
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
dir = parent;
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
return false;
|
|
112
194
|
}
|
|
113
|
-
throw new Error(`findInstallSourceRoot: could not locate commands/gsd from ${__dirname}`);
|
|
114
195
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
196
|
+
function providerHasRequiredClasses(provider, required, routed, runtimeConfigDir) {
|
|
197
|
+
if (provider.kind === 'installed' && runtimeConfigDir) {
|
|
198
|
+
return installedManifestIsComplete(runtimeConfigDir, required);
|
|
199
|
+
}
|
|
200
|
+
return (!required.has('commands') || isReadableDirectory(provider.commandsRoot, routed)) &&
|
|
201
|
+
(!required.has('agents') || isReadableDirectory(provider.agentsRoot, routed));
|
|
202
|
+
}
|
|
203
|
+
function providersShareRequiredRoots(left, right, required) {
|
|
204
|
+
const leftFs = left.kind === 'package' ? node_fs_1.default : installFs();
|
|
205
|
+
const rightFs = right.kind === 'package' ? node_fs_1.default : installFs();
|
|
206
|
+
const physicalRootsOverlap = (leftRoot, rightRoot) => {
|
|
207
|
+
const canonicalize = (io, root) => {
|
|
208
|
+
let existing = node_path_1.default.resolve(root);
|
|
209
|
+
const missingSegments = [];
|
|
210
|
+
while (true) {
|
|
211
|
+
try {
|
|
212
|
+
return node_path_1.default.resolve(io.realpathSync(existing), ...missingSegments);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
if (error.code !== 'ENOENT')
|
|
216
|
+
return null;
|
|
217
|
+
const parent = node_path_1.default.dirname(existing);
|
|
218
|
+
if (parent === existing)
|
|
219
|
+
return null;
|
|
220
|
+
missingSegments.unshift(node_path_1.default.basename(existing));
|
|
221
|
+
existing = parent;
|
|
135
222
|
}
|
|
136
223
|
}
|
|
137
|
-
|
|
224
|
+
};
|
|
225
|
+
const overlap = (leftPath, rightPath) => {
|
|
226
|
+
const relative = node_path_1.default.relative(leftPath, rightPath);
|
|
227
|
+
return relative === '' ||
|
|
228
|
+
(relative !== '..' && !relative.startsWith(`..${node_path_1.default.sep}`) && !node_path_1.default.isAbsolute(relative)); // allow-handrolled-containment: bidirectional physical-root overlap/identity check between two providers for dedup detection — not a security confinement gate on untrusted input
|
|
229
|
+
};
|
|
230
|
+
const physicalLeft = canonicalize(leftFs, leftRoot);
|
|
231
|
+
const physicalRight = canonicalize(rightFs, rightRoot);
|
|
232
|
+
if (!physicalLeft || !physicalRight)
|
|
233
|
+
return true;
|
|
234
|
+
return overlap(physicalLeft, physicalRight) || overlap(physicalRight, physicalLeft);
|
|
235
|
+
};
|
|
236
|
+
return (required.has('commands') && physicalRootsOverlap(left.commandsRoot, right.commandsRoot)) ||
|
|
237
|
+
(required.has('agents') && physicalRootsOverlap(left.agentsRoot, right.agentsRoot));
|
|
238
|
+
}
|
|
239
|
+
function markerProvider(runtimeConfigDir) {
|
|
240
|
+
const markerPath = node_path_1.default.join(runtimeConfigDir, '.gsd-source');
|
|
241
|
+
try {
|
|
242
|
+
if (!installFs().existsSync(markerPath))
|
|
243
|
+
return null;
|
|
244
|
+
const markerStat = installFs().lstatSync(markerPath);
|
|
245
|
+
if (!markerStat.isFile() || markerStat.isSymbolicLink())
|
|
246
|
+
return null;
|
|
247
|
+
const commandsRoot = installFs().readFileSync(markerPath, 'utf8').trim();
|
|
248
|
+
if (!commandsRoot)
|
|
249
|
+
return null;
|
|
250
|
+
// A marker written by the installer may point at this process's executing
|
|
251
|
+
// package. Preserve package-source IO on real fs so the existing injected
|
|
252
|
+
// destination adapter remains destination-only (#2874).
|
|
253
|
+
const packaged = packageProvider(new Set(['commands']));
|
|
254
|
+
if (packaged && node_path_1.default.resolve(commandsRoot) === node_path_1.default.resolve(packaged.commandsRoot)) {
|
|
255
|
+
return packaged;
|
|
138
256
|
}
|
|
257
|
+
return {
|
|
258
|
+
kind: 'marker',
|
|
259
|
+
commandsRoot,
|
|
260
|
+
agentsRoot: node_path_1.default.resolve(node_path_1.default.dirname(commandsRoot), '..', 'agents'),
|
|
261
|
+
};
|
|
139
262
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
263
|
+
catch {
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function packageProvider(required) {
|
|
268
|
+
// Package-source IO deliberately stays on real fs; injected install adapters
|
|
269
|
+
// model destinations, not the executing package tree (#2874).
|
|
145
270
|
let dir = __dirname;
|
|
146
271
|
for (let i = 0; i < 6; i++) {
|
|
147
|
-
const candidate =
|
|
148
|
-
|
|
149
|
-
|
|
272
|
+
const candidate = {
|
|
273
|
+
kind: 'package',
|
|
274
|
+
commandsRoot: node_path_1.default.join(dir, 'commands', 'gsd'),
|
|
275
|
+
agentsRoot: node_path_1.default.join(dir, 'agents'),
|
|
276
|
+
};
|
|
277
|
+
if (providerHasRequiredClasses(candidate, required, false))
|
|
150
278
|
return candidate;
|
|
151
|
-
}
|
|
152
|
-
catch { /* not here — keep walking up */ }
|
|
153
279
|
const parent = node_path_1.default.dirname(dir);
|
|
154
280
|
if (parent === dir)
|
|
155
281
|
break;
|
|
156
282
|
dir = parent;
|
|
157
283
|
}
|
|
158
|
-
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Select one complete source provider for an entire resolved layout.
|
|
288
|
+
* Provider mixing is forbidden: a skills+agents layout cannot take commands
|
|
289
|
+
* from one package version and agents from another.
|
|
290
|
+
*/
|
|
291
|
+
function resolveSourceProvider(runtimeConfigDir, requiredClasses, scope = 'global', authority = 'compatible') {
|
|
292
|
+
const required = new Set(requiredClasses);
|
|
293
|
+
let rejectedInstalled = null;
|
|
294
|
+
if (required.size === 0) {
|
|
295
|
+
return { kind: 'package', commandsRoot: '', agentsRoot: '' };
|
|
296
|
+
}
|
|
297
|
+
if (runtimeConfigDir && scope === 'global') {
|
|
298
|
+
const installed = {
|
|
299
|
+
kind: 'installed',
|
|
300
|
+
commandsRoot: node_path_1.default.join(runtimeConfigDir, 'gsd-core', 'commands', 'gsd'),
|
|
301
|
+
agentsRoot: node_path_1.default.join(runtimeConfigDir, 'gsd-core', 'agents'),
|
|
302
|
+
};
|
|
303
|
+
if (providerHasRequiredClasses(installed, required, true, runtimeConfigDir))
|
|
304
|
+
return installed;
|
|
305
|
+
rejectedInstalled = installed;
|
|
306
|
+
const marker = markerProvider(runtimeConfigDir);
|
|
307
|
+
if (marker && !providersShareRequiredRoots(marker, installed, required) && providerHasRequiredClasses(marker, required, marker.kind !== 'package')) {
|
|
308
|
+
return marker;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
else if (runtimeConfigDir) {
|
|
312
|
+
const marker = markerProvider(runtimeConfigDir);
|
|
313
|
+
if (marker && providerHasRequiredClasses(marker, required, marker.kind !== 'package'))
|
|
314
|
+
return marker;
|
|
315
|
+
}
|
|
316
|
+
if (authority === 'compatible') {
|
|
317
|
+
const packaged = packageProvider(required);
|
|
318
|
+
if (packaged &&
|
|
319
|
+
(!rejectedInstalled || !providersShareRequiredRoots(packaged, rejectedInstalled, required))) {
|
|
320
|
+
return packaged;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
throw new Error(`Runtime Surface source is unavailable or incomplete for ${[...required].sort().join('+')}; ` +
|
|
324
|
+
'install or upgrade gsd-core before materializing this surface.');
|
|
325
|
+
}
|
|
326
|
+
function sourceRootFor(context, sourceClass) {
|
|
327
|
+
context.provider ??= resolveSourceProvider(context.runtimeConfigDir, context.required, context.scope, context.authority);
|
|
328
|
+
return sourceClass === 'commands' ? context.provider.commandsRoot : context.provider.agentsRoot;
|
|
329
|
+
}
|
|
330
|
+
function findInstallSourceRoot(runtimeConfigDir) {
|
|
331
|
+
return resolveSourceProvider(runtimeConfigDir, ['commands']).commandsRoot;
|
|
159
332
|
}
|
|
160
333
|
// ---------------------------------------------------------------------------
|
|
161
334
|
// Layout table builders
|
|
162
335
|
// ---------------------------------------------------------------------------
|
|
163
|
-
function commandsKind(destSubpath, prefix,
|
|
336
|
+
function commandsKind(destSubpath, prefix, sourceContext) {
|
|
164
337
|
return {
|
|
165
338
|
kind: 'commands',
|
|
166
339
|
destSubpath,
|
|
167
340
|
prefix,
|
|
168
|
-
stage: (resolved) => stageSkillsForProfile(
|
|
341
|
+
stage: (resolved) => stageSkillsForProfile(sourceRootFor(sourceContext, 'commands'), resolved),
|
|
169
342
|
};
|
|
170
343
|
}
|
|
171
|
-
function agentsKind(destSubpath, prefix, configDir) {
|
|
344
|
+
function agentsKind(destSubpath, prefix, configDir, sourceContext) {
|
|
172
345
|
return {
|
|
173
346
|
kind: 'agents',
|
|
174
347
|
destSubpath,
|
|
@@ -191,7 +364,7 @@ function agentsKind(destSubpath, prefix, configDir) {
|
|
|
191
364
|
// signature silently dropped the second arg every caller already passed —
|
|
192
365
|
// a caller with NO agentCtx in scope is unaffected (row I2: converter-only,
|
|
193
366
|
// as today), matching stageAgentsForRuntimeWithConverter's own contract.
|
|
194
|
-
stage: (resolved, agentCtx) => stageAgentsForRuntimeWithConverter(
|
|
367
|
+
stage: (resolved, agentCtx) => stageAgentsForRuntimeWithConverter(sourceRootFor(sourceContext, 'agents'), resolved, (content) => content, false, agentCtx?.runtime ? agentCtx : undefined),
|
|
195
368
|
};
|
|
196
369
|
}
|
|
197
370
|
/**
|
|
@@ -323,7 +496,7 @@ function _resolveNamedConverter(converterName, kindLabel) {
|
|
|
323
496
|
* @param converterName name of converter function in Runtime Artifact Conversion exports
|
|
324
497
|
* @param configDir runtime config dir (for .gsd-source marker resolution)
|
|
325
498
|
*/
|
|
326
|
-
function convertedAgentsKind(destSubpath, prefix, converterName, configDir, scope
|
|
499
|
+
function convertedAgentsKind(destSubpath, prefix, converterName, configDir, sourceContext, scope) {
|
|
327
500
|
return {
|
|
328
501
|
kind: 'agents',
|
|
329
502
|
destSubpath,
|
|
@@ -396,20 +569,20 @@ function convertedAgentsKind(destSubpath, prefix, converterName, configDir, scop
|
|
|
396
569
|
// ADR-1235 §1: when agentCtx is provided (by createRuntimeArtifactInstallPlan
|
|
397
570
|
// for descriptor-driven runtimes), thread it through so stageAgentsForRuntimeWithConverter
|
|
398
571
|
// can apply the full pre-converter + post-converter sequence in the correct order.
|
|
399
|
-
return stageAgentsForRuntimeWithConverter(
|
|
572
|
+
return stageAgentsForRuntimeWithConverter(sourceRootFor(sourceContext, 'agents'), resolved, converter, (0, install_scope_cjs_1.isGlobalScope)(scope), agentCtx?.runtime ? agentCtx : undefined);
|
|
400
573
|
},
|
|
401
574
|
};
|
|
402
575
|
}
|
|
403
|
-
function kimiAgentsKind(destSubpath, prefix, configDir) {
|
|
576
|
+
function kimiAgentsKind(destSubpath, prefix, configDir, sourceContext) {
|
|
404
577
|
return {
|
|
405
578
|
kind: 'kimi-agents',
|
|
406
579
|
destSubpath,
|
|
407
580
|
prefix,
|
|
408
|
-
stage: (resolved) => {
|
|
581
|
+
stage: (resolved, agentCtx) => {
|
|
409
582
|
const buildKimiAgentArtifacts = conversionExports['buildKimiAgentArtifacts'];
|
|
410
583
|
// #2995: compose at staging (identity converter) so the readFileSync below
|
|
411
584
|
// sees marker-free content — same single composing stager as agentsKind.
|
|
412
|
-
const stagedAgents = stageAgentsForRuntimeWithConverter(
|
|
585
|
+
const stagedAgents = stageAgentsForRuntimeWithConverter(sourceRootFor(sourceContext, 'agents'), resolved, (content) => content, false, agentCtx);
|
|
413
586
|
const subagents = [];
|
|
414
587
|
if (installFs().existsSync(stagedAgents)) {
|
|
415
588
|
for (const entry of installFs().readdirSync(stagedAgents, { withFileTypes: true })) {
|
|
@@ -456,7 +629,7 @@ function kimiAgentsKind(destSubpath, prefix, configDir) {
|
|
|
456
629
|
* their declaring capId at staging time. Absent -> stage() stages
|
|
457
630
|
* nothing third-party (fail closed).
|
|
458
631
|
*/
|
|
459
|
-
function skillsKind(destSubpath, prefix, converterName, runtime, configDir, nested
|
|
632
|
+
function skillsKind(destSubpath, prefix, converterName, runtime, configDir, nested, scope, sourceContext, capabilityRegistry) {
|
|
460
633
|
return {
|
|
461
634
|
kind: 'skills',
|
|
462
635
|
destSubpath,
|
|
@@ -489,7 +662,7 @@ function skillsKind(destSubpath, prefix, converterName, runtime, configDir, nest
|
|
|
489
662
|
// it must run AFTER it instead, once the `@`-include is in its final
|
|
490
663
|
// rewritten shape.
|
|
491
664
|
const wrappedConverter = (content, skillName) => realConverter(content, skillName, runtime, cmdNames, isGlobal);
|
|
492
|
-
return stageSkillsForRuntimeAsSkills(
|
|
665
|
+
return stageSkillsForRuntimeAsSkills(sourceRootFor(sourceContext, 'commands'), resolved, wrappedConverter, prefix, nested, capabilityRegistry);
|
|
493
666
|
},
|
|
494
667
|
};
|
|
495
668
|
}
|
|
@@ -509,14 +682,14 @@ function skillsKind(destSubpath, prefix, converterName, runtime, configDir, nest
|
|
|
509
682
|
* @param converterName name of converter function in Runtime Artifact Conversion exports
|
|
510
683
|
* @param configDir runtime config dir (for .gsd-source marker resolution)
|
|
511
684
|
*/
|
|
512
|
-
function convertedCommandsKind(destSubpath, prefix, converterName,
|
|
685
|
+
function convertedCommandsKind(destSubpath, prefix, converterName, sourceContext) {
|
|
513
686
|
return {
|
|
514
687
|
kind: 'commands',
|
|
515
688
|
destSubpath,
|
|
516
689
|
prefix,
|
|
517
690
|
stage: (resolved) => {
|
|
518
691
|
const converter = _resolveNamedConverter(converterName, 'commands');
|
|
519
|
-
return stageCommandsForRuntimeFlat(
|
|
692
|
+
return stageCommandsForRuntimeFlat(sourceRootFor(sourceContext, 'commands'), resolved, converter, prefix);
|
|
520
693
|
},
|
|
521
694
|
};
|
|
522
695
|
}
|
|
@@ -527,29 +700,29 @@ function getRegistry() {
|
|
|
527
700
|
* Map a single ArtifactKindDescriptor entry to an ArtifactKind using the
|
|
528
701
|
* matching builder function. Mirrors the hand-built calls in the old switch.
|
|
529
702
|
*/
|
|
530
|
-
function dispatchKindEntry(entry, runtime, configDir, scope, capabilityRegistry) {
|
|
703
|
+
function dispatchKindEntry(entry, runtime, configDir, scope, capabilityRegistry, sourceContext) {
|
|
531
704
|
const { kind, destSubpath, prefix, nesting, converter } = entry;
|
|
532
705
|
const nested = nesting === 'nested';
|
|
533
706
|
let result;
|
|
534
707
|
switch (kind) {
|
|
535
708
|
case 'commands':
|
|
536
709
|
result = converter == null
|
|
537
|
-
? commandsKind(destSubpath, prefix,
|
|
538
|
-
: convertedCommandsKind(destSubpath, prefix, converter,
|
|
710
|
+
? commandsKind(destSubpath, prefix, sourceContext)
|
|
711
|
+
: convertedCommandsKind(destSubpath, prefix, converter, sourceContext);
|
|
539
712
|
break;
|
|
540
713
|
case 'agents':
|
|
541
714
|
result = converter == null
|
|
542
|
-
? agentsKind(destSubpath, prefix, configDir)
|
|
543
|
-
: convertedAgentsKind(destSubpath, prefix, converter, configDir, scope);
|
|
715
|
+
? agentsKind(destSubpath, prefix, configDir, sourceContext)
|
|
716
|
+
: convertedAgentsKind(destSubpath, prefix, converter, configDir, sourceContext, scope);
|
|
544
717
|
break;
|
|
545
718
|
case 'skills':
|
|
546
719
|
if (converter == null) {
|
|
547
720
|
throw new TypeError(`resolveRuntimeArtifactLayout: skills entry for '${runtime}' has converter=null (converter is required for skills)`);
|
|
548
721
|
}
|
|
549
|
-
result = skillsKind(destSubpath, prefix, converter, runtime, configDir, nested, scope, capabilityRegistry);
|
|
722
|
+
result = skillsKind(destSubpath, prefix, converter, runtime, configDir, nested, scope, sourceContext, capabilityRegistry);
|
|
550
723
|
break;
|
|
551
724
|
case 'kimi-agents':
|
|
552
|
-
result = kimiAgentsKind(destSubpath, prefix, configDir);
|
|
725
|
+
result = kimiAgentsKind(destSubpath, prefix, configDir, sourceContext);
|
|
553
726
|
break;
|
|
554
727
|
default:
|
|
555
728
|
throw new TypeError(`resolveRuntimeArtifactLayout: unknown kind '${kind}' in descriptor for runtime '${runtime}'`);
|
|
@@ -594,7 +767,20 @@ function resolveRuntimeArtifactLayoutFromRegistry(registry, runtime, configDir,
|
|
|
594
767
|
throw new TypeError(`Unknown runtime: '${runtime}' — add to runtime-artifact-layout.cjs table`);
|
|
595
768
|
}
|
|
596
769
|
const entries = desc[scope] ?? [];
|
|
597
|
-
const
|
|
770
|
+
const required = requiredRuntimeSurfaceSourceClasses(entries);
|
|
771
|
+
// Stage closures share one lazy source-resolution context, so the first kind
|
|
772
|
+
// to stage selects and caches one complete provider for every required source
|
|
773
|
+
// class. Global layouts accept only installed or marker providers; the
|
|
774
|
+
// installer owns its private package fallback by retrying through a transient
|
|
775
|
+
// compatibility marker after source resolution fails. Local layouts retain
|
|
776
|
+
// compatible marker/package resolution and never provision the global corpus.
|
|
777
|
+
const sourceContext = {
|
|
778
|
+
runtimeConfigDir: configDir,
|
|
779
|
+
scope,
|
|
780
|
+
required,
|
|
781
|
+
authority: scope === 'local' ? 'compatible' : 'runtime',
|
|
782
|
+
};
|
|
783
|
+
const kinds = entries.map((entry) => dispatchKindEntry(entry, runtime, configDir, scope, capabilityRegistry, sourceContext));
|
|
598
784
|
return { runtime, configDir, scope, kinds };
|
|
599
785
|
}
|
|
600
786
|
function getTriggerRegistry() {
|