peaks-loop 3.1.2 → 4.0.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +62 -12
- package/CHANGELOG.md +50 -36
- package/README-en.md +58 -240
- package/README.md +49 -325
- package/agents/karpathy-reviewer.md +3 -3
- package/dist/src/cli/cli-helpers.d.ts +18 -0
- package/dist/src/cli/cli-helpers.js +8 -0
- package/dist/src/cli/commands/adapter-commands.d.ts +30 -0
- package/dist/src/cli/commands/adapter-commands.js +35 -0
- package/dist/src/cli/commands/context-commands.d.ts +1 -1
- package/dist/src/cli/commands/context-commands.js +1 -1
- package/dist/src/cli/commands/contract-commands.d.ts +1 -1
- package/dist/src/cli/commands/contract-commands.js +1 -1
- package/dist/src/cli/commands/core/session-command.js +12 -0
- package/dist/src/cli/commands/core/skill-command.js +4 -4
- package/dist/src/cli/commands/dispatch-commands.js +2 -2
- package/dist/src/cli/commands/job-commands.js +5 -5
- package/dist/src/cli/commands/observability-commands.js +1 -1
- package/dist/src/cli/commands/perf-audit-commands.js +2 -2
- package/dist/src/cli/commands/security-audit-commands.js +2 -2
- package/dist/src/cli/commands/sediment-commands.d.ts +80 -0
- package/dist/src/cli/commands/sediment-commands.js +640 -0
- package/dist/src/cli/commands/session-migrate-skill-name.d.ts +17 -0
- package/dist/src/cli/commands/session-migrate-skill-name.js +41 -0
- package/dist/src/cli/commands/skill-visibility.d.ts +8 -0
- package/dist/src/cli/commands/skill-visibility.js +63 -0
- package/dist/src/cli/commands/slice-commands.js +2 -2
- package/dist/src/cli/commands/solo-commands.d.ts +2 -2
- package/dist/src/cli/commands/solo-commands.js +8 -8
- package/dist/src/cli/commands/sub-agent-commands.d.ts +1 -1
- package/dist/src/cli/commands/sub-agent-commands.js +1 -1
- package/dist/src/cli/commands/understand-commands.js +1 -1
- package/dist/src/cli/commands/upgrade-commands.d.ts +1 -1
- package/dist/src/cli/commands/upgrade-commands.js +3 -3
- package/dist/src/cli/commands/user-touchpoint-commands.js +1 -1
- package/dist/src/cli/commands/verdict-aggregate-command.d.ts +1 -1
- package/dist/src/cli/commands/verdict-aggregate-command.js +2 -2
- package/dist/src/cli/commands/workflow-commands.js +2 -2
- package/dist/src/cli/commands/workspace/init-command.d.ts +3 -3
- package/dist/src/cli/commands/workspace/init-command.js +7 -7
- package/dist/src/cli/program.js +19 -2
- package/dist/src/services/adapter/adapter.d.ts +27 -0
- package/dist/src/services/adapter/adapter.js +5 -0
- package/dist/src/services/adapter/auto-adapter.d.ts +11 -0
- package/dist/src/services/adapter/auto-adapter.js +15 -0
- package/dist/src/services/adapter/claude-adapter.d.ts +14 -0
- package/dist/src/services/adapter/claude-adapter.js +40 -0
- package/dist/src/services/adapter/codex-adapter.d.ts +14 -0
- package/dist/src/services/adapter/codex-adapter.js +14 -0
- package/dist/src/services/adapter/copilot-adapter.d.ts +14 -0
- package/dist/src/services/adapter/copilot-adapter.js +14 -0
- package/dist/src/services/audit/enforcers/solo-code-ban.d.ts +1 -1
- package/dist/src/services/audit/enforcers/solo-code-ban.js +2 -2
- package/dist/src/services/audit/red-line-catalog.js +1 -1
- package/dist/src/services/audit/scanners/skills-tree-scanner.js +22 -0
- package/dist/src/services/context/auto-compact-dispatcher.d.ts +1 -1
- package/dist/src/services/dispatch/batch-counter.js +1 -1
- package/dist/src/services/dispatch/leak-detector.js +1 -1
- package/dist/src/services/doctor/doctor-service.js +2 -2
- package/dist/src/services/job/job-resource-snapshot.js +29 -1
- package/dist/src/services/memory/project-memory-service.js +1 -1
- package/dist/src/services/migrate-skill-name/migrate.d.ts +17 -0
- package/dist/src/services/migrate-skill-name/migrate.js +152 -0
- package/dist/src/services/migrate-skill-name/schema.d.ts +42 -0
- package/dist/src/services/migrate-skill-name/schema.js +25 -0
- package/dist/src/services/observability/aggregation.d.ts +1 -1
- package/dist/src/services/observability/aggregation.js +1 -1
- package/dist/src/services/perf/perf-baseline-service.d.ts +1 -1
- package/dist/src/services/perf/perf-baseline-service.js +1 -1
- package/dist/src/services/prd/handoff-types.d.ts +1 -1
- package/dist/src/services/prd/handoff-types.js +1 -1
- package/dist/src/services/progress/progress-service.d.ts +1 -1
- package/dist/src/services/progress/progress-service.js +1 -1
- package/dist/src/services/rd/standards-diagnostic.js +1 -1
- package/dist/src/services/recommendations/capability-seed-mappings.js +1 -1
- package/dist/src/services/sc/sc-service.js +1 -1
- package/dist/src/services/sediment/dispose-confirm.d.ts +9 -0
- package/dist/src/services/sediment/dispose-confirm.js +5 -0
- package/dist/src/services/sediment/json-schema.d.ts +247 -0
- package/dist/src/services/sediment/json-schema.js +26 -0
- package/dist/src/services/sediment/manifest-lint.d.ts +13 -0
- package/dist/src/services/sediment/manifest-lint.js +11 -0
- package/dist/src/services/sediment/pool-paths.d.ts +22 -0
- package/dist/src/services/sediment/pool-paths.js +25 -0
- package/dist/src/services/sediment/pool-read.d.ts +20 -0
- package/dist/src/services/sediment/pool-read.js +73 -0
- package/dist/src/services/sediment/pool-rebuild-index.d.ts +15 -0
- package/dist/src/services/sediment/pool-rebuild-index.js +28 -0
- package/dist/src/services/sediment/pool-write.d.ts +14 -0
- package/dist/src/services/sediment/pool-write.js +25 -0
- package/dist/src/services/sediment/promotion-gate.d.ts +12 -0
- package/dist/src/services/sediment/promotion-gate.js +20 -0
- package/dist/src/services/sediment/types.d.ts +52 -0
- package/dist/src/services/sediment/types.js +1 -0
- package/dist/src/services/session/binding-store.d.ts +1 -1
- package/dist/src/services/session/binding-store.js +1 -1
- package/dist/src/services/session/caller-id-types.d.ts +1 -1
- package/dist/src/services/session/session-manager.d.ts +1 -1
- package/dist/src/services/session/session-manager.js +1 -1
- package/dist/src/services/skill/resume-detector.js +1 -1
- package/dist/src/services/skill/skill-scheduler.d.ts +1 -1
- package/dist/src/services/skill/skill-scheduler.js +1 -1
- package/dist/src/services/skillhub/release-diff.d.ts +18 -0
- package/dist/src/services/skillhub/release-diff.js +38 -0
- package/dist/src/services/skillhub/release-export.d.ts +8 -0
- package/dist/src/services/skillhub/release-export.js +31 -0
- package/dist/src/services/skillhub/release-gc-blobs.d.ts +13 -0
- package/dist/src/services/skillhub/release-gc-blobs.js +32 -0
- package/dist/src/services/skillhub/release-import.d.ts +7 -0
- package/dist/src/services/skillhub/release-import.js +59 -0
- package/dist/src/services/skillhub/release-retain.d.ts +23 -0
- package/dist/src/services/skillhub/release-retain.js +89 -0
- package/dist/src/services/skillhub/sqlite-store.d.ts +22 -0
- package/dist/src/services/skillhub/sqlite-store.js +47 -0
- package/dist/src/services/skillhub/tar-runtime.d.ts +21 -0
- package/dist/src/services/skillhub/tar-runtime.js +91 -0
- package/dist/src/services/skillhub/types.d.ts +105 -0
- package/dist/src/services/skillhub/types.js +1 -0
- package/dist/src/services/skills/skill-conformance-service.js +8 -5
- package/dist/src/services/skills/skill-presence-service.d.ts +4 -4
- package/dist/src/services/skills/skill-presence-service.js +2 -2
- package/dist/src/services/skills/skill-registry.js +27 -0
- package/dist/src/services/skills/skill-runbook-service.js +2 -2
- package/dist/src/services/slice/slice-check-service.js +1 -1
- package/dist/src/services/slice/slice-check-types.d.ts +1 -1
- package/dist/src/services/slice/slice-check-types.js +1 -1
- package/dist/src/services/slice/slice-decompose-types.d.ts +1 -1
- package/dist/src/services/slice/slice-decompose-types.js +1 -1
- package/dist/src/services/solo/auto-compact-orchestrator.d.ts +1 -1
- package/dist/src/services/solo/auto-compact-orchestrator.js +2 -2
- package/dist/src/services/solo/dag-orchestrator.d.ts +3 -3
- package/dist/src/services/solo/dag-orchestrator.js +4 -4
- package/dist/src/services/solo/mode-gate.d.ts +2 -2
- package/dist/src/services/solo/post-compact-detector.js +2 -2
- package/dist/src/services/solo/status-line-renderer.d.ts +4 -4
- package/dist/src/services/standards/missing-standards-detector.d.ts +1 -1
- package/dist/src/services/standards/missing-standards-detector.js +1 -1
- package/dist/src/services/standards/project-standards-service.d.ts +1 -1
- package/dist/src/services/standards/project-standards-service.js +4 -4
- package/dist/src/services/understand/understand-types.d.ts +1 -1
- package/dist/src/services/upgrade/1x-detector-service.js +1 -1
- package/dist/src/services/upgrade/upgrade-service.d.ts +34 -0
- package/dist/src/services/upgrade/upgrade-service.js +52 -30
- package/dist/src/services/verdict/verdict-aggregator.d.ts +1 -1
- package/dist/src/services/workflow/workflow-router-service.d.ts +1 -1
- package/dist/src/services/workflow/workflow-router-service.js +3 -3
- package/dist/src/services/workspace/claude-settings-template.d.ts +1 -1
- package/dist/src/services/workspace/claude-settings-template.js +2 -2
- package/dist/src/services/workspace/workspace-claude-settings-materializer.d.ts +1 -1
- package/dist/src/services/workspace/workspace-claude-settings-materializer.js +1 -1
- package/dist/src/services/workspace/workspace-service.d.ts +4 -4
- package/dist/src/services/workspace/workspace-service.js +2 -2
- package/dist/src/shared/paths.d.ts +1 -1
- package/dist/src/shared/paths.js +1 -1
- package/dist/src/shared/version.d.ts +1 -1
- package/dist/src/shared/version.js +1 -1
- package/dist/src/skills/peaks-maker/index.d.ts +5 -0
- package/dist/src/skills/peaks-maker/index.js +32 -0
- package/package.json +8 -3
- package/scripts/install-skills.mjs +29 -4
- package/skills/{peaks-prd → bee/peaks-prd}/SKILL.md +8 -2
- package/skills/{peaks-prd → bee/peaks-prd}/references/workflow.md +1 -1
- package/skills/{peaks-qa → bee/peaks-qa}/SKILL.md +10 -4
- package/skills/{peaks-qa → bee/peaks-qa}/references/browser-validation-contracts.md +2 -2
- package/skills/{peaks-qa → bee/peaks-qa}/references/external-capability-guidance.md +1 -1
- package/skills/{peaks-qa → bee/peaks-qa}/references/qa-fanout-contract.md +3 -3
- package/skills/{peaks-qa → bee/peaks-qa}/references/qa-sub-agent-dispatch.md +1 -1
- package/skills/{peaks-rd → bee/peaks-rd}/SKILL.md +13 -6
- package/skills/{peaks-rd → bee/peaks-rd}/references/browser-self-test-contracts.md +1 -1
- package/skills/{peaks-rd → bee/peaks-rd}/references/mock-data-placement.md +1 -1
- package/skills/{peaks-rd → bee/peaks-rd}/references/parallel-review-fanout.md +1 -1
- package/skills/{peaks-rd → bee/peaks-rd}/references/rd-runbook.md +1 -1
- package/skills/{peaks-rd → bee/peaks-rd}/references/rd-sub-agent-dispatch.md +2 -2
- package/skills/{peaks-rd → bee/peaks-rd}/references/rd-transition-gates.md +1 -1
- package/skills/{peaks-rd → bee/peaks-rd}/references/skill-presence-and-title.md +1 -1
- package/skills/{peaks-reviewer → bee/peaks-reviewer}/SKILL.md +2 -2
- package/skills/{peaks-sc → bee/peaks-sc}/SKILL.md +7 -1
- package/skills/{peaks-txt → bee/peaks-txt}/SKILL.md +9 -3
- package/skills/{peaks-ui → bee/peaks-ui}/SKILL.md +11 -5
- package/skills/peaks-audit/SKILL.md +1 -1
- package/skills/{peaks-solo → peaks-code}/SKILL.md +9 -9
- package/skills/{peaks-solo → peaks-code}/references/a2a-artifact-mapping.md +2 -2
- package/skills/{peaks-solo → peaks-code}/references/anchoring-and-session-info.md +4 -4
- package/skills/{peaks-solo → peaks-code}/references/artifact-contracts.md +2 -2
- package/skills/{peaks-solo → peaks-code}/references/browser-workflow.md +1 -1
- package/skills/peaks-code/references/command-migration.md +3 -0
- package/skills/{peaks-solo → peaks-code}/references/completion-handoff.md +2 -2
- package/skills/{peaks-solo → peaks-code}/references/context-governance.md +2 -2
- package/skills/{peaks-solo → peaks-code}/references/frontend-only-mode.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/local-artifact-workspace.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/micro-cycle.md +9 -9
- package/skills/{peaks-solo → peaks-code}/references/mode-selection-with-stale-presence.md +12 -12
- package/skills/{peaks-solo → peaks-code}/references/mode-selection.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/openspec-workflow.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/project-scan-checklist.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/refactor-mode.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/resume-detection.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/runbook.md +5 -5
- package/skills/{peaks-solo → peaks-code}/references/skill-presence-and-title.md +3 -3
- package/skills/{peaks-solo → peaks-code}/references/standards-preflight.md +1 -1
- package/skills/{peaks-solo → peaks-code}/references/step-0-55-1x-detection.md +5 -5
- package/skills/{peaks-solo → peaks-code}/references/sub-agent-dispatch.md +10 -10
- package/skills/{peaks-solo → peaks-code}/references/swarm-dispatch-contract.md +7 -7
- package/skills/{peaks-solo → peaks-code}/references/workflow-gates-and-types.md +3 -3
- package/skills/peaks-doctor/SKILL.md +1 -1
- package/skills/peaks-doctor/references/doctor-check-catalog.md +1 -1
- package/skills/peaks-final-review/SKILL.md +3 -3
- package/skills/peaks-final-review/references/4-dimensions.md +1 -1
- package/skills/peaks-ide/SKILL.md +1 -1
- package/skills/{peaks-solo-resume → peaks-resume}/SKILL.md +14 -14
- package/skills/peaks-sop/SKILL.md +1 -1
- package/skills/{peaks-solo-status → peaks-status}/SKILL.md +13 -13
- package/skills/{peaks-solo-test → peaks-test}/SKILL.md +11 -11
- package/skills/peaks-solo/references/command-migration.md +0 -3
- /package/skills/{peaks-perf-audit → bee/peaks-perf-audit}/SKILL.md +0 -0
- /package/skills/{peaks-perf-audit → bee/peaks-perf-audit}/references/audit-protocol.md +0 -0
- /package/skills/{peaks-prd → bee/peaks-prd}/references/artifact-contracts.md +0 -0
- /package/skills/{peaks-prd → bee/peaks-prd}/references/artifact-per-request.md +0 -0
- /package/skills/{peaks-prd → bee/peaks-prd}/references/command-migration.md +0 -0
- /package/skills/{peaks-prd → bee/peaks-prd}/references/prd-for-multi-pass.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/artifact-contracts.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/artifact-per-request.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/codegraph-regression-focus.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/command-migration.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/openspec-validation-gate.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-compact-handoff.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-context-governance.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-gstack-integration.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-local-artifacts.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-matt-pocock-integration.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-perf-test-plan.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-refactor-role.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-runbook.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-security-test-plan.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-skill-presence.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-standards-preflight.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/qa-transition-gates.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/reading-handoff-frontmatter.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/regression-gates.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/requirement-boundary-recheck.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/test-case-generation.md +0 -0
- /package/skills/{peaks-qa → bee/peaks-qa}/references/test-report-output.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/artifact-and-standards-output.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/artifact-contracts.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/artifact-per-request.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/browser-action-wrapper.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/code-reviewer-4dim-hint.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/codegraph-project-analysis.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/command-migration.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/compact-handoff.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/external-references.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/frontend-project-generation.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/karpathy-reviewer-prompt.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/library-version-awareness.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/mandatory-perf-baseline.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/matt-pocock-integration.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/ocr-integration.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/openspec-cli.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/rd-context-governance.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/rd-fanout-contracts.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/rd-gstack-integration.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/rd-standards-preflight.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/reading-v2-slice-results.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/refactor-workflow.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/v2-12-fanout-collapse.md +0 -0
- /package/skills/{peaks-rd → bee/peaks-rd}/references/writing-handoff-frontmatter.md +0 -0
- /package/skills/{peaks-reviewer → bee/peaks-reviewer}/references/reviewer-prompt.md +0 -0
- /package/skills/{peaks-reviewer → bee/peaks-reviewer}/references/reviewer-schema.md +0 -0
- /package/skills/{peaks-sc → bee/peaks-sc}/references/artifact-contracts.md +0 -0
- /package/skills/{peaks-sc → bee/peaks-sc}/references/artifact-retention.md +0 -0
- /package/skills/{peaks-sc → bee/peaks-sc}/references/command-migration.md +0 -0
- /package/skills/{peaks-sc → bee/peaks-sc}/references/openspec-commit-boundaries.md +0 -0
- /package/skills/{peaks-security-audit → bee/peaks-security-audit}/SKILL.md +0 -0
- /package/skills/{peaks-security-audit → bee/peaks-security-audit}/references/audit-protocol.md +0 -0
- /package/skills/{peaks-txt → bee/peaks-txt}/references/artifact-contracts.md +0 -0
- /package/skills/{peaks-txt → bee/peaks-txt}/references/command-migration.md +0 -0
- /package/skills/{peaks-txt → bee/peaks-txt}/references/context-capsule.md +0 -0
- /package/skills/{peaks-ui → bee/peaks-ui}/references/artifact-contracts.md +0 -0
- /package/skills/{peaks-ui → bee/peaks-ui}/references/artifact-per-request.md +0 -0
- /package/skills/{peaks-ui → bee/peaks-ui}/references/command-migration.md +0 -0
- /package/skills/{peaks-ui → bee/peaks-ui}/references/workflow.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/boundaries.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/checkpoint-resume.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/codegraph-orchestration.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/cross-date-session-check.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/dag-orchestrator.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/envelope-contract.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/existing-system-extraction.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/external-references.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/external-skill-invocation.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/fanout-mandatory.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/fast-mode.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/gstack-integration.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/headroom-integration.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/job-loop.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/periodic-checkpoint.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/playwright-mcp-multi-terminal.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/project-memory-loading.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/quality-gate-cheatsheet.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/step-0-8-gate.md +0 -0
- /package/skills/{peaks-solo → peaks-code}/references/workflow.md +0 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const BeeManifestSchema: z.ZodEffects<z.ZodObject<{
|
|
3
|
+
schemaVersion: z.ZodLiteral<"peaks.bee/1">;
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
source: z.ZodEnum<["system", "user"]>;
|
|
6
|
+
promotion_status: z.ZodEnum<["candidate", "stable", "retired", "system-stable"]>;
|
|
7
|
+
description: z.ZodString;
|
|
8
|
+
segments: z.ZodArray<z.ZodObject<{
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
inputs: z.ZodArray<z.ZodObject<{
|
|
11
|
+
name: z.ZodString;
|
|
12
|
+
type: z.ZodEnum<["string", "number", "boolean", "json"]>;
|
|
13
|
+
required: z.ZodBoolean;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
name: string;
|
|
16
|
+
type: "string" | "number" | "boolean" | "json";
|
|
17
|
+
required: boolean;
|
|
18
|
+
}, {
|
|
19
|
+
name: string;
|
|
20
|
+
type: "string" | "number" | "boolean" | "json";
|
|
21
|
+
required: boolean;
|
|
22
|
+
}>, "many">;
|
|
23
|
+
outputs: z.ZodArray<z.ZodObject<{
|
|
24
|
+
name: z.ZodString;
|
|
25
|
+
type: z.ZodEnum<["string", "number", "boolean", "json"]>;
|
|
26
|
+
required: z.ZodBoolean;
|
|
27
|
+
}, "strip", z.ZodTypeAny, {
|
|
28
|
+
name: string;
|
|
29
|
+
type: "string" | "number" | "boolean" | "json";
|
|
30
|
+
required: boolean;
|
|
31
|
+
}, {
|
|
32
|
+
name: string;
|
|
33
|
+
type: "string" | "number" | "boolean" | "json";
|
|
34
|
+
required: boolean;
|
|
35
|
+
}>, "many">;
|
|
36
|
+
sideEffects: z.ZodArray<z.ZodString, "many">;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
name: string;
|
|
39
|
+
outputs: {
|
|
40
|
+
name: string;
|
|
41
|
+
type: "string" | "number" | "boolean" | "json";
|
|
42
|
+
required: boolean;
|
|
43
|
+
}[];
|
|
44
|
+
inputs: {
|
|
45
|
+
name: string;
|
|
46
|
+
type: "string" | "number" | "boolean" | "json";
|
|
47
|
+
required: boolean;
|
|
48
|
+
}[];
|
|
49
|
+
sideEffects: string[];
|
|
50
|
+
}, {
|
|
51
|
+
name: string;
|
|
52
|
+
outputs: {
|
|
53
|
+
name: string;
|
|
54
|
+
type: "string" | "number" | "boolean" | "json";
|
|
55
|
+
required: boolean;
|
|
56
|
+
}[];
|
|
57
|
+
inputs: {
|
|
58
|
+
name: string;
|
|
59
|
+
type: "string" | "number" | "boolean" | "json";
|
|
60
|
+
required: boolean;
|
|
61
|
+
}[];
|
|
62
|
+
sideEffects: string[];
|
|
63
|
+
}>, "many">;
|
|
64
|
+
entrypoint: z.ZodObject<{
|
|
65
|
+
preamble: z.ZodString;
|
|
66
|
+
refs: z.ZodArray<z.ZodObject<{
|
|
67
|
+
path: z.ZodString;
|
|
68
|
+
kind: z.ZodEnum<["file", "dir", "script"]>;
|
|
69
|
+
}, "strip", z.ZodTypeAny, {
|
|
70
|
+
path: string;
|
|
71
|
+
kind: "file" | "script" | "dir";
|
|
72
|
+
}, {
|
|
73
|
+
path: string;
|
|
74
|
+
kind: "file" | "script" | "dir";
|
|
75
|
+
}>, "many">;
|
|
76
|
+
}, "strip", z.ZodTypeAny, {
|
|
77
|
+
preamble: string;
|
|
78
|
+
refs: {
|
|
79
|
+
path: string;
|
|
80
|
+
kind: "file" | "script" | "dir";
|
|
81
|
+
}[];
|
|
82
|
+
}, {
|
|
83
|
+
preamble: string;
|
|
84
|
+
refs: {
|
|
85
|
+
path: string;
|
|
86
|
+
kind: "file" | "script" | "dir";
|
|
87
|
+
}[];
|
|
88
|
+
}>;
|
|
89
|
+
promotion: z.ZodObject<{
|
|
90
|
+
minCycles: z.ZodNumber;
|
|
91
|
+
requiresHumanApproval: z.ZodBoolean;
|
|
92
|
+
requiresSmokeTest: z.ZodBoolean;
|
|
93
|
+
retireOnMissesInRow: z.ZodOptional<z.ZodNumber>;
|
|
94
|
+
}, "strip", z.ZodTypeAny, {
|
|
95
|
+
minCycles: number;
|
|
96
|
+
requiresHumanApproval: boolean;
|
|
97
|
+
requiresSmokeTest: boolean;
|
|
98
|
+
retireOnMissesInRow?: number | undefined;
|
|
99
|
+
}, {
|
|
100
|
+
minCycles: number;
|
|
101
|
+
requiresHumanApproval: boolean;
|
|
102
|
+
requiresSmokeTest: boolean;
|
|
103
|
+
retireOnMissesInRow?: number | undefined;
|
|
104
|
+
}>;
|
|
105
|
+
createdBy: z.ZodEnum<["human", "llm"]>;
|
|
106
|
+
lastTouchedAt: z.ZodString;
|
|
107
|
+
}, "strip", z.ZodTypeAny, {
|
|
108
|
+
name: string;
|
|
109
|
+
source: "user" | "system";
|
|
110
|
+
description: string;
|
|
111
|
+
schemaVersion: "peaks.bee/1";
|
|
112
|
+
promotion: {
|
|
113
|
+
minCycles: number;
|
|
114
|
+
requiresHumanApproval: boolean;
|
|
115
|
+
requiresSmokeTest: boolean;
|
|
116
|
+
retireOnMissesInRow?: number | undefined;
|
|
117
|
+
};
|
|
118
|
+
segments: {
|
|
119
|
+
name: string;
|
|
120
|
+
outputs: {
|
|
121
|
+
name: string;
|
|
122
|
+
type: "string" | "number" | "boolean" | "json";
|
|
123
|
+
required: boolean;
|
|
124
|
+
}[];
|
|
125
|
+
inputs: {
|
|
126
|
+
name: string;
|
|
127
|
+
type: "string" | "number" | "boolean" | "json";
|
|
128
|
+
required: boolean;
|
|
129
|
+
}[];
|
|
130
|
+
sideEffects: string[];
|
|
131
|
+
}[];
|
|
132
|
+
promotion_status: "candidate" | "stable" | "retired" | "system-stable";
|
|
133
|
+
entrypoint: {
|
|
134
|
+
preamble: string;
|
|
135
|
+
refs: {
|
|
136
|
+
path: string;
|
|
137
|
+
kind: "file" | "script" | "dir";
|
|
138
|
+
}[];
|
|
139
|
+
};
|
|
140
|
+
createdBy: "llm" | "human";
|
|
141
|
+
lastTouchedAt: string;
|
|
142
|
+
}, {
|
|
143
|
+
name: string;
|
|
144
|
+
source: "user" | "system";
|
|
145
|
+
description: string;
|
|
146
|
+
schemaVersion: "peaks.bee/1";
|
|
147
|
+
promotion: {
|
|
148
|
+
minCycles: number;
|
|
149
|
+
requiresHumanApproval: boolean;
|
|
150
|
+
requiresSmokeTest: boolean;
|
|
151
|
+
retireOnMissesInRow?: number | undefined;
|
|
152
|
+
};
|
|
153
|
+
segments: {
|
|
154
|
+
name: string;
|
|
155
|
+
outputs: {
|
|
156
|
+
name: string;
|
|
157
|
+
type: "string" | "number" | "boolean" | "json";
|
|
158
|
+
required: boolean;
|
|
159
|
+
}[];
|
|
160
|
+
inputs: {
|
|
161
|
+
name: string;
|
|
162
|
+
type: "string" | "number" | "boolean" | "json";
|
|
163
|
+
required: boolean;
|
|
164
|
+
}[];
|
|
165
|
+
sideEffects: string[];
|
|
166
|
+
}[];
|
|
167
|
+
promotion_status: "candidate" | "stable" | "retired" | "system-stable";
|
|
168
|
+
entrypoint: {
|
|
169
|
+
preamble: string;
|
|
170
|
+
refs: {
|
|
171
|
+
path: string;
|
|
172
|
+
kind: "file" | "script" | "dir";
|
|
173
|
+
}[];
|
|
174
|
+
};
|
|
175
|
+
createdBy: "llm" | "human";
|
|
176
|
+
lastTouchedAt: string;
|
|
177
|
+
}>, {
|
|
178
|
+
name: string;
|
|
179
|
+
source: "user" | "system";
|
|
180
|
+
description: string;
|
|
181
|
+
schemaVersion: "peaks.bee/1";
|
|
182
|
+
promotion: {
|
|
183
|
+
minCycles: number;
|
|
184
|
+
requiresHumanApproval: boolean;
|
|
185
|
+
requiresSmokeTest: boolean;
|
|
186
|
+
retireOnMissesInRow?: number | undefined;
|
|
187
|
+
};
|
|
188
|
+
segments: {
|
|
189
|
+
name: string;
|
|
190
|
+
outputs: {
|
|
191
|
+
name: string;
|
|
192
|
+
type: "string" | "number" | "boolean" | "json";
|
|
193
|
+
required: boolean;
|
|
194
|
+
}[];
|
|
195
|
+
inputs: {
|
|
196
|
+
name: string;
|
|
197
|
+
type: "string" | "number" | "boolean" | "json";
|
|
198
|
+
required: boolean;
|
|
199
|
+
}[];
|
|
200
|
+
sideEffects: string[];
|
|
201
|
+
}[];
|
|
202
|
+
promotion_status: "candidate" | "stable" | "retired" | "system-stable";
|
|
203
|
+
entrypoint: {
|
|
204
|
+
preamble: string;
|
|
205
|
+
refs: {
|
|
206
|
+
path: string;
|
|
207
|
+
kind: "file" | "script" | "dir";
|
|
208
|
+
}[];
|
|
209
|
+
};
|
|
210
|
+
createdBy: "llm" | "human";
|
|
211
|
+
lastTouchedAt: string;
|
|
212
|
+
}, {
|
|
213
|
+
name: string;
|
|
214
|
+
source: "user" | "system";
|
|
215
|
+
description: string;
|
|
216
|
+
schemaVersion: "peaks.bee/1";
|
|
217
|
+
promotion: {
|
|
218
|
+
minCycles: number;
|
|
219
|
+
requiresHumanApproval: boolean;
|
|
220
|
+
requiresSmokeTest: boolean;
|
|
221
|
+
retireOnMissesInRow?: number | undefined;
|
|
222
|
+
};
|
|
223
|
+
segments: {
|
|
224
|
+
name: string;
|
|
225
|
+
outputs: {
|
|
226
|
+
name: string;
|
|
227
|
+
type: "string" | "number" | "boolean" | "json";
|
|
228
|
+
required: boolean;
|
|
229
|
+
}[];
|
|
230
|
+
inputs: {
|
|
231
|
+
name: string;
|
|
232
|
+
type: "string" | "number" | "boolean" | "json";
|
|
233
|
+
required: boolean;
|
|
234
|
+
}[];
|
|
235
|
+
sideEffects: string[];
|
|
236
|
+
}[];
|
|
237
|
+
promotion_status: "candidate" | "stable" | "retired" | "system-stable";
|
|
238
|
+
entrypoint: {
|
|
239
|
+
preamble: string;
|
|
240
|
+
refs: {
|
|
241
|
+
path: string;
|
|
242
|
+
kind: "file" | "script" | "dir";
|
|
243
|
+
}[];
|
|
244
|
+
};
|
|
245
|
+
createdBy: "llm" | "human";
|
|
246
|
+
lastTouchedAt: string;
|
|
247
|
+
}>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const BeeManifestSchema = z.object({
|
|
3
|
+
schemaVersion: z.literal("peaks.bee/1"),
|
|
4
|
+
name: z.string().regex(/^bee-[a-z0-9][a-z0-9-]*$|^peaks-[a-z0-9][a-z0-9-]*$/),
|
|
5
|
+
source: z.enum(["system", "user"]),
|
|
6
|
+
promotion_status: z.enum(["candidate", "stable", "retired", "system-stable"]),
|
|
7
|
+
description: z.string().min(1).max(200),
|
|
8
|
+
segments: z.array(z.object({
|
|
9
|
+
name: z.string(),
|
|
10
|
+
inputs: z.array(z.object({ name: z.string(), type: z.enum(["string", "number", "boolean", "json"]), required: z.boolean() })),
|
|
11
|
+
outputs: z.array(z.object({ name: z.string(), type: z.enum(["string", "number", "boolean", "json"]), required: z.boolean() })),
|
|
12
|
+
sideEffects: z.array(z.string()),
|
|
13
|
+
})),
|
|
14
|
+
entrypoint: z.object({
|
|
15
|
+
preamble: z.string(),
|
|
16
|
+
refs: z.array(z.object({ path: z.string(), kind: z.enum(["file", "dir", "script"]) })),
|
|
17
|
+
}),
|
|
18
|
+
promotion: z.object({
|
|
19
|
+
minCycles: z.number().int().nonnegative(),
|
|
20
|
+
requiresHumanApproval: z.boolean(),
|
|
21
|
+
requiresSmokeTest: z.boolean(),
|
|
22
|
+
retireOnMissesInRow: z.number().int().positive().optional(),
|
|
23
|
+
}),
|
|
24
|
+
createdBy: z.enum(["human", "llm"]),
|
|
25
|
+
lastTouchedAt: z.string().datetime(),
|
|
26
|
+
}).refine((m) => !(m.source === "system" && m.promotion_status !== "system-stable"), { message: "source=system must have promotion_status=system-stable" });
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BeeManifest } from "./types.js";
|
|
2
|
+
export type Finding = {
|
|
3
|
+
path: string;
|
|
4
|
+
message: string;
|
|
5
|
+
};
|
|
6
|
+
export type LintResult = {
|
|
7
|
+
ok: true;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
findings: Finding[];
|
|
11
|
+
};
|
|
12
|
+
export declare function lintManifest(m: unknown): LintResult;
|
|
13
|
+
export declare function lintManifestStrict(m: unknown): BeeManifest;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BeeManifestSchema } from "./json-schema.js";
|
|
2
|
+
export function lintManifest(m) {
|
|
3
|
+
const r = BeeManifestSchema.safeParse(m);
|
|
4
|
+
if (r.success)
|
|
5
|
+
return { ok: true };
|
|
6
|
+
return { ok: false, findings: r.error.issues.map((i) => ({ path: i.path.join("."), message: i.message })) };
|
|
7
|
+
}
|
|
8
|
+
export function lintManifestStrict(m) {
|
|
9
|
+
const r = BeeManifestSchema.parse(m);
|
|
10
|
+
return r;
|
|
11
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export declare class SYSTEM_PATH_FORBIDDEN extends Error {
|
|
2
|
+
constructor(p: string);
|
|
3
|
+
}
|
|
4
|
+
export interface Home {
|
|
5
|
+
home: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const resolvePoolRoot: ({ home }: Home) => string;
|
|
8
|
+
export declare const resolveSystemDir: ({ home }: Home) => string;
|
|
9
|
+
export declare const resolveUserBeesDir: ({ home }: Home) => string;
|
|
10
|
+
export declare const resolveUserBeeDir: ({ home }: Home, name: string) => string;
|
|
11
|
+
export declare const resolveSegmentsDir: ({ home }: Home) => string;
|
|
12
|
+
export declare const resolveSegmentDir: ({ home }: Home, name: string) => string;
|
|
13
|
+
export declare const resolveStateDbPath: ({ home }: Home) => string;
|
|
14
|
+
export declare const resolveBlobsDir: ({ home }: Home) => string;
|
|
15
|
+
/**
|
|
16
|
+
* Normalize `..` segments via `path.resolve` before splitting, so a path like
|
|
17
|
+
* `/h/foo/../.system/evil` collapses to `/h/.system/evil` and its `.system`
|
|
18
|
+
* segment is correctly identified. Also defends against Windows-style
|
|
19
|
+
* traversal patterns such as `..\\.system\\evil`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function isSystemPath(p: string): boolean;
|
|
22
|
+
export declare function assertNotSystemPath(p: string): void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { join, resolve as pathResolve } from "node:path";
|
|
2
|
+
export class SYSTEM_PATH_FORBIDDEN extends Error {
|
|
3
|
+
constructor(p) { super(`SYSTEM_PATH_FORBIDDEN: refusing to write ${p}`); }
|
|
4
|
+
}
|
|
5
|
+
export const resolvePoolRoot = ({ home }) => join(home, ".peaks", "skills");
|
|
6
|
+
export const resolveSystemDir = ({ home }) => join(resolvePoolRoot({ home }), ".system");
|
|
7
|
+
export const resolveUserBeesDir = ({ home }) => join(resolvePoolRoot({ home }), "bees");
|
|
8
|
+
export const resolveUserBeeDir = ({ home }, name) => join(resolveUserBeesDir({ home }), name);
|
|
9
|
+
export const resolveSegmentsDir = ({ home }) => join(resolvePoolRoot({ home }), "segments");
|
|
10
|
+
export const resolveSegmentDir = ({ home }, name) => join(resolveSegmentsDir({ home }), name);
|
|
11
|
+
export const resolveStateDbPath = ({ home }) => join(resolvePoolRoot({ home }), "state.db");
|
|
12
|
+
export const resolveBlobsDir = ({ home }) => join(resolvePoolRoot({ home }), "blobs");
|
|
13
|
+
/**
|
|
14
|
+
* Normalize `..` segments via `path.resolve` before splitting, so a path like
|
|
15
|
+
* `/h/foo/../.system/evil` collapses to `/h/.system/evil` and its `.system`
|
|
16
|
+
* segment is correctly identified. Also defends against Windows-style
|
|
17
|
+
* traversal patterns such as `..\\.system\\evil`.
|
|
18
|
+
*/
|
|
19
|
+
export function isSystemPath(p) {
|
|
20
|
+
return pathResolve(p).split(/[\\/]/).some((seg) => seg === ".system");
|
|
21
|
+
}
|
|
22
|
+
export function assertNotSystemPath(p) {
|
|
23
|
+
if (isSystemPath(p))
|
|
24
|
+
throw new SYSTEM_PATH_FORBIDDEN(p);
|
|
25
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { IndexFile } from "./types.js";
|
|
2
|
+
export declare class POOL_READ_ERROR extends Error {
|
|
3
|
+
}
|
|
4
|
+
/** Pure read of the in-memory pool index (Critical #2 fix).
|
|
5
|
+
*
|
|
6
|
+
* CONTRACT: this function is a READ-ONLY computation. It MUST NOT
|
|
7
|
+
* write `index.json` (or any other file) as a side-effect. The
|
|
8
|
+
* "self-heal" property of rewriting index.json when it goes stale
|
|
9
|
+
* belongs to `rebuildIndexFromFs`, not here. List / search / recent /
|
|
10
|
+
* add-* verbs that need to mutate the on-disk cache should call
|
|
11
|
+
* `rebuildIndexFromFs` explicitly.
|
|
12
|
+
*
|
|
13
|
+
* Edge case: if the pool root does not yet exist, this returns an
|
|
14
|
+
* empty index WITHOUT creating the directory. Callers that need a
|
|
15
|
+
* materialized root should use `rebuildIndexFromFs` or `mkdirSync`
|
|
16
|
+
* themselves.
|
|
17
|
+
*/
|
|
18
|
+
export declare function readPool({ home }: {
|
|
19
|
+
home: string;
|
|
20
|
+
}): IndexFile;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { readdirSync, readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolveUserBeesDir, resolveSegmentsDir } from "./pool-paths.js";
|
|
4
|
+
import { lintManifest } from "./manifest-lint.js";
|
|
5
|
+
export class POOL_READ_ERROR extends Error {
|
|
6
|
+
}
|
|
7
|
+
function readJsonIfExists(p) {
|
|
8
|
+
if (!existsSync(p))
|
|
9
|
+
return null;
|
|
10
|
+
return JSON.parse(readFileSync(p, "utf-8"));
|
|
11
|
+
}
|
|
12
|
+
function readBeeDir(home, name) {
|
|
13
|
+
const dir = join(resolveUserBeesDir({ home }), name);
|
|
14
|
+
const manifestPath = join(dir, "manifest.json");
|
|
15
|
+
const m = readJsonIfExists(manifestPath);
|
|
16
|
+
if (!m)
|
|
17
|
+
return null;
|
|
18
|
+
const r = lintManifest(m);
|
|
19
|
+
if (!r.ok)
|
|
20
|
+
return null;
|
|
21
|
+
return {
|
|
22
|
+
name: m.name,
|
|
23
|
+
kind: "bee",
|
|
24
|
+
path: `bees/${name}`,
|
|
25
|
+
source: m.source,
|
|
26
|
+
promotion_status: m.promotion_status,
|
|
27
|
+
segments: m.segments.map((s) => s.name),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function readSegmentDir(home, name) {
|
|
31
|
+
const dir = join(resolveSegmentsDir({ home }), name);
|
|
32
|
+
if (!existsSync(dir))
|
|
33
|
+
return null;
|
|
34
|
+
return {
|
|
35
|
+
name, kind: "segment", path: `segments/${name}`, source: "user", promotion_status: "stable",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Pure read of the in-memory pool index (Critical #2 fix).
|
|
39
|
+
*
|
|
40
|
+
* CONTRACT: this function is a READ-ONLY computation. It MUST NOT
|
|
41
|
+
* write `index.json` (or any other file) as a side-effect. The
|
|
42
|
+
* "self-heal" property of rewriting index.json when it goes stale
|
|
43
|
+
* belongs to `rebuildIndexFromFs`, not here. List / search / recent /
|
|
44
|
+
* add-* verbs that need to mutate the on-disk cache should call
|
|
45
|
+
* `rebuildIndexFromFs` explicitly.
|
|
46
|
+
*
|
|
47
|
+
* Edge case: if the pool root does not yet exist, this returns an
|
|
48
|
+
* empty index WITHOUT creating the directory. Callers that need a
|
|
49
|
+
* materialized root should use `rebuildIndexFromFs` or `mkdirSync`
|
|
50
|
+
* themselves.
|
|
51
|
+
*/
|
|
52
|
+
export function readPool({ home }) {
|
|
53
|
+
const entries = [];
|
|
54
|
+
const beesDir = resolveUserBeesDir({ home });
|
|
55
|
+
if (existsSync(beesDir)) {
|
|
56
|
+
for (const ent of readdirSync(beesDir, { withFileTypes: true })) {
|
|
57
|
+
if (!ent.isDirectory())
|
|
58
|
+
continue;
|
|
59
|
+
entries.push(...[readBeeDir(home, ent.name)].filter((e) => e !== null));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const segsDir = resolveSegmentsDir({ home });
|
|
63
|
+
if (existsSync(segsDir)) {
|
|
64
|
+
for (const ent of readdirSync(segsDir, { withFileTypes: true })) {
|
|
65
|
+
if (!ent.isDirectory())
|
|
66
|
+
continue;
|
|
67
|
+
entries.push(...[readSegmentDir(home, ent.name)].filter((e) => e !== null));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const idx = { schemaVersion: "peaks.pool/1", generatedAt: new Date().toISOString(), entries };
|
|
71
|
+
// Note: NO writeFileSync here. See Critical #2 fix.
|
|
72
|
+
return idx;
|
|
73
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IndexFile } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Rebuilds index.json from on-disk manifests/segments and writes the result.
|
|
4
|
+
*
|
|
5
|
+
* After the Critical #2 fix, `readPool` is a pure read (no filesystem
|
|
6
|
+
* side-effects). `rebuildIndexFromFs` is the single writer of
|
|
7
|
+
* `index.json`: it materializes the pool root if needed, walks the
|
|
8
|
+
* filesystem to build the in-memory index via `readPool`, and persists
|
|
9
|
+
* the result. Callers that need the on-disk cache up-to-date should
|
|
10
|
+
* call this function (or one of the add-* / rebuild-index CLI verbs
|
|
11
|
+
* which call it internally).
|
|
12
|
+
*/
|
|
13
|
+
export declare function rebuildIndexFromFs({ home }: {
|
|
14
|
+
home: string;
|
|
15
|
+
}): IndexFile;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolvePoolRoot } from "./pool-paths.js";
|
|
4
|
+
import { readPool } from "./pool-read.js";
|
|
5
|
+
/**
|
|
6
|
+
* Rebuilds index.json from on-disk manifests/segments and writes the result.
|
|
7
|
+
*
|
|
8
|
+
* After the Critical #2 fix, `readPool` is a pure read (no filesystem
|
|
9
|
+
* side-effects). `rebuildIndexFromFs` is the single writer of
|
|
10
|
+
* `index.json`: it materializes the pool root if needed, walks the
|
|
11
|
+
* filesystem to build the in-memory index via `readPool`, and persists
|
|
12
|
+
* the result. Callers that need the on-disk cache up-to-date should
|
|
13
|
+
* call this function (or one of the add-* / rebuild-index CLI verbs
|
|
14
|
+
* which call it internally).
|
|
15
|
+
*/
|
|
16
|
+
export function rebuildIndexFromFs({ home }) {
|
|
17
|
+
const root = resolvePoolRoot({ home });
|
|
18
|
+
if (!existsSync(root))
|
|
19
|
+
mkdirSync(root, { recursive: true });
|
|
20
|
+
const idx = readPool({ home });
|
|
21
|
+
// Trailing newline: POSIX-friendly (`cat`, `git diff`, log tailers all
|
|
22
|
+
// expect a final \n). The Minor #14 review confirmed we keep the current
|
|
23
|
+
// behavior rather than drop it — both are JSON-valid but the trailing
|
|
24
|
+
// newline matches the convention used by every other peaks-*.json file
|
|
25
|
+
// in the project (manifest.json, segment.json, etc.).
|
|
26
|
+
writeFileSync(join(root, "index.json"), JSON.stringify(idx, null, 2) + "\n");
|
|
27
|
+
return idx;
|
|
28
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { BeeManifest } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Atomically writes a BeeManifest to <home>/.peaks/skills/bees/<name>/manifest.json.
|
|
4
|
+
*
|
|
5
|
+
* Defense in depth:
|
|
6
|
+
* - re-validates the manifest via lintManifestStrict (zod) before any FS work
|
|
7
|
+
* - refuses to write under any path segment equal to ".system" (soft-protection)
|
|
8
|
+
*
|
|
9
|
+
* Atomicity is achieved via write-to-tmp + renameSync so readers either see the
|
|
10
|
+
* old file or the fully-written new file, never a half-written one.
|
|
11
|
+
*/
|
|
12
|
+
export declare function writeBeeManifest({ home }: {
|
|
13
|
+
home: string;
|
|
14
|
+
}, m: BeeManifest): void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync, renameSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { assertNotSystemPath, resolveUserBeeDir } from "./pool-paths.js";
|
|
4
|
+
import { lintManifestStrict } from "./manifest-lint.js";
|
|
5
|
+
/**
|
|
6
|
+
* Atomically writes a BeeManifest to <home>/.peaks/skills/bees/<name>/manifest.json.
|
|
7
|
+
*
|
|
8
|
+
* Defense in depth:
|
|
9
|
+
* - re-validates the manifest via lintManifestStrict (zod) before any FS work
|
|
10
|
+
* - refuses to write under any path segment equal to ".system" (soft-protection)
|
|
11
|
+
*
|
|
12
|
+
* Atomicity is achieved via write-to-tmp + renameSync so readers either see the
|
|
13
|
+
* old file or the fully-written new file, never a half-written one.
|
|
14
|
+
*/
|
|
15
|
+
export function writeBeeManifest({ home }, m) {
|
|
16
|
+
const validated = lintManifestStrict(m);
|
|
17
|
+
const dir = resolveUserBeeDir({ home }, validated.name);
|
|
18
|
+
assertNotSystemPath(dir);
|
|
19
|
+
mkdirSync(dir, { recursive: true });
|
|
20
|
+
const file = join(dir, "manifest.json");
|
|
21
|
+
assertNotSystemPath(file);
|
|
22
|
+
const tmp = file + ".tmp";
|
|
23
|
+
writeFileSync(tmp, JSON.stringify(validated, null, 2) + "\n");
|
|
24
|
+
renameSync(tmp, file);
|
|
25
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { BeeManifest } from "./types.js";
|
|
2
|
+
export interface GateInputs {
|
|
3
|
+
humanApproved: boolean;
|
|
4
|
+
smokeTestPresent: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface GateResult {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
failedSubconditions: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function evaluateGate({ home }: {
|
|
11
|
+
home: string;
|
|
12
|
+
}, m: BeeManifest, inputs: GateInputs): GateResult;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolveUserBeeDir } from "./pool-paths.js";
|
|
4
|
+
export function evaluateGate({ home }, m, inputs) {
|
|
5
|
+
if (m.source === "system") {
|
|
6
|
+
return { ok: true, failedSubconditions: [] };
|
|
7
|
+
}
|
|
8
|
+
const failed = [];
|
|
9
|
+
const rsPath = join(resolveUserBeeDir({ home }, m.name), "run-state.json");
|
|
10
|
+
const cycles = existsSync(rsPath)
|
|
11
|
+
? JSON.parse(readFileSync(rsPath, "utf-8")).cycles
|
|
12
|
+
: 0;
|
|
13
|
+
if (cycles < m.promotion.minCycles)
|
|
14
|
+
failed.push("minCycles");
|
|
15
|
+
if (inputs.smokeTestPresent !== m.promotion.requiresSmokeTest)
|
|
16
|
+
failed.push("smokeTest");
|
|
17
|
+
if (m.promotion.requiresHumanApproval && !inputs.humanApproved)
|
|
18
|
+
failed.push("humanApproval");
|
|
19
|
+
return { ok: failed.length === 0, failedSubconditions: failed };
|
|
20
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export type Source = "system" | "user";
|
|
2
|
+
export type PromotionStatus = "candidate" | "stable" | "retired" | "system-stable";
|
|
3
|
+
export interface Param {
|
|
4
|
+
name: string;
|
|
5
|
+
type: "string" | "number" | "boolean" | "json";
|
|
6
|
+
required: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface SegmentRef {
|
|
9
|
+
name: string;
|
|
10
|
+
inputs: Param[];
|
|
11
|
+
outputs: Param[];
|
|
12
|
+
sideEffects: string[];
|
|
13
|
+
}
|
|
14
|
+
export interface SkillEnvelopeRef {
|
|
15
|
+
path: string;
|
|
16
|
+
kind: "file" | "dir" | "script";
|
|
17
|
+
}
|
|
18
|
+
export interface SkillEnvelope {
|
|
19
|
+
preamble: string;
|
|
20
|
+
refs: SkillEnvelopeRef[];
|
|
21
|
+
}
|
|
22
|
+
export interface PromotionGate {
|
|
23
|
+
minCycles: number;
|
|
24
|
+
requiresHumanApproval: boolean;
|
|
25
|
+
requiresSmokeTest: boolean;
|
|
26
|
+
retireOnMissesInRow?: number;
|
|
27
|
+
}
|
|
28
|
+
export interface BeeManifest {
|
|
29
|
+
schemaVersion: "peaks.bee/1";
|
|
30
|
+
name: string;
|
|
31
|
+
source: Source;
|
|
32
|
+
promotion_status: PromotionStatus;
|
|
33
|
+
description: string;
|
|
34
|
+
segments: SegmentRef[];
|
|
35
|
+
entrypoint: SkillEnvelope;
|
|
36
|
+
promotion: PromotionGate;
|
|
37
|
+
createdBy: "human" | "llm";
|
|
38
|
+
lastTouchedAt: string;
|
|
39
|
+
}
|
|
40
|
+
export interface IndexEntry {
|
|
41
|
+
name: string;
|
|
42
|
+
kind: "bee" | "segment";
|
|
43
|
+
path: string;
|
|
44
|
+
source: Source;
|
|
45
|
+
promotion_status: PromotionStatus;
|
|
46
|
+
segments?: string[];
|
|
47
|
+
}
|
|
48
|
+
export interface IndexFile {
|
|
49
|
+
schemaVersion: "peaks.pool/1";
|
|
50
|
+
generatedAt: string;
|
|
51
|
+
entries: IndexEntry[];
|
|
52
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -107,7 +107,7 @@ export declare function writeBinding(projectRoot: string, binding: Binding): voi
|
|
|
107
107
|
* This is the D2 Claude-instance-level binding primitive — a single
|
|
108
108
|
* Claude instance keeps one sid across multiple peaks-* skill
|
|
109
109
|
* activations; binding.instances[<sid>].roles accumulates the skill
|
|
110
|
-
* names (peaks-
|
|
110
|
+
* names (peaks-code → peaks-rd → peaks-qa in the same Claude run).
|
|
111
111
|
*
|
|
112
112
|
* The caller is responsible for actually creating the session dir via
|
|
113
113
|
* `initWorkspace` and storing per-session meta via `setSessionMeta`.
|
|
@@ -192,7 +192,7 @@ export function writeBinding(projectRoot, binding) {
|
|
|
192
192
|
* This is the D2 Claude-instance-level binding primitive — a single
|
|
193
193
|
* Claude instance keeps one sid across multiple peaks-* skill
|
|
194
194
|
* activations; binding.instances[<sid>].roles accumulates the skill
|
|
195
|
-
* names (peaks-
|
|
195
|
+
* names (peaks-code → peaks-rd → peaks-qa in the same Claude run).
|
|
196
196
|
*
|
|
197
197
|
* The caller is responsible for actually creating the session dir via
|
|
198
198
|
* `initWorkspace` and storing per-session meta via `setSessionMeta`.
|
|
@@ -28,7 +28,7 @@ export interface CallerBinding {
|
|
|
28
28
|
createdAt: string;
|
|
29
29
|
/** ISO 8601 timestamp; bumped on every `peaks <cmd>` that touches the binding. */
|
|
30
30
|
lastActivityAt: string;
|
|
31
|
-
/** Last skill that touched this binding, e.g. "peaks-
|
|
31
|
+
/** Last skill that touched this binding, e.g. "peaks-code". */
|
|
32
32
|
skill: string;
|
|
33
33
|
/** Last mode, e.g. "full-auto". */
|
|
34
34
|
mode: string;
|
|
@@ -120,7 +120,7 @@ export declare function getSessionId(projectRoot: string): string | null;
|
|
|
120
120
|
* caller is operating on a user-supplied `--project` flag
|
|
121
121
|
* and the binding may have been written by a CLI invocation
|
|
122
122
|
* that was running from inside the project dir (the common
|
|
123
|
-
* peaks-
|
|
123
|
+
* peaks-code / peaks-sop scenario). Other modules depend
|
|
124
124
|
* on the strict-equality semantics of `getSessionId` (the
|
|
125
125
|
* "no binding" fallback path is part of their contract),
|
|
126
126
|
* so this variant is opt-in.
|