peaks-loop 4.1.2 → 4.1.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/.claude-plugin/marketplace.json +136 -47
- package/CHANGELOG.md +56 -0
- package/README-en.md +1 -1
- package/README.md +1 -1
- package/contracts/readonly-argv-whitelist.json +211 -0
- package/dist/cli/commands/audit-artifact-runners.d.ts +16 -0
- package/dist/cli/commands/audit-artifact-runners.js +170 -0
- package/dist/cli/commands/audit-command-shared.d.ts +97 -0
- package/dist/cli/commands/audit-command-shared.js +60 -0
- package/dist/cli/commands/audit-commands.d.ts +7 -31
- package/dist/cli/commands/audit-commands.js +64 -473
- package/dist/cli/commands/audit-goal-runners.d.ts +17 -0
- package/dist/cli/commands/audit-goal-runners.js +114 -0
- package/dist/cli/commands/audit-red-lines-runners.d.ts +11 -0
- package/dist/cli/commands/audit-red-lines-runners.js +43 -0
- package/dist/cli/commands/audit-refusal-data.d.ts +23 -0
- package/dist/cli/commands/audit-refusal-data.js +69 -0
- package/dist/cli/commands/audit-static-runners.d.ts +13 -0
- package/dist/cli/commands/audit-static-runners.js +139 -0
- package/dist/cli/commands/await-runners.d.ts +11 -0
- package/dist/cli/commands/await-runners.js +148 -0
- package/dist/cli/commands/code-auto-compact-command.d.ts +3 -0
- package/dist/cli/commands/code-auto-compact-command.js +124 -0
- package/dist/cli/commands/code-auto-compact-envelope.d.ts +22 -0
- package/dist/cli/commands/code-auto-compact-envelope.js +39 -0
- package/dist/cli/commands/code-context-audit-command.d.ts +3 -0
- package/dist/cli/commands/code-context-audit-command.js +68 -0
- package/dist/cli/commands/code-context-now-command.d.ts +3 -0
- package/dist/cli/commands/code-context-now-command.js +124 -0
- package/dist/cli/commands/code-context-now-envelope.d.ts +66 -0
- package/dist/cli/commands/code-context-now-envelope.js +136 -0
- package/dist/cli/commands/code-context-now-mapping.d.ts +27 -0
- package/dist/cli/commands/code-context-now-mapping.js +43 -0
- package/dist/cli/commands/code-emit-handoff-command.d.ts +3 -0
- package/dist/cli/commands/code-emit-handoff-command.js +99 -0
- package/dist/cli/commands/code-gate-step-08-command.d.ts +3 -0
- package/dist/cli/commands/code-gate-step-08-command.js +139 -0
- package/dist/cli/commands/code-post-compact-detect-command.d.ts +3 -0
- package/dist/cli/commands/code-post-compact-detect-command.js +50 -0
- package/dist/cli/commands/code-runtime-commands.d.ts +9 -43
- package/dist/cli/commands/code-runtime-commands.js +20 -672
- package/dist/cli/commands/code-runtime-session.d.ts +1 -0
- package/dist/cli/commands/code-runtime-session.js +15 -0
- package/dist/cli/commands/compact-command.d.ts +6 -2
- package/dist/cli/commands/compact-command.js +12 -559
- package/dist/cli/commands/compact-dry-run-command.d.ts +3 -0
- package/dist/cli/commands/compact-dry-run-command.js +87 -0
- package/dist/cli/commands/compact-force-command.d.ts +3 -0
- package/dist/cli/commands/compact-force-command.js +98 -0
- package/dist/cli/commands/compact-harness-window-command.d.ts +3 -0
- package/dist/cli/commands/compact-harness-window-command.js +174 -0
- package/dist/cli/commands/compact-history-command.d.ts +3 -0
- package/dist/cli/commands/compact-history-command.js +89 -0
- package/dist/cli/commands/compact-read-commands.d.ts +3 -0
- package/dist/cli/commands/compact-read-commands.js +123 -0
- package/dist/cli/commands/compact-settle-command.d.ts +3 -0
- package/dist/cli/commands/compact-settle-command.js +130 -0
- package/dist/cli/commands/compact-shared.d.ts +9 -0
- package/dist/cli/commands/compact-shared.js +26 -0
- package/dist/cli/commands/core/skill-command.d.ts +1 -44
- package/dist/cli/commands/core/skill-command.js +13 -541
- package/dist/cli/commands/core/skill-context-verdict.d.ts +38 -0
- package/dist/cli/commands/core/skill-context-verdict.js +63 -0
- package/dist/cli/commands/core/skill-generated-config-notice.d.ts +41 -0
- package/dist/cli/commands/core/skill-generated-config-notice.js +75 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-heartbeat-commands.js +50 -0
- package/dist/cli/commands/core/skill-presence-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-commands.js +123 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-presence-housekeeping-commands.js +165 -0
- package/dist/cli/commands/core/skill-registry-commands.d.ts +3 -0
- package/dist/cli/commands/core/skill-registry-commands.js +117 -0
- package/dist/cli/commands/core/skill-runbook-command.d.ts +3 -0
- package/dist/cli/commands/core/skill-runbook-command.js +29 -0
- package/dist/cli/commands/dispatch-command-spec.d.ts +2 -0
- package/dist/cli/commands/dispatch-command-spec.js +62 -0
- package/dist/cli/commands/dispatch-commands.js +159 -775
- package/dist/cli/commands/dispatch-detached-branch.d.ts +3 -0
- package/dist/cli/commands/dispatch-detached-branch.js +58 -0
- package/dist/cli/commands/dispatch-envelope.d.ts +36 -0
- package/dist/cli/commands/dispatch-envelope.js +104 -0
- package/dist/cli/commands/dispatch-isolation-lease.d.ts +17 -0
- package/dist/cli/commands/dispatch-isolation-lease.js +149 -0
- package/dist/cli/commands/dispatch-preflight.d.ts +7 -0
- package/dist/cli/commands/dispatch-preflight.js +105 -0
- package/dist/cli/commands/dispatch-prompt-blocks.d.ts +10 -0
- package/dist/cli/commands/dispatch-prompt-blocks.js +56 -0
- package/dist/cli/commands/dispatch-prompt-composition.d.ts +30 -0
- package/dist/cli/commands/dispatch-prompt-composition.js +171 -0
- package/dist/cli/commands/dispatch-record-write.d.ts +24 -0
- package/dist/cli/commands/dispatch-record-write.js +96 -0
- package/dist/cli/commands/dispatch-tool-call.d.ts +15 -0
- package/dist/cli/commands/dispatch-tool-call.js +128 -0
- package/dist/cli/commands/evolution-command-shared.d.ts +78 -0
- package/dist/cli/commands/evolution-command-shared.js +107 -0
- package/dist/cli/commands/evolution-commands.d.ts +11 -1
- package/dist/cli/commands/evolution-commands.js +19 -350
- package/dist/cli/commands/evolution-evaluate-command.d.ts +24 -0
- package/dist/cli/commands/evolution-evaluate-command.js +138 -0
- package/dist/cli/commands/evolution-propose-command.d.ts +23 -0
- package/dist/cli/commands/evolution-propose-command.js +145 -0
- package/dist/cli/commands/evolution-status-command.d.ts +17 -0
- package/dist/cli/commands/evolution-status-command.js +41 -0
- package/dist/cli/commands/evolution-verdict-commands.d.ts +30 -0
- package/dist/cli/commands/evolution-verdict-commands.js +100 -0
- package/dist/cli/commands/finalize-accumulator.d.ts +44 -0
- package/dist/cli/commands/finalize-accumulator.js +55 -0
- package/dist/cli/commands/finalize-branches.d.ts +34 -0
- package/dist/cli/commands/finalize-branches.js +119 -0
- package/dist/cli/commands/finalize-runners.d.ts +3 -0
- package/dist/cli/commands/finalize-runners.js +92 -0
- package/dist/cli/commands/finalize-selection.d.ts +65 -0
- package/dist/cli/commands/finalize-selection.js +35 -0
- package/dist/cli/commands/gate-commands.js +26 -8
- package/dist/cli/commands/job-checkpoint-commands.d.ts +3 -0
- package/dist/cli/commands/job-checkpoint-commands.js +157 -0
- package/dist/cli/commands/job-command-shared.d.ts +109 -0
- package/dist/cli/commands/job-command-shared.js +72 -0
- package/dist/cli/commands/job-commands.d.ts +4 -64
- package/dist/cli/commands/job-commands.js +42 -552
- package/dist/cli/commands/job-cost-check-command.d.ts +3 -0
- package/dist/cli/commands/job-cost-check-command.js +41 -0
- package/dist/cli/commands/job-init-status-commands.d.ts +3 -0
- package/dist/cli/commands/job-init-status-commands.js +149 -0
- package/dist/cli/commands/job-run-commands.d.ts +3 -0
- package/dist/cli/commands/job-run-commands.js +97 -0
- package/dist/cli/commands/job-state-root.d.ts +35 -0
- package/dist/cli/commands/job-state-root.js +76 -0
- package/dist/cli/commands/loop-eval-capture-index.d.ts +4 -0
- package/dist/cli/commands/loop-eval-capture-index.js +44 -0
- package/dist/cli/commands/loop-eval-commands.d.ts +8 -5
- package/dist/cli/commands/loop-eval-commands.js +12 -626
- package/dist/cli/commands/loop-eval-eval-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-eval-command.js +168 -0
- package/dist/cli/commands/loop-eval-monotonic-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-monotonic-command.js +90 -0
- package/dist/cli/commands/loop-eval-parents.d.ts +7 -0
- package/dist/cli/commands/loop-eval-parents.js +20 -0
- package/dist/cli/commands/loop-eval-run-code.d.ts +7 -0
- package/dist/cli/commands/loop-eval-run-code.js +40 -0
- package/dist/cli/commands/loop-eval-run-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-run-command.js +113 -0
- package/dist/cli/commands/loop-eval-spec-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-commands.js +165 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.d.ts +3 -0
- package/dist/cli/commands/loop-eval-spec-lint-command.js +42 -0
- package/dist/cli/commands/loop-eval-workflow-commands.d.ts +3 -0
- package/dist/cli/commands/loop-eval-workflow-commands.js +141 -0
- package/dist/cli/commands/mcp-commands.d.ts +10 -0
- package/dist/cli/commands/mcp-commands.js +157 -0
- package/dist/cli/commands/request-command-options.d.ts +49 -0
- package/dist/cli/commands/request-command-options.js +1 -0
- package/dist/cli/commands/request-commands.d.ts +3 -9
- package/dist/cli/commands/request-commands.js +17 -522
- package/dist/cli/commands/request-init-command.d.ts +3 -0
- package/dist/cli/commands/request-init-command.js +100 -0
- package/dist/cli/commands/request-lint-command.d.ts +3 -0
- package/dist/cli/commands/request-lint-command.js +50 -0
- package/dist/cli/commands/request-list-command.d.ts +10 -0
- package/dist/cli/commands/request-list-command.js +53 -0
- package/dist/cli/commands/request-repair-status-command.d.ts +3 -0
- package/dist/cli/commands/request-repair-status-command.js +61 -0
- package/dist/cli/commands/request-show-command.d.ts +3 -0
- package/dist/cli/commands/request-show-command.js +56 -0
- package/dist/cli/commands/request-transition-command.d.ts +3 -0
- package/dist/cli/commands/request-transition-command.js +122 -0
- package/dist/cli/commands/request-transition-failures.d.ts +8 -0
- package/dist/cli/commands/request-transition-failures.js +90 -0
- package/dist/cli/commands/request-transition-hooks.d.ts +50 -0
- package/dist/cli/commands/request-transition-hooks.js +115 -0
- package/dist/cli/commands/request-transition-preflight.d.ts +10 -0
- package/dist/cli/commands/request-transition-preflight.js +107 -0
- package/dist/cli/commands/scan-command-shared.d.ts +96 -0
- package/dist/cli/commands/scan-command-shared.js +83 -0
- package/dist/cli/commands/scan-commands.d.ts +3 -2
- package/dist/cli/commands/scan-commands.js +23 -463
- package/dist/cli/commands/scan-inventory-commands.d.ts +3 -0
- package/dist/cli/commands/scan-inventory-commands.js +96 -0
- package/dist/cli/commands/scan-project-commands.d.ts +3 -0
- package/dist/cli/commands/scan-project-commands.js +65 -0
- package/dist/cli/commands/scan-scope-commands.d.ts +3 -0
- package/dist/cli/commands/scan-scope-commands.js +149 -0
- package/dist/cli/commands/scan-scope-helpers.d.ts +8 -0
- package/dist/cli/commands/scan-scope-helpers.js +54 -0
- package/dist/cli/commands/scan-structural-commands.d.ts +3 -0
- package/dist/cli/commands/scan-structural-commands.js +113 -0
- package/dist/cli/commands/share-commands.d.ts +12 -68
- package/dist/cli/commands/share-commands.js +47 -556
- package/dist/cli/commands/share-error-hints.d.ts +14 -0
- package/dist/cli/commands/share-error-hints.js +38 -0
- package/dist/cli/commands/share-identity.d.ts +13 -0
- package/dist/cli/commands/share-identity.js +22 -0
- package/dist/cli/commands/share-record-paths.d.ts +37 -0
- package/dist/cli/commands/share-record-paths.js +68 -0
- package/dist/cli/commands/share-runners.d.ts +3 -0
- package/dist/cli/commands/share-runners.js +158 -0
- package/dist/cli/commands/shared-read-runners.d.ts +3 -0
- package/dist/cli/commands/shared-read-runners.js +51 -0
- package/dist/cli/commands/slice-check-command.d.ts +3 -0
- package/dist/cli/commands/slice-check-command.js +54 -0
- package/dist/cli/commands/slice-commands.d.ts +2 -22
- package/dist/cli/commands/slice-commands.js +18 -517
- package/dist/cli/commands/slice-decompose-artifacts.d.ts +18 -0
- package/dist/cli/commands/slice-decompose-artifacts.js +79 -0
- package/dist/cli/commands/slice-decompose-command.d.ts +3 -0
- package/dist/cli/commands/slice-decompose-command.js +123 -0
- package/dist/cli/commands/slice-list-commands.d.ts +3 -0
- package/dist/cli/commands/slice-list-commands.js +182 -0
- package/dist/cli/commands/slice-pick-command.d.ts +3 -0
- package/dist/cli/commands/slice-pick-command.js +60 -0
- package/dist/cli/commands/slice-plan-command.d.ts +24 -0
- package/dist/cli/commands/slice-plan-command.js +111 -0
- package/dist/cli/commands/workflow-commands.d.ts +10 -1
- package/dist/cli/commands/workflow-commands.js +6 -594
- package/dist/cli/commands/workflow-gate-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-gate-commands.js +116 -0
- package/dist/cli/commands/workflow-plan-helpers.d.ts +48 -0
- package/dist/cli/commands/workflow-plan-helpers.js +103 -0
- package/dist/cli/commands/workflow-planning-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-planning-commands.js +56 -0
- package/dist/cli/commands/workflow-swarm-actions.d.ts +7 -0
- package/dist/cli/commands/workflow-swarm-actions.js +109 -0
- package/dist/cli/commands/workflow-swarm-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-swarm-commands.js +138 -0
- package/dist/cli/commands/workflow-tech-actions.d.ts +10 -0
- package/dist/cli/commands/workflow-tech-actions.js +150 -0
- package/dist/cli/commands/workspace/init-actions.d.ts +10 -0
- package/dist/cli/commands/workspace/init-actions.js +199 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.d.ts +10 -0
- package/dist/cli/commands/workspace/init-codegraph-stake.js +54 -0
- package/dist/cli/commands/workspace/init-command.d.ts +8 -124
- package/dist/cli/commands/workspace/init-command.js +59 -623
- package/dist/cli/commands/workspace/init-context.d.ts +58 -0
- package/dist/cli/commands/workspace/init-context.js +121 -0
- package/dist/cli/commands/workspace/init-envelope.d.ts +3 -0
- package/dist/cli/commands/workspace/init-envelope.js +34 -0
- package/dist/cli/commands/workspace/init-failures.d.ts +3 -0
- package/dist/cli/commands/workspace/init-failures.js +84 -0
- package/dist/cli/commands/workspace/init-hooks-decision.d.ts +24 -0
- package/dist/cli/commands/workspace/init-hooks-decision.js +189 -0
- package/dist/cli/commands/workspace/init-options.d.ts +102 -0
- package/dist/cli/commands/workspace/init-options.js +1 -0
- package/dist/cli/commands/worktree-lease-commands.d.ts +10 -6
- package/dist/cli/commands/worktree-lease-commands.js +42 -512
- package/dist/cli/commands/worktree-lease-gc-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-gc-command.js +117 -0
- package/dist/cli/commands/worktree-lease-git.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-git.js +48 -0
- package/dist/cli/commands/worktree-lease-list-command.d.ts +12 -0
- package/dist/cli/commands/worktree-lease-list-command.js +100 -0
- package/dist/cli/commands/worktree-lease-load.d.ts +37 -0
- package/dist/cli/commands/worktree-lease-load.js +28 -0
- package/dist/cli/commands/worktree-lease-release-command.d.ts +13 -0
- package/dist/cli/commands/worktree-lease-release-command.js +105 -0
- package/dist/cli/commands/worktree-lease-renew-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-renew-command.js +99 -0
- package/dist/cli/commands/worktree-lease-session.d.ts +22 -0
- package/dist/cli/commands/worktree-lease-session.js +29 -0
- package/dist/cli/commands/worktree-lease-spawn-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-spawn-command.js +119 -0
- package/dist/cli/commands/worktree-lease-status-command.d.ts +11 -0
- package/dist/cli/commands/worktree-lease-status-command.js +86 -0
- package/dist/cli/commands/worktree-lease-store.d.ts +19 -0
- package/dist/cli/commands/worktree-lease-store.js +24 -0
- package/dist/cli/program.js +5 -0
- package/dist/services/distribution/mcp-install-runner.d.ts +21 -0
- package/dist/services/distribution/mcp-install-runner.js +59 -0
- package/dist/services/distribution/mcp-install.d.ts +95 -0
- package/dist/services/distribution/mcp-install.js +179 -0
- package/dist/services/distribution/plugin-manifest.d.ts +97 -0
- package/dist/services/distribution/plugin-manifest.js +126 -0
- package/dist/services/hooks/mcp-surface-gate.d.ts +19 -0
- package/dist/services/hooks/mcp-surface-gate.js +87 -0
- package/dist/services/ide/adapters/claude-code-adapter.d.ts +4 -35
- package/dist/services/ide/adapters/claude-code-adapter.js +48 -171
- package/dist/services/ide/adapters/claude-code-local-state.d.ts +28 -0
- package/dist/services/ide/adapters/claude-code-local-state.js +112 -0
- package/dist/services/ide/adapters/claude-code-model-window.d.ts +37 -0
- package/dist/services/ide/adapters/claude-code-model-window.js +113 -0
- package/dist/services/ide/ide-mcp-install-types.d.ts +78 -0
- package/dist/services/ide/ide-mcp-install-types.js +104 -0
- package/dist/services/ide/ide-types.d.ts +45 -1
- package/dist/services/ide/mcp-tool-matcher.d.ts +34 -0
- package/dist/services/ide/mcp-tool-matcher.js +84 -0
- package/dist/services/lint/npx-resolver.js +7 -0
- package/dist/services/mcp/cli-executor.d.ts +36 -0
- package/dist/services/mcp/cli-executor.js +97 -0
- package/dist/services/mcp/json-rpc.d.ts +81 -0
- package/dist/services/mcp/json-rpc.js +116 -0
- package/dist/services/mcp/memory-tool.d.ts +3 -0
- package/dist/services/mcp/memory-tool.js +62 -0
- package/dist/services/mcp/server-main.d.ts +1 -0
- package/dist/services/mcp/server-main.js +66 -0
- package/dist/services/mcp/server.d.ts +22 -0
- package/dist/services/mcp/server.js +152 -0
- package/dist/services/mcp/surface.d.ts +62 -0
- package/dist/services/mcp/surface.js +198 -0
- package/dist/services/mcp/tool-core.d.ts +42 -0
- package/dist/services/mcp/tool-core.js +137 -0
- package/dist/services/mcp/tools.d.ts +13 -0
- package/dist/services/mcp/tools.js +58 -0
- package/dist/services/readonly-surface/argv-guard.d.ts +32 -0
- package/dist/services/readonly-surface/argv-guard.js +164 -0
- package/dist/services/readonly-surface/readonly-whitelist.d.ts +147 -0
- package/dist/services/readonly-surface/readonly-whitelist.js +107 -0
- package/dist/services/readonly-surface/whitelist-generator.d.ts +64 -0
- package/dist/services/readonly-surface/whitelist-generator.js +212 -0
- package/dist/services/skills/hooks-codegate-superpowers.d.ts +1 -0
- package/dist/services/skills/hooks-codegate-superpowers.js +26 -0
- package/dist/services/skills/hooks-settings-service.js +10 -2
- package/package.json +17 -6
- package/scripts/install-skills-bundles.mjs +233 -0
- package/scripts/install-skills-fs.mjs +148 -0
- package/scripts/install-skills-ide.mjs +279 -0
- package/scripts/install-skills-output-style-default.mjs +196 -0
- package/scripts/install-skills-output-styles.mjs +121 -0
- package/scripts/install-skills-report.mjs +42 -0
- package/scripts/install-skills-user-config.mjs +198 -0
- package/scripts/install-skills.mjs +36 -1066
- package/scripts/watch-tree.mjs +140 -0
- package/scripts/watch.mjs +4 -126
- package/skills/peaks-status/SKILL.md +31 -13
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `peaks audit artifact` runners — first-class CLI surface for the 4 audit
|
|
3
|
+
* artifact types. Replaces the 2026-06-22 "hand `git add` into
|
|
4
|
+
* .peaks/memory/" anti-pattern that left 4 orphan files. Each kind routes to
|
|
5
|
+
* exactly one writer in artifact-writer.ts; the writer enforces canonical
|
|
6
|
+
* frontmatter, so the memory-shape guard never fires for new writes.
|
|
7
|
+
*
|
|
8
|
+
* The action body moved out of `audit-commands.ts` verbatim; the registrar now
|
|
9
|
+
* only wires the commands and delegates. Every envelope, error code and hint
|
|
10
|
+
* string is unchanged.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
13
|
+
import { resolve } from 'node:path';
|
|
14
|
+
import { fail, ok } from 'peaks-loop-shared/result';
|
|
15
|
+
import { writeDecision, writeMachineOutput, writeNarrative, writePrompt } from '../../services/audit/artifact-writer.js';
|
|
16
|
+
import { parseRedLineAuditInput, RedLineAuditInputError } from '../../services/audit/red-line-audit-input.js';
|
|
17
|
+
import { getErrorMessage, printResult } from '../cli-helpers.js';
|
|
18
|
+
import { isSupportedArtifactKind, PROJECT_PATH_HINT, SUPPORTED_ARTIFACT_KINDS, validateProjectRoot } from './audit-command-shared.js';
|
|
19
|
+
import { emptyArtifactWriteRecord } from './audit-refusal-data.js';
|
|
20
|
+
export const ARTIFACT_GROUP_DESCRIPTION = 'Manage audit artifacts (decision / prompt / machine-output / narrative) under .peaks/memory/';
|
|
21
|
+
export const ARTIFACT_WRITE_DESCRIPTION = 'Persist a single audit artifact to .peaks/memory/ via the artifact-writer (canonical frontmatter)';
|
|
22
|
+
const INPUT_PATH_HINT = 'Verify the --input path is correct (relative paths resolve against cwd)';
|
|
23
|
+
/** Length of the `YYYY-MM-DD` prefix of an ISO timestamp. */
|
|
24
|
+
const ISO_DATE_LENGTH = 10;
|
|
25
|
+
/**
|
|
26
|
+
* Names the unreachable `--kind` without tripping the template-expression rule:
|
|
27
|
+
* by the time the `default` arm runs, the narrowing has reduced `kind` to
|
|
28
|
+
* `never`, so the message is built from a `string` parameter instead.
|
|
29
|
+
*/
|
|
30
|
+
function unreachableKindError(kind) {
|
|
31
|
+
return new Error(`unreachable: kind=${kind}`);
|
|
32
|
+
}
|
|
33
|
+
function refuseArtifactWrite(refusal) {
|
|
34
|
+
printResult(refusal.io, fail('audit.artifact.write', refusal.code, refusal.message, emptyArtifactWriteRecord(refusal.kind), refusal.nextActions), refusal.json);
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
}
|
|
37
|
+
function writeByKind(request) {
|
|
38
|
+
const writeOpts = {
|
|
39
|
+
projectRoot: request.projectRoot,
|
|
40
|
+
dryRun: request.dryRun,
|
|
41
|
+
...(request.rid ? { rid: request.rid } : {})
|
|
42
|
+
};
|
|
43
|
+
switch (request.kind) {
|
|
44
|
+
case 'prompt': {
|
|
45
|
+
const body = readFileSync(request.inputAbs, 'utf8');
|
|
46
|
+
return writePrompt({ name: request.baseName, description: request.description, body }, writeOpts);
|
|
47
|
+
}
|
|
48
|
+
case 'machine-output': {
|
|
49
|
+
const json = readFileSync(request.inputAbs, 'utf8');
|
|
50
|
+
return writeMachineOutput({ name: request.baseName, description: request.description, json }, writeOpts);
|
|
51
|
+
}
|
|
52
|
+
case 'narrative': {
|
|
53
|
+
const body = readFileSync(request.inputAbs, 'utf8');
|
|
54
|
+
return writeNarrative({ name: request.baseName, description: request.description, body }, writeOpts);
|
|
55
|
+
}
|
|
56
|
+
case 'decision': {
|
|
57
|
+
// `--input` is a RedLineAudit JSON document — typically
|
|
58
|
+
// an archived `peaks audit static` result — validated field by field
|
|
59
|
+
// before it reaches the writer, because the writer renders whatever
|
|
60
|
+
// it is given into a memory record with no further checks.
|
|
61
|
+
// `--name` and `--description` do not apply: the decision slug and
|
|
62
|
+
// title come from the scan date (and `--rid`), exactly as
|
|
63
|
+
// `peaks audit static --record` derives them.
|
|
64
|
+
const audit = parseRedLineAuditInput(readFileSync(request.inputAbs, 'utf8'));
|
|
65
|
+
return writeDecision(audit, writeOpts);
|
|
66
|
+
}
|
|
67
|
+
default: {
|
|
68
|
+
// Unreachable: isSupportedArtifactKind already filtered.
|
|
69
|
+
throw unreachableKindError(request.kind);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function artifactWriteNextActions(record) {
|
|
74
|
+
return [
|
|
75
|
+
`Artifact written via ${record.kind} writer.`,
|
|
76
|
+
record.indexSynced
|
|
77
|
+
? 'Memory index regenerated; entry will appear in `peaks project memories` on next read.'
|
|
78
|
+
: 'Memory index NOT regenerated; run `peaks project memories --project <root>` to refresh.'
|
|
79
|
+
];
|
|
80
|
+
}
|
|
81
|
+
function persistArtifact(request) {
|
|
82
|
+
let record;
|
|
83
|
+
try {
|
|
84
|
+
record = writeByKind(request);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
// A malformed decision input is the caller's document, not a write
|
|
88
|
+
// failure: name it as input so the remedy reads as "fix the JSON field".
|
|
89
|
+
refuseArtifactWrite({
|
|
90
|
+
io: request.io,
|
|
91
|
+
json: request.json,
|
|
92
|
+
kind: request.kind,
|
|
93
|
+
code: err instanceof RedLineAuditInputError ? 'AUDIT_ARTIFACT_INPUT_INVALID' : 'WRITE_FAILED',
|
|
94
|
+
message: getErrorMessage(err),
|
|
95
|
+
nextActions: err instanceof RedLineAuditInputError
|
|
96
|
+
? [
|
|
97
|
+
'Inspect the named field; --kind decision takes the JSON shape `peaks audit static --json` prints.'
|
|
98
|
+
]
|
|
99
|
+
: ['Inspect the error message; for --kind machine-output ensure --input is valid JSON']
|
|
100
|
+
});
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
printResult(request.io, ok('audit.artifact.write', record, [], artifactWriteNextActions(record)), request.json);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The three refusals `--project`, `--kind` and `--input` can earn, in the
|
|
107
|
+
* order the original action checked them. Prints the envelope and sets the
|
|
108
|
+
* exit code on failure.
|
|
109
|
+
*/
|
|
110
|
+
function precheckArtifactWrite(options, io) {
|
|
111
|
+
const validation = validateProjectRoot(options.project);
|
|
112
|
+
if (!validation.ok) {
|
|
113
|
+
refuseArtifactWrite({
|
|
114
|
+
io,
|
|
115
|
+
json: options.json,
|
|
116
|
+
kind: 'narrative',
|
|
117
|
+
code: validation.code,
|
|
118
|
+
message: validation.message,
|
|
119
|
+
nextActions: [PROJECT_PATH_HINT]
|
|
120
|
+
});
|
|
121
|
+
return { ok: false };
|
|
122
|
+
}
|
|
123
|
+
if (!isSupportedArtifactKind(options.kind)) {
|
|
124
|
+
refuseArtifactWrite({
|
|
125
|
+
io,
|
|
126
|
+
json: options.json,
|
|
127
|
+
kind: 'narrative',
|
|
128
|
+
code: 'INVALID_KIND',
|
|
129
|
+
message: `Unknown --kind "${options.kind}". Supported: ${SUPPORTED_ARTIFACT_KINDS.join(', ')}.`,
|
|
130
|
+
nextActions: [
|
|
131
|
+
`Re-run with --kind <one of ${SUPPORTED_ARTIFACT_KINDS.join(' | ')}>`,
|
|
132
|
+
'See .peaks/memory/audit-artifact-convention.md for the 4 artifact types.'
|
|
133
|
+
]
|
|
134
|
+
});
|
|
135
|
+
return { ok: false };
|
|
136
|
+
}
|
|
137
|
+
const inputAbs = resolve(options.input);
|
|
138
|
+
if (!existsSync(inputAbs)) {
|
|
139
|
+
refuseArtifactWrite({
|
|
140
|
+
io,
|
|
141
|
+
json: options.json,
|
|
142
|
+
kind: options.kind,
|
|
143
|
+
code: 'INPUT_NOT_FOUND',
|
|
144
|
+
message: `--input file not found: ${options.input}`,
|
|
145
|
+
nextActions: [INPUT_PATH_HINT]
|
|
146
|
+
});
|
|
147
|
+
return { ok: false };
|
|
148
|
+
}
|
|
149
|
+
return { ok: true, projectRoot: validation.projectRoot, kind: options.kind, inputAbs };
|
|
150
|
+
}
|
|
151
|
+
export function runArtifactWrite(options, io) {
|
|
152
|
+
const precheck = precheckArtifactWrite(options, io);
|
|
153
|
+
if (!precheck.ok) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const baseName = options.name ?? options.input.split(/[\\/]/).pop() ?? 'untitled';
|
|
157
|
+
const description = options.description ??
|
|
158
|
+
`Audit artifact (${precheck.kind}) archived via peaks audit artifact write on ${new Date().toISOString().slice(0, ISO_DATE_LENGTH)}.`;
|
|
159
|
+
persistArtifact({
|
|
160
|
+
io,
|
|
161
|
+
json: options.json,
|
|
162
|
+
kind: precheck.kind,
|
|
163
|
+
inputAbs: precheck.inputAbs,
|
|
164
|
+
baseName,
|
|
165
|
+
description,
|
|
166
|
+
projectRoot: precheck.projectRoot,
|
|
167
|
+
dryRun: options.dryRun === true,
|
|
168
|
+
...(options.rid ? { rid: options.rid } : {})
|
|
169
|
+
});
|
|
170
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared plumbing for the `peaks audit *` command family.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `audit-commands.ts` (file-size cap) so each runner module can
|
|
5
|
+
* read the option shapes, the `--project` validation and the two whitelists
|
|
6
|
+
* without importing the registrar back. Dependency direction is one-way:
|
|
7
|
+
* nothing here imports `audit-commands.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import type { AuditGoalOutput } from '../../services/audit/audit-goal-types.js';
|
|
10
|
+
import type { AgentShieldState } from '../../services/audit/static-service.js';
|
|
11
|
+
import type { ArtifactKind } from '../../services/audit/artifact-writer.js';
|
|
12
|
+
import type { AuditDecisionRecord } from '../../services/audit/decision-writer.js';
|
|
13
|
+
import type { RedLineAudit } from '../../services/audit/types.js';
|
|
14
|
+
export type RedLinesOptions = {
|
|
15
|
+
project: string;
|
|
16
|
+
json?: boolean;
|
|
17
|
+
noColor?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type StaticAuditOptions = {
|
|
20
|
+
project: string;
|
|
21
|
+
json?: boolean;
|
|
22
|
+
noColor?: boolean;
|
|
23
|
+
record?: boolean;
|
|
24
|
+
rid?: string;
|
|
25
|
+
};
|
|
26
|
+
export type AuditGoalOptions = {
|
|
27
|
+
project: string;
|
|
28
|
+
need: string;
|
|
29
|
+
llmProvider?: string;
|
|
30
|
+
json?: boolean;
|
|
31
|
+
};
|
|
32
|
+
export type ArtifactWriteOptions = {
|
|
33
|
+
project: string;
|
|
34
|
+
kind: string;
|
|
35
|
+
input: string;
|
|
36
|
+
description?: string;
|
|
37
|
+
name?: string;
|
|
38
|
+
rid?: string;
|
|
39
|
+
dryRun?: boolean;
|
|
40
|
+
json?: boolean;
|
|
41
|
+
};
|
|
42
|
+
export type ProseRatioOptions = {
|
|
43
|
+
project: string;
|
|
44
|
+
target: string;
|
|
45
|
+
json?: boolean;
|
|
46
|
+
};
|
|
47
|
+
export declare const SUPPORTED_ARTIFACT_KINDS: readonly ArtifactKind[];
|
|
48
|
+
export declare function isSupportedArtifactKind(value: string): value is ArtifactKind;
|
|
49
|
+
/** Whitelist of supported `--llm-provider` values for `peaks audit goal`. */
|
|
50
|
+
export declare const SUPPORTED_LLM_PROVIDERS: readonly ["anthropic", "stub"];
|
|
51
|
+
export type SupportedLlmProvider = (typeof SUPPORTED_LLM_PROVIDERS)[number];
|
|
52
|
+
/**
|
|
53
|
+
* The real provider is the default: `peaks audit goal` is the entry gate for
|
|
54
|
+
* every peaks-* workflow, so it must audit by default and only scaffold when
|
|
55
|
+
* a caller explicitly asks for `stub`.
|
|
56
|
+
*/
|
|
57
|
+
export declare const DEFAULT_LLM_PROVIDER: SupportedLlmProvider;
|
|
58
|
+
export declare function isSupportedLlmProvider(value: string): value is SupportedLlmProvider;
|
|
59
|
+
/** The one hint every `--project` refusal carries, verbatim. */
|
|
60
|
+
export declare const PROJECT_PATH_HINT = "Verify the project path exists and is a directory";
|
|
61
|
+
/** The one hint every scanner-failure refusal carries, verbatim. */
|
|
62
|
+
export declare const SCANNER_HINT = "Inspect scanner logs and re-run with the same --project path";
|
|
63
|
+
/** `--project` is valid only when it resolves to an existing directory. */
|
|
64
|
+
export type ProjectRootValidation = {
|
|
65
|
+
ok: true;
|
|
66
|
+
projectRoot: string;
|
|
67
|
+
} | {
|
|
68
|
+
ok: false;
|
|
69
|
+
code: string;
|
|
70
|
+
message: string;
|
|
71
|
+
};
|
|
72
|
+
export declare function validateProjectRoot(projectArg: string): ProjectRootValidation;
|
|
73
|
+
/** `audit-failed` is a failure envelope's status — never a scaffold, never a success. */
|
|
74
|
+
export type AuditGoalStatus = 'audit-complete' | 'scaffold-only' | 'audit-failed';
|
|
75
|
+
export interface AuditGoalData {
|
|
76
|
+
readonly status: AuditGoalStatus;
|
|
77
|
+
/** Which LLM produced (or failed to produce) the audit. `unresolved` = rejected before binding. */
|
|
78
|
+
readonly providerBinding: 'anthropic-messages-api' | 'stub' | 'unresolved';
|
|
79
|
+
readonly need: string;
|
|
80
|
+
readonly projectRoot: string;
|
|
81
|
+
/** The validated 6-dimension audit. Present on success only. */
|
|
82
|
+
readonly result?: AuditGoalOutput;
|
|
83
|
+
/** The bound model. Present on a real run only. */
|
|
84
|
+
readonly model?: string;
|
|
85
|
+
/**
|
|
86
|
+
* Environment variables the binding needed and did not find. Present on a
|
|
87
|
+
* binding failure only, and verbatim: `fail()` redacts `message`, so this
|
|
88
|
+
* is the channel that reliably names what the operator must set.
|
|
89
|
+
*/
|
|
90
|
+
readonly missingEnv?: readonly string[];
|
|
91
|
+
}
|
|
92
|
+
export interface StaticAuditData {
|
|
93
|
+
readonly audit: RedLineAudit;
|
|
94
|
+
readonly agentShield: AgentShieldState;
|
|
95
|
+
/** Populated only when `--record` is passed. Persisted decision record path. */
|
|
96
|
+
readonly decision?: AuditDecisionRecord;
|
|
97
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared plumbing for the `peaks audit *` command family.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `audit-commands.ts` (file-size cap) so each runner module can
|
|
5
|
+
* read the option shapes, the `--project` validation and the two whitelists
|
|
6
|
+
* without importing the registrar back. Dependency direction is one-way:
|
|
7
|
+
* nothing here imports `audit-commands.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, statSync } from 'node:fs';
|
|
10
|
+
import { resolve } from 'node:path';
|
|
11
|
+
import { getErrorMessage } from '../cli-helpers.js';
|
|
12
|
+
export const SUPPORTED_ARTIFACT_KINDS = [
|
|
13
|
+
'decision',
|
|
14
|
+
'prompt',
|
|
15
|
+
'machine-output',
|
|
16
|
+
'narrative'
|
|
17
|
+
];
|
|
18
|
+
export function isSupportedArtifactKind(value) {
|
|
19
|
+
return SUPPORTED_ARTIFACT_KINDS.includes(value);
|
|
20
|
+
}
|
|
21
|
+
/** Whitelist of supported `--llm-provider` values for `peaks audit goal`. */
|
|
22
|
+
export const SUPPORTED_LLM_PROVIDERS = ['anthropic', 'stub'];
|
|
23
|
+
/**
|
|
24
|
+
* The real provider is the default: `peaks audit goal` is the entry gate for
|
|
25
|
+
* every peaks-* workflow, so it must audit by default and only scaffold when
|
|
26
|
+
* a caller explicitly asks for `stub`.
|
|
27
|
+
*/
|
|
28
|
+
export const DEFAULT_LLM_PROVIDER = 'anthropic';
|
|
29
|
+
export function isSupportedLlmProvider(value) {
|
|
30
|
+
return SUPPORTED_LLM_PROVIDERS.includes(value);
|
|
31
|
+
}
|
|
32
|
+
/** The one hint every `--project` refusal carries, verbatim. */
|
|
33
|
+
export const PROJECT_PATH_HINT = 'Verify the project path exists and is a directory';
|
|
34
|
+
/** The one hint every scanner-failure refusal carries, verbatim. */
|
|
35
|
+
export const SCANNER_HINT = 'Inspect scanner logs and re-run with the same --project path';
|
|
36
|
+
export function validateProjectRoot(projectArg) {
|
|
37
|
+
const projectRoot = resolve(projectArg);
|
|
38
|
+
if (!existsSync(projectRoot)) {
|
|
39
|
+
return {
|
|
40
|
+
ok: false,
|
|
41
|
+
code: 'PROJECT_NOT_FOUND',
|
|
42
|
+
message: `project path does not exist: ${projectArg}`
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
let stat;
|
|
46
|
+
try {
|
|
47
|
+
stat = statSync(projectRoot);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return { ok: false, code: 'INVALID_PROJECT', message: getErrorMessage(error) };
|
|
51
|
+
}
|
|
52
|
+
if (!stat.isDirectory()) {
|
|
53
|
+
return {
|
|
54
|
+
ok: false,
|
|
55
|
+
code: 'INVALID_PROJECT',
|
|
56
|
+
message: `project path is not a directory: ${projectArg}`
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return { ok: true, projectRoot };
|
|
60
|
+
}
|
|
@@ -1,41 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* peaks audit * CLI surface — Slice L2.1 + L2.3 P2-a.
|
|
3
3
|
*
|
|
4
|
-
* Registers the
|
|
5
|
-
* `
|
|
4
|
+
* Registers the `peaks audit` top-level command with the `red-lines` (L2.1),
|
|
5
|
+
* `static` (L2.3 P2-a), `prose-ratio`, `goal` and `artifact` subcommands.
|
|
6
6
|
* Per `peaks-loop-when-adding-a-new-subcommand-check-for-existing-top-level-first.md`
|
|
7
7
|
* we verified that no `peaks audit` top-level exists; this is the only
|
|
8
8
|
* file that owns the registration.
|
|
9
|
+
*
|
|
10
|
+
* The action bodies live in `audit-<responsibility>-runners.ts` siblings; this
|
|
11
|
+
* file only wires the commands and delegates. Each delegate preserves the
|
|
12
|
+
* original callback's declared arity.
|
|
9
13
|
*/
|
|
10
14
|
import type { Command } from 'commander';
|
|
11
|
-
import { type AgentShieldState } from '../../services/audit/static-service.js';
|
|
12
15
|
import { type ProgramIO } from '../cli-helpers.js';
|
|
13
|
-
|
|
14
|
-
import type { RedLineAudit } from '../../services/audit/types.js';
|
|
15
|
-
import { type AuditDecisionRecord } from '../../services/audit/decision-writer.js';
|
|
16
|
-
/** `audit-failed` is a failure envelope's status — never a scaffold, never a success. */
|
|
17
|
-
export type AuditGoalStatus = 'audit-complete' | 'scaffold-only' | 'audit-failed';
|
|
18
|
-
export interface AuditGoalData {
|
|
19
|
-
readonly status: AuditGoalStatus;
|
|
20
|
-
/** Which LLM produced (or failed to produce) the audit. `unresolved` = rejected before binding. */
|
|
21
|
-
readonly providerBinding: 'anthropic-messages-api' | 'stub' | 'unresolved';
|
|
22
|
-
readonly need: string;
|
|
23
|
-
readonly projectRoot: string;
|
|
24
|
-
/** The validated 6-dimension audit. Present on success only. */
|
|
25
|
-
readonly result?: AuditGoalOutput;
|
|
26
|
-
/** The bound model. Present on a real run only. */
|
|
27
|
-
readonly model?: string;
|
|
28
|
-
/**
|
|
29
|
-
* Environment variables the binding needed and did not find. Present on a
|
|
30
|
-
* binding failure only, and verbatim: `fail()` redacts `message`, so this
|
|
31
|
-
* is the channel that reliably names what the operator must set.
|
|
32
|
-
*/
|
|
33
|
-
readonly missingEnv?: readonly string[];
|
|
34
|
-
}
|
|
35
|
-
export interface StaticAuditData {
|
|
36
|
-
readonly audit: RedLineAudit;
|
|
37
|
-
readonly agentShield: AgentShieldState;
|
|
38
|
-
/** Populated only when `--record` is passed. Persisted decision record path. */
|
|
39
|
-
readonly decision?: AuditDecisionRecord;
|
|
40
|
-
}
|
|
16
|
+
export type { AuditGoalData, AuditGoalStatus, StaticAuditData } from './audit-command-shared.js';
|
|
41
17
|
export declare function registerAuditCommands(program: Command, io: ProgramIO): void;
|