peaks-loop 4.1.0 → 4.1.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.
- package/CHANGELOG.md +75 -0
- package/README-en.md +4 -4
- package/README.md +25 -4
- package/bin/node-floor.mjs +59 -0
- package/bin/peaks.js +13 -0
- package/config/eslint/tsconfig.lint.json +2 -1
- package/dist/cli/cli-helpers.d.ts +0 -1
- package/dist/cli/cli-helpers.js +0 -1
- package/dist/cli/commands/_cli-error-envelope.js +0 -3
- package/dist/cli/commands/_register.js +2 -2
- package/dist/cli/commands/adapter-commands-s2a.d.ts +0 -1
- package/dist/cli/commands/adapter-commands.d.ts +0 -1
- package/dist/cli/commands/api-diff-commands.d.ts +0 -1
- package/dist/cli/commands/api-diff-commands.js +0 -1
- package/dist/cli/commands/audit-commands.js +21 -24
- package/dist/cli/commands/autonomous-swarm-commands.js +0 -1
- package/dist/cli/commands/bee-commands.d.ts +0 -2
- package/dist/cli/commands/bee-commands.js +0 -2
- package/dist/cli/commands/best-practice-scan-command.d.ts +0 -1
- package/dist/cli/commands/best-practice-scan-helpers.js +0 -1
- package/dist/cli/commands/changeset-commands.d.ts +0 -2
- package/dist/cli/commands/changeset-commands.js +0 -2
- package/dist/cli/commands/code-commands.d.ts +0 -3
- package/dist/cli/commands/code-commands.js +0 -3
- package/dist/cli/commands/code-gate-command.d.ts +0 -1
- package/dist/cli/commands/code-gate-command.js +0 -1
- package/dist/cli/commands/code-job-shape-commands-read-job-shape.d.ts +0 -1
- package/dist/cli/commands/code-job-shape-commands-read-job-shape.js +0 -1
- package/dist/cli/commands/code-job-shape-commands.d.ts +0 -2
- package/dist/cli/commands/code-job-shape-commands.js +0 -3
- package/dist/cli/commands/code-mode-gate-commands.d.ts +0 -2
- package/dist/cli/commands/code-mode-gate-commands.js +0 -3
- package/dist/cli/commands/code-mode-gate-should-pause-command.js +1 -5
- package/dist/cli/commands/code-mode-gate-should-pause-envelope.d.ts +0 -1
- package/dist/cli/commands/code-mode-gate-should-pause-envelope.js +0 -2
- package/dist/cli/commands/code-mode-status-command.d.ts +0 -1
- package/dist/cli/commands/code-mode-status-command.js +0 -1
- package/dist/cli/commands/code-orchestrator-can-do.d.ts +0 -1
- package/dist/cli/commands/code-orchestrator-can-do.js +0 -1
- package/dist/cli/commands/code-run-command.js +0 -1
- package/dist/cli/commands/code-runtime-commands.d.ts +0 -3
- package/dist/cli/commands/code-runtime-commands.js +0 -15
- package/dist/cli/commands/codegraph-command-runtime.d.ts +6 -0
- package/dist/cli/commands/codegraph-command-runtime.js +19 -7
- package/dist/cli/commands/codegraph-commands.js +20 -193
- package/dist/cli/commands/codegraph-init-command.d.ts +8 -0
- package/dist/cli/commands/codegraph-init-command.js +162 -0
- package/dist/cli/commands/codegraph-status-command.js +5 -6
- package/dist/cli/commands/comments-commands.d.ts +14 -0
- package/dist/cli/commands/comments-commands.js +96 -0
- package/dist/cli/commands/compact-command.d.ts +0 -1
- package/dist/cli/commands/compact-command.js +0 -4
- package/dist/cli/commands/container-commands.d.ts +0 -1
- package/dist/cli/commands/container-commands.js +0 -1
- package/dist/cli/commands/context-commands.d.ts +0 -1
- package/dist/cli/commands/context-commands.js +0 -1
- package/dist/cli/commands/core/doctor-command.d.ts +0 -1
- package/dist/cli/commands/core/doctor-command.js +0 -9
- package/dist/cli/commands/core/memory-command.js +10 -1
- package/dist/cli/commands/core/session-command.js +0 -14
- package/dist/cli/commands/core/skill-command.js +1 -10
- package/dist/cli/commands/core/standards-command.js +1 -1
- package/dist/cli/commands/core-artifact-commands.d.ts +0 -1
- package/dist/cli/commands/core-artifact-commands.js +0 -1
- package/dist/cli/commands/cron-commands-actions.d.ts +0 -1
- package/dist/cli/commands/cron-commands-actions.js +0 -2
- package/dist/cli/commands/cron-commands-schedule.d.ts +0 -3
- package/dist/cli/commands/cron-commands-schedule.js +0 -1
- package/dist/cli/commands/cron-commands.d.ts +0 -1
- package/dist/cli/commands/cron-commands.js +0 -2
- package/dist/cli/commands/cron-scheduler-commands.d.ts +0 -1
- package/dist/cli/commands/cron-scheduler-commands.js +0 -1
- package/dist/cli/commands/cron-scheduler-persist.d.ts +0 -5
- package/dist/cli/commands/cron-scheduler-persist.js +0 -5
- package/dist/cli/commands/dashboard-summary.d.ts +0 -1
- package/dist/cli/commands/dispatch-commands.d.ts +0 -1
- package/dist/cli/commands/dispatch-commands.js +10 -37
- package/dist/cli/commands/dispatch-from-dag.js +0 -4
- package/dist/cli/commands/doctor/invoke-from-code.js +0 -1
- package/dist/cli/commands/e2e-verify.d.ts +0 -1
- package/dist/cli/commands/ecc-commands.d.ts +16 -22
- package/dist/cli/commands/ecc-commands.js +38 -26
- package/dist/cli/commands/evolution-commands.d.ts +0 -1
- package/dist/cli/commands/evolution-commands.js +0 -1
- package/dist/cli/commands/feedback-commands.d.ts +0 -1
- package/dist/cli/commands/feedback-commands.js +0 -2
- package/dist/cli/commands/fixture-commands.d.ts +0 -2
- package/dist/cli/commands/fresh-context-commands.d.ts +0 -1
- package/dist/cli/commands/gate-commands-enforce.d.ts +0 -3
- package/dist/cli/commands/gate-commands-enforce.js +0 -4
- package/dist/cli/commands/gate-commands.js +0 -2
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +0 -3
- package/dist/cli/commands/governance-classify-contract-commands.js +0 -4
- package/dist/cli/commands/heartbeat-commands-action.js +0 -6
- package/dist/cli/commands/heartbeat-commands-validation.d.ts +0 -2
- package/dist/cli/commands/heartbeat-commands-validation.js +0 -2
- package/dist/cli/commands/heartbeat-commands.d.ts +0 -1
- package/dist/cli/commands/heartbeat-commands.js +0 -1
- package/dist/cli/commands/hooks-commands.js +0 -11
- package/dist/cli/commands/ide-commands.d.ts +0 -1
- package/dist/cli/commands/job-add-slice-command.d.ts +0 -2
- package/dist/cli/commands/job-add-slice-command.js +0 -2
- package/dist/cli/commands/job-commands.js +0 -4
- package/dist/cli/commands/lease-metrics-commands.d.ts +0 -1
- package/dist/cli/commands/lease-metrics-commands.js +0 -1
- package/dist/cli/commands/lease-stats-commands.d.ts +0 -1
- package/dist/cli/commands/lease-stats-commands.js +0 -1
- package/dist/cli/commands/log-commands.d.ts +0 -2
- package/dist/cli/commands/log-commands.js +0 -3
- package/dist/cli/commands/loop-eval-commands.js +0 -3
- package/dist/cli/commands/memory-commands.d.ts +0 -1
- package/dist/cli/commands/memory-commands.js +0 -1
- package/dist/cli/commands/observability-commands.d.ts +0 -6
- package/dist/cli/commands/observability-commands.js +0 -6
- package/dist/cli/commands/outer-cache-commands.js +0 -2
- package/dist/cli/commands/playwright-commands.d.ts +0 -1
- package/dist/cli/commands/playwright-commands.js +0 -1
- package/dist/cli/commands/polyrepo-commands.d.ts +0 -1
- package/dist/cli/commands/prd-commands.d.ts +0 -1
- package/dist/cli/commands/prd-commands.js +8 -4
- package/dist/cli/commands/preferences-commands.js +0 -2
- package/dist/cli/commands/primer-command.d.ts +0 -1
- package/dist/cli/commands/primer-command.js +0 -1
- package/dist/cli/commands/project-commands.js +0 -1
- package/dist/cli/commands/qa-commands.d.ts +0 -1
- package/dist/cli/commands/qa-commands.js +0 -2
- package/dist/cli/commands/release-commands.js +0 -9
- package/dist/cli/commands/request-commands.d.ts +0 -1
- package/dist/cli/commands/request-commands.js +0 -10
- package/dist/cli/commands/request-format-helpers.d.ts +0 -1
- package/dist/cli/commands/request-format-helpers.js +0 -2
- package/dist/cli/commands/runtime-commands.d.ts +0 -1
- package/dist/cli/commands/sc-commands.js +0 -1
- package/dist/cli/commands/session-24h-mode.d.ts +0 -1
- package/dist/cli/commands/session-24h-mode.js +0 -2
- package/dist/cli/commands/session-checkpoint-command.d.ts +0 -1
- package/dist/cli/commands/session-checkpoint-command.js +0 -1
- package/dist/cli/commands/session-resume-command.d.ts +0 -1
- package/dist/cli/commands/session-resume-command.js +0 -1
- package/dist/cli/commands/shadcn-commands.js +0 -2
- package/dist/cli/commands/share-commands.d.ts +0 -3
- package/dist/cli/commands/share-commands.js +0 -13
- package/dist/cli/commands/skill-search-commands.d.ts +0 -2
- package/dist/cli/commands/slice-commands.js +0 -2
- package/dist/cli/commands/slice-integrate-commands.js +0 -1
- package/dist/cli/commands/spill-demo-command.d.ts +0 -1
- package/dist/cli/commands/statusline-commands.js +0 -4
- package/dist/cli/commands/sub-agent/detached.js +0 -2
- package/dist/cli/commands/sub-agent-commands.d.ts +0 -3
- package/dist/cli/commands/sub-agent-shared.d.ts +0 -8
- package/dist/cli/commands/sub-agent-shared.js +0 -5
- package/dist/cli/commands/sub-agent-shutdown-commands.d.ts +0 -1
- package/dist/cli/commands/tech-commands.d.ts +0 -4
- package/dist/cli/commands/tech-commands.js +0 -4
- package/dist/cli/commands/vendor-detect.d.ts +0 -3
- package/dist/cli/commands/vendor-detect.js +0 -2
- package/dist/cli/commands/verdict-aggregate-command.d.ts +0 -1
- package/dist/cli/commands/verdict-aggregate-command.js +0 -7
- package/dist/cli/commands/vm-commands.d.ts +0 -1
- package/dist/cli/commands/vm-commands.js +5 -29
- package/dist/cli/commands/vm-hypervisor-probe.d.ts +27 -0
- package/dist/cli/commands/vm-hypervisor-probe.js +78 -0
- package/dist/cli/commands/vm-status-command.d.ts +3 -0
- package/dist/cli/commands/vm-status-command.js +50 -0
- package/dist/cli/commands/wave-plan-commands.d.ts +0 -1
- package/dist/cli/commands/web-lifecycle-commands.d.ts +0 -1
- package/dist/cli/commands/workflow-commands.js +0 -14
- package/dist/cli/commands/workflow-plan-commands-actions.js +0 -2
- package/dist/cli/commands/workflow-plan-commands-session.js +0 -2
- package/dist/cli/commands/workflow-plan-commands.d.ts +0 -1
- package/dist/cli/commands/workspace/clean-command.d.ts +0 -1
- package/dist/cli/commands/workspace/clean-command.js +0 -1
- package/dist/cli/commands/workspace/helpers.d.ts +0 -1
- package/dist/cli/commands/workspace/helpers.js +0 -1
- package/dist/cli/commands/workspace/init-command.d.ts +0 -6
- package/dist/cli/commands/workspace/init-command.js +0 -17
- package/dist/cli/commands/workspace/migrate-command.d.ts +0 -2
- package/dist/cli/commands/workspace/migrate-command.js +0 -2
- package/dist/cli/commands/workspace/reconcile-command.d.ts +0 -2
- package/dist/cli/commands/workspace/reconcile-command.js +0 -3
- package/dist/cli/commands/workspace-commands.d.ts +0 -2
- package/dist/cli/commands/workspace-commands.js +0 -4
- package/dist/cli/commands/worktree-auth-commands.d.ts +0 -1
- package/dist/cli/commands/worktree-auth-commands.js +0 -1
- package/dist/cli/commands/worktree-auth-grant-command.d.ts +0 -1
- package/dist/cli/commands/worktree-auth-grant-command.js +0 -1
- package/dist/cli/commands/worktree-auth-manage-commands.d.ts +0 -1
- package/dist/cli/commands/worktree-auth-manage-commands.js +0 -1
- package/dist/cli/commands/worktree-lease-commands.js +0 -1
- package/dist/cli/program.js +4 -16
- package/dist/reporters/bdd-reporter.js +0 -1
- package/dist/services/24h-mode/auto-engage.d.ts +0 -1
- package/dist/services/24h-mode/auto-engage.js +0 -1
- package/dist/services/24h-mode/decider.d.ts +0 -3
- package/dist/services/24h-mode/decider.js +0 -3
- package/dist/services/24h-mode/index.d.ts +0 -2
- package/dist/services/24h-mode/index.js +0 -2
- package/dist/services/24h-mode/state.d.ts +0 -1
- package/dist/services/24h-mode/state.js +0 -1
- package/dist/services/24h-mode/store.d.ts +0 -1
- package/dist/services/24h-mode/store.js +0 -1
- package/dist/services/adapter/adapter-registry.js +0 -1
- package/dist/services/artifacts/artifact-prerequisites.d.ts +0 -5
- package/dist/services/artifacts/artifact-prerequisites.js +0 -19
- package/dist/services/artifacts/artifact-templates.d.ts +0 -1
- package/dist/services/artifacts/artifact-templates.js +0 -1
- package/dist/services/artifacts/request-artifact-service.d.ts +0 -5
- package/dist/services/artifacts/request-artifact-service.js +0 -12
- package/dist/services/artifacts/request-artifact-state-helpers.d.ts +0 -1
- package/dist/services/artifacts/request-artifact-state-helpers.js +0 -1
- package/dist/services/audit/artifact-writer.d.ts +0 -1
- package/dist/services/audit/artifact-writer.js +0 -1
- package/dist/services/audit/decision-writer.js +3 -1
- package/dist/services/audit/enforcer-liveness.js +0 -1
- package/dist/services/audit/enforcers/active-skill-resolver.d.ts +0 -2
- package/dist/services/audit/enforcers/active-skill-resolver.js +0 -2
- package/dist/services/audit/red-line-audit-input.d.ts +11 -0
- package/dist/services/audit/red-line-audit-input.js +103 -0
- package/dist/services/audit/red-line-catalog-p2-a-bee-runtime.d.ts +0 -1
- package/dist/services/audit/red-line-catalog-p2-a.js +0 -9
- package/dist/services/audit/types.d.ts +0 -2
- package/dist/services/audit/types.js +0 -2
- package/dist/services/audit-independent/perf-audit-service.d.ts +0 -2
- package/dist/services/audit-independent/security-audit-service.d.ts +0 -5
- package/dist/services/audit-independent/security-audit-service.js +0 -2
- package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +0 -5
- package/dist/services/autonomous-swarm/autonomous-swarm-service.js +0 -5
- package/dist/services/best-practice/language-detector.js +0 -1
- package/dist/services/best-practice/output-formatter.d.ts +0 -1
- package/dist/services/best-practice/scan-orchestrator.d.ts +0 -1
- package/dist/services/capability-audit-service/types.d.ts +1 -3
- package/dist/services/capability-guard-runner/contracts/J08.js +2 -2
- package/dist/services/changeset/changeset-check-service.d.ts +0 -3
- package/dist/services/changeset/changeset-check-service.js +0 -3
- package/dist/services/classify/classify-service.d.ts +0 -1
- package/dist/services/classify/classify-service.js +0 -1
- package/dist/services/classify/classify-types.d.ts +0 -1
- package/dist/services/classify/classify-types.js +0 -1
- package/dist/services/code/auto-compact-lifecycle.d.ts +0 -11
- package/dist/services/code/auto-compact-lifecycle.js +0 -10
- package/dist/services/code/auto-compact-modes.d.ts +0 -3
- package/dist/services/code/auto-compact-modes.js +0 -3
- package/dist/services/code/auto-compact-orchestrator.d.ts +0 -9
- package/dist/services/code/auto-compact-orchestrator.js +0 -29
- package/dist/services/code/batch-heartbeat-poller.js +0 -1
- package/dist/services/code/compact-event-settle.js +0 -1
- package/dist/services/code/dag-orchestrator.d.ts +0 -1
- package/dist/services/code/dag-orchestrator.js +0 -1
- package/dist/services/code/mode-gate-types.d.ts +1 -3
- package/dist/services/code/mode-gate-types.js +0 -2
- package/dist/services/code/mode-gate.d.ts +0 -5
- package/dist/services/code/mode-gate.js +1 -14
- package/dist/services/code/orchestrator-can-do-advisories.d.ts +0 -2
- package/dist/services/code/orchestrator-can-do-advisories.js +0 -5
- package/dist/services/code/orchestrator-can-do.d.ts +0 -4
- package/dist/services/code/orchestrator-can-do.js +0 -3
- package/dist/services/code/status-line-renderer.js +0 -1
- package/dist/services/code/user-touchpoint-classifier.js +0 -7
- package/dist/services/code-review/ecc-bridge.d.ts +6 -7
- package/dist/services/codegraph/codegraph-autorefresh.js +6 -4
- package/dist/services/codegraph/codegraph-backend-advice.d.ts +26 -0
- package/dist/services/codegraph/codegraph-backend-advice.js +166 -0
- package/dist/services/codegraph/codegraph-config-repair-writer.d.ts +0 -24
- package/dist/services/codegraph/codegraph-config-repair-writer.js +32 -73
- package/dist/services/codegraph/codegraph-exclude-integrity.d.ts +14 -6
- package/dist/services/codegraph/codegraph-exclude-integrity.js +24 -14
- package/dist/services/codegraph/codegraph-exclude-reconciler.d.ts +9 -2
- package/dist/services/codegraph/codegraph-exclude-reconciler.js +87 -18
- package/dist/services/codegraph/codegraph-exclude-repair.d.ts +9 -61
- package/dist/services/codegraph/codegraph-exclude-repair.js +67 -139
- package/dist/services/codegraph/codegraph-foreign-removal.d.ts +21 -0
- package/dist/services/codegraph/codegraph-foreign-removal.js +77 -0
- package/dist/services/codegraph/codegraph-index-integrity.d.ts +12 -25
- package/dist/services/codegraph/codegraph-index-integrity.js +84 -23
- package/dist/services/codegraph/codegraph-preflight-service.js +15 -6
- package/dist/services/codegraph/codegraph-project-config.d.ts +35 -0
- package/dist/services/codegraph/codegraph-project-config.js +90 -0
- package/dist/services/codegraph/codegraph-service.d.ts +1 -2
- package/dist/services/codegraph/codegraph-service.js +11 -11
- package/dist/services/codegraph/codegraph-upstream-layout.d.ts +24 -0
- package/dist/services/codegraph/codegraph-upstream-layout.js +85 -0
- package/dist/services/comments/citation-rules.d.ts +154 -0
- package/dist/services/comments/citation-rules.js +241 -0
- package/dist/services/comments/comment-audit.d.ts +68 -0
- package/dist/services/comments/comment-audit.js +121 -0
- package/dist/services/comments/comment-citations.d.ts +66 -0
- package/dist/services/comments/comment-citations.js +184 -0
- package/dist/services/comments/comment-hygiene.d.ts +105 -0
- package/dist/services/comments/comment-hygiene.js +170 -0
- package/dist/services/comments/comment-prune.d.ts +88 -0
- package/dist/services/comments/comment-prune.js +196 -0
- package/dist/services/comments/comment-spans.d.ts +30 -0
- package/dist/services/comments/comment-spans.js +266 -0
- package/dist/services/comments/prune-apply.d.ts +82 -0
- package/dist/services/comments/prune-apply.js +217 -0
- package/dist/services/comments/repo-path-probe.d.ts +43 -0
- package/dist/services/comments/repo-path-probe.js +78 -0
- package/dist/services/compact/decision-tables.d.ts +0 -2
- package/dist/services/compact/decision-tables.js +0 -2
- package/dist/services/compact/request-transition-hook.js +0 -2
- package/dist/services/compact-history/compact-history-service.d.ts +0 -2
- package/dist/services/compact-history/compact-history-service.js +0 -1
- package/dist/services/compact-statusline/compact-lifecycle-store.js +0 -2
- package/dist/services/compact-statusline/compact-lifecycle-types.d.ts +0 -1
- package/dist/services/compact-statusline/compact-statusline-service.js +0 -4
- package/dist/services/config/config-rollback.js +0 -1
- package/dist/services/config/config-safety.d.ts +0 -1
- package/dist/services/config/config-safety.js +0 -1
- package/dist/services/config/config-service.d.ts +0 -1
- package/dist/services/config/config-service.js +0 -1
- package/dist/services/config/model-routing.d.ts +0 -3
- package/dist/services/config/model-routing.js +0 -5
- package/dist/services/container/container-lease.d.ts +0 -1
- package/dist/services/container/container-lease.js +0 -1
- package/dist/services/context/artifact-meta.js +0 -1
- package/dist/services/context/auto-compact-dispatcher-input.d.ts +0 -3
- package/dist/services/context/auto-compact-dispatcher.js +0 -14
- package/dist/services/context/auto-compact-reader-input.d.ts +0 -1
- package/dist/services/context/auto-compact-reader.d.ts +0 -2
- package/dist/services/context/auto-compact-reader.js +0 -7
- package/dist/services/context/auto-compact-types.d.ts +0 -11
- package/dist/services/context/auto-compact-types.js +0 -1
- package/dist/services/context/build-dispatch-system-prompt.d.ts +11 -29
- package/dist/services/context/build-dispatch-system-prompt.js +8 -27
- package/dist/services/context/codegraph-unavailable-block.d.ts +38 -0
- package/dist/services/context/codegraph-unavailable-block.js +77 -0
- package/dist/services/context/context-audit-hint.d.ts +0 -1
- package/dist/services/context/context-audit-hint.js +0 -1
- package/dist/services/context/context-audit.d.ts +0 -1
- package/dist/services/context/context-audit.js +0 -1
- package/dist/services/context/harness-window-config.d.ts +0 -4
- package/dist/services/context/harness-window-config.js +0 -4
- package/dist/services/context/main-session-monitor.d.ts +0 -2
- package/dist/services/context/main-session-monitor.js +0 -2
- package/dist/services/context/memory-index-reader.d.ts +0 -2
- package/dist/services/context/memory-index-reader.js +0 -1
- package/dist/services/context/memory-preflight-config.d.ts +0 -1
- package/dist/services/context/memory-preflight-service.d.ts +0 -1
- package/dist/services/context/memory-preflight-service.js +0 -3
- package/dist/services/context/memory-preflight-support.d.ts +0 -5
- package/dist/services/context/post-compact-reinjection.d.ts +0 -1
- package/dist/services/context/post-compact-reinjection.js +0 -1
- package/dist/services/context/summary-view.d.ts +0 -1
- package/dist/services/context/summary-view.js +0 -1
- package/dist/services/crystallization/crystallization-service.d.ts +5 -11
- package/dist/services/crystallization/crystallization-service.js +3 -11
- package/dist/services/crystallization/crystallization-store.d.ts +6 -6
- package/dist/services/dispatch/await-batch-helpers.js +0 -3
- package/dist/services/dispatch/await-batch.d.ts +0 -1
- package/dist/services/dispatch/await-batch.js +0 -4
- package/dist/services/dispatch/batch-counter.js +0 -1
- package/dist/services/dispatch/conflict-replay.d.ts +0 -1
- package/dist/services/dispatch/conflict-replay.js +0 -1
- package/dist/services/dispatch/contract-store.d.ts +0 -2
- package/dist/services/dispatch/contract-store.js +0 -2
- package/dist/services/dispatch/dispatch-record-input-types.d.ts +0 -2
- package/dist/services/dispatch/dispatch-record-types.d.ts +0 -10
- package/dist/services/dispatch/dispatch-record-upgrade-fields.js +0 -7
- package/dist/services/dispatch/dispatch-record-upgrade-guards.js +0 -2
- package/dist/services/dispatch/dispatch-record-writer.d.ts +0 -5
- package/dist/services/dispatch/dispatch-record-writer.js +0 -21
- package/dist/services/dispatch/dispatch-sub-agent.d.ts +0 -1
- package/dist/services/dispatch/dispatch-sub-agent.js +0 -1
- package/dist/services/dispatch/e2e-fixtures.js +0 -1
- package/dist/services/dispatch/file-overlap-wave-planner.d.ts +0 -1
- package/dist/services/dispatch/file-overlap-wave-planner.js +0 -1
- package/dist/services/dispatch/isolation-lease.d.ts +0 -2
- package/dist/services/dispatch/isolation-lease.js +0 -2
- package/dist/services/dispatch/service-shutdown.js +0 -1
- package/dist/services/dispatch/session-capsule.js +0 -1
- package/dist/services/dispatch/slice-dag-types.d.ts +0 -1
- package/dist/services/dispatch/slice-dag.js +0 -2
- package/dist/services/dispatch/stage-enum.d.ts +0 -1
- package/dist/services/dispatch/stage-enum.js +0 -1
- package/dist/services/dispatch/startup-timeout.d.ts +0 -1
- package/dist/services/dispatch/sub-agent-batch-await.js +0 -3
- package/dist/services/dispatch/sub-agent-dispatcher-types.d.ts +0 -1
- package/dist/services/dispatch/sub-agent-dispatcher.js +0 -2
- package/dist/services/dispatch/test-tool-detection.d.ts +0 -3
- package/dist/services/dispatch/test-tool-detection.js +0 -2
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +19 -12
- package/dist/services/doctor/doctor-service/checks/codegraph-index-integrity.js +1 -2
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +0 -2
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +0 -2
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +0 -1
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +0 -1
- package/dist/services/doctor/doctor-service/checks/multi-binary-drift.d.ts +0 -1
- package/dist/services/doctor/doctor-service/checks/multi-binary-drift.js +0 -3
- package/dist/services/doctor/doctor-service/checks/workspace-layout.js +0 -2
- package/dist/services/doctor/doctor-service/index.d.ts +0 -1
- package/dist/services/doctor/doctor-service/index.js +0 -1
- package/dist/services/doctor/doctor-service/plugin-registry.d.ts +0 -2
- package/dist/services/doctor/doctor-service/plugin-registry.js +0 -2
- package/dist/services/doctor/doctor-service/probe-types.d.ts +0 -4
- package/dist/services/doctor/doctor-service/report/final-summary.d.ts +0 -1
- package/dist/services/doctor/doctor-service/report/final-summary.js +0 -1
- package/dist/services/doctor/doctor-service/types.d.ts +0 -5
- package/dist/services/doctor/doctor-service/types.js +0 -1
- package/dist/services/doctor/doctor-service.d.ts +0 -1
- package/dist/services/doctor/doctor-service.js +0 -2
- package/dist/services/env/shell-probe.js +0 -1
- package/dist/services/evidence/evidence-generator.js +0 -8
- package/dist/services/evolution/evolution-constraints.d.ts +0 -2
- package/dist/services/evolution/evolution-constraints.js +0 -2
- package/dist/services/evolution/evolution-service.d.ts +2 -12
- package/dist/services/evolution/evolution-service.js +0 -9
- package/dist/services/evolution/evolution-store.d.ts +6 -8
- package/dist/services/evolution/evolution-store.js +1 -3
- package/dist/services/evolution/evolution-types.d.ts +0 -2
- package/dist/services/evolution/evolution-types.js +0 -6
- package/dist/services/evolution/independent-evaluator-runner.d.ts +0 -3
- package/dist/services/evolution/independent-evaluator-runner.js +0 -1
- package/dist/services/evolution/regression-skeptic-runner.d.ts +0 -1
- package/dist/services/feedback/feedback-promotion-service.d.ts +0 -8
- package/dist/services/feedback/feedback-promotion-service.js +0 -10
- package/dist/services/feedback/promotion-artifact-evidence.d.ts +0 -1
- package/dist/services/feedback/promotion-artifact-evidence.js +0 -1
- package/dist/services/final-review/final-review-evidence-budget.d.ts +0 -3
- package/dist/services/final-review/final-review-evidence-budget.js +0 -5
- package/dist/services/final-review/final-review-evidence-sources.d.ts +0 -1
- package/dist/services/final-review/final-review-evidence-sources.js +0 -1
- package/dist/services/final-review/final-review-output-budget.d.ts +0 -1
- package/dist/services/final-review/final-review-output-budget.js +0 -3
- package/dist/services/final-review/final-review-service.d.ts +0 -1
- package/dist/services/final-review/final-review-service.js +0 -1
- package/dist/services/fixture/fixture-capture-service.js +0 -1
- package/dist/services/fixture/fixture-sanitize-service.d.ts +0 -3
- package/dist/services/fixture/fixture-sanitize-service.js +0 -3
- package/dist/services/fresh-context/config.js +0 -1
- package/dist/services/fresh-context/fresh-context-block.js +0 -1
- package/dist/services/fresh-context/trigger-scan.d.ts +0 -1
- package/dist/services/fresh-context/trigger-scan.js +0 -1
- package/dist/services/fuzzy-matching/fzf-pick-service.d.ts +0 -1
- package/dist/services/fuzzy-matching/fzf-pick-service.js +0 -1
- package/dist/services/handoff/handoff-parser.d.ts +0 -1
- package/dist/services/handoff/handoff-parser.js +0 -1
- package/dist/services/handoff/handoff-types.d.ts +0 -1
- package/dist/services/handoff/handoff-types.js +0 -1
- package/dist/services/handoff/handoff-writer.d.ts +0 -1
- package/dist/services/handoff/handoff-writer.js +0 -1
- package/dist/services/hooks/auto-compact-hook-install.d.ts +0 -1
- package/dist/services/hooks/auto-compact-hook-install.js +0 -1
- package/dist/services/hooks/output.d.ts +0 -1
- package/dist/services/hooks/output.js +0 -1
- package/dist/services/hooks/pre-tool-code-gate.d.ts +0 -1
- package/dist/services/hooks/pre-tool-code-gate.js +0 -1
- package/dist/services/hooks/presence-marker-detector.js +0 -1
- package/dist/services/hooks/worktree-authorization-gate.d.ts +0 -3
- package/dist/services/hooks/worktree-authorization-gate.js +0 -1
- package/dist/services/ide/adapters/claude-code-adapter.d.ts +0 -5
- package/dist/services/ide/adapters/claude-code-adapter.js +0 -11
- package/dist/services/ide/adapters/qoder-adapter.d.ts +0 -3
- package/dist/services/ide/adapters/qoder-adapter.js +0 -5
- package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +0 -2
- package/dist/services/ide/adapters/tongyi-lingma-adapter.js +0 -2
- package/dist/services/ide/adapters/trae-adapter.d.ts +0 -3
- package/dist/services/ide/adapters/trae-adapter.js +3 -6
- package/dist/services/ide/adapters/zcode-adapter.js +0 -2
- package/dist/services/ide/current-model-detector.js +0 -1
- package/dist/services/ide/hook-protocol.d.ts +0 -2
- package/dist/services/ide/hook-protocol.js +0 -2
- package/dist/services/ide/ide-compact-types.d.ts +0 -7
- package/dist/services/ide/ide-types.d.ts +0 -12
- package/dist/services/ide/resource-profile.d.ts +0 -1
- package/dist/services/job/job-commit-verification.d.ts +0 -2
- package/dist/services/job/job-commit-verification.js +0 -2
- package/dist/services/job/job-orchestrator.d.ts +0 -1
- package/dist/services/job/job-orchestrator.js +0 -1
- package/dist/services/job/job-progress-store.d.ts +0 -2
- package/dist/services/job/job-progress-store.js +0 -3
- package/dist/services/job/job-types.js +0 -1
- package/dist/services/job-snapshot/snapshot.js +0 -1
- package/dist/services/karpathy-cost/karpathy-cost-check-service.js +0 -1
- package/dist/services/legacy/legacy-detector.js +0 -1
- package/dist/services/log/log-commands-service.d.ts +0 -2
- package/dist/services/log/log-commands-service.js +0 -2
- package/dist/services/log/logger.d.ts +0 -1
- package/dist/services/log/logger.js +0 -1
- package/dist/services/log/redact.d.ts +0 -1
- package/dist/services/log/redact.js +0 -1
- package/dist/services/log/retention.d.ts +0 -17
- package/dist/services/log/retention.js +0 -18
- package/dist/services/loop/loop-bee-relation-service.d.ts +3 -3
- package/dist/services/loop/loop-bee-relation-service.js +14 -13
- package/dist/services/loop/loop-bee-relation-store.d.ts +9 -10
- package/dist/services/loop/loop-bee-relation-store.js +1 -2
- package/dist/services/loop/loop-bee-relation-types.d.ts +1 -1
- package/dist/services/loop/loop-bee-relation-types.js +1 -1
- package/dist/services/loop/loop-release-service.d.ts +3 -3
- package/dist/services/loop/loop-release-service.js +1 -1
- package/dist/services/loop/loop-release-store.d.ts +6 -7
- package/dist/services/loop/loop-release-store.js +0 -1
- package/dist/services/loop/monotonic-guard.d.ts +0 -1
- package/dist/services/loop/monotonic-guard.js +0 -1
- package/dist/services/memory/memory-ingest-service.js +0 -1
- package/dist/services/memory/project-context-service.d.ts +0 -1
- package/dist/services/memory/project-context-service.js +0 -1
- package/dist/services/memory/project-memory-service/index/reindex.d.ts +0 -2
- package/dist/services/memory/project-memory-service/index/reindex.js +0 -1
- package/dist/services/memory/project-memory-service/index/search.d.ts +0 -1
- package/dist/services/memory/project-memory-service/index/search.js +0 -1
- package/dist/services/memory/project-memory-service/index.d.ts +1 -1
- package/dist/services/memory/project-memory-service/index.js +1 -1
- package/dist/services/memory/project-memory-service/memory-kinds.d.ts +0 -1
- package/dist/services/memory/project-memory-service/memory-kinds.js +0 -1
- package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +0 -1
- package/dist/services/memory/project-memory-service/parsers/frontmatter.js +0 -1
- package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +19 -7
- package/dist/services/memory/project-memory-service/store/atomic-write.js +120 -26
- package/dist/services/memory/project-memory-service.js +0 -1
- package/dist/services/mode/mode-enforcement.js +0 -1
- package/dist/services/mode/mode-status-service.d.ts +0 -2
- package/dist/services/mode/mode-status-service.js +0 -2
- package/dist/services/observability/aggregation.d.ts +0 -4
- package/dist/services/observability/aggregation.js +0 -6
- package/dist/services/observability/observability-schema.js +0 -1
- package/dist/services/observability/observability-service.d.ts +0 -5
- package/dist/services/observability/observability-service.js +0 -4
- package/dist/services/observability/report-formatter.d.ts +0 -2
- package/dist/services/observability/report-formatter.js +0 -2
- package/dist/services/openspec/artifact-boundary.d.ts +0 -4
- package/dist/services/openspec/artifact-boundary.js +0 -4
- package/dist/services/openspec/coverage-evidence-reader.d.ts +0 -1
- package/dist/services/openspec/coverage-evidence-reader.js +0 -1
- package/dist/services/polyrepo/polyrepo-dispatcher.js +0 -1
- package/dist/services/polyrepo/polyrepo-scanner.js +0 -1
- package/dist/services/polyrepo/polyrepo-service.js +0 -1
- package/dist/services/polyrepo/polyrepo-types.d.ts +0 -1
- package/dist/services/prd/best-practice-auto-trigger.d.ts +0 -2
- package/dist/services/prd/best-practice-auto-trigger.js +0 -2
- package/dist/services/prd/gate-evidence-derivation.d.ts +0 -4
- package/dist/services/prd/gate-evidence-derivation.js +0 -5
- package/dist/services/prd/handoff-auto-regen.js +0 -5
- package/dist/services/prd/handoff-frontmatter-shape.d.ts +0 -2
- package/dist/services/prd/handoff-frontmatter-shape.js +0 -2
- package/dist/services/prd/handoff-frontmatter.d.ts +0 -1
- package/dist/services/prd/handoff-frontmatter.js +61 -2
- package/dist/services/prd/handoff-gate-evidence.d.ts +0 -1
- package/dist/services/prd/handoff-gate-evidence.js +12 -12
- package/dist/services/prd/handoff-path-resolution.d.ts +0 -7
- package/dist/services/prd/handoff-path-resolution.js +0 -10
- package/dist/services/prd/handoff-service.d.ts +11 -3
- package/dist/services/prd/handoff-service.js +11 -3
- package/dist/services/prd/handoff-types.d.ts +33 -3
- package/dist/services/prd/handoff-types.js +0 -1
- package/dist/services/prd/project-scan-bootstrap-service.d.ts +0 -1
- package/dist/services/prd/project-scan-bootstrap-service.js +0 -4
- package/dist/services/prd/project-scan-types.d.ts +0 -1
- package/dist/services/prd/project-scan-types.js +0 -1
- package/dist/services/preferences/preferences-service.d.ts +0 -1
- package/dist/services/preferences/preferences-service.js +0 -5
- package/dist/services/preferences/preferences-types.d.ts +0 -14
- package/dist/services/preferences/preferences-types.js +0 -4
- package/dist/services/progress/progress-service.js +0 -1
- package/dist/services/qa/bdd-test-style-verifier.d.ts +0 -1
- package/dist/services/qa/bdd-test-style-verifier.js +0 -1
- package/dist/services/qa/browser-event-logger.d.ts +0 -1
- package/dist/services/qa/browser-event-logger.js +0 -1
- package/dist/services/qa/browser-restart-detector.d.ts +0 -1
- package/dist/services/qa/browser-restart-detector.js +0 -1
- package/dist/services/qa/browser-reuse-hint.d.ts +0 -1
- package/dist/services/qa/browser-reuse-hint.js +0 -1
- package/dist/services/qa/qa-business-review-state.js +0 -2
- package/dist/services/qa/screenshot-archive-service.d.ts +0 -1
- package/dist/services/qa/screenshot-archive-service.js +0 -1
- package/dist/services/rd/impl.js +0 -1
- package/dist/services/rd/rd-service.d.ts +0 -5
- package/dist/services/rd/rd-service.js +0 -5
- package/dist/services/rd/reviewer-dispatch-policy.d.ts +0 -4
- package/dist/services/rd/reviewer-dispatch-policy.js +0 -4
- package/dist/services/rd/standards-diagnostic.js +0 -1
- package/dist/services/rd/tactical-stage.js +0 -1
- package/dist/services/rd-swarm/rd-swarm-types.d.ts +0 -1
- package/dist/services/rd-swarm/rd-swarm-types.js +0 -1
- package/dist/services/recommendations/installed-capability-detector.d.ts +5 -6
- package/dist/services/recommendations/installed-capability-detector.js +11 -11
- package/dist/services/release/version-precheck-service.d.ts +0 -2
- package/dist/services/release/version-precheck-service.js +0 -3
- package/dist/services/retrospective/retrospective-index.d.ts +0 -1
- package/dist/services/retrospective/retrospective-index.js +0 -1
- package/dist/services/retrospective/retrospective-show.d.ts +0 -1
- package/dist/services/retrospective/retrospective-show.js +0 -1
- package/dist/services/reviewer/model-family.js +0 -1
- package/dist/services/reviewer/reviewer-config.js +0 -1
- package/dist/services/reviewer/reviewer-service.d.ts +0 -1
- package/dist/services/reviewer/reviewer-service.js +0 -3
- package/dist/services/reviewer/selection-strategies.js +0 -1
- package/dist/services/runtime/runtime-detector.js +0 -1
- package/dist/services/runtime/runtime-service.d.ts +0 -2
- package/dist/services/runtime/vendor-adapter.d.ts +0 -7
- package/dist/services/runtime/vendors/claude-code.js +0 -1
- package/dist/services/runtime/vendors/codex.js +0 -1
- package/dist/services/runtime/vendors/copilot.js +0 -1
- package/dist/services/sc/sc-service.js +0 -6
- package/dist/services/scan/acceptance-coverage-service.js +0 -2
- package/dist/services/scan/api-diff-recorded.d.ts +0 -1
- package/dist/services/scan/api-diff-recorded.js +0 -1
- package/dist/services/scan/api-diff-service.d.ts +0 -1
- package/dist/services/scan/api-diff-service.js +0 -1
- package/dist/services/scan/api-diff-types.d.ts +0 -1
- package/dist/services/scan/api-diff-types.js +0 -1
- package/dist/services/scan/archetype-detection.d.ts +37 -0
- package/dist/services/scan/archetype-detection.js +175 -2
- package/dist/services/scan/archetype-service.js +36 -23
- package/dist/services/scan/file-size-policy.d.ts +0 -1
- package/dist/services/scan/file-size-policy.js +0 -5
- package/dist/services/scan/file-size-scan.d.ts +0 -1
- package/dist/services/scan/scan-types.d.ts +9 -0
- package/dist/services/security/safe-settings-path.js +0 -1
- package/dist/services/session/binding-store.d.ts +0 -4
- package/dist/services/session/binding-store.js +0 -7
- package/dist/services/session/caller-binding-service.d.ts +0 -6
- package/dist/services/session/caller-binding-service.js +0 -4
- package/dist/services/session/caller-id-types.d.ts +0 -3
- package/dist/services/session/caller-id-types.js +0 -2
- package/dist/services/session/getSessionDir.js +0 -1
- package/dist/services/session/index.js +0 -1
- package/dist/services/session/platform-fallbacks.d.ts +0 -3
- package/dist/services/session/platform-fallbacks.js +0 -3
- package/dist/services/session/resolve-caller-id.d.ts +0 -2
- package/dist/services/session/resolve-caller-id.js +0 -2
- package/dist/services/session/session-binding-bridge.d.ts +0 -2
- package/dist/services/session/session-binding-bridge.js +0 -15
- package/dist/services/session/session-checkpoint-service.d.ts +0 -1
- package/dist/services/session/session-checkpoint-service.js +0 -1
- package/dist/services/session/session-manager.d.ts +0 -8
- package/dist/services/session/session-manager.js +0 -19
- package/dist/services/session/session-resume-service.d.ts +0 -1
- package/dist/services/session/session-resume-service.js +0 -1
- package/dist/services/share/bundle-reader.d.ts +2 -5
- package/dist/services/share/bundle-reader.js +6 -8
- package/dist/services/share/bundle-writer.d.ts +2 -2
- package/dist/services/skill/resume-detector.js +0 -3
- package/dist/services/skill/skill-scheduler.d.ts +0 -1
- package/dist/services/skill/skill-scheduler.js +0 -1
- package/dist/services/skill/skill-search-service.d.ts +0 -2
- package/dist/services/skill/skill-search-service.js +0 -2
- package/dist/services/skillhub/release-diff.d.ts +2 -2
- package/dist/services/skillhub/release-export.d.ts +2 -2
- package/dist/services/skillhub/release-gc-blobs.d.ts +2 -2
- package/dist/services/skillhub/release-import.d.ts +2 -2
- package/dist/services/skillhub/release-import.js +2 -1
- package/dist/services/skillhub/release-retain.d.ts +2 -2
- package/dist/services/skillhub/release-retain.js +2 -1
- package/dist/services/skillhub/sqlite-store.d.ts +3 -3
- package/dist/services/skillhub/sqlite-store.js +4 -5
- package/dist/services/skills/hooks-codegate-superpowers.d.ts +0 -3
- package/dist/services/skills/hooks-codegate-superpowers.js +0 -14
- package/dist/services/skills/hooks-settings-service.d.ts +0 -2
- package/dist/services/skills/hooks-settings-service.js +0 -6
- package/dist/services/skills/presence-lease-service.d.ts +0 -1
- package/dist/services/skills/presence-lease-service.js +0 -1
- package/dist/services/skills/session-start-hook-constants.d.ts +0 -4
- package/dist/services/skills/session-start-hook-constants.js +0 -4
- package/dist/services/skills/skill-presence-service.d.ts +0 -8
- package/dist/services/skills/skill-presence-service.js +0 -13
- package/dist/services/skills/skill-statusline-model.d.ts +0 -6
- package/dist/services/skills/skill-statusline-model.js +1 -4
- package/dist/services/skills/skill-statusline-renderer.d.ts +0 -1
- package/dist/services/skills/skill-statusline-renderer.js +0 -12
- package/dist/services/skills/skill-statusline-service.js +0 -6
- package/dist/services/skills/skill-statusline-sid-suffix.d.ts +0 -2
- package/dist/services/skills/skill-statusline-sid-suffix.js +0 -2
- package/dist/services/skills/statusline-palette.d.ts +0 -2
- package/dist/services/skills/statusline-palette.js +0 -3
- package/dist/services/slice/slice-archive-service.js +0 -1
- package/dist/services/slice/slice-benchmark-service.d.ts +0 -1
- package/dist/services/slice/slice-benchmark-service.js +0 -1
- package/dist/services/slice/slice-check-service.js +0 -6
- package/dist/services/slice/slice-check-types.d.ts +0 -1
- package/dist/services/slice/slice-pick-service.d.ts +0 -1
- package/dist/services/slice/slice-pick-service.js +0 -1
- package/dist/services/slice/slice-review-state.js +0 -2
- package/dist/services/sqlite/sqlite-driver.d.ts +118 -0
- package/dist/services/sqlite/sqlite-driver.js +159 -0
- package/dist/services/standards/ide-aware-standards-service.d.ts +0 -2
- package/dist/services/standards/ide-aware-standards-service.js +0 -1
- package/dist/services/standards/loop-engineering-readiness-lint.d.ts +0 -1
- package/dist/services/standards/loop-engineering-readiness-lint.js +0 -1
- package/dist/services/standards/migrate-claude-rules-service.js +0 -3
- package/dist/services/standards/migrate-service.d.ts +0 -1
- package/dist/services/standards/migrate-service.js +0 -1
- package/dist/services/standards/missing-standards-detector.d.ts +0 -2
- package/dist/services/standards/missing-standards-detector.js +0 -3
- package/dist/services/standards/project-standards-service.d.ts +0 -1
- package/dist/services/standards/project-standards-service.js +0 -1
- package/dist/services/standards/standards-render.d.ts +0 -1
- package/dist/services/standards/standards-render.js +0 -1
- package/dist/services/standards/ui-library-dispatch-block.d.ts +0 -1
- package/dist/services/standards/ui-library-dispatch-block.js +0 -1
- package/dist/services/tech/tech-change-id-service.d.ts +0 -7
- package/dist/services/tech/tech-change-id-service.js +0 -7
- package/dist/services/tech/tech-service.js +0 -5
- package/dist/services/verdict/envelope-parsers.d.ts +0 -2
- package/dist/services/verdict/envelope-parsers.js +0 -2
- package/dist/services/verdict/envelopes.d.ts +0 -1
- package/dist/services/vm/vm-lease.js +0 -1
- package/dist/services/web/aria-node.d.ts +0 -1
- package/dist/services/web/bounded-output.d.ts +0 -1
- package/dist/services/web/bounded-output.js +0 -1
- package/dist/services/web/browser-acquire.js +0 -1
- package/dist/services/web/browser-cache-probe.js +0 -1
- package/dist/services/web/browser-session-manager.js +0 -1
- package/dist/services/web/daemon-entry.js +0 -1
- package/dist/services/web/daemon-registry.js +0 -1
- package/dist/services/web/daemon-supervisor.d.ts +4 -3
- package/dist/services/web/daemon-supervisor.js +4 -4
- package/dist/services/web/playwright-loader.js +0 -1
- package/dist/services/web/playwright-types.d.ts +0 -1
- package/dist/services/web/snapshot-pruner.js +0 -1
- package/dist/services/web/untrusted-envelope.d.ts +0 -1
- package/dist/services/web/web-artifact-paths.js +0 -1
- package/dist/services/web/web-client.d.ts +0 -1
- package/dist/services/web/web-daemon-service.js +0 -1
- package/dist/services/web/web-fallback.d.ts +0 -1
- package/dist/services/web/web-fallback.js +0 -1
- package/dist/services/web/web-install-service.js +0 -1
- package/dist/services/web/web-login-profile.js +0 -1
- package/dist/services/web/web-protocol.d.ts +0 -1
- package/dist/services/web/web-protocol.js +0 -1
- package/dist/services/web/web-status-report.js +0 -1
- package/dist/services/workflow/artifact-paths.js +0 -3
- package/dist/services/workflow/autonomous-resume-writer.js +0 -2
- package/dist/services/workflow/pipeline-verify-gate-support.d.ts +0 -5
- package/dist/services/workflow/pipeline-verify-gate-support.js +0 -11
- package/dist/services/workflow/pipeline-verify-service.d.ts +0 -2
- package/dist/services/workflow/pipeline-verify-service.js +0 -15
- package/dist/services/workflow/pipeline-verify-types.d.ts +0 -10
- package/dist/services/workflow/pipeline-verify-types.js +0 -2
- package/dist/services/workflow/plan-reader.d.ts +0 -1
- package/dist/services/workflow/plan-reader.js +0 -5
- package/dist/services/workflow/plan-refresher.js +0 -2
- package/dist/services/workflow/plan-trigger-detector.d.ts +0 -2
- package/dist/services/workflow/plan-trigger-detector.js +0 -3
- package/dist/services/workflow/workflow-autonomous-resume-helpers.js +0 -5
- package/dist/services/workflow/workflow-autonomous-service.js +0 -2
- package/dist/services/workflow/workflow-autonomous-types.d.ts +0 -2
- package/dist/services/workflow/workflow-autonomous-types.js +0 -2
- package/dist/services/workflow/workflow-graph-types.d.ts +0 -1
- package/dist/services/workflow/workflow-graph-types.js +0 -1
- package/dist/services/workflow/workflow-router-service.js +0 -4
- package/dist/services/workflow/workflow-skip-service.d.ts +0 -1
- package/dist/services/workflow/workflow-skip-service.js +0 -1
- package/dist/services/workflow/workflow-spec-lint.d.ts +0 -2
- package/dist/services/workflow/workflow-spec-lint.js +0 -2
- package/dist/services/workflow/workflow-spec-types.d.ts +0 -1
- package/dist/services/workflow/workflow-spec-types.js +0 -1
- package/dist/services/workflow/workflow-spec-yaml.d.ts +0 -2
- package/dist/services/workflow/workflow-spec-yaml.js +0 -2
- package/dist/services/workflow/workflow-spec.js +0 -1
- package/dist/services/workflow/workflow-state-store.js +0 -1
- package/dist/services/workspace/claude-settings-template.d.ts +0 -4
- package/dist/services/workspace/claude-settings-template.js +0 -4
- package/dist/services/workspace/generated-artifacts-stamp.d.ts +2 -2
- package/dist/services/workspace/generated-artifacts-stamp.js +2 -2
- package/dist/services/workspace/migrate-1-4-1-service.d.ts +0 -1
- package/dist/services/workspace/migrate-1-4-1-service.js +0 -1
- package/dist/services/workspace/migrate-service.js +0 -8
- package/dist/services/workspace/migrate-types.d.ts +0 -4
- package/dist/services/workspace/migrate-types.js +0 -1
- package/dist/services/workspace/reconcile-migrate.d.ts +0 -3
- package/dist/services/workspace/reconcile-migrate.js +0 -5
- package/dist/services/workspace/reconcile-service.d.ts +0 -3
- package/dist/services/workspace/reconcile-service.js +0 -7
- package/dist/services/workspace/reconcile-types.d.ts +0 -5
- package/dist/services/workspace/sid-naming-guard.d.ts +0 -1
- package/dist/services/workspace/sid-naming-guard.js +0 -1
- package/dist/services/workspace/templates/project-scan/index.d.ts +0 -3
- package/dist/services/workspace/templates/project-scan/index.js +0 -3
- package/dist/services/workspace/workspace-claude-settings-materializer.d.ts +0 -1
- package/dist/services/workspace/workspace-claude-settings-materializer.js +0 -4
- package/dist/services/workspace/workspace-service.d.ts +0 -7
- package/dist/services/workspace/workspace-service.js +1 -17
- package/dist/services/worktree/playwright-profile.js +0 -1
- package/dist/services/worktree/worktree-lease-types.d.ts +0 -1
- package/dist/services/worktree/worktree-lease-types.js +0 -1
- package/dist/services/worktree/worktree-lease.d.ts +0 -2
- package/dist/services/worktree/worktree-lease.js +0 -2
- package/dist/shared/format-md-compact.d.ts +0 -2
- package/dist/shared/format-md-compact.js +0 -2
- package/dist/shared/incrementing-number.d.ts +0 -1
- package/dist/shared/incrementing-number.js +0 -1
- package/dist/shared/path-utils.d.ts +0 -1
- package/dist/shared/path-utils.js +0 -1
- package/dist/shared/runtime-root.d.ts +0 -1
- package/dist/shared/runtime-root.js +0 -1
- package/dist/shared/stale-policy.d.ts +0 -1
- package/dist/shared/stale-policy.js +0 -1
- package/package.json +12 -10
- package/scripts/canonical-store-link.mjs +296 -0
- package/scripts/canonical-store-prune.mjs +131 -0
- package/scripts/canonical-store.mjs +298 -0
- package/scripts/install-skills.mjs +175 -560
- package/skills/bee/peaks-qa/references/reading-handoff-frontmatter.md +3 -1
- package/skills/bee/peaks-rd/references/parallel-review-fanout.md +1 -1
- package/skills/bee/peaks-rd/references/rd-fanout-contracts.md +3 -2
- package/skills/bee/peaks-rd/references/writing-handoff-frontmatter.md +29 -7
- package/skills/peaks-audit/SKILL.md +3 -3
- package/skills/peaks-code/references/frontend-only-mode.md +2 -2
- package/skills/peaks-code/references/startup-sequence.md +0 -4
- package/dist/cli/commands/upgrade-commands.d.ts +0 -25
- package/dist/cli/commands/upgrade-commands.js +0 -154
- package/dist/services/codegraph/codegraph-include-reconciler.d.ts +0 -10
- package/dist/services/codegraph/codegraph-include-reconciler.js +0 -160
- package/dist/services/upgrade/1x-detector-service.d.ts +0 -7
- package/dist/services/upgrade/1x-detector-service.js +0 -96
- package/dist/services/upgrade/gitignore-migrate-service.d.ts +0 -56
- package/dist/services/upgrade/gitignore-migrate-service.js +0 -170
- package/dist/services/upgrade/upgrade-service.d.ts +0 -81
- package/dist/services/upgrade/upgrade-service.js +0 -428
- package/skills/peaks-code/references/step-0-55-1x-detection.md +0 -83
|
@@ -9,20 +9,29 @@ import {
|
|
|
9
9
|
mkdirSync,
|
|
10
10
|
openSync,
|
|
11
11
|
readFileSync,
|
|
12
|
-
readlinkSync,
|
|
13
12
|
realpathSync,
|
|
14
13
|
readdirSync,
|
|
15
14
|
renameSync,
|
|
16
|
-
symlinkSync,
|
|
17
15
|
unlinkSync,
|
|
18
16
|
writeFileSync
|
|
19
17
|
} from 'node:fs';
|
|
20
|
-
import {
|
|
21
|
-
import { createHash, randomUUID } from 'node:crypto';
|
|
18
|
+
import { randomUUID } from 'node:crypto';
|
|
22
19
|
import { homedir } from 'node:os';
|
|
23
|
-
import {
|
|
20
|
+
import { dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
24
21
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
25
22
|
|
|
23
|
+
// The canonical store — `~/.peaks/{skills,agents,output-styles}`. Skills are
|
|
24
|
+
// linked to it instead of to `<packageRoot>/skills/<name>`; see the loop in
|
|
25
|
+
// `installBundledSkills` for why the target moved and why repair is now
|
|
26
|
+
// unconditional. `canonical-store-link.mjs` is the same contract for the two
|
|
27
|
+
// families whose entry is a single FILE rather than a tree, and it is where the
|
|
28
|
+
// "the symlink was refused, here is the report" fallback lives. MUST both stay in
|
|
29
|
+
// `package.json#files`: this file IS the npm postinstall, and an unpublished
|
|
30
|
+
// sibling import breaks every user's install.
|
|
31
|
+
import { reconcileCanonicalEntry } from './canonical-store.mjs';
|
|
32
|
+
import { reconcileCanonicalFileEntry } from './canonical-store-link.mjs';
|
|
33
|
+
import { pruneBundledEntries } from './canonical-store-prune.mjs';
|
|
34
|
+
|
|
26
35
|
function getPathStats(path) {
|
|
27
36
|
try {
|
|
28
37
|
return lstatSync(path);
|
|
@@ -31,24 +40,6 @@ function getPathStats(path) {
|
|
|
31
40
|
}
|
|
32
41
|
}
|
|
33
42
|
|
|
34
|
-
function isBrokenSymlink(stats, targetPath) {
|
|
35
|
-
return stats.isSymbolicLink() && !existsSync(targetPath);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function validateManagedMarkerPath(markerPath) {
|
|
39
|
-
const markerStats = getPathStats(markerPath);
|
|
40
|
-
if (!markerStats) return;
|
|
41
|
-
if (markerStats.isSymbolicLink()) {
|
|
42
|
-
throw new Error('Peaks managed marker path must not be a symlink');
|
|
43
|
-
}
|
|
44
|
-
if (!markerStats.isFile()) {
|
|
45
|
-
throw new Error('Peaks managed marker path must be a file');
|
|
46
|
-
}
|
|
47
|
-
if (markerStats.nlink !== 1) {
|
|
48
|
-
throw new Error('Peaks managed marker path must not be hardlinked');
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
43
|
function validateOpenFile(fd, path, errorMessage) {
|
|
53
44
|
const fdStats = fstatSync(fd);
|
|
54
45
|
const pathStats = lstatSync(path);
|
|
@@ -65,26 +56,6 @@ function validateOpenFile(fd, path, errorMessage) {
|
|
|
65
56
|
}
|
|
66
57
|
}
|
|
67
58
|
|
|
68
|
-
function createFileIdentity(path) {
|
|
69
|
-
const stats = lstatSync(path);
|
|
70
|
-
if (!stats.isFile() || stats.isSymbolicLink() || stats.nlink !== 1) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
return { dev: stats.dev, ino: stats.ino };
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function isSameFileIdentity(path, identity) {
|
|
77
|
-
if (identity === null) return false;
|
|
78
|
-
const stats = getPathStats(path);
|
|
79
|
-
return Boolean(
|
|
80
|
-
stats?.isFile() &&
|
|
81
|
-
!stats.isSymbolicLink() &&
|
|
82
|
-
stats.nlink === 1 &&
|
|
83
|
-
stats.dev === identity.dev &&
|
|
84
|
-
stats.ino === identity.ino
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
59
|
function getSafeReadOpenFlags() {
|
|
89
60
|
return typeof constants.O_NOFOLLOW === 'number'
|
|
90
61
|
? constants.O_RDONLY | constants.O_NOFOLLOW
|
|
@@ -101,94 +72,6 @@ function readFileSafely(path, errorMessage) {
|
|
|
101
72
|
}
|
|
102
73
|
}
|
|
103
74
|
|
|
104
|
-
function getManagedTarget(targetPath) {
|
|
105
|
-
const markerPath = `${targetPath}.peaks-managed`;
|
|
106
|
-
validateManagedMarkerPath(markerPath);
|
|
107
|
-
if (!existsSync(markerPath)) {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
return readFileSafely(markerPath, 'Peaks managed marker path changed during read').trim();
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
function markManagedPeaksLink(targetPath, sourcePath) {
|
|
114
|
-
const markerPath = `${targetPath}.peaks-managed`;
|
|
115
|
-
validateManagedMarkerPath(markerPath);
|
|
116
|
-
writeFileAtomically(
|
|
117
|
-
markerPath,
|
|
118
|
-
`${sourcePath}\n`,
|
|
119
|
-
'Peaks managed marker path changed during write',
|
|
120
|
-
() => validateManagedMarkerPath(markerPath)
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
function readPackageSourceFile(path) {
|
|
125
|
-
const stats = lstatSync(path);
|
|
126
|
-
if (!stats.isFile() || stats.isSymbolicLink()) {
|
|
127
|
-
throw new Error('Peaks package source path must be a file');
|
|
128
|
-
}
|
|
129
|
-
return readFileSync(path, 'utf8');
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
function hashContent(content) {
|
|
133
|
-
return createHash('sha256').update(content).digest('hex');
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
function hashFileContent(path) {
|
|
137
|
-
return hashContent(readFileSafely(path, 'Peaks managed file path changed during read'));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function createManagedOutputStyleMarker(sourcePath, outputStyleName) {
|
|
141
|
-
const content = readPackageSourceFile(sourcePath);
|
|
142
|
-
return `${JSON.stringify({ version: 1, kind: 'output-style', outputStyleName, sourcePath, contentSha256: hashContent(content) })}\n`;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
function parseManagedOutputStyleMarker(managedTarget) {
|
|
146
|
-
if (managedTarget === null) return null;
|
|
147
|
-
try {
|
|
148
|
-
const marker = JSON.parse(managedTarget);
|
|
149
|
-
if (
|
|
150
|
-
marker?.version !== 1 ||
|
|
151
|
-
marker?.kind !== 'output-style' ||
|
|
152
|
-
typeof marker.outputStyleName !== 'string' ||
|
|
153
|
-
typeof marker.sourcePath !== 'string' ||
|
|
154
|
-
typeof marker.contentSha256 !== 'string'
|
|
155
|
-
) {
|
|
156
|
-
return null;
|
|
157
|
-
}
|
|
158
|
-
return marker;
|
|
159
|
-
} catch {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function isTrustedOutputStyleSource(marker, sourcePath, outputStyleName) {
|
|
165
|
-
return (
|
|
166
|
-
marker.outputStyleName === outputStyleName &&
|
|
167
|
-
resolve(marker.sourcePath) === resolve(sourcePath) &&
|
|
168
|
-
basename(resolve(marker.sourcePath)) === outputStyleName
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function getManagedPeaksOutputStyleIdentity(
|
|
173
|
-
managedTarget,
|
|
174
|
-
targetPath,
|
|
175
|
-
sourcePath,
|
|
176
|
-
outputStyleName
|
|
177
|
-
) {
|
|
178
|
-
const marker = parseManagedOutputStyleMarker(managedTarget);
|
|
179
|
-
const sourceHash = hashContent(readPackageSourceFile(sourcePath));
|
|
180
|
-
if (
|
|
181
|
-
marker === null ||
|
|
182
|
-
!isTrustedOutputStyleSource(marker, sourcePath, outputStyleName) ||
|
|
183
|
-
!existsSync(targetPath) ||
|
|
184
|
-
hashFileContent(targetPath) !== sourceHash ||
|
|
185
|
-
marker.contentSha256 !== sourceHash
|
|
186
|
-
) {
|
|
187
|
-
return null;
|
|
188
|
-
}
|
|
189
|
-
return createFileIdentity(targetPath);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
75
|
function validateInstallRoot(targetRoot, label) {
|
|
193
76
|
const rootStats = lstatSync(targetRoot);
|
|
194
77
|
if (rootStats.isSymbolicLink()) {
|
|
@@ -211,7 +94,7 @@ function createInstallRootValidator(targetRoot, label) {
|
|
|
211
94
|
}
|
|
212
95
|
|
|
213
96
|
function createInstallResult() {
|
|
214
|
-
return { installed: [], skipped: [] };
|
|
97
|
+
return { installed: [], skipped: [], pruned: [], fallbacks: [] };
|
|
215
98
|
}
|
|
216
99
|
|
|
217
100
|
function resolvePackageRoot(options = {}) {
|
|
@@ -335,39 +218,6 @@ function getSafeTempOpenFlags() {
|
|
|
335
218
|
return typeof constants.O_NOFOLLOW === 'number' ? baseFlags | constants.O_NOFOLLOW : baseFlags;
|
|
336
219
|
}
|
|
337
220
|
|
|
338
|
-
function writeFileExclusively(path, content, errorMessage, validateBeforeWrite) {
|
|
339
|
-
validateBeforeWrite();
|
|
340
|
-
let fd = openSync(path, getSafeTempOpenFlags(), 0o600);
|
|
341
|
-
let closeError = null;
|
|
342
|
-
let identity = null;
|
|
343
|
-
try {
|
|
344
|
-
validateOpenFile(fd, path, errorMessage);
|
|
345
|
-
validateBeforeWrite();
|
|
346
|
-
validateOpenFile(fd, path, errorMessage);
|
|
347
|
-
identity = createFileIdentity(path);
|
|
348
|
-
if (identity === null) {
|
|
349
|
-
throw new Error(errorMessage);
|
|
350
|
-
}
|
|
351
|
-
fchmodSync(fd, 0o600);
|
|
352
|
-
writeFileSync(fd, content, 'utf8');
|
|
353
|
-
const writeFd = fd;
|
|
354
|
-
fd = null;
|
|
355
|
-
closeSync(writeFd);
|
|
356
|
-
return identity;
|
|
357
|
-
} finally {
|
|
358
|
-
if (fd !== null) {
|
|
359
|
-
try {
|
|
360
|
-
closeSync(fd);
|
|
361
|
-
} catch (error) {
|
|
362
|
-
closeError = error;
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
if (closeError) {
|
|
366
|
-
throw closeError;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
|
|
371
221
|
function writeFileAtomically(configPath, content, errorMessage, validateBeforeWrite) {
|
|
372
222
|
validateBeforeWrite();
|
|
373
223
|
|
|
@@ -785,51 +635,43 @@ export function installBundledSkills(options = {}) {
|
|
|
785
635
|
for (const { skillName, sourcePath } of candidates) {
|
|
786
636
|
const targetPath = join(targetRoot, skillName);
|
|
787
637
|
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
// worktree was removed, Windows keeps the Junction entry but its target
|
|
799
|
-
// no longer resolves. Repair only when reconciliation was explicitly
|
|
800
|
-
// requested; normal postinstall keeps its existing ownership behavior.
|
|
801
|
-
if (
|
|
802
|
-
(current.isSymbolicLink() || isBrokenSymlink(current, targetPath)) &&
|
|
803
|
-
(managedTarget === linkTarget ||
|
|
804
|
-
(options.reconcileJunctions === true && managedTarget !== null && !linkTargetExists))
|
|
805
|
-
) {
|
|
806
|
-
validateSkillsRoot();
|
|
807
|
-
unlinkSync(targetPath);
|
|
808
|
-
validateSkillsRoot();
|
|
809
|
-
unlinkSync(`${targetPath}.peaks-managed`);
|
|
810
|
-
} else {
|
|
811
|
-
skipped.push(skillName);
|
|
812
|
-
continue;
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
|
|
638
|
+
// Slice 2 (`agents-canonical-store`) — the entry points at the CANONICAL
|
|
639
|
+
// STORE (`~/.peaks/skills/<name>`), not at `<packageRoot>/skills/<name>`,
|
|
640
|
+
// because `<packageRoot>` changes on every `npm i -g peaks-loop@latest` and
|
|
641
|
+
// the links must bind to a PATH peaks-loop owns, not to a VERSION. Repair is
|
|
642
|
+
// the only behaviour: an entry peaks-loop owns (sidecar matches, or the link
|
|
643
|
+
// dangles) is relinked onto the store; only a real directory the user authored
|
|
644
|
+
// is left alone and reported `skipped`. `options.reconcileJunctions` is
|
|
645
|
+
// therefore READ NOWHERE here — still accepted (`sync-service.ts` forwards it)
|
|
646
|
+
// so passing it changes nothing, and removing it is a CLI-surface change this
|
|
647
|
+
// slice does not own.
|
|
816
648
|
validateSkillsRoot();
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
649
|
+
const reconciled = reconcileCanonicalEntry({
|
|
650
|
+
kind: 'skills',
|
|
651
|
+
name: skillName,
|
|
652
|
+
sourcePath,
|
|
653
|
+
linkPath: targetPath
|
|
654
|
+
});
|
|
655
|
+
validateSkillsRoot();
|
|
656
|
+
|
|
657
|
+
if (reconciled.linkAction === 'skipped') {
|
|
658
|
+
skipped.push(skillName);
|
|
659
|
+
continue;
|
|
828
660
|
}
|
|
829
661
|
installed.push(skillName);
|
|
830
662
|
}
|
|
831
663
|
|
|
832
|
-
|
|
664
|
+
// Slice 3 — PRUNE. The loop above only ever ADDS. A skill removed from the
|
|
665
|
+
// package left its canonical copy, every IDE link and every sidecar on the
|
|
666
|
+
// user's machine forever, because nothing walked the DESTINATIONS. This does,
|
|
667
|
+
// and deletes only what `isManagedEntry` proves is ours.
|
|
668
|
+
const { pruned } = pruneBundledEntries({
|
|
669
|
+
kind: 'skills',
|
|
670
|
+
keepNames: candidates.map((candidate) => candidate.skillName),
|
|
671
|
+
linkDirs: [targetRoot]
|
|
672
|
+
});
|
|
673
|
+
|
|
674
|
+
return { installed, skipped, pruned };
|
|
833
675
|
}
|
|
834
676
|
|
|
835
677
|
/**
|
|
@@ -892,73 +734,55 @@ export function installBundledOutputStyles(options = {}) {
|
|
|
892
734
|
|
|
893
735
|
const installed = [];
|
|
894
736
|
const skipped = [];
|
|
737
|
+
const fallbacks = [];
|
|
895
738
|
mkdirSync(targetRoot, { recursive: true });
|
|
896
739
|
const validateOutputStylesRoot = createInstallRootValidator(targetRoot, 'Peaks output styles');
|
|
897
740
|
|
|
741
|
+
// Slice 4 (`agents-canonical-store`) — same move slice 2 made for skills, with the
|
|
742
|
+
// one difference the brief calls out: a style is a FILE, so the link is a file
|
|
743
|
+
// symlink, which Windows only grants with developer mode or Administrator.
|
|
744
|
+
// `reconcileCanonicalFileEntry` is the whole policy — canonical copy, link, and the
|
|
745
|
+
// reported fallback to a real copy when the host refuses the link. The loop below
|
|
746
|
+
// no longer decides ownership, and that is deliberate: the decision it used to make
|
|
747
|
+
// was `resolve(marker.sourcePath) === resolve(sourcePath)`, a string comparison
|
|
748
|
+
// against a version-scoped package path that went false forever on the first
|
|
749
|
+
// upgrade and silently froze the style.
|
|
750
|
+
const bundledStyleNames = [];
|
|
898
751
|
for (const outputStyleName of readdirSync(outputStylesRoot)) {
|
|
899
752
|
const sourcePath = join(outputStylesRoot, outputStyleName);
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
753
|
+
if (!lstatSync(sourcePath).isFile() || !outputStyleName.endsWith('.md')) continue;
|
|
754
|
+
bundledStyleNames.push(outputStyleName);
|
|
755
|
+
|
|
756
|
+
validateOutputStylesRoot();
|
|
757
|
+
const reconciled = reconcileCanonicalFileEntry({
|
|
758
|
+
kind: 'output-styles',
|
|
759
|
+
name: outputStyleName,
|
|
760
|
+
sourcePath,
|
|
761
|
+
linkPath: join(targetRoot, outputStyleName),
|
|
762
|
+
createFileLink: options.createFileLink
|
|
763
|
+
});
|
|
764
|
+
validateOutputStylesRoot();
|
|
765
|
+
|
|
766
|
+
if (reconciled.linkAction === 'skipped') {
|
|
767
|
+
skipped.push(outputStyleName);
|
|
903
768
|
continue;
|
|
904
769
|
}
|
|
905
|
-
|
|
906
|
-
const current = getPathStats(targetPath);
|
|
907
|
-
if (current) {
|
|
908
|
-
const managedTarget = getManagedTarget(targetPath);
|
|
909
|
-
const managedTargetIdentity = getManagedPeaksOutputStyleIdentity(
|
|
910
|
-
managedTarget,
|
|
911
|
-
targetPath,
|
|
912
|
-
sourcePath,
|
|
913
|
-
outputStyleName
|
|
914
|
-
);
|
|
915
|
-
if (isSameFileIdentity(targetPath, managedTargetIdentity)) {
|
|
916
|
-
validateOutputStylesRoot();
|
|
917
|
-
if (!isSameFileIdentity(targetPath, managedTargetIdentity)) {
|
|
918
|
-
throw new Error('Peaks output style path changed during unlink');
|
|
919
|
-
}
|
|
920
|
-
unlinkSync(targetPath);
|
|
921
|
-
validateOutputStylesRoot();
|
|
922
|
-
unlinkSync(`${targetPath}.peaks-managed`);
|
|
923
|
-
} else {
|
|
924
|
-
skipped.push(outputStyleName);
|
|
925
|
-
continue;
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
|
|
929
|
-
const markerPath = `${targetPath}.peaks-managed`;
|
|
930
|
-
validateManagedMarkerPath(markerPath);
|
|
931
|
-
if (!current && existsSync(markerPath)) {
|
|
932
|
-
validateOutputStylesRoot();
|
|
933
|
-
unlinkSync(markerPath);
|
|
934
|
-
}
|
|
935
|
-
const createdTargetIdentity = writeFileExclusively(
|
|
936
|
-
targetPath,
|
|
937
|
-
readPackageSourceFile(sourcePath),
|
|
938
|
-
'Peaks output style path changed during write',
|
|
939
|
-
validateOutputStylesRoot
|
|
940
|
-
);
|
|
941
|
-
try {
|
|
942
|
-
writeFileExclusively(
|
|
943
|
-
markerPath,
|
|
944
|
-
createManagedOutputStyleMarker(sourcePath, outputStyleName),
|
|
945
|
-
'Peaks managed marker path changed during write',
|
|
946
|
-
() => {
|
|
947
|
-
validateOutputStylesRoot();
|
|
948
|
-
validateManagedMarkerPath(markerPath);
|
|
949
|
-
}
|
|
950
|
-
);
|
|
951
|
-
} catch (error) {
|
|
952
|
-
validateOutputStylesRoot();
|
|
953
|
-
if (isSameFileIdentity(targetPath, createdTargetIdentity)) {
|
|
954
|
-
unlinkSync(targetPath);
|
|
955
|
-
}
|
|
956
|
-
throw error;
|
|
957
|
-
}
|
|
958
770
|
installed.push(outputStyleName);
|
|
771
|
+
if (reconciled.fallback !== null) {
|
|
772
|
+
fallbacks.push({ name: outputStyleName, ...reconciled.fallback });
|
|
773
|
+
}
|
|
959
774
|
}
|
|
960
775
|
|
|
961
|
-
|
|
776
|
+
// The delete half, for the same reason skills have one: the loop above only ever
|
|
777
|
+
// adds. A style removed from the package used to leave its canonical copy, its IDE
|
|
778
|
+
// link and both sidecars behind forever.
|
|
779
|
+
const { pruned } = pruneBundledEntries({
|
|
780
|
+
kind: 'output-styles',
|
|
781
|
+
keepNames: bundledStyleNames,
|
|
782
|
+
linkDirs: [targetRoot]
|
|
783
|
+
});
|
|
784
|
+
|
|
785
|
+
return { installed, skipped, pruned, fallbacks };
|
|
962
786
|
}
|
|
963
787
|
|
|
964
788
|
/**
|
|
@@ -1112,72 +936,26 @@ export function installBundledOutputStyleDefault(options = {}) {
|
|
|
1112
936
|
/**
|
|
1113
937
|
* Slice 7/7 — bundled agents (Claude Code sub-agent prompts).
|
|
1114
938
|
*
|
|
1115
|
-
*
|
|
1116
|
-
*
|
|
1117
|
-
*
|
|
1118
|
-
*
|
|
1119
|
-
*
|
|
939
|
+
* Writes into the IDE's sub-agent loader directory (`~/.claude/agents/` for Claude
|
|
940
|
+
* Code, and whatever `agentsDir` the detected profile declares). The bytes live in
|
|
941
|
+
* the canonical store (`~/.peaks/agents/<name>`) and the IDE entry is a link to it.
|
|
942
|
+
*
|
|
943
|
+
* Ownership policy — ONE predicate, in `canonical-store-link.mjs::isOwnedFileEntry`,
|
|
944
|
+
* and it is deliberately not a string comparison:
|
|
945
|
+
* - entry resolves to the canonical copy → leave it (idempotent run)
|
|
946
|
+
* - entry is a link we wrote (sidecar agrees, dangles) → relink onto the store
|
|
947
|
+
* - entry is a real file with OUR sidecar beside it → re-point it at the store
|
|
948
|
+
* - entry is a real file with a LEGACY sidecar whose
|
|
949
|
+
* recorded package path no longer resolves → same: repair it
|
|
950
|
+
* - entry is a real file we never wrote (no sidecar) → skip (user-authored)
|
|
951
|
+
* - entry is a real file whose sidecar names a path
|
|
952
|
+
* that STILL resolves → skip (a second live install)
|
|
1120
953
|
*
|
|
1121
|
-
*
|
|
1122
|
-
*
|
|
1123
|
-
*
|
|
1124
|
-
*
|
|
1125
|
-
* SHA matches, sourcePath matches → skip (idempotent re-install)
|
|
1126
|
-
* - file present, marker present,
|
|
1127
|
-
* SHA matches, sourcePath differs → skip (stale package path;
|
|
1128
|
-
* preserve user's local file)
|
|
1129
|
-
* - file present, marker present,
|
|
1130
|
-
* SHA differs → overwrite (package upgrade)
|
|
1131
|
-
* - file present, no marker → skip (user-authored file;
|
|
1132
|
-
* preserve)
|
|
954
|
+
* The two "skip" arms above are the ones the old code got wrong in opposite
|
|
955
|
+
* directions: it skipped whenever the package path merely DIFFERED, which froze
|
|
956
|
+
* every entry on the first upgrade, silently and permanently. See
|
|
957
|
+
* `isOwnedFileEntry` for why a vanished package path is proof of an earlier install.
|
|
1133
958
|
*/
|
|
1134
|
-
function createManagedAgentMarker(sourcePath, agentName) {
|
|
1135
|
-
const content = readPackageSourceFile(sourcePath);
|
|
1136
|
-
return `${JSON.stringify({ version: 1, kind: 'agent', agentName, sourcePath, contentSha256: hashContent(content) })}\n`;
|
|
1137
|
-
}
|
|
1138
|
-
|
|
1139
|
-
function parseManagedAgentMarker(managedTarget) {
|
|
1140
|
-
if (managedTarget === null) return null;
|
|
1141
|
-
try {
|
|
1142
|
-
const marker = JSON.parse(managedTarget);
|
|
1143
|
-
if (
|
|
1144
|
-
marker?.version !== 1 ||
|
|
1145
|
-
marker?.kind !== 'agent' ||
|
|
1146
|
-
typeof marker.agentName !== 'string' ||
|
|
1147
|
-
typeof marker.sourcePath !== 'string' ||
|
|
1148
|
-
typeof marker.contentSha256 !== 'string'
|
|
1149
|
-
) {
|
|
1150
|
-
return null;
|
|
1151
|
-
}
|
|
1152
|
-
return marker;
|
|
1153
|
-
} catch {
|
|
1154
|
-
return null;
|
|
1155
|
-
}
|
|
1156
|
-
}
|
|
1157
|
-
|
|
1158
|
-
function isTrustedAgentSource(marker, sourcePath, agentName) {
|
|
1159
|
-
return (
|
|
1160
|
-
marker.agentName === agentName &&
|
|
1161
|
-
resolve(marker.sourcePath) === resolve(sourcePath) &&
|
|
1162
|
-
basename(resolve(marker.sourcePath)) === agentName
|
|
1163
|
-
);
|
|
1164
|
-
}
|
|
1165
|
-
|
|
1166
|
-
function getManagedPeaksAgentIdentity(managedTarget, targetPath, sourcePath, agentName) {
|
|
1167
|
-
const marker = parseManagedAgentMarker(managedTarget);
|
|
1168
|
-
const sourceHash = hashContent(readPackageSourceFile(sourcePath));
|
|
1169
|
-
if (
|
|
1170
|
-
marker === null ||
|
|
1171
|
-
!isTrustedAgentSource(marker, sourcePath, agentName) ||
|
|
1172
|
-
!existsSync(targetPath) ||
|
|
1173
|
-
hashFileContent(targetPath) !== sourceHash ||
|
|
1174
|
-
marker.contentSha256 !== sourceHash
|
|
1175
|
-
) {
|
|
1176
|
-
return null;
|
|
1177
|
-
}
|
|
1178
|
-
return createFileIdentity(targetPath);
|
|
1179
|
-
}
|
|
1180
|
-
|
|
1181
959
|
export function installBundledAgents(options = {}) {
|
|
1182
960
|
const packageRoot = resolvePackageRoot(options);
|
|
1183
961
|
const agentsRoot = join(packageRoot, 'agents');
|
|
@@ -1211,73 +989,82 @@ export function installBundledAgents(options = {}) {
|
|
|
1211
989
|
|
|
1212
990
|
const installed = [];
|
|
1213
991
|
const skipped = [];
|
|
992
|
+
const fallbacks = [];
|
|
1214
993
|
mkdirSync(targetRoot, { recursive: true });
|
|
1215
994
|
const validateAgentsRoot = createInstallRootValidator(targetRoot, 'Peaks agents');
|
|
1216
995
|
|
|
996
|
+
// Slice 4 (`agents-canonical-store`) — the canonical store owns the bytes and the
|
|
997
|
+
// IDE entry points at it. Everything this loop used to decide about ownership is
|
|
998
|
+
// now `reconcileCanonicalFileEntry`'s, and the reason is the defect the brief
|
|
999
|
+
// names as this slice's core: the old test was
|
|
1000
|
+
// `resolve(marker.sourcePath) === resolve(sourcePath)`, a STRING comparison against
|
|
1001
|
+
// the package path of the installing version — a path with a node version inside it
|
|
1002
|
+
// (`…\nvm\v24.21.0\node_modules\peaks-loop\agents\…`). It went false the first time
|
|
1003
|
+
// the package moved and stayed false, so the agent silently never updated again.
|
|
1004
|
+
const bundledAgentNames = [];
|
|
1217
1005
|
for (const agentFileName of readdirSync(agentsRoot)) {
|
|
1218
1006
|
const sourcePath = join(agentsRoot, agentFileName);
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1007
|
+
if (!lstatSync(sourcePath).isFile() || !agentFileName.endsWith('.md')) continue;
|
|
1008
|
+
bundledAgentNames.push(agentFileName);
|
|
1009
|
+
|
|
1010
|
+
validateAgentsRoot();
|
|
1011
|
+
const reconciled = reconcileCanonicalFileEntry({
|
|
1012
|
+
kind: 'agents',
|
|
1013
|
+
name: agentFileName,
|
|
1014
|
+
sourcePath,
|
|
1015
|
+
linkPath: join(targetRoot, agentFileName),
|
|
1016
|
+
createFileLink: options.createFileLink
|
|
1017
|
+
});
|
|
1018
|
+
validateAgentsRoot();
|
|
1019
|
+
|
|
1020
|
+
if (reconciled.linkAction === 'skipped') {
|
|
1021
|
+
skipped.push(agentFileName);
|
|
1222
1022
|
continue;
|
|
1223
1023
|
}
|
|
1224
|
-
|
|
1225
|
-
const current = getPathStats(targetPath);
|
|
1226
|
-
if (current) {
|
|
1227
|
-
const managedTarget = getManagedTarget(targetPath);
|
|
1228
|
-
const managedTargetIdentity = getManagedPeaksAgentIdentity(
|
|
1229
|
-
managedTarget,
|
|
1230
|
-
targetPath,
|
|
1231
|
-
sourcePath,
|
|
1232
|
-
agentFileName
|
|
1233
|
-
);
|
|
1234
|
-
if (isSameFileIdentity(targetPath, managedTargetIdentity)) {
|
|
1235
|
-
validateAgentsRoot();
|
|
1236
|
-
if (!isSameFileIdentity(targetPath, managedTargetIdentity)) {
|
|
1237
|
-
throw new Error('Peaks agent path changed during unlink');
|
|
1238
|
-
}
|
|
1239
|
-
unlinkSync(targetPath);
|
|
1240
|
-
validateAgentsRoot();
|
|
1241
|
-
unlinkSync(`${targetPath}.peaks-managed`);
|
|
1242
|
-
} else {
|
|
1243
|
-
skipped.push(agentFileName);
|
|
1244
|
-
continue;
|
|
1245
|
-
}
|
|
1246
|
-
}
|
|
1247
|
-
|
|
1248
|
-
const markerPath = `${targetPath}.peaks-managed`;
|
|
1249
|
-
validateManagedMarkerPath(markerPath);
|
|
1250
|
-
if (!current && existsSync(markerPath)) {
|
|
1251
|
-
validateAgentsRoot();
|
|
1252
|
-
unlinkSync(markerPath);
|
|
1253
|
-
}
|
|
1254
|
-
const createdTargetIdentity = writeFileExclusively(
|
|
1255
|
-
targetPath,
|
|
1256
|
-
readPackageSourceFile(sourcePath),
|
|
1257
|
-
'Peaks agent path changed during write',
|
|
1258
|
-
validateAgentsRoot
|
|
1259
|
-
);
|
|
1260
|
-
try {
|
|
1261
|
-
writeFileExclusively(
|
|
1262
|
-
markerPath,
|
|
1263
|
-
createManagedAgentMarker(sourcePath, agentFileName),
|
|
1264
|
-
'Peaks managed marker path changed during write',
|
|
1265
|
-
() => {
|
|
1266
|
-
validateAgentsRoot();
|
|
1267
|
-
validateManagedMarkerPath(markerPath);
|
|
1268
|
-
}
|
|
1269
|
-
);
|
|
1270
|
-
} catch (error) {
|
|
1271
|
-
validateAgentsRoot();
|
|
1272
|
-
if (isSameFileIdentity(targetPath, createdTargetIdentity)) {
|
|
1273
|
-
unlinkSync(targetPath);
|
|
1274
|
-
}
|
|
1275
|
-
throw error;
|
|
1276
|
-
}
|
|
1277
1024
|
installed.push(agentFileName);
|
|
1025
|
+
if (reconciled.fallback !== null) {
|
|
1026
|
+
fallbacks.push({ name: agentFileName, ...reconciled.fallback });
|
|
1027
|
+
}
|
|
1278
1028
|
}
|
|
1279
1029
|
|
|
1280
|
-
|
|
1030
|
+
// The delete half: an agent the package stops shipping used to leave its canonical
|
|
1031
|
+
// copy, its IDE entry and both sidecars on the machine forever.
|
|
1032
|
+
const { pruned } = pruneBundledEntries({
|
|
1033
|
+
kind: 'agents',
|
|
1034
|
+
keepNames: bundledAgentNames,
|
|
1035
|
+
linkDirs: [targetRoot]
|
|
1036
|
+
});
|
|
1037
|
+
|
|
1038
|
+
return { installed, skipped, pruned, fallbacks };
|
|
1039
|
+
}
|
|
1040
|
+
|
|
1041
|
+
/**
|
|
1042
|
+
* A fallback is not a failure — but it must never LOOK like a plain success. The
|
|
1043
|
+
* entry is a real copy instead of a link, and the postinstall says so, naming each
|
|
1044
|
+
* one. Silence here would be the same shape as the defect this slice fixes: an
|
|
1045
|
+
* outcome nobody can observe from the outside.
|
|
1046
|
+
*/
|
|
1047
|
+
function reportCopyFallbacks(label, fallbacks) {
|
|
1048
|
+
if (fallbacks.length === 0) return;
|
|
1049
|
+
process.stderr.write(
|
|
1050
|
+
`Peaks ${label}: ${fallbacks.map((entry) => entry.name).join(', ')} ` +
|
|
1051
|
+
'installed as REAL COPIES because this host refused a symlink ' +
|
|
1052
|
+
`(${fallbacks[0].code ?? 'no code returned'})\n`
|
|
1053
|
+
);
|
|
1054
|
+
}
|
|
1055
|
+
|
|
1056
|
+
/**
|
|
1057
|
+
* The other half of the same rule, for the other bucket. A `skipped` entry means the
|
|
1058
|
+
* canonical copy WAS written and the IDE entry was NOT — a half migration. Whatever the
|
|
1059
|
+
* cause (a file the user authored, or an entry whose sidecar names a second live
|
|
1060
|
+
* installation), it must not be invisible: the whole defect this slice fixes was an
|
|
1061
|
+
* outcome nobody could observe from outside.
|
|
1062
|
+
*/
|
|
1063
|
+
function reportLeftAlone(label, skipped) {
|
|
1064
|
+
if (skipped.length === 0) return;
|
|
1065
|
+
process.stderr.write(
|
|
1066
|
+
`Peaks ${label}: left alone, not peaks-loop's to replace: ${skipped.join(', ')}\n`
|
|
1067
|
+
);
|
|
1281
1068
|
}
|
|
1282
1069
|
|
|
1283
1070
|
/**
|
|
@@ -1321,11 +1108,14 @@ export function installBundledAgentsForAllPlatforms(options = {}) {
|
|
|
1321
1108
|
? { ...options, ideId, targetRoot: options.targetRoot }
|
|
1322
1109
|
: { ...options, ideId };
|
|
1323
1110
|
const result = installBundledAgents(platformOpts);
|
|
1111
|
+
reportCopyFallbacks(`agents in ${profile.agentsDir}`, result.fallbacks);
|
|
1112
|
+
reportLeftAlone(`agents in ${profile.agentsDir}`, result.skipped);
|
|
1324
1113
|
perPlatform.push({
|
|
1325
1114
|
ideId,
|
|
1326
1115
|
agentsDir: profile.agentsDir,
|
|
1327
1116
|
installed: result.installed,
|
|
1328
|
-
skipped: result.skipped
|
|
1117
|
+
skipped: result.skipped,
|
|
1118
|
+
fallbacks: result.fallbacks
|
|
1329
1119
|
});
|
|
1330
1120
|
} catch (err) {
|
|
1331
1121
|
const message = err instanceof Error ? err.message : String(err);
|
|
@@ -1409,162 +1199,6 @@ export function installBundledSkillsForAllPlatforms(options = {}) {
|
|
|
1409
1199
|
return perPlatform;
|
|
1410
1200
|
}
|
|
1411
1201
|
|
|
1412
|
-
/**
|
|
1413
|
-
* 1.x → 2.0 detection — sniff for legacy 1.x project state
|
|
1414
|
-
* in `cwd`. Returns a 1.x detection envelope with the
|
|
1415
|
-
* detected signals (so the postinstall can decide whether
|
|
1416
|
-
* to auto-upgrade).
|
|
1417
|
-
*
|
|
1418
|
-
* 1.x signals (any one fires the detection):
|
|
1419
|
-
* - `~/.peaks/config.json` exists with `version: '1.4.2'` (or
|
|
1420
|
-
* any '1.x' version that predates the 2.0 schema)
|
|
1421
|
-
* - `.claude/rules/common/dev-preference.md` exists and
|
|
1422
|
-
* references "peaks progress" (the 1.x CLI surface
|
|
1423
|
-
* removed in slice #014)
|
|
1424
|
-
* - `<cwd>/.peaks/preferences.json` missing OR has no
|
|
1425
|
-
* `schema_version: '2.0.0'` field
|
|
1426
|
-
*
|
|
1427
|
-
* Returns:
|
|
1428
|
-
* { isOneX: boolean, signals: string[], projectRoot: string|null,
|
|
1429
|
-
* configPath: string|null }
|
|
1430
|
-
*/
|
|
1431
|
-
export function detect1xProjectState(cwd = process.cwd()) {
|
|
1432
|
-
const home = homedir();
|
|
1433
|
-
const signals = [];
|
|
1434
|
-
let projectRoot = null;
|
|
1435
|
-
let configPath = null;
|
|
1436
|
-
|
|
1437
|
-
// Walk up from cwd looking for .peaks/_runtime (signals
|
|
1438
|
-
// we're inside a peaks project).
|
|
1439
|
-
let dir = cwd;
|
|
1440
|
-
for (let i = 0; i < 8; i += 1) {
|
|
1441
|
-
const peaksRuntime = join(dir, '.peaks', '_runtime');
|
|
1442
|
-
if (existsSync(peaksRuntime)) {
|
|
1443
|
-
projectRoot = dir;
|
|
1444
|
-
break;
|
|
1445
|
-
}
|
|
1446
|
-
const parent = dirname(dir);
|
|
1447
|
-
if (parent === dir) break;
|
|
1448
|
-
dir = parent;
|
|
1449
|
-
}
|
|
1450
|
-
|
|
1451
|
-
// Signal 1: ~/.peaks/config.json with 1.x version
|
|
1452
|
-
const globalConfig = join(home, '.peaks', 'config.json');
|
|
1453
|
-
if (existsSync(globalConfig)) {
|
|
1454
|
-
try {
|
|
1455
|
-
const raw = JSON.parse(readFileSync(globalConfig, 'utf8'));
|
|
1456
|
-
if (typeof raw.version === 'string' && /^1\./.test(raw.version)) {
|
|
1457
|
-
signals.push(`global config at ${globalConfig} is 1.x (${raw.version})`);
|
|
1458
|
-
if (configPath === null) configPath = globalConfig;
|
|
1459
|
-
}
|
|
1460
|
-
} catch {
|
|
1461
|
-
// ignore parse error — the 1.x detection is best-effort
|
|
1462
|
-
}
|
|
1463
|
-
}
|
|
1464
|
-
|
|
1465
|
-
// Signal 2: .claude/rules/common/dev-preference.md with peaks progress
|
|
1466
|
-
if (projectRoot !== null) {
|
|
1467
|
-
const devPref = join(projectRoot, '.claude', 'rules', 'common', 'dev-preference.md');
|
|
1468
|
-
if (existsSync(devPref)) {
|
|
1469
|
-
try {
|
|
1470
|
-
const body = readFileSync(devPref, 'utf8');
|
|
1471
|
-
if (/peaks progress/i.test(body)) {
|
|
1472
|
-
signals.push(
|
|
1473
|
-
`${devPref} references "peaks progress" (1.x CLI surface, removed in slice #014)`
|
|
1474
|
-
);
|
|
1475
|
-
}
|
|
1476
|
-
} catch {
|
|
1477
|
-
// ignore
|
|
1478
|
-
}
|
|
1479
|
-
}
|
|
1480
|
-
// Signal 3: project preferences.json missing or 1.x
|
|
1481
|
-
const prefs = join(projectRoot, '.peaks', 'preferences.json');
|
|
1482
|
-
if (!existsSync(prefs)) {
|
|
1483
|
-
signals.push(`${prefs} does not exist (1.x project never migrated)`);
|
|
1484
|
-
} else {
|
|
1485
|
-
try {
|
|
1486
|
-
const raw = JSON.parse(readFileSync(prefs, 'utf8'));
|
|
1487
|
-
if (raw.schema_version !== '2.0.0') {
|
|
1488
|
-
signals.push(
|
|
1489
|
-
`${prefs} has schema_version ${JSON.stringify(raw.schema_version)}, expected '2.0.0'`
|
|
1490
|
-
);
|
|
1491
|
-
}
|
|
1492
|
-
} catch {
|
|
1493
|
-
signals.push(`${prefs} exists but is not valid JSON`);
|
|
1494
|
-
}
|
|
1495
|
-
}
|
|
1496
|
-
}
|
|
1497
|
-
|
|
1498
|
-
return {
|
|
1499
|
-
isOneX: signals.length > 0,
|
|
1500
|
-
signals,
|
|
1501
|
-
projectRoot,
|
|
1502
|
-
configPath
|
|
1503
|
-
};
|
|
1504
|
-
}
|
|
1505
|
-
|
|
1506
|
-
/**
|
|
1507
|
-
* Postinstall auto-upgrade — when the user just ran
|
|
1508
|
-
* `npm i -g peaks-loop@2.0` and `cwd` is a 1.x peaks-loop
|
|
1509
|
-
* project, this shells out to the installed `peaks`
|
|
1510
|
-
* binary to run the umbrella `peaks upgrade --to 2.0 --auto`.
|
|
1511
|
-
*
|
|
1512
|
-
* Per the "minimal-user-operation" tenet, the user should
|
|
1513
|
-
* never have to run a second command after `npm i -g`. The
|
|
1514
|
-
* upgrade CLI (if installed) is at the resolved `peaks`
|
|
1515
|
-
* binary path; if not, the user gets a hint to run it
|
|
1516
|
-
* manually.
|
|
1517
|
-
*
|
|
1518
|
-
* The auto-upgrade is opt-out via:
|
|
1519
|
-
* PEAKS_SKIP_AUTO_UPGRADE=1
|
|
1520
|
-
* (so a CI box that installs 2.0 but never wants the
|
|
1521
|
-
* project-level migration can suppress the auto-step).
|
|
1522
|
-
*/
|
|
1523
|
-
export async function autoUpgrade1xProjectIfPresent(options = {}) {
|
|
1524
|
-
if (process.env.PEAKS_SKIP_AUTO_UPGRADE === '1') {
|
|
1525
|
-
return { ran: false, reason: 'PEAKS_SKIP_AUTO_UPGRADE=1' };
|
|
1526
|
-
}
|
|
1527
|
-
const state = detect1xProjectState(options.cwd ?? process.cwd());
|
|
1528
|
-
if (!state.isOneX) {
|
|
1529
|
-
return { ran: false, reason: 'no 1.x project state detected' };
|
|
1530
|
-
}
|
|
1531
|
-
if (state.projectRoot === null) {
|
|
1532
|
-
return { ran: false, reason: 'cwd is not a peaks project (no .peaks/_runtime/)' };
|
|
1533
|
-
}
|
|
1534
|
-
// The peaks binary should be on PATH after `npm i -g`.
|
|
1535
|
-
// We shell out via spawnSync (synchronous; the postinstall
|
|
1536
|
-
// is already synchronous and the umbrella is fast).
|
|
1537
|
-
try {
|
|
1538
|
-
const result = spawnSync(
|
|
1539
|
-
'peaks',
|
|
1540
|
-
['upgrade', '--to', '2.0', '--auto', '--project', state.projectRoot],
|
|
1541
|
-
{
|
|
1542
|
-
encoding: 'utf8',
|
|
1543
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
1544
|
-
timeout: 120_000,
|
|
1545
|
-
windowsHide: true
|
|
1546
|
-
}
|
|
1547
|
-
);
|
|
1548
|
-
return {
|
|
1549
|
-
ran: true,
|
|
1550
|
-
reason: 'auto-upgrade dispatched',
|
|
1551
|
-
signals: state.signals,
|
|
1552
|
-
projectRoot: state.projectRoot,
|
|
1553
|
-
exitCode: result.status,
|
|
1554
|
-
stdout: result.stdout ?? '',
|
|
1555
|
-
stderr: result.stderr ?? ''
|
|
1556
|
-
};
|
|
1557
|
-
} catch (err) {
|
|
1558
|
-
return {
|
|
1559
|
-
ran: true,
|
|
1560
|
-
reason: 'auto-upgrade dispatched but failed',
|
|
1561
|
-
signals: state.signals,
|
|
1562
|
-
projectRoot: state.projectRoot,
|
|
1563
|
-
error: err instanceof Error ? err.message : String(err)
|
|
1564
|
-
};
|
|
1565
|
-
}
|
|
1566
|
-
}
|
|
1567
|
-
|
|
1568
1202
|
if (
|
|
1569
1203
|
process.argv[1] !== undefined &&
|
|
1570
1204
|
import.meta.url === pathToFileURL(resolve(process.argv[1])).href
|
|
@@ -1622,6 +1256,7 @@ if (
|
|
|
1622
1256
|
`Peaks output styles skipped because local files already exist: ${outputStylesResult.skipped.join(', ')}\n`
|
|
1623
1257
|
);
|
|
1624
1258
|
}
|
|
1259
|
+
reportCopyFallbacks('output styles', outputStylesResult.fallbacks);
|
|
1625
1260
|
|
|
1626
1261
|
// Slice 2026-08-02 — auto-register bundled output style.
|
|
1627
1262
|
//
|
|
@@ -1661,26 +1296,6 @@ if (
|
|
|
1661
1296
|
if (userConfigResult.created) {
|
|
1662
1297
|
process.stdout.write('Peaks user config created: ~/.peaks/config.json\n');
|
|
1663
1298
|
}
|
|
1664
|
-
|
|
1665
|
-
// 2.0 postinstall: auto-detect 1.x project state in cwd
|
|
1666
|
-
// and dispatch the upgrade umbrella. This makes the
|
|
1667
|
-
// user's `npm i -g peaks-loop@2.0` truly one-key.
|
|
1668
|
-
if (process.env.PEAKS_SKIP_AUTO_UPGRADE !== '1') {
|
|
1669
|
-
// Fire-and-forget; the upgrade is async by design so
|
|
1670
|
-
// the npm install output isn't blocked. We print a
|
|
1671
|
-
// one-line hint so the user knows the auto-step
|
|
1672
|
-
// happened.
|
|
1673
|
-
autoUpgrade1xProjectIfPresent().then((result) => {
|
|
1674
|
-
if (result.ran) {
|
|
1675
|
-
process.stdout.write(
|
|
1676
|
-
`\n✓ Detected 1.x peaks-loop project at ${result.projectRoot}\n` +
|
|
1677
|
-
` → auto-upgraded to 2.0 (${result.signals?.length ?? 0} signals resolved)\n` +
|
|
1678
|
-
` Run \`peaks audit red-lines --project .\` to verify.\n`
|
|
1679
|
-
);
|
|
1680
|
-
}
|
|
1681
|
-
// When !result.ran we say nothing — silent on success.
|
|
1682
|
-
});
|
|
1683
|
-
}
|
|
1684
1299
|
if (userConfigResult.updated) {
|
|
1685
1300
|
process.stdout.write('Peaks user config updated: ~/.peaks/config.json\n');
|
|
1686
1301
|
}
|