peaks-loop 4.0.0-beta.9 → 4.0.3
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 +572 -234
- package/README-en.md +67 -30
- package/README.md +67 -30
- package/agents/karpathy-reviewer.md +33 -0
- package/bin/peaks.js +0 -0
- package/dist/cli/cli-helpers.d.ts +31 -6
- package/dist/cli/cli-helpers.js +48 -25
- package/dist/cli/commands/_register.d.ts +3 -0
- package/dist/cli/commands/_register.js +139 -0
- package/dist/cli/commands/_super.d.ts +10 -0
- package/dist/cli/commands/_super.js +97 -0
- package/dist/cli/commands/adapter-commands-s2a.js +1 -1
- package/dist/cli/commands/asset-commands.js +33 -16
- package/dist/cli/commands/audit-commands.js +2 -2
- package/dist/cli/commands/autonomous-swarm-commands.d.ts +12 -0
- package/dist/cli/commands/autonomous-swarm-commands.js +120 -0
- package/dist/cli/commands/bee-commands.js +1 -1
- package/dist/cli/commands/capability-commands.js +1 -1
- package/dist/cli/commands/capability-worker-config-sc-commands.js +0 -2
- package/dist/cli/commands/changeset-commands.d.ts +13 -0
- package/dist/cli/commands/changeset-commands.js +46 -0
- package/dist/cli/commands/code-commands.d.ts +11 -1
- package/dist/cli/commands/code-commands.js +19 -699
- package/dist/cli/commands/code-job-shape-commands.d.ts +9 -0
- package/dist/cli/commands/code-job-shape-commands.js +164 -0
- package/dist/cli/commands/code-mode-gate-commands.d.ts +9 -0
- package/dist/cli/commands/code-mode-gate-commands.js +223 -0
- package/dist/cli/commands/code-review-commands.js +2 -2
- package/dist/cli/commands/code-run-command.d.ts +12 -0
- package/dist/cli/commands/code-run-command.js +68 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +11 -0
- package/dist/cli/commands/code-runtime-commands.js +391 -0
- package/dist/cli/commands/codegraph-commands.js +1 -1
- package/dist/cli/commands/compact-command.js +53 -1
- package/dist/cli/commands/complexity-commands.js +1 -1
- package/dist/cli/commands/config-commands.js +4 -75
- package/dist/cli/commands/container-commands.d.ts +28 -0
- package/dist/cli/commands/container-commands.js +221 -0
- package/dist/cli/commands/context-commands.js +3 -2
- package/dist/cli/commands/core/artifacts-command.js +1 -1
- package/dist/cli/commands/core/binding-commands.js +1 -1
- package/dist/cli/commands/core/doctor-command.js +63 -3
- package/dist/cli/commands/core/memory-command.js +1 -1
- package/dist/cli/commands/core/profile-command.js +1 -1
- package/dist/cli/commands/core/proxy-command.js +1 -1
- package/dist/cli/commands/core/session-command.js +9 -7
- package/dist/cli/commands/core/skill-command.js +7 -4
- package/dist/cli/commands/core/standards-command.js +1 -1
- package/dist/cli/commands/cron-commands.d.ts +57 -0
- package/dist/cli/commands/cron-commands.js +257 -0
- package/dist/cli/commands/cron-scheduler-commands.d.ts +47 -0
- package/dist/cli/commands/cron-scheduler-commands.js +284 -0
- package/dist/cli/commands/dashboard-commands.d.ts +4 -0
- package/dist/cli/commands/dashboard-commands.js +10 -0
- package/dist/cli/commands/dashboard-long-run.d.ts +25 -0
- package/dist/cli/commands/dashboard-long-run.js +122 -0
- package/dist/cli/commands/dashboard-summary.d.ts +12 -0
- package/dist/cli/commands/dashboard-summary.js +58 -0
- package/dist/cli/commands/dispatch-commands.d.ts +0 -7
- package/dist/cli/commands/dispatch-commands.js +372 -8
- package/dist/cli/commands/dispatch-from-dag.js +4 -1
- package/dist/cli/commands/doc-commands.js +1 -1
- package/dist/cli/commands/ecc-commands.d.ts +30 -0
- package/dist/cli/commands/ecc-commands.js +119 -0
- package/dist/cli/commands/evolution-commands.js +1 -1
- package/dist/cli/commands/feedback-commands.js +1 -1
- package/dist/cli/commands/final-review-commands.js +1 -1
- package/dist/cli/commands/fixture-commands.js +1 -1
- package/dist/cli/commands/fork-commands.js +1 -1
- package/dist/cli/commands/gate-commands.js +128 -6
- package/dist/cli/commands/governance-classify-contract-commands.d.ts +21 -0
- package/dist/cli/commands/governance-classify-contract-commands.js +273 -0
- package/dist/cli/commands/heartbeat-commands.js +76 -5
- package/dist/cli/commands/heartbeat-watch-command.d.ts +31 -0
- package/dist/cli/commands/heartbeat-watch-command.js +146 -0
- package/dist/cli/commands/hook-handle.js +1 -1
- package/dist/cli/commands/hooks-commands.js +126 -10
- package/dist/cli/commands/ide-commands.js +1 -1
- package/dist/cli/commands/impact-commands.js +1 -1
- package/dist/cli/commands/job-commands.js +34 -1
- package/dist/cli/commands/lease-metrics-commands.d.ts +67 -0
- package/dist/cli/commands/lease-metrics-commands.js +231 -0
- package/dist/cli/commands/lease-stats-commands.d.ts +65 -0
- package/dist/cli/commands/lease-stats-commands.js +107 -0
- package/dist/cli/commands/legacy-commands.js +1 -1
- package/dist/cli/commands/log-commands.js +1 -1
- package/dist/cli/commands/loop-commands.js +1 -1
- package/dist/cli/commands/loop-eval-commands.js +1 -1
- package/dist/cli/commands/memory-commands.js +1 -1
- package/dist/cli/commands/migrate-1-4-1-command.js +1 -1
- package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +1 -1
- package/dist/cli/commands/mut-commands.d.ts +1 -1
- package/dist/cli/commands/mut-commands.js +1 -5
- package/dist/cli/commands/observability-commands.js +1 -1
- package/dist/cli/commands/openspec-commands.js +65 -4
- package/dist/cli/commands/perf-audit-commands.js +3 -3
- package/dist/cli/commands/perf-commands.js +1 -1
- package/dist/cli/commands/polyrepo-commands.js +1 -1
- package/dist/cli/commands/prd-blocks-commands.js +1 -1
- package/dist/cli/commands/prd-commands.js +4 -2
- package/dist/cli/commands/preferences-commands.js +23 -3
- package/dist/cli/commands/project-commands.js +1 -1
- package/dist/cli/commands/qa-business-review-commands.js +1 -1
- package/dist/cli/commands/qa-commands.d.ts +1 -1
- package/dist/cli/commands/qa-commands.js +39 -3
- package/dist/cli/commands/release-commands.d.ts +15 -0
- package/dist/cli/commands/release-commands.js +113 -21
- package/dist/cli/commands/request-commands.js +1 -1
- package/dist/cli/commands/retrospective-commands.js +1 -1
- package/dist/cli/commands/reviewer-commands.js +1 -1
- package/dist/cli/commands/role-commands.js +1 -1
- package/dist/cli/commands/runtime-commands-helpers.d.ts +7 -0
- package/dist/cli/commands/runtime-commands-helpers.js +24 -0
- package/dist/cli/commands/runtime-commands.js +1 -2
- package/dist/cli/commands/sc-commands.js +4 -2
- package/dist/cli/commands/scan-commands.js +1 -1
- package/dist/cli/commands/security-audit-commands.js +3 -3
- package/dist/cli/commands/sediment-commands.js +10 -1
- package/dist/cli/commands/session-24h-mode.d.ts +26 -0
- package/dist/cli/commands/session-24h-mode.js +196 -0
- package/dist/cli/commands/share-commands.d.ts +19 -0
- package/dist/cli/commands/share-commands.js +121 -2
- package/dist/cli/commands/skill-conformance-commands.js +1 -1
- package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +1 -1
- package/dist/cli/commands/skill-search-commands.js +4 -1
- package/dist/cli/commands/slice-commands.js +1 -1
- package/dist/cli/commands/slice-integrate-commands.js +1 -1
- package/dist/cli/commands/slice-review-commands.js +1 -1
- package/dist/cli/commands/smoke-commands.js +1 -1
- package/dist/cli/commands/sop-commands.js +1 -1
- package/dist/cli/commands/spill-demo-command.d.ts +7 -0
- package/dist/cli/commands/spill-demo-command.js +29 -0
- package/dist/cli/commands/statusline-commands.d.ts +12 -0
- package/dist/cli/commands/statusline-commands.js +79 -17
- package/dist/cli/commands/sub-agent-commands.js +2 -1
- package/dist/cli/commands/sub-agent-shared.d.ts +10 -0
- package/dist/cli/commands/sub-agent-shared.js +24 -1
- package/dist/cli/commands/swarm-commands.d.ts +13 -0
- package/dist/cli/commands/swarm-commands.js +77 -0
- package/dist/cli/commands/tech-commands.d.ts +64 -0
- package/dist/cli/commands/tech-commands.js +195 -0
- package/dist/cli/commands/understand-commands.js +1 -1
- package/dist/cli/commands/upgrade-commands.d.ts +2 -0
- package/dist/cli/commands/upgrade-commands.js +40 -5
- package/dist/cli/commands/user-touchpoint-commands.js +1 -1
- package/dist/cli/commands/verdict-aggregate-command.js +1 -1
- package/dist/cli/commands/vm-commands.d.ts +31 -0
- package/dist/cli/commands/vm-commands.js +274 -0
- package/dist/cli/commands/workflow-commands.js +24 -1
- package/dist/cli/commands/workflow-plan-commands.js +1 -1
- package/dist/cli/commands/workspace/init-command.js +1 -1
- package/dist/cli/commands/workspace/migrate-command.js +1 -1
- package/dist/cli/commands/workspace/reconcile-command.js +1 -1
- package/dist/cli/commands/worktree-auth-commands.d.ts +29 -0
- package/dist/cli/commands/worktree-auth-commands.js +652 -0
- package/dist/cli/index.js +58 -13
- package/dist/cli/program.d.ts +2 -2
- package/dist/cli/program.js +86 -281
- package/dist/services/24h-mode/decider.d.ts +103 -0
- package/dist/services/24h-mode/decider.js +144 -0
- package/dist/services/24h-mode/index.d.ts +12 -0
- package/dist/services/24h-mode/index.js +12 -0
- package/dist/services/24h-mode/state.d.ts +48 -0
- package/dist/services/24h-mode/state.js +51 -0
- package/dist/services/24h-mode/store.d.ts +27 -0
- package/dist/services/24h-mode/store.js +119 -0
- package/dist/services/artifacts/artifact-prerequisites.js +1 -1
- package/dist/services/artifacts/request-artifact-service.js +1 -1
- package/dist/services/artifacts/workspace-service.js +1 -1
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-bee-runtime-contract.js +91 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-peaks-code-runtime.js +31 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.d.ts +23 -0
- package/dist/services/audit/enforcers/lint-peaks-skill-runtime.js +59 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.d.ts +28 -0
- package/dist/services/audit/enforcers/lint-peaks-ui-sc-txt-runtime.js +86 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-prd-artifact-handoff.js +41 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.d.ts +27 -0
- package/dist/services/audit/enforcers/lint-prd-source-snapshot.js +47 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.d.ts +19 -0
- package/dist/services/audit/enforcers/lint-qa-gateguard-and-runtime.js +47 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.d.ts +18 -0
- package/dist/services/audit/enforcers/lint-rd-handoff-coverage.js +70 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.d.ts +25 -0
- package/dist/services/audit/enforcers/lint-skill-presence-mandatory.js +53 -0
- package/dist/services/audit/red-line-catalog-p2-a.d.ts +0 -6
- package/dist/services/audit/red-line-catalog-p2-a.js +230 -1
- package/dist/services/audit/static-service.d.ts +32 -25
- package/dist/services/audit/static-service.js +30 -109
- package/dist/services/audit-independent/index.d.ts +2 -0
- package/dist/services/audit-independent/index.js +2 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.d.ts +127 -0
- package/dist/services/autonomous-swarm/autonomous-swarm-service.js +446 -0
- package/dist/services/changeset/changeset-check-service.d.ts +22 -0
- package/dist/services/changeset/changeset-check-service.js +47 -0
- package/dist/services/code/auto-compact-modes.d.ts +30 -0
- package/dist/services/code/auto-compact-modes.js +38 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +43 -5
- package/dist/services/code/auto-compact-orchestrator.js +101 -21
- package/dist/services/code/dag-orchestrator.d.ts +30 -1
- package/dist/services/code/dag-orchestrator.js +106 -1
- package/dist/services/code/status-line-renderer.d.ts +2 -0
- package/dist/services/code/status-line-renderer.js +21 -3
- package/dist/services/code-review/ocr-service.d.ts +1 -1
- package/dist/services/code-review/ocr-service.js +6 -3
- package/dist/services/compact-history/compact-history-service.d.ts +41 -0
- package/dist/services/compact-history/compact-history-service.js +62 -0
- package/dist/services/compact-statusline/compact-statusline-service.d.ts +16 -0
- package/dist/services/compact-statusline/compact-statusline-service.js +83 -0
- package/dist/services/config/config-service.d.ts +1 -12
- package/dist/services/config/config-service.js +3 -72
- package/dist/services/config/config-types.d.ts +2 -4
- package/dist/services/config/config-types.js +1 -1
- package/dist/services/container/container-lease.d.ts +67 -0
- package/dist/services/container/container-lease.js +135 -0
- package/dist/services/context/auto-compact-dispatcher.d.ts +40 -5
- package/dist/services/context/auto-compact-dispatcher.js +32 -102
- package/dist/services/context/auto-compact-reader.js +1 -1
- package/dist/services/context/auto-compact-types.d.ts +27 -2
- package/dist/services/context/auto-compact-types.js +8 -1
- package/dist/services/context/build-dispatch-system-prompt.d.ts +75 -0
- package/dist/services/context/build-dispatch-system-prompt.js +117 -0
- package/dist/services/context/collector.d.ts +2 -2
- package/dist/services/context/context-builder.d.ts +4 -4
- package/dist/services/context/context-schema.d.ts +48 -48
- package/dist/services/context/ide-detect.d.ts +4 -0
- package/dist/services/context/ide-detect.js +24 -0
- package/dist/services/context/main-session-monitor.d.ts +1 -4
- package/dist/services/context/main-session-monitor.js +1 -24
- package/dist/services/context/memory-index-reader.d.ts +8 -0
- package/dist/services/context/memory-index-reader.js +57 -0
- package/dist/services/context/memory-lru-cache.d.ts +12 -0
- package/dist/services/context/memory-lru-cache.js +60 -0
- package/dist/services/context/memory-preflight-config.d.ts +19 -0
- package/dist/services/context/memory-preflight-config.js +25 -0
- package/dist/services/context/memory-preflight-service.d.ts +19 -0
- package/dist/services/context/memory-preflight-service.js +120 -0
- package/dist/services/context/spillover-store.d.ts +23 -0
- package/dist/services/context/spillover-store.js +155 -0
- package/dist/services/context/spillover-types.d.ts +18 -0
- package/dist/services/context/spillover-types.js +1 -0
- package/dist/services/crystallization/crystallization-service.d.ts +22 -5
- package/dist/services/crystallization/crystallization-service.js +8 -14
- package/dist/services/crystallization/crystallization-types.d.ts +6 -6
- package/dist/services/crystallization/evidence-brief-builder.d.ts +1 -1
- package/dist/services/crystallization/index.d.ts +13 -0
- package/dist/services/crystallization/index.js +13 -0
- package/dist/services/dashboard/project-dashboard-service.js +2 -2
- package/dist/services/dispatch/await-batch.d.ts +70 -0
- package/dist/services/dispatch/await-batch.js +272 -0
- package/dist/services/dispatch/batch-counter.js +1 -1
- package/dist/services/dispatch/dispatch-record-writer.d.ts +126 -4
- package/dist/services/dispatch/dispatch-record-writer.js +239 -9
- package/dist/services/dispatch/slice-dag.d.ts +46 -0
- package/dist/services/dispatch/slice-dag.js +6 -0
- package/dist/services/dispatch/stage-enum.d.ts +27 -0
- package/dist/services/dispatch/stage-enum.js +48 -0
- package/dist/services/dispatch/startup-timeout.d.ts +86 -0
- package/dist/services/dispatch/startup-timeout.js +97 -0
- package/dist/services/dispatch/sub-agent-dispatcher.js +40 -89
- package/dist/services/dispatch/test-tool-detection.d.ts +25 -1
- package/dist/services/dispatch/test-tool-detection.js +80 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.d.ts +18 -0
- package/dist/services/doctor/doctor-service/checks/check-id-schema.js +64 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/codegraph-capability.js +69 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.d.ts +32 -0
- package/dist/services/doctor/doctor-service/checks/dist-source-version.js +110 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.d.ts +24 -0
- package/dist/services/doctor/doctor-service/checks/gateguard-conflict.js +164 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/l3-memory-health.js +57 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.d.ts +19 -0
- package/dist/services/doctor/doctor-service/checks/l3-orphan-sessions.js +66 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/schema-validity.js +33 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.d.ts +20 -0
- package/dist/services/doctor/doctor-service/checks/skill-apply-note.js +85 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/skill-existence.js +30 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-name-match.js +25 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.d.ts +10 -0
- package/dist/services/doctor/doctor-service/checks/skill-parse.js +19 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.d.ts +21 -0
- package/dist/services/doctor/doctor-service/checks/skill-presence.js +75 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/skill-runbook.js +47 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.d.ts +14 -0
- package/dist/services/doctor/doctor-service/checks/statusline-install.js +32 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.d.ts +13 -0
- package/dist/services/doctor/doctor-service/checks/statusline-runtime.js +30 -0
- package/dist/services/doctor/doctor-service/checks/user-config.d.ts +11 -0
- package/dist/services/doctor/doctor-service/checks/user-config.js +27 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.d.ts +16 -0
- package/dist/services/doctor/doctor-service/checks/workspace-init.js +34 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.d.ts +33 -0
- package/dist/services/doctor/doctor-service/checks/workspace-layout.js +180 -0
- package/dist/services/doctor/doctor-service/index.d.ts +48 -0
- package/dist/services/doctor/doctor-service/index.js +254 -0
- package/dist/services/doctor/doctor-service/plugin-registry.d.ts +41 -0
- package/dist/services/doctor/doctor-service/plugin-registry.js +77 -0
- package/dist/services/doctor/doctor-service/report/final-summary.d.ts +20 -0
- package/dist/services/doctor/doctor-service/report/final-summary.js +29 -0
- package/dist/services/doctor/doctor-service/types.d.ts +245 -0
- package/dist/services/doctor/doctor-service/types.js +15 -0
- package/dist/services/doctor/doctor-service.d.ts +15 -146
- package/dist/services/doctor/doctor-service.js +22 -926
- package/dist/services/doctor/index.d.ts +22 -0
- package/dist/services/doctor/index.js +22 -0
- package/dist/services/env/shell-probe.d.ts +71 -0
- package/dist/services/env/shell-probe.js +161 -0
- package/dist/services/evolution/evolution-types.d.ts +39 -39
- package/dist/services/final-review/final-review-service.d.ts +11 -1
- package/dist/services/final-review/index.d.ts +2 -0
- package/dist/services/final-review/index.js +1 -0
- package/dist/services/hooks/auto-compact-hook-install.d.ts +4 -5
- package/dist/services/hooks/auto-compact-hook-install.js +4 -5
- package/dist/services/hooks/worktree-authorization-gate.d.ts +205 -0
- package/dist/services/hooks/worktree-authorization-gate.js +492 -0
- package/dist/services/ide/adapters/claude-code-adapter.js +2 -2
- package/dist/services/ide/adapters/qoder-adapter.d.ts +25 -0
- package/dist/services/ide/adapters/qoder-adapter.js +57 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.d.ts +16 -0
- package/dist/services/ide/adapters/tongyi-lingma-adapter.js +45 -0
- package/dist/services/ide/ide-registry.js +6 -0
- package/dist/services/ide/ide-types.d.ts +1 -1
- package/dist/services/job/job-types.d.ts +56 -56
- package/dist/services/job-snapshot/index.d.ts +8 -0
- package/dist/services/job-snapshot/index.js +7 -0
- package/dist/services/{job/job-resource-snapshot.d.ts → job-snapshot/snapshot.d.ts} +1 -1
- package/dist/services/job-snapshot/types.d.ts +7 -0
- package/dist/services/job-snapshot/types.js +1 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.d.ts +67 -0
- package/dist/services/karpathy-cost/karpathy-cost-check-service.js +108 -0
- package/dist/services/log/retention.d.ts +16 -0
- package/dist/services/log/retention.js +17 -0
- package/dist/services/loop/loop-bee-relation-types.d.ts +6 -6
- package/dist/services/loop/loop-release-types.d.ts +24 -24
- package/dist/services/loop/monotonic-runner.d.ts +17 -11
- package/dist/services/loop/monotonic-runner.js +118 -79
- package/dist/services/memory/project-memory-service/index/kind-dispatch.d.ts +8 -0
- package/dist/services/memory/project-memory-service/index/kind-dispatch.js +253 -0
- package/dist/services/memory/project-memory-service/index/ranking.d.ts +6 -0
- package/dist/services/memory/project-memory-service/index/ranking.js +171 -0
- package/dist/services/memory/project-memory-service/index/search.d.ts +34 -0
- package/dist/services/memory/project-memory-service/index/search.js +194 -0
- package/dist/services/memory/project-memory-service/index.d.ts +9 -0
- package/dist/services/memory/project-memory-service/index.js +24 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.d.ts +9 -0
- package/dist/services/memory/project-memory-service/parsers/frontmatter.js +106 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.d.ts +7 -0
- package/dist/services/memory/project-memory-service/parsers/markdown-pure.js +96 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.d.ts +5 -0
- package/dist/services/memory/project-memory-service/store/atomic-write.js +56 -0
- package/dist/services/memory/project-memory-service/store/paths.d.ts +8 -0
- package/dist/services/memory/project-memory-service/store/paths.js +116 -0
- package/dist/services/memory/project-memory-service/types.d.ts +128 -0
- package/dist/services/memory/project-memory-service/types.js +9 -0
- package/dist/services/memory/project-memory-service.d.ts +1 -167
- package/dist/services/memory/project-memory-service.js +19 -816
- package/dist/services/migrate-skill-name/schema.d.ts +2 -2
- package/dist/services/observability/aggregation.d.ts +27 -0
- package/dist/services/observability/aggregation.js +72 -0
- package/dist/services/observability/observability-service.d.ts +73 -7
- package/dist/services/observability/observability-service.js +87 -1
- package/dist/services/openspec/artifact-boundary.d.ts +138 -0
- package/dist/services/openspec/artifact-boundary.js +150 -0
- package/dist/services/openspec/coverage-evidence-reader.d.ts +191 -0
- package/dist/services/openspec/coverage-evidence-reader.js +386 -0
- package/dist/services/openspec/openspec-archive-service.d.ts +70 -0
- package/dist/services/openspec/openspec-archive-service.js +320 -8
- package/dist/services/openspec/openspec-bridge-service.js +1 -1
- package/dist/services/openspec/openspec-init-service.js +1 -1
- package/dist/services/openspec/openspec-propose-from-doctor-service.js +1 -1
- package/dist/services/openspec/openspec-render-service.js +7 -4
- package/dist/services/openspec/openspec-scan-service.js +1 -1
- package/dist/services/openspec/openspec-validate-service.js +5 -4
- package/dist/services/preferences/preferences-service.js +10 -0
- package/dist/services/preferences/preferences-types.d.ts +13 -0
- package/dist/services/preferences/preferences-types.js +11 -0
- package/dist/services/qa/screenshot-archive-service.d.ts +51 -0
- package/dist/services/qa/screenshot-archive-service.js +134 -0
- package/dist/services/rd/rd-service.js +10 -11
- package/dist/services/rd/types.d.ts +32 -32
- package/dist/services/rd-swarm/rd-swarm-service.d.ts +60 -0
- package/dist/services/rd-swarm/rd-swarm-service.js +93 -0
- package/dist/services/recommendations/capability-seed-items.js +0 -1
- package/dist/services/recommendations/capability-seed-mappings.js +0 -1
- package/dist/services/recommendations/capability-seed-sources.js +0 -1
- package/dist/services/release/version-precheck-service.d.ts +51 -0
- package/dist/services/release/version-precheck-service.js +257 -0
- package/dist/services/scan/acceptance-coverage-service.js +1 -1
- package/dist/services/scan/archetype-service.js +1 -1
- package/dist/services/scan/existing-system-service.js +1 -1
- package/dist/services/scan/libraries-service.js +1 -1
- package/dist/services/sediment/json-schema.d.ts +40 -40
- package/dist/services/share/bundle-types.d.ts +12 -12
- package/dist/services/share/run-state-contract.d.ts +2 -2
- package/dist/services/skill/skill-search-service.d.ts +12 -7
- package/dist/services/skill/skill-search-service.js +8 -4
- package/dist/services/skillhub/migrations/001-initial.sql +71 -0
- package/dist/services/skillhub/migrations/002-loop-release.sql +32 -0
- package/dist/services/skillhub/migrations/003-loop-bee-relation.sql +35 -0
- package/dist/services/skillhub/migrations/004-loop-bee-extension.sql +65 -0
- package/dist/services/skillhub/migrations/005-evolution-evaluation.sql +81 -0
- package/dist/services/skillhub/migrations/006-crystallization-event.sql +92 -0
- package/dist/services/skills/hooks-settings-service.d.ts +75 -0
- package/dist/services/skills/hooks-settings-service.js +230 -2
- package/dist/services/skills/skill-registry.d.ts +1 -0
- package/dist/services/skills/skill-registry.js +6 -4
- package/dist/services/skills/skill-runbook-service.js +1 -1
- package/dist/services/slice/slice-check-service.js +1 -1
- package/dist/services/standards/main-session-monitor-ban-hook.d.ts +14 -0
- package/dist/services/standards/main-session-monitor-ban-hook.js +19 -0
- package/dist/services/standards/missing-standards-detector.d.ts +25 -0
- package/dist/services/standards/missing-standards-detector.js +43 -12
- package/dist/services/tech/tech-change-id-service.d.ts +82 -0
- package/dist/services/tech/tech-change-id-service.js +117 -0
- package/dist/services/understand/understand-hybrid-service.js +1 -1
- package/dist/services/understand/understand-scan-service.js +2 -2
- package/dist/services/upgrade/upgrade-service.js +4 -3
- package/dist/services/verdict/envelopes.d.ts +2 -2
- package/dist/services/verdict/envelopes.js +2 -2
- package/dist/services/verdict/verdict-aggregator.d.ts +3 -3
- package/dist/services/vm/vm-lease.d.ts +40 -0
- package/dist/services/vm/vm-lease.js +137 -0
- package/dist/services/workflow/autonomous-resume-writer.js +1 -1
- package/dist/services/workflow/pipeline-verify-gate-support.d.ts +47 -0
- package/dist/services/workflow/pipeline-verify-gate-support.js +194 -0
- package/dist/services/workflow/pipeline-verify-service.d.ts +17 -81
- package/dist/services/workflow/pipeline-verify-service.js +42 -218
- package/dist/services/workflow/pipeline-verify-types.d.ts +90 -0
- package/dist/services/workflow/pipeline-verify-types.js +10 -0
- package/dist/services/workflow/plan-reader.d.ts +1 -1
- package/dist/services/workflow/plan-reader.js +1 -1
- package/dist/services/workflow/plan-refresher.d.ts +1 -1
- package/dist/services/workflow/plan-refresher.js +1 -1
- package/dist/services/workflow/plan-trigger-detector.d.ts +1 -1
- package/dist/services/workflow/plan-trigger-detector.js +1 -1
- package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +1 -1
- package/dist/services/workflow/workflow-autonomous-service.d.ts +2 -98
- package/dist/services/workflow/workflow-autonomous-types.d.ts +114 -0
- package/dist/services/workflow/workflow-autonomous-types.js +21 -0
- package/dist/services/workflow/workflow-router-service.js +18 -16
- package/dist/services/workflow/workflow-spec-lint.d.ts +13 -0
- package/dist/services/workflow/workflow-spec-lint.js +75 -0
- package/dist/services/workflow/workflow-spec-types.d.ts +100 -0
- package/dist/services/workflow/workflow-spec-types.js +13 -0
- package/dist/services/workflow/workflow-spec-yaml.d.ts +17 -0
- package/dist/services/workflow/workflow-spec-yaml.js +88 -0
- package/dist/services/workflow/workflow-spec.d.ts +11 -91
- package/dist/services/workflow/workflow-spec.js +16 -145
- package/dist/services/workspace/migrate-service.js +1 -1
- package/dist/services/workspace/workspace-service.js +1 -1
- package/dist/services/worktree/worktree-lease.d.ts +170 -0
- package/dist/services/worktree/worktree-lease.js +242 -0
- package/package.json +91 -51
- package/scripts/clean-dist.mjs +31 -1
- package/scripts/copy-templates.mjs +16 -0
- package/scripts/sync-version.mjs +53 -2
- package/skills/bee/peaks-perf-audit/SKILL.md +17 -0
- package/skills/bee/peaks-prd/SKILL.md +16 -0
- package/skills/bee/peaks-prd/test-prompts.json +12 -0
- package/skills/bee/peaks-qa/SKILL.md +16 -1
- package/skills/bee/peaks-qa/references/qa-sub-agent-dispatch.md +22 -0
- package/skills/bee/peaks-qa/test-prompts.json +12 -0
- package/skills/bee/peaks-rd/SKILL.md +29 -20
- package/skills/bee/peaks-rd/references/rd-sub-agent-dispatch.md +39 -0
- package/skills/bee/peaks-rd/test-prompts.json +12 -0
- package/skills/bee/peaks-reviewer/SKILL.md +17 -0
- package/skills/bee/peaks-sc/SKILL.md +16 -0
- package/skills/bee/peaks-security-audit/SKILL.md +17 -0
- package/skills/bee/peaks-txt/SKILL.md +16 -0
- package/skills/bee/peaks-txt/test-prompts.json +12 -0
- package/skills/bee/peaks-ui/SKILL.md +49 -43
- package/skills/bee/peaks-ui/test-prompts.json +12 -0
- package/skills/peaks-code/SKILL.md +54 -109
- package/skills/peaks-code/references/boundaries.md +15 -1
- package/skills/peaks-code/references/cron-scheduler-deployment.md +313 -0
- package/skills/peaks-code/references/external-skill-invocation.md +27 -0
- package/skills/peaks-code/references/lease-dashboard.html +224 -0
- package/skills/peaks-code/references/lease-stats.sample.json +26 -0
- package/skills/peaks-code/references/peaks-worktree-l2-enforcers.md +208 -0
- package/skills/peaks-code/references/periodic-checkpoint.md +4 -4
- package/skills/peaks-code/references/runbook.md +63 -1
- package/skills/peaks-code/references/startup-sequence.md +110 -0
- package/skills/peaks-code/references/step-0-8-gate.md +1 -1
- package/skills/peaks-code/references/sub-agent-dispatch.md +92 -1
- package/skills/peaks-code/references/worktree-governance.md +123 -0
- package/skills/peaks-code/test-prompts.json +12 -0
- package/skills/peaks-doctor/SKILL.md +1 -1
- package/skills/peaks-ide/SKILL.md +1 -1
- package/skills/peaks-solo/SKILL.md +21 -0
- package/skills/peaks-solo/references/triage-decision-table.md +6 -0
- package/skills/peaks-sop/test-prompts.json +17 -0
- package/dist/cli/commands/agent-commands.d.ts +0 -20
- package/dist/cli/commands/agent-commands.js +0 -48
- package/dist/cli/commands/classify-classify-commands.d.ts +0 -19
- package/dist/cli/commands/classify-classify-commands.js +0 -151
- package/dist/cli/commands/contract-commands.d.ts +0 -26
- package/dist/cli/commands/contract-commands.js +0 -114
- package/dist/cli/commands/session-auto-compact-hook-command.d.ts +0 -37
- package/dist/cli/commands/session-auto-compact-hook-command.js +0 -127
- package/dist/cli/commands/worker-commands.d.ts +0 -3
- package/dist/cli/commands/worker-commands.js +0 -52
- package/dist/services/agent/ecc-agent-service.d.ts +0 -47
- package/dist/services/agent/ecc-agent-service.js +0 -143
- package/dist/services/config/provider-service.d.ts +0 -48
- package/dist/services/config/provider-service.js +0 -143
- package/dist/services/context/dispatch-context-guard.d.ts +0 -27
- package/dist/services/context/dispatch-context-guard.js +0 -192
- package/dist/services/context/shared-channel.d.ts +0 -93
- package/dist/services/context/shared-channel.js +0 -308
- package/dist/services/filesystem/file-lock.d.ts +0 -11
- package/dist/services/filesystem/file-lock.js +0 -152
- package/dist/services/mut/assert-scanner.d.ts +0 -6
- package/dist/services/mut/assert-scanner.js +0 -116
- package/dist/services/mut/index.d.ts +0 -8
- package/dist/services/mut/index.js +0 -7
- package/dist/services/mut/mut-runner.d.ts +0 -39
- package/dist/services/mut/mut-runner.js +0 -29
- package/dist/services/mut/production-stryker.d.ts +0 -2
- package/dist/services/mut/production-stryker.js +0 -75
- package/dist/services/mut/report-builder.d.ts +0 -11
- package/dist/services/mut/report-builder.js +0 -110
- package/dist/services/mut/report-loader.d.ts +0 -31
- package/dist/services/mut/report-loader.js +0 -78
- package/dist/services/mut/thresholds.d.ts +0 -21
- package/dist/services/mut/thresholds.js +0 -22
- package/dist/services/mut/types.d.ts +0 -336
- package/dist/services/mut/types.js +0 -59
- package/dist/services/providers/minimax-provider-service.d.ts +0 -24
- package/dist/services/providers/minimax-provider-service.js +0 -143
- package/dist/services/providers/minimax-worker-service.d.ts +0 -21
- package/dist/services/providers/minimax-worker-service.js +0 -83
- package/dist/shared/fs.d.ts +0 -4
- package/dist/shared/fs.js +0 -26
- package/dist/shared/paths.d.ts +0 -6
- package/dist/shared/paths.js +0 -50
- package/dist/shared/result.d.ts +0 -22
- package/dist/shared/result.js +0 -46
- package/dist/shared/version.d.ts +0 -1
- package/dist/shared/version.js +0 -1
- package/examples/video-demo/README.md +0 -142
- package/examples/video-demo/out/en-closing-960.png +0 -0
- package/examples/video-demo/out/zh-closing-960.png +0 -0
- package/examples/video-demo/preview/peaks-loop-demo-en.mp4 +0 -0
- package/examples/video-demo/preview/peaks-loop-demo.mp4 +0 -0
- /package/dist/services/{job/job-resource-snapshot.js → job-snapshot/snapshot.js} +0 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 24h mode B3 trigger evaluation + attempts counter.
|
|
3
|
+
*
|
|
4
|
+
* Rid-020a (state-only slice). `fireB3` is the single mutating
|
|
5
|
+
* primitive: it increments the per-key counter and escalates with a
|
|
6
|
+
* `B3Escalation` when the count reaches `B3_THRESHOLD` (3). The
|
|
7
|
+
* counter is **per-key** — AC-T3 mandates B1 and B2 retries do not
|
|
8
|
+
* share a global counter. The T3/T4 auto-24H_ACTIVE path is encoded
|
|
9
|
+
* in `isAutoEngageTrigger` (BRAINSTORM is bypassed for these
|
|
10
|
+
* triggers so an offline-resumed session does not deadlock in
|
|
11
|
+
* WAITING_USER — proposal §1 T3/T4 exception).
|
|
12
|
+
*/
|
|
13
|
+
import { B3_THRESHOLD, isDecisionKey } from './state.js';
|
|
14
|
+
import { read24hState } from './store.js';
|
|
15
|
+
export const B3_TRIGGER_REASONS = [
|
|
16
|
+
'prd_direction_change',
|
|
17
|
+
'blocker_3_consecutive_slices',
|
|
18
|
+
'registry_affecting_failure',
|
|
19
|
+
'destructive_irreversible_op',
|
|
20
|
+
'any_B1_B2_failure_3x_non_converging',
|
|
21
|
+
'runtime_or_shared_version_mismatch',
|
|
22
|
+
'sub-agent_stale_5min_x3'
|
|
23
|
+
];
|
|
24
|
+
export class B3Escalation extends Error {
|
|
25
|
+
reason;
|
|
26
|
+
attempts;
|
|
27
|
+
constructor(reason, attempts) {
|
|
28
|
+
super(`B3 escalation: reason=${reason}, attempts=${attempts}`);
|
|
29
|
+
this.name = 'B3Escalation';
|
|
30
|
+
this.reason = reason;
|
|
31
|
+
this.attempts = attempts;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export function isB3Reason(value) {
|
|
35
|
+
return B3_TRIGGER_REASONS.includes(value);
|
|
36
|
+
}
|
|
37
|
+
export function isValidReason(value) {
|
|
38
|
+
return isDecisionKey(value);
|
|
39
|
+
}
|
|
40
|
+
export function freshAttempts() {
|
|
41
|
+
const out = {};
|
|
42
|
+
for (const key of B3_TRIGGER_REASONS)
|
|
43
|
+
out[key] = 0;
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Per AC-T1 (attempts=1 continue, no B3) and AC-T2 (attempts=3
|
|
48
|
+
* escalate), the 3rd call escalates. The threshold is intentionally
|
|
49
|
+
* NOT configurable — the proposal pins the constant so QA v3 can
|
|
50
|
+
* assert it. Returns a FireB3Result instead of throwing so test
|
|
51
|
+
* code can read the `attempts` field via plain property access
|
|
52
|
+
* (Error-subclass property access through vitest 4.1.10 matchers
|
|
53
|
+
* is unreliable; the discriminated union sidesteps that).
|
|
54
|
+
*/
|
|
55
|
+
export function fireB3(reason, attempts) {
|
|
56
|
+
const cur = attempts[reason] ?? 0;
|
|
57
|
+
const next = cur + 1;
|
|
58
|
+
attempts[reason] = next;
|
|
59
|
+
if (next >= B3_THRESHOLD) {
|
|
60
|
+
return { kind: 'escalate', reason, attempts: next };
|
|
61
|
+
}
|
|
62
|
+
return { kind: 'continue', reason, attempts: next };
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* T3 (runaway recovery) and T4 (offline resume) auto-engage
|
|
66
|
+
* `24H_ACTIVE` without forcing `USER_CONFIRM` — the deferred
|
|
67
|
+
* AskUserQuestion fires at the first 10min checkpoint instead, so
|
|
68
|
+
* a T4 session does not deadlock in `WAITING_USER` while the
|
|
69
|
+
* user is offline (proposal §1 T3/T4 exception).
|
|
70
|
+
*/
|
|
71
|
+
export const AUTO_ENGAGE_TRIGGERS = ['T3', 'T4'];
|
|
72
|
+
export function isAutoEngageTrigger(t) {
|
|
73
|
+
return AUTO_ENGAGE_TRIGGERS.includes(t);
|
|
74
|
+
}
|
|
75
|
+
export const T1_KEYWORDS = ['24h', '通宵跑', '通宵', '夜跑', '夜机', '不计成本', '不停机'];
|
|
76
|
+
export const T2_MIN_SLICES = 30;
|
|
77
|
+
export const T2_MIN_WALL_HOURS = 6;
|
|
78
|
+
export const T3_MIN_MONOTONIC_GUARDS = 3;
|
|
79
|
+
export const T3_MIN_REMAINING_SLICES = 10;
|
|
80
|
+
export const T4_SESSION_GAP_HOURS = 4;
|
|
81
|
+
export const T5_MIN_ACTIVE_SLICES = 3;
|
|
82
|
+
export function checkTriggers(input) {
|
|
83
|
+
if (T1_KEYWORDS.some((kw) => input.userMessage.includes(kw))) {
|
|
84
|
+
return { triggered: true, trigger: 'T1', reason: `T1 keyword match in user message` };
|
|
85
|
+
}
|
|
86
|
+
if (input.sliceListSize >= T2_MIN_SLICES || input.estimatedWallHours >= T2_MIN_WALL_HOURS) {
|
|
87
|
+
return {
|
|
88
|
+
triggered: true,
|
|
89
|
+
trigger: 'T2',
|
|
90
|
+
reason: `T2 scale: sliceList=${input.sliceListSize} OR wallHours=${input.estimatedWallHours}`
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
if (input.monotonicGuards >= T3_MIN_MONOTONIC_GUARDS &&
|
|
94
|
+
input.remainingSlices >= T3_MIN_REMAINING_SLICES) {
|
|
95
|
+
return {
|
|
96
|
+
triggered: true,
|
|
97
|
+
trigger: 'T3',
|
|
98
|
+
reason: `T3 runaway recovery: monotonicGuards=${input.monotonicGuards} remaining=${input.remainingSlices}`
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (input.sessionGapHours >= T4_SESSION_GAP_HOURS && input.remainingSlices > 0) {
|
|
102
|
+
return {
|
|
103
|
+
triggered: true,
|
|
104
|
+
trigger: 'T4',
|
|
105
|
+
reason: `T4 offline resume: gapHours=${input.sessionGapHours} remaining=${input.remainingSlices}`
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
if (input.activeSlicesAcrossServices >= T5_MIN_ACTIVE_SLICES) {
|
|
109
|
+
return {
|
|
110
|
+
triggered: true,
|
|
111
|
+
trigger: 'T5',
|
|
112
|
+
reason: `T5 multi-business: activeAcrossServices=${input.activeSlicesAcrossServices}`
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
return { triggered: false, trigger: null, reason: 'no trigger' };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* HANDOFF is reachable via three exit conditions per proposal §1:
|
|
119
|
+
* - user abort
|
|
120
|
+
* - all-trigger-resolved
|
|
121
|
+
* - B3 unresolvable (B3Escalation that the user dismisses)
|
|
122
|
+
*/
|
|
123
|
+
export const HANDOFF_EXIT_CONDITIONS = ['user_abort', 'all_triggers_resolved', 'b3_unresolvable'];
|
|
124
|
+
export function isHandoffExitCondition(s) {
|
|
125
|
+
return HANDOFF_EXIT_CONDITIONS.includes(s);
|
|
126
|
+
}
|
|
127
|
+
export function isHandoffState(s) {
|
|
128
|
+
return s === 'HANDOFF';
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Slice 2026-07-28 (rid-027): resolve the auto-compact mode from
|
|
132
|
+
* 24h-mode awareness. Returns `'partial'` when the session is
|
|
133
|
+
* `24H_ACTIVE`, otherwise `'standard'`. This is the CLI-side default;
|
|
134
|
+
* the explicit `--mode` flag in `peaks compact auto` overrides it.
|
|
135
|
+
*/
|
|
136
|
+
export function getAutoCompactMode(projectRoot, sessionId) {
|
|
137
|
+
try {
|
|
138
|
+
const snap = read24hState(projectRoot, sessionId);
|
|
139
|
+
return snap.state === '24H_ACTIVE' ? 'partial' : 'standard';
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return 'standard';
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public barrel for 24h-mode service module.
|
|
3
|
+
*
|
|
4
|
+
* Rid-020a (state-only slice). Exports the 6-state enum, the
|
|
5
|
+
* DecisionKey enum, the persistence API, and the B3 decider API
|
|
6
|
+
* so that the `peaks session 24h-mode` CLI (and future rid-020b
|
|
7
|
+
* `peaks code run --24h`) can consume them without reaching into
|
|
8
|
+
* the internal file layout.
|
|
9
|
+
*/
|
|
10
|
+
export { B3_THRESHOLD, DECISION_KEYS, STATES, emptyAttempts, isDecisionKey, isState, type DecisionKey, type State, type State24hSnapshot } from './state.js';
|
|
11
|
+
export { STATE_STORE_CONSTANTS, emptySnapshot, read24hState, write24hState } from './store.js';
|
|
12
|
+
export { AUTO_ENGAGE_TRIGGERS, B3_TRIGGER_REASONS, B3Escalation, HANDOFF_EXIT_CONDITIONS, T1_KEYWORDS, T2_MIN_SLICES, T2_MIN_WALL_HOURS, T3_MIN_MONOTONIC_GUARDS, T3_MIN_REMAINING_SLICES, T4_SESSION_GAP_HOURS, T5_MIN_ACTIVE_SLICES, checkTriggers, fireB3, freshAttempts, isAutoEngageTrigger, isB3Reason, isHandoffExitCondition, isHandoffState, isValidReason, type AttemptsMap, type AutoEngageTrigger, type B3Reason, type FireB3Result, type HandoffExitCondition, type TriggerCheck } from './decider.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public barrel for 24h-mode service module.
|
|
3
|
+
*
|
|
4
|
+
* Rid-020a (state-only slice). Exports the 6-state enum, the
|
|
5
|
+
* DecisionKey enum, the persistence API, and the B3 decider API
|
|
6
|
+
* so that the `peaks session 24h-mode` CLI (and future rid-020b
|
|
7
|
+
* `peaks code run --24h`) can consume them without reaching into
|
|
8
|
+
* the internal file layout.
|
|
9
|
+
*/
|
|
10
|
+
export { B3_THRESHOLD, DECISION_KEYS, STATES, emptyAttempts, isDecisionKey, isState } from './state.js';
|
|
11
|
+
export { STATE_STORE_CONSTANTS, emptySnapshot, read24hState, write24hState } from './store.js';
|
|
12
|
+
export { AUTO_ENGAGE_TRIGGERS, B3_TRIGGER_REASONS, B3Escalation, HANDOFF_EXIT_CONDITIONS, T1_KEYWORDS, T2_MIN_SLICES, T2_MIN_WALL_HOURS, T3_MIN_MONOTONIC_GUARDS, T3_MIN_REMAINING_SLICES, T4_SESSION_GAP_HOURS, T5_MIN_ACTIVE_SLICES, checkTriggers, fireB3, freshAttempts, isAutoEngageTrigger, isB3Reason, isHandoffExitCondition, isHandoffState, isValidReason } from './decider.js';
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 24h mode state machine — state types + DecisionKey enum.
|
|
3
|
+
*
|
|
4
|
+
* Rid-020a (state-only slice). The proposal defines six states that
|
|
5
|
+
* capture the lifecycle of a 24h code run; the DecisionKey enum is the
|
|
6
|
+
* enumeration of B1/B2 decision keys whose retry counter lives in
|
|
7
|
+
* `AttemptsMap`. Persistence and trigger evaluation live in sibling
|
|
8
|
+
* files; this module is pure data so the persistence tests can
|
|
9
|
+
* round-trip without pulling in IO and the decider tests can be
|
|
10
|
+
* exercised on an in-memory map.
|
|
11
|
+
*/
|
|
12
|
+
export declare const STATES: readonly ["IDLE", "BRAINSTORM", "USER_CONFIRM", "24H_ACTIVE", "WAITING_USER", "HANDOFF"];
|
|
13
|
+
export type State = (typeof STATES)[number];
|
|
14
|
+
/**
|
|
15
|
+
* Reasons recorded in the persisted `attempts` map. Mirrors the
|
|
16
|
+
* 7 B3 trigger rows in the v2 proposal §1 (B3 trigger table) plus
|
|
17
|
+
* generic B1/B2 retry keys (per-key independence in AC-T3).
|
|
18
|
+
*/
|
|
19
|
+
export declare const DECISION_KEYS: readonly ["prd_direction_change", "blocker_3_consecutive_slices", "registry_affecting_failure", "destructive_irreversible_op", "any_B1_B2_failure_3x_non_converging", "runtime_or_shared_version_mismatch", "sub-agent_stale_5min_x3"];
|
|
20
|
+
export type DecisionKey = (typeof DECISION_KEYS)[number];
|
|
21
|
+
/**
|
|
22
|
+
* B3 trigger threshold: per decision key, the 3rd consecutive fire
|
|
23
|
+
* escalates. Lower thresholds are not configurable here — proposal
|
|
24
|
+
* pins the constant so QA v3 can verify.
|
|
25
|
+
*/
|
|
26
|
+
export declare const B3_THRESHOLD = 3;
|
|
27
|
+
/**
|
|
28
|
+
* The persisted shape for `.peaks/_runtime/<sessionId>/24h-state.json`.
|
|
29
|
+
* `enteredAt` is the ISO timestamp of the most recent state
|
|
30
|
+
* transition; `enteredFrom` is the previous state (or `null` for the
|
|
31
|
+
* IDLE bootstrap). `attempts` is keyed by `DecisionKey` and
|
|
32
|
+
* monotonically incremented by `fireB3`.
|
|
33
|
+
*/
|
|
34
|
+
export interface State24hSnapshot {
|
|
35
|
+
state: State;
|
|
36
|
+
enteredAt: string;
|
|
37
|
+
enteredFrom: State | null;
|
|
38
|
+
activeSlices: string[];
|
|
39
|
+
monotonicGuards: number;
|
|
40
|
+
autoCompactCount: number;
|
|
41
|
+
checkpoints: number;
|
|
42
|
+
lastCheckpointAt: string | null;
|
|
43
|
+
attempts: Record<DecisionKey, number>;
|
|
44
|
+
exitCondition: string | null;
|
|
45
|
+
}
|
|
46
|
+
export declare function isState(value: string): value is State;
|
|
47
|
+
export declare function isDecisionKey(value: string): value is DecisionKey;
|
|
48
|
+
export declare function emptyAttempts(): Record<DecisionKey, number>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 24h mode state machine — state types + DecisionKey enum.
|
|
3
|
+
*
|
|
4
|
+
* Rid-020a (state-only slice). The proposal defines six states that
|
|
5
|
+
* capture the lifecycle of a 24h code run; the DecisionKey enum is the
|
|
6
|
+
* enumeration of B1/B2 decision keys whose retry counter lives in
|
|
7
|
+
* `AttemptsMap`. Persistence and trigger evaluation live in sibling
|
|
8
|
+
* files; this module is pure data so the persistence tests can
|
|
9
|
+
* round-trip without pulling in IO and the decider tests can be
|
|
10
|
+
* exercised on an in-memory map.
|
|
11
|
+
*/
|
|
12
|
+
export const STATES = [
|
|
13
|
+
'IDLE',
|
|
14
|
+
'BRAINSTORM',
|
|
15
|
+
'USER_CONFIRM',
|
|
16
|
+
'24H_ACTIVE',
|
|
17
|
+
'WAITING_USER',
|
|
18
|
+
'HANDOFF'
|
|
19
|
+
];
|
|
20
|
+
/**
|
|
21
|
+
* Reasons recorded in the persisted `attempts` map. Mirrors the
|
|
22
|
+
* 7 B3 trigger rows in the v2 proposal §1 (B3 trigger table) plus
|
|
23
|
+
* generic B1/B2 retry keys (per-key independence in AC-T3).
|
|
24
|
+
*/
|
|
25
|
+
export const DECISION_KEYS = [
|
|
26
|
+
'prd_direction_change',
|
|
27
|
+
'blocker_3_consecutive_slices',
|
|
28
|
+
'registry_affecting_failure',
|
|
29
|
+
'destructive_irreversible_op',
|
|
30
|
+
'any_B1_B2_failure_3x_non_converging',
|
|
31
|
+
'runtime_or_shared_version_mismatch',
|
|
32
|
+
'sub-agent_stale_5min_x3'
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* B3 trigger threshold: per decision key, the 3rd consecutive fire
|
|
36
|
+
* escalates. Lower thresholds are not configurable here — proposal
|
|
37
|
+
* pins the constant so QA v3 can verify.
|
|
38
|
+
*/
|
|
39
|
+
export const B3_THRESHOLD = 3;
|
|
40
|
+
export function isState(value) {
|
|
41
|
+
return STATES.includes(value);
|
|
42
|
+
}
|
|
43
|
+
export function isDecisionKey(value) {
|
|
44
|
+
return DECISION_KEYS.includes(value);
|
|
45
|
+
}
|
|
46
|
+
export function emptyAttempts() {
|
|
47
|
+
const out = {};
|
|
48
|
+
for (const key of DECISION_KEYS)
|
|
49
|
+
out[key] = 0;
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 24h mode persistence — atomic JSON snapshot under
|
|
3
|
+
* `.peaks/_runtime/<sessionId>/24h-state.json`.
|
|
4
|
+
*
|
|
5
|
+
* Rid-020a (state-only slice). The store never invents a session id:
|
|
6
|
+
* the caller passes one (the CLI resolves it from `.peaks/_runtime/session.json`).
|
|
7
|
+
* Writes use the temp-file + rename pattern so a crash mid-write never
|
|
8
|
+
* leaves a half-written state file (atomic on POSIX, near-atomic on
|
|
9
|
+
* Windows — same approach used by `session-checkpoint-service.ts`).
|
|
10
|
+
*/
|
|
11
|
+
import { type State24hSnapshot } from './state.js';
|
|
12
|
+
export declare function emptySnapshot(now?: Date): State24hSnapshot;
|
|
13
|
+
export declare function read24hState(projectRoot: string, sessionId: string): State24hSnapshot;
|
|
14
|
+
/**
|
|
15
|
+
* Atomic write: temp file in the same directory, then rename. The
|
|
16
|
+
* rename is a single syscall on POSIX and a single MoveFile on
|
|
17
|
+
* Windows — a crash in between leaves the previous valid snapshot
|
|
18
|
+
* intact. `fsync` on the temp file is omitted (we accept the
|
|
19
|
+
* same weaker contract that `session-checkpoint-service.ts` uses)
|
|
20
|
+
* because the state is reconstructible from the B3 attempt log.
|
|
21
|
+
*/
|
|
22
|
+
export declare function write24hState(projectRoot: string, sessionId: string, snapshot: State24hSnapshot): {
|
|
23
|
+
path: string;
|
|
24
|
+
};
|
|
25
|
+
export declare const STATE_STORE_CONSTANTS: {
|
|
26
|
+
readonly STATE_FILENAME: "24h-state.json";
|
|
27
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 24h mode persistence — atomic JSON snapshot under
|
|
3
|
+
* `.peaks/_runtime/<sessionId>/24h-state.json`.
|
|
4
|
+
*
|
|
5
|
+
* Rid-020a (state-only slice). The store never invents a session id:
|
|
6
|
+
* the caller passes one (the CLI resolves it from `.peaks/_runtime/session.json`).
|
|
7
|
+
* Writes use the temp-file + rename pattern so a crash mid-write never
|
|
8
|
+
* leaves a half-written state file (atomic on POSIX, near-atomic on
|
|
9
|
+
* Windows — same approach used by `session-checkpoint-service.ts`).
|
|
10
|
+
*/
|
|
11
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { dirname, join } from 'node:path';
|
|
13
|
+
import { getSessionDir } from '../session/getSessionDir.js';
|
|
14
|
+
import { emptyAttempts, isDecisionKey, isState } from './state.js';
|
|
15
|
+
const STATE_FILENAME = '24h-state.json';
|
|
16
|
+
function statePath(projectRoot, sessionId) {
|
|
17
|
+
return join(getSessionDir(projectRoot, sessionId), STATE_FILENAME);
|
|
18
|
+
}
|
|
19
|
+
function isPlainObject(v) {
|
|
20
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
21
|
+
}
|
|
22
|
+
function coerceSnapshot(raw) {
|
|
23
|
+
if (!isPlainObject(raw)) {
|
|
24
|
+
throw new Error('24H_STATE_INVALID: root must be an object');
|
|
25
|
+
}
|
|
26
|
+
if (typeof raw['state'] !== 'string' || !isState(raw['state'])) {
|
|
27
|
+
throw new Error(`24H_STATE_INVALID: state must be one of IDLE|BRAINSTORM|USER_CONFIRM|24H_ACTIVE|WAITING_USER|HANDOFF (got ${JSON.stringify(raw['state'])})`);
|
|
28
|
+
}
|
|
29
|
+
if (typeof raw['enteredAt'] !== 'string') {
|
|
30
|
+
throw new Error('24H_STATE_INVALID: enteredAt must be an ISO string');
|
|
31
|
+
}
|
|
32
|
+
if (raw['enteredFrom'] !== null && (typeof raw['enteredFrom'] !== 'string' || !isState(raw['enteredFrom']))) {
|
|
33
|
+
throw new Error('24H_STATE_INVALID: enteredFrom must be a State or null');
|
|
34
|
+
}
|
|
35
|
+
if (!Array.isArray(raw['activeSlices']) || !raw['activeSlices'].every((s) => typeof s === 'string')) {
|
|
36
|
+
throw new Error('24H_STATE_INVALID: activeSlices must be string[]');
|
|
37
|
+
}
|
|
38
|
+
if (typeof raw['monotonicGuards'] !== 'number' || !Number.isInteger(raw['monotonicGuards'])) {
|
|
39
|
+
throw new Error('24H_STATE_INVALID: monotonicGuards must be a non-negative integer');
|
|
40
|
+
}
|
|
41
|
+
if (typeof raw['autoCompactCount'] !== 'number' || !Number.isInteger(raw['autoCompactCount'])) {
|
|
42
|
+
throw new Error('24H_STATE_INVALID: autoCompactCount must be a non-negative integer');
|
|
43
|
+
}
|
|
44
|
+
if (typeof raw['checkpoints'] !== 'number' || !Number.isInteger(raw['checkpoints'])) {
|
|
45
|
+
throw new Error('24H_STATE_INVALID: checkpoints must be a non-negative integer');
|
|
46
|
+
}
|
|
47
|
+
if (raw['lastCheckpointAt'] !== null && typeof raw['lastCheckpointAt'] !== 'string') {
|
|
48
|
+
throw new Error('24H_STATE_INVALID: lastCheckpointAt must be ISO string or null');
|
|
49
|
+
}
|
|
50
|
+
if (raw['exitCondition'] !== null && typeof raw['exitCondition'] !== 'string') {
|
|
51
|
+
throw new Error('24H_STATE_INVALID: exitCondition must be string or null');
|
|
52
|
+
}
|
|
53
|
+
const rawAttempts = raw['attempts'];
|
|
54
|
+
if (!isPlainObject(rawAttempts)) {
|
|
55
|
+
throw new Error('24H_STATE_INVALID: attempts must be an object');
|
|
56
|
+
}
|
|
57
|
+
const attempts = emptyAttempts();
|
|
58
|
+
for (const [k, v] of Object.entries(rawAttempts)) {
|
|
59
|
+
if (!isDecisionKey(k)) {
|
|
60
|
+
throw new Error(`24H_STATE_INVALID: attempts has unknown key ${k}`);
|
|
61
|
+
}
|
|
62
|
+
if (typeof v !== 'number' || !Number.isInteger(v) || v < 0) {
|
|
63
|
+
throw new Error(`24H_STATE_INVALID: attempts.${k} must be a non-negative integer`);
|
|
64
|
+
}
|
|
65
|
+
attempts[k] = v;
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
state: raw['state'],
|
|
69
|
+
enteredAt: raw['enteredAt'],
|
|
70
|
+
enteredFrom: raw['enteredFrom'],
|
|
71
|
+
activeSlices: raw['activeSlices'],
|
|
72
|
+
monotonicGuards: raw['monotonicGuards'],
|
|
73
|
+
autoCompactCount: raw['autoCompactCount'],
|
|
74
|
+
checkpoints: raw['checkpoints'],
|
|
75
|
+
lastCheckpointAt: raw['lastCheckpointAt'],
|
|
76
|
+
attempts,
|
|
77
|
+
exitCondition: raw['exitCondition']
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
export function emptySnapshot(now = new Date()) {
|
|
81
|
+
return {
|
|
82
|
+
state: 'IDLE',
|
|
83
|
+
enteredAt: now.toISOString(),
|
|
84
|
+
enteredFrom: null,
|
|
85
|
+
activeSlices: [],
|
|
86
|
+
monotonicGuards: 0,
|
|
87
|
+
autoCompactCount: 0,
|
|
88
|
+
checkpoints: 0,
|
|
89
|
+
lastCheckpointAt: null,
|
|
90
|
+
attempts: emptyAttempts(),
|
|
91
|
+
exitCondition: null
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function read24hState(projectRoot, sessionId) {
|
|
95
|
+
const path = statePath(projectRoot, sessionId);
|
|
96
|
+
if (!existsSync(path))
|
|
97
|
+
return emptySnapshot();
|
|
98
|
+
const raw = readFileSync(path, 'utf8');
|
|
99
|
+
return coerceSnapshot(JSON.parse(raw));
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Atomic write: temp file in the same directory, then rename. The
|
|
103
|
+
* rename is a single syscall on POSIX and a single MoveFile on
|
|
104
|
+
* Windows — a crash in between leaves the previous valid snapshot
|
|
105
|
+
* intact. `fsync` on the temp file is omitted (we accept the
|
|
106
|
+
* same weaker contract that `session-checkpoint-service.ts` uses)
|
|
107
|
+
* because the state is reconstructible from the B3 attempt log.
|
|
108
|
+
*/
|
|
109
|
+
export function write24hState(projectRoot, sessionId, snapshot) {
|
|
110
|
+
const path = statePath(projectRoot, sessionId);
|
|
111
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
112
|
+
const tmp = `${path}.tmp-${process.pid}-${Date.now()}`;
|
|
113
|
+
writeFileSync(tmp, JSON.stringify(snapshot, null, 2) + '\n', 'utf8');
|
|
114
|
+
renameSync(tmp, path);
|
|
115
|
+
return { path };
|
|
116
|
+
}
|
|
117
|
+
export const STATE_STORE_CONSTANTS = {
|
|
118
|
+
STATE_FILENAME
|
|
119
|
+
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { join, dirname, basename } from 'node:path';
|
|
2
2
|
import { readFile, readdir } from 'node:fs/promises';
|
|
3
|
-
import { pathExists } from '
|
|
3
|
+
import { pathExists } from 'peaks-loop-shared/fs';
|
|
4
4
|
import { emitObservabilityEvent } from '../observability/observability-service.js';
|
|
5
5
|
export const VALID_REQUEST_TYPES = [
|
|
6
6
|
'feature',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { mkdir, readFile, readdir, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { dirname, join } from 'node:path';
|
|
4
|
-
import { isDirectory, listDirectories } from '
|
|
4
|
+
import { isDirectory, listDirectories } from 'peaks-loop-shared/fs';
|
|
5
5
|
import { checkPrerequisites, DEFAULT_REQUEST_TYPE, isRequestType, VALID_REQUEST_TYPES } from './artifact-prerequisites.js';
|
|
6
6
|
import { ensureSession, getSessionIdCanonical } from '../session/session-manager.js';
|
|
7
7
|
// Slice 2026-06-29-change-id-root-removal: `getCurrentChangeId` was
|
|
@@ -3,7 +3,7 @@ import { Buffer } from 'node:buffer';
|
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
4
|
import { isInsidePath, stablePath } from '../../shared/path-utils.js';
|
|
5
5
|
import { getWorkspaceConfig, getWorkspaceConfigForCurrentPath } from '../config/config-service.js';
|
|
6
|
-
import { pathExists } from '
|
|
6
|
+
import { pathExists } from 'peaks-loop-shared/fs';
|
|
7
7
|
import { execCommand } from '../../shared/process.js';
|
|
8
8
|
function canonicalPath(path) {
|
|
9
9
|
return stablePath(path);
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P2-b sweep 008 — peaks-rd / peaks-ui / peaks-txt / peaks-sc
|
|
3
|
+
* runtime contract enforcer. Closes six discovered lines:
|
|
4
|
+
*
|
|
5
|
+
* - peaks-rd-skill-md-166 : OpenSpec usage (BLOCKING)
|
|
6
|
+
* - peaks-rd-skill-md-184 : Frontend project generation (MUST NOT)
|
|
7
|
+
* - peaks-sc-skill-md-150 : Transition verification gates (MANDATORY)
|
|
8
|
+
* - peaks-txt-skill-md-266 : Memory block embedding rule (MANDATORY)
|
|
9
|
+
* - peaks-txt-skill-md-277 : Transition verification gates (MANDATORY)
|
|
10
|
+
* - peaks-ui-skill-md-188 : Transition verification gates (MANDATORY)
|
|
11
|
+
*
|
|
12
|
+
* The contract is a single enforcer per skill: each skill
|
|
13
|
+
* declares its own runtime contract markers. The sweep covers
|
|
14
|
+
* 3 marker classes (OpenSpec, FrontendGen, TransitionGates,
|
|
15
|
+
* MemoryBlock) by 4 skills (rd, ui, sc, txt).
|
|
16
|
+
*
|
|
17
|
+
* scope: each helper scopes to a specific skill via the
|
|
18
|
+
* `name` field on SkillFile; ui-363 + peaks-rd-58 (skill
|
|
19
|
+
* presence) are already closed by sweep 003.
|
|
20
|
+
*/
|
|
21
|
+
import type { LintHit, SkillFile } from './lint-style.js';
|
|
22
|
+
export declare function lintRdRuntimeContract(skill: SkillFile): ReadonlyArray<LintHit>;
|
|
23
|
+
export declare function lintUiTransitionGates(skill: SkillFile): ReadonlyArray<LintHit>;
|
|
24
|
+
export declare function lintScTransitionGates(skill: SkillFile): ReadonlyArray<LintHit>;
|
|
25
|
+
export declare function lintTxtRuntimeContract(skill: SkillFile): ReadonlyArray<LintHit>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const OPENSPEC_USAGE = /use openspec when the/i;
|
|
2
|
+
const FRONTEND_PROJECT_GENERATION = /rd work creates a frontend application/i;
|
|
3
|
+
const TRANSITION_GATES = /Transition verification gates/im;
|
|
4
|
+
const MEMORY_BLOCK_EMBEDDING = /memory block embedding rule/i;
|
|
5
|
+
function findContract(lines) {
|
|
6
|
+
let openspec = false;
|
|
7
|
+
let frontendGen = false;
|
|
8
|
+
let transitionGates = false;
|
|
9
|
+
let memoryBlock = false;
|
|
10
|
+
for (const line of lines) {
|
|
11
|
+
if (OPENSPEC_USAGE.test(line))
|
|
12
|
+
openspec = true;
|
|
13
|
+
if (FRONTEND_PROJECT_GENERATION.test(line))
|
|
14
|
+
frontendGen = true;
|
|
15
|
+
if (TRANSITION_GATES.test(line))
|
|
16
|
+
transitionGates = true;
|
|
17
|
+
if (MEMORY_BLOCK_EMBEDDING.test(line))
|
|
18
|
+
memoryBlock = true;
|
|
19
|
+
}
|
|
20
|
+
return { openspec, frontendGen, transitionGates, memoryBlock };
|
|
21
|
+
}
|
|
22
|
+
export function lintRdRuntimeContract(skill) {
|
|
23
|
+
if (skill.name !== 'peaks-rd')
|
|
24
|
+
return [];
|
|
25
|
+
const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
|
|
26
|
+
const { openspec, frontendGen } = findContract(lines);
|
|
27
|
+
if (openspec && frontendGen)
|
|
28
|
+
return [];
|
|
29
|
+
const missing = [];
|
|
30
|
+
if (!openspec)
|
|
31
|
+
missing.push('OpenSpec usage');
|
|
32
|
+
if (!frontendGen)
|
|
33
|
+
missing.push('Frontend project generation');
|
|
34
|
+
return [{
|
|
35
|
+
catalogId: 'rl-peaks-rd-runtime-contract-001',
|
|
36
|
+
rule: 'peaks-rd SKILL.md must declare the runtime contract (OpenSpec usage + Frontend project generation)',
|
|
37
|
+
file: skill.path,
|
|
38
|
+
line: 1,
|
|
39
|
+
matchedText: `missing markers: ${missing.join(', ')}`
|
|
40
|
+
}];
|
|
41
|
+
}
|
|
42
|
+
export function lintUiTransitionGates(skill) {
|
|
43
|
+
if (skill.name !== 'peaks-ui')
|
|
44
|
+
return [];
|
|
45
|
+
const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
|
|
46
|
+
const { transitionGates } = findContract(lines);
|
|
47
|
+
if (transitionGates)
|
|
48
|
+
return [];
|
|
49
|
+
return [{
|
|
50
|
+
catalogId: 'rl-peaks-ui-transition-gates-001',
|
|
51
|
+
rule: 'peaks-ui SKILL.md must declare the Transition verification gates section',
|
|
52
|
+
file: skill.path,
|
|
53
|
+
line: 1,
|
|
54
|
+
matchedText: 'missing "Transition verification gates" heading'
|
|
55
|
+
}];
|
|
56
|
+
}
|
|
57
|
+
export function lintScTransitionGates(skill) {
|
|
58
|
+
if (skill.name !== 'peaks-sc')
|
|
59
|
+
return [];
|
|
60
|
+
const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
|
|
61
|
+
const { transitionGates } = findContract(lines);
|
|
62
|
+
if (transitionGates)
|
|
63
|
+
return [];
|
|
64
|
+
return [{
|
|
65
|
+
catalogId: 'rl-peaks-sc-transition-gates-001',
|
|
66
|
+
rule: 'peaks-sc SKILL.md must declare the Transition verification gates section',
|
|
67
|
+
file: skill.path,
|
|
68
|
+
line: 1,
|
|
69
|
+
matchedText: 'missing "Transition verification gates" heading'
|
|
70
|
+
}];
|
|
71
|
+
}
|
|
72
|
+
export function lintTxtRuntimeContract(skill) {
|
|
73
|
+
if (skill.name !== 'peaks-txt')
|
|
74
|
+
return [];
|
|
75
|
+
const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
|
|
76
|
+
const { transitionGates, memoryBlock } = findContract(lines);
|
|
77
|
+
if (transitionGates && memoryBlock)
|
|
78
|
+
return [];
|
|
79
|
+
const missing = [];
|
|
80
|
+
if (!transitionGates)
|
|
81
|
+
missing.push('Transition verification gates');
|
|
82
|
+
if (!memoryBlock)
|
|
83
|
+
missing.push('Memory block embedding rule');
|
|
84
|
+
return [{
|
|
85
|
+
catalogId: 'rl-peaks-txt-runtime-contract-001',
|
|
86
|
+
rule: 'peaks-txt SKILL.md must declare the runtime contract (Transition verification gates + Memory block embedding rule)',
|
|
87
|
+
file: skill.path,
|
|
88
|
+
line: 1,
|
|
89
|
+
matchedText: `missing markers: ${missing.join(', ')}`
|
|
90
|
+
}];
|
|
91
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P2-b sweep 009 — peaks-code SKILL.md runtime contract.
|
|
3
|
+
* Single enforcer closing 13 of the 33 remaining discovered
|
|
4
|
+
* lines (peaks-code-skill-md-6, 79, 93, 111, 119, 121, 123,
|
|
5
|
+
* 125, 153, 184, 188, 248).
|
|
6
|
+
*
|
|
7
|
+
* The contract is the section-marker skeleton that every
|
|
8
|
+
* peaks-code SKILL.md must declare. Each heading is one of
|
|
9
|
+
* the peaks-code runbook's red-line chapters; the enforcer
|
|
10
|
+
* checks the headings are present and emits a hit on each
|
|
11
|
+
* missing one.
|
|
12
|
+
*
|
|
13
|
+
* scope: peaks-code only.
|
|
14
|
+
*/
|
|
15
|
+
import type { LintHit, SkillFile } from './lint-style.js';
|
|
16
|
+
export declare function lintPeaksCodeRuntimeContract(skill: SkillFile): ReadonlyArray<LintHit>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const REQUIRED_HEADINGS = Object.freeze([
|
|
2
|
+
{ name: 'Scope (rl-8 red line)', pattern: /scope \(rl-8/i },
|
|
3
|
+
{ name: 'No auto-compact prose ban', pattern: /no auto-compact prose ban/i },
|
|
4
|
+
{ name: 'Superpowers 协作边界', pattern: /peaks-loop superpowers 协作边界/i },
|
|
5
|
+
{ name: 'npm-contract boundary', pattern: /npm-contract boundary/i },
|
|
6
|
+
{ name: 'Startup sequence', pattern: /peaks-loop startup sequence/i },
|
|
7
|
+
{ name: 'Step 0.8 job-shape detection', pattern: /step 0\.8.*job-shape detection/i },
|
|
8
|
+
{ name: 'Local intermediate artifact workspace', pattern: /peaks-loop local intermediate artifact workspace/i },
|
|
9
|
+
{ name: 'Pre-rd project scan checklist', pattern: /peaks-loop pre-rd project scan checklist/i },
|
|
10
|
+
{ name: 'Step 11 memory sediment', pattern: /step 11.*memory sediment/i },
|
|
11
|
+
{ name: '--enforce-job-mode (v3.1.2)', pattern: /enforce-job-mode \(v3\.1\.2\)/i }
|
|
12
|
+
]);
|
|
13
|
+
export function lintPeaksCodeRuntimeContract(skill) {
|
|
14
|
+
if (skill.name !== 'peaks-code')
|
|
15
|
+
return [];
|
|
16
|
+
const lines = skill.lines.length > 0 ? skill.lines : skill.body.split(/\r?\n/);
|
|
17
|
+
const missing = [];
|
|
18
|
+
for (const h of REQUIRED_HEADINGS) {
|
|
19
|
+
if (!lines.some((l) => h.pattern.test(l)))
|
|
20
|
+
missing.push(h.name);
|
|
21
|
+
}
|
|
22
|
+
if (missing.length === 0)
|
|
23
|
+
return [];
|
|
24
|
+
return [{
|
|
25
|
+
catalogId: 'rl-peaks-code-runtime-contract-001',
|
|
26
|
+
rule: 'peaks-code SKILL.md must declare the runbook section markers (Scope, no auto-compact, superpowers bridge, npm-contract, startup sequence, step 0.8 job-shape, local intermediate artifact workspace, pre-rd project scan checklist, step 11 memory sediment, --enforce-job-mode v3.1.2).',
|
|
27
|
+
file: skill.path,
|
|
28
|
+
line: 1,
|
|
29
|
+
matchedText: `missing markers: ${missing.join(', ')}`
|
|
30
|
+
}];
|
|
31
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P2-b sweep 010 — peaks-* runtime contract enforcer (excluding
|
|
3
|
+
* peaks-code which has its own sweep 009 enforcer; excluding
|
|
4
|
+
* peaks-prd / peaks-rd / peaks-qa / peaks-ui / peaks-sc / peaks-txt
|
|
5
|
+
* which have their own per-skill enforcers in earlier sweeps).
|
|
6
|
+
*
|
|
7
|
+
* Closes 8 of the remaining 22 discovered lines:
|
|
8
|
+
* - peaks-audit-skill-md-52, 70, 125, 133
|
|
9
|
+
* - peaks-content-skill-md-141, 235
|
|
10
|
+
* - peaks-ide-skill-md-12, 114
|
|
11
|
+
*
|
|
12
|
+
* The contract is the section-marker skeleton that every
|
|
13
|
+
* peaks-* SKILL.md must declare. Single enforcer scopes per
|
|
14
|
+
* skill via the SkillFile.name field.
|
|
15
|
+
*/
|
|
16
|
+
import type { LintHit, SkillFile } from './lint-style.js';
|
|
17
|
+
export declare const lintPeaksAuditRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
|
|
18
|
+
export declare const lintPeaksContentRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
|
|
19
|
+
export declare const lintPeaksIdeRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
|
|
20
|
+
export declare const lintPeaksDoctorRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
|
|
21
|
+
export declare const lintPeaksIssueFixOrchestratorRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
|
|
22
|
+
export declare const lintPeaksSopRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
|
|
23
|
+
export declare const lintPeaksSliceDecomposeRuntime: (skill: SkillFile) => ReadonlyArray<LintHit>;
|