@mmerterden/multi-agent-pipeline 20.2.0 → 20.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +923 -1
- package/README.md +104 -81
- package/README.tr.md +103 -62
- package/docs/FIGMA_PIPELINE.md +35 -35
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
- package/docs/architecture.md +50 -14
- package/docs/best-practices.md +1 -1
- package/docs/ecosystem.md +56 -32
- package/docs/facts.json +10 -10
- package/docs/features.md +97 -5
- package/docs/recovery-guide.md +7 -14
- package/docs/server-readiness.md +31 -24
- package/index.js +1 -1
- package/install/_common.mjs +3 -5
- package/install/_platform-filter.mjs +23 -1
- package/install/_unattended-profile.mjs +321 -75
- package/install/claude.mjs +51 -10
- package/install/codex.mjs +2 -0
- package/install/copilot.mjs +2 -0
- package/install/index.mjs +30 -17
- package/install/templates/claude-hooks.json +16 -5
- package/install/templates/copilot-instructions.md +1 -1
- package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
- package/install/templates/multi-agent-autopilot.plist.template +12 -5
- package/install/unattended-profile-legacy.json +80 -0
- package/manifest.json +616 -483
- package/package.json +8 -3
- package/pipeline/agents/code-reviewer.md +10 -0
- package/pipeline/agents/plan-critic.md +98 -0
- package/pipeline/agents/security-auditor.md +10 -0
- package/pipeline/agents/task-clarifier.md +10 -0
- package/pipeline/commands/multi-agent/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
- package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
- package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
- package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
- package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
- package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
- package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
- package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
- package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
- package/pipeline/contract/CHANGELOG.md +74 -0
- package/pipeline/contract/README.md +126 -0
- package/pipeline/contract/build.mjs +427 -0
- package/pipeline/contract/fixtures/answer-result.json +11 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
- package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
- package/pipeline/contract/fixtures/error-unsigned.json +5 -0
- package/pipeline/contract/fixtures/issues-empty.json +18 -0
- package/pipeline/contract/fixtures/launch-plan.json +31 -0
- package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
- package/pipeline/contract/fixtures/runs-empty.json +6 -0
- package/pipeline/contract/fixtures/runs-failed.json +84 -0
- package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
- package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
- package/pipeline/contract/fixtures/runs-running.json +84 -0
- package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
- package/pipeline/contract/frozen/toolbox.json +107 -0
- package/pipeline/contract/manifest.json +263 -0
- package/pipeline/contract/types/index.d.ts +343 -0
- package/pipeline/lib/_jira-auth.sh +6 -2
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/autopilot-state.sh +19 -0
- package/pipeline/lib/context-link-extractor.sh +12 -5
- package/pipeline/lib/credential-inventory.sh +12 -5
- package/pipeline/lib/credential-store.sh +116 -185
- package/pipeline/lib/fetch-confluence.sh +44 -3
- package/pipeline/lib/fetch-document.sh +3 -4
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/figma-mcp-refresh.sh +2 -2
- package/pipeline/lib/figma-token.sh +5 -1
- package/pipeline/lib/issue-fetcher.sh +233 -16
- package/pipeline/lib/json-file-lock.mjs +172 -0
- package/pipeline/lib/model-dispatch.sh +21 -12
- package/pipeline/lib/model-rung.sh +6 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/outbound-gate.mjs +46 -16
- package/pipeline/lib/parse-complaints.sh +14 -7
- package/pipeline/lib/plan-todos.sh +3 -3
- package/pipeline/lib/post-pr-review.sh +9 -9
- package/pipeline/lib/pr-request-location.mjs +85 -0
- package/pipeline/lib/regular-file.mjs +153 -0
- package/pipeline/lib/repo-hygiene.sh +17 -0
- package/pipeline/lib/route-state.sh +5 -1
- package/pipeline/lib/run-paths.sh +3 -2
- package/pipeline/lib/stack-detect.sh +19 -1
- package/pipeline/lib/unattended-profile-check.mjs +178 -0
- package/pipeline/lib/unattended-settings-location.mjs +28 -0
- package/pipeline/lib/unattended.mjs +76 -0
- package/pipeline/lib/unattended.sh +32 -0
- package/pipeline/lib/untrusted.mjs +76 -0
- package/pipeline/lib/user-facing.mjs +82 -0
- package/pipeline/lib/user-facing.sh +58 -0
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
- package/pipeline/multi-agent-refs/analysis/render.md +4 -3
- package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
- package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
- package/pipeline/multi-agent-refs/analysis-template.md +10 -17
- package/pipeline/multi-agent-refs/channels/jira.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
- package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
- package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
- package/pipeline/multi-agent-refs/features/constitution.md +196 -0
- package/pipeline/multi-agent-refs/features/doctor.md +6 -3
- package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
- package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
- package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
- package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
- package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
- package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
- package/pipeline/multi-agent-refs/features/research.md +150 -0
- package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
- package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
- package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
- package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
- package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
- package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
- package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
- package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -31
- package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
- package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
- package/pipeline/multi-agent-refs/keychain.md +6 -11
- package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
- package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
- package/pipeline/multi-agent-refs/phases/modes.md +10 -12
- package/pipeline/multi-agent-refs/phases/operations.md +11 -5
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
- package/pipeline/multi-agent-refs/phases.md +1 -1
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/progress-contract.md +13 -16
- package/pipeline/multi-agent-refs/readiness-review.md +1 -1
- package/pipeline/multi-agent-refs/research/engine.md +91 -0
- package/pipeline/multi-agent-refs/rules.md +6 -4
- package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
- package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
- package/pipeline/rules/figma-pipeline.md +12 -12
- package/pipeline/schemas/agent-state.schema.json +480 -18
- package/pipeline/schemas/analysis-spec.schema.json +4 -4
- package/pipeline/schemas/answer-request.schema.json +24 -0
- package/pipeline/schemas/answer-result.schema.json +28 -0
- package/pipeline/schemas/autopilot-config.schema.json +111 -13
- package/pipeline/schemas/command-parameters.schema.json +99 -0
- package/pipeline/schemas/constitution.schema.json +56 -0
- package/pipeline/schemas/contract-error.schema.json +52 -0
- package/pipeline/schemas/design-check-config.schema.json +5 -1
- package/pipeline/schemas/issues.schema.json +61 -0
- package/pipeline/schemas/launch-plan.schema.json +46 -0
- package/pipeline/schemas/launch-request.schema.json +45 -0
- package/pipeline/schemas/launch.json +61 -0
- package/pipeline/schemas/launch.schema.json +84 -0
- package/pipeline/schemas/phases.json +2 -2
- package/pipeline/schemas/phases.schema.json +68 -0
- package/pipeline/schemas/phone-devices.schema.json +61 -0
- package/pipeline/schemas/phone-signed-request.schema.json +67 -0
- package/pipeline/schemas/plan-critique.schema.json +99 -0
- package/pipeline/schemas/plan-todos.schema.json +7 -7
- package/pipeline/schemas/planning-output.schema.json +5 -0
- package/pipeline/schemas/pr-request.schema.json +46 -0
- package/pipeline/schemas/prefs.schema.json +82 -7
- package/pipeline/schemas/research-output.schema.json +118 -0
- package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
- package/pipeline/schemas/reviewer-output.schema.json +40 -4
- package/pipeline/schemas/run-questions.json +392 -0
- package/pipeline/schemas/run-questions.schema.json +118 -0
- package/pipeline/schemas/runs-index.schema.json +189 -0
- package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
- package/pipeline/schemas/secret-patterns.schema.json +28 -0
- package/pipeline/schemas/stack-adapters.json +527 -0
- package/pipeline/schemas/stack-adapters.schema.json +184 -0
- package/pipeline/schemas/token-budget.json +1 -1
- package/pipeline/schemas/token-budget.schema.json +26 -0
- package/pipeline/schemas/triage-output.schema.json +64 -3
- package/pipeline/schemas/unattended-policy.json +139 -0
- package/pipeline/schemas/unattended-policy.schema.json +73 -0
- package/pipeline/schemas/unattended-profile.json +248 -0
- package/pipeline/schemas/unattended-profile.schema.json +198 -0
- package/pipeline/schemas/worktrees.schema.json +51 -0
- package/pipeline/scripts/README.md +1 -0
- package/pipeline/scripts/_autopilot-config.mjs +130 -0
- package/pipeline/scripts/_autopilot-ops.mjs +567 -0
- package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
- package/pipeline/scripts/_command-contract.mjs +384 -0
- package/pipeline/scripts/_cost.mjs +40 -0
- package/pipeline/scripts/_notices.mjs +160 -0
- package/pipeline/scripts/_phone-auth.mjs +485 -0
- package/pipeline/scripts/_pre-existing.mjs +294 -0
- package/pipeline/scripts/_redact.mjs +77 -0
- package/pipeline/scripts/_run-paths.mjs +4 -2
- package/pipeline/scripts/_stack-adapter.mjs +678 -0
- package/pipeline/scripts/_stack-routing.mjs +1 -1
- package/pipeline/scripts/agent-guard.py +348 -37
- package/pipeline/scripts/agent-guard.sh +41 -13
- package/pipeline/scripts/analysis-story-tree.mjs +79 -3
- package/pipeline/scripts/answer-question.mjs +181 -0
- package/pipeline/scripts/audit-log-rotate.sh +1 -4
- package/pipeline/scripts/audit-log.sh +4 -4
- package/pipeline/scripts/autopilot-arming.mjs +389 -21
- package/pipeline/scripts/autopilot-awake.mjs +255 -0
- package/pipeline/scripts/autopilot-intake.mjs +137 -36
- package/pipeline/scripts/autopilot-menubar.swift +156 -44
- package/pipeline/scripts/autopilot-publish.mjs +1625 -0
- package/pipeline/scripts/autopilot-runner.mjs +1678 -222
- package/pipeline/scripts/autopilot-status.sh +198 -33
- package/pipeline/scripts/build-lock.sh +120 -0
- package/pipeline/scripts/build-references.mjs +4 -1
- package/pipeline/scripts/build-stack-plugins.mjs +59 -22
- package/pipeline/scripts/capture-flush.sh +1 -1
- package/pipeline/scripts/capture-resume.sh +13 -9
- package/pipeline/scripts/check-derived-drift.mjs +52 -11
- package/pipeline/scripts/commands.mjs +88 -0
- package/pipeline/scripts/constitution.mjs +362 -0
- package/pipeline/scripts/contract-server.mjs +776 -0
- package/pipeline/scripts/cost-analyze.mjs +89 -39
- package/pipeline/scripts/diff-explain.mjs +12 -1
- package/pipeline/scripts/doctor.mjs +77 -28
- package/pipeline/scripts/evidence-gate.mjs +192 -12
- package/pipeline/scripts/feedback-send.mjs +4 -2
- package/pipeline/scripts/gate-ledger.mjs +449 -0
- package/pipeline/scripts/gc-abandoned.sh +132 -13
- package/pipeline/scripts/gen-facts.mjs +31 -15
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/github-ssh-setup.sh +140 -29
- package/pipeline/scripts/graph-mermaid.mjs +4 -1
- package/pipeline/scripts/issues.mjs +236 -0
- package/pipeline/scripts/jira-attach.sh +6 -2
- package/pipeline/scripts/jira-search.sh +4 -3
- package/pipeline/scripts/keychain-save.sh +125 -24
- package/pipeline/scripts/keychain.py +63 -93
- package/pipeline/scripts/launch-request.mjs +747 -0
- package/pipeline/scripts/localize-commands.mjs +4 -10
- package/pipeline/scripts/log-metric.sh +6 -5
- package/pipeline/scripts/maturity-followup.mjs +13 -4
- package/pipeline/scripts/memory-save.sh +25 -0
- package/pipeline/scripts/migrate-prefs.mjs +4 -3
- package/pipeline/scripts/open-questions-gate.mjs +276 -0
- package/pipeline/scripts/phase-tracker.sh +41 -27
- package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
- package/pipeline/scripts/phone-devices.mjs +224 -0
- package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
- package/pipeline/scripts/plan-critique-gate.mjs +591 -0
- package/pipeline/scripts/pr-request.mjs +188 -0
- package/pipeline/scripts/pre-commit-check.sh +115 -4
- package/pipeline/scripts/probe-evidence-capability.sh +44 -5
- package/pipeline/scripts/record-phase.mjs +71 -0
- package/pipeline/scripts/render-agent-log-cost.sh +17 -2
- package/pipeline/scripts/render-cost-summary.sh +1 -1
- package/pipeline/scripts/render-work-summary.sh +1 -1
- package/pipeline/scripts/require-supported-version.sh +4 -1
- package/pipeline/scripts/research-gate.mjs +704 -0
- package/pipeline/scripts/review-decision-gate.mjs +403 -0
- package/pipeline/scripts/routine-registry.mjs +5 -2
- package/pipeline/scripts/runs-index.mjs +135 -27
- package/pipeline/scripts/scaffold-gate.mjs +393 -0
- package/pipeline/scripts/skill-conformance.mjs +25 -8
- package/pipeline/scripts/skill-siblings.mjs +2 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
- package/pipeline/scripts/smoke-schema-validation.sh +6 -2
- package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
- package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
- package/pipeline/scripts/test-gap-scan.mjs +40 -2
- package/pipeline/scripts/test-integrity-gate.mjs +20 -4
- package/pipeline/scripts/test-strength.mjs +484 -0
- package/pipeline/scripts/test-summary.mjs +651 -0
- package/pipeline/scripts/triage-memory.mjs +49 -9
- package/pipeline/scripts/unattended_policy.py +2786 -0
- package/pipeline/scripts/uninstall.mjs +10 -10
- package/pipeline/scripts/update-issue-progress.sh +1 -1
- package/pipeline/scripts/usage-identity.mjs +288 -0
- package/pipeline/scripts/usage-register.mjs +185 -63
- package/pipeline/scripts/usage-report.mjs +230 -66
- package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
- package/pipeline/scripts/validate-planning.mjs +6 -0
- package/pipeline/scripts/verify-citations.mjs +151 -38
- package/pipeline/scripts/verify.mjs +58 -18
- package/pipeline/scripts/worktree-prepare.sh +126 -0
- package/pipeline/scripts/worktrees.mjs +124 -0
- package/pipeline/scripts/write-state.mjs +48 -17
- package/pipeline/skills/.skill-manifest.json +222 -226
- package/pipeline/skills/.skills-index.json +77 -88
- package/pipeline/skills/shared/README.md +44 -45
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
- package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
- package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
- package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
- package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
- package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
- package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
- package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
- package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
- package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
- package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
- package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
- package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
- package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
- package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
- package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
- package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
- package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
- package/pipeline/skills/shared/external/council/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
- package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
- package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
- package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
- package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
- package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
- package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
- package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
- package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
- package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
- package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
- package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
- package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
- package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
- package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
- package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
- package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
- package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
- package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
- package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
- package/pipeline/skills/skills-index.md +40 -41
- package/docs/token-budget-history.md +0 -24
- package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
- package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
- package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
- package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
- package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Client contract kit
|
|
2
|
+
|
|
3
|
+
What a client (the macOS toolbox, a web page, a script) needs to read the
|
|
4
|
+
pipeline's state and start or answer a run without a terminal conversation.
|
|
5
|
+
Nothing in here is a UI and nothing here runs on its own.
|
|
6
|
+
|
|
7
|
+
| File | What it is |
|
|
8
|
+
|------|------------|
|
|
9
|
+
| `manifest.json` | Every surface: its CLI invocation, its HTTP route, its schema and version. |
|
|
10
|
+
| `../schemas/*.schema.json` | The schemas. The kit points at them; it never copies them. |
|
|
11
|
+
| `types/index.d.ts` | TypeScript declarations generated from those schemas by `build.mjs`. |
|
|
12
|
+
| `fixtures/*.json` | Real producer output for every state a client renders, generated by `build.mjs`. |
|
|
13
|
+
| `frozen/toolbox.json` | The fields the macOS toolbox decodes today, held by `test/toolbox-compat.test.mjs`. |
|
|
14
|
+
| `CHANGELOG.md` | What changed in the contract, by contract version. |
|
|
15
|
+
|
|
16
|
+
`node pipeline/contract/build.mjs --write` regenerates the types and fixtures;
|
|
17
|
+
`--check` fails on drift. `npm pack` runs `--write` first, so a published kit
|
|
18
|
+
always matches its schemas.
|
|
19
|
+
|
|
20
|
+
From the npm package: `@mmerterden/multi-agent-pipeline/contract` resolves to
|
|
21
|
+
the types (and to `manifest.json` at runtime), `/contract/*` to any kit file
|
|
22
|
+
and `/schemas/*` to a schema.
|
|
23
|
+
|
|
24
|
+
## Two carriers, one contract
|
|
25
|
+
|
|
26
|
+
Every surface is reachable two ways, and for the same input both print the
|
|
27
|
+
same bytes (`test/contract-parity.test.mjs`):
|
|
28
|
+
|
|
29
|
+
1. **CLI.** The scripts under `pipeline/scripts/` (installed: `~/.claude/scripts/`)
|
|
30
|
+
print JSON on stdout. `--redact` drops every field a schema marks
|
|
31
|
+
`x-sensitivity: local`.
|
|
32
|
+
2. **HTTP.** `contract-server.mjs`, started on demand with `/multi-agent:serve`
|
|
33
|
+
or by the client itself. Routes are in `manifest.json`; `?redact=1` is
|
|
34
|
+
`--redact`.
|
|
35
|
+
|
|
36
|
+
| Surface | CLI | HTTP |
|
|
37
|
+
|---------|-----|------|
|
|
38
|
+
| Runs | `runs-index.mjs --json [--group G] [--redact]` | `GET /v1/runs` |
|
|
39
|
+
| One run | `runs-index.mjs --json --task-id ID` | `GET /v1/runs/{id}` |
|
|
40
|
+
| Commands | `commands.mjs --json` | `GET /v1/commands` |
|
|
41
|
+
| Run questions | `launch-request.mjs questions` | `GET /v1/questions` |
|
|
42
|
+
| Assigned issues | `issues.mjs --json [--source S] [--project K] [--max N]` | `GET /v1/issues` |
|
|
43
|
+
| Worktrees | `worktrees.mjs --json [--measure] [--redact]` | `GET /v1/worktrees` |
|
|
44
|
+
| Launch shape | `launch-request.mjs spec` | `GET /v1/launch-spec` |
|
|
45
|
+
| Start a run | write the request file, then `launch-request.mjs plan FILE --repo P --session-id U [--channel phone]` | `POST /v1/launch?repo=P` |
|
|
46
|
+
| Answer a question | `answer-question.mjs STATE --question Q --answer IDS` | `POST /v1/runs/{id}/answer` |
|
|
47
|
+
|
|
48
|
+
Starting a run is always the client's act. `POST /v1/launch` validates the
|
|
49
|
+
request, writes it (0600) and returns the argv, environment and working
|
|
50
|
+
directory from `launch.json`; it never starts `claude`. Spawn the argv without
|
|
51
|
+
a shell. `launch.json` is marked `verified: false` until a live launch trial, so
|
|
52
|
+
treat the shape as provisional.
|
|
53
|
+
|
|
54
|
+
The run starts with no permission prompts, so its input is held to a shape: a
|
|
55
|
+
Jira key, a GitHub issue URL, `repo#N`, `#N`, or a Jira URL on the configured
|
|
56
|
+
host passes as it is; free text (desktop only) becomes one quoted argument; a
|
|
57
|
+
newline, a control character, a leading `-` or a first token that is a pipeline
|
|
58
|
+
op or mode keyword is refused (`launch-request.schema.json`). `repo` must be a
|
|
59
|
+
configured autopilot repo or one registered with
|
|
60
|
+
`launch-request.mjs register-repo <path>`, else `403 repo-not-allowed`.
|
|
61
|
+
|
|
62
|
+
To answer, read `pendingQuestion` from the run (present when `waitingFor` is
|
|
63
|
+
`question`) and send its `id` with one or more of its `options[].id`. Anything
|
|
64
|
+
else is refused, and a run that has moved to another question refuses an
|
|
65
|
+
answer to the old one.
|
|
66
|
+
|
|
67
|
+
## Talking to the server
|
|
68
|
+
|
|
69
|
+
- It listens on `127.0.0.1` only, on the port its ready line names, and refuses
|
|
70
|
+
any other `--host`.
|
|
71
|
+
- The ready line (stdout, one JSON object) names `tokenFile`, a 0600 file under
|
|
72
|
+
`~/.claude/logs/multi-agent/contract-server/` holding the token. A client
|
|
73
|
+
that spawned the server can pass `--print-token` to get it on the ready line.
|
|
74
|
+
- Every request sends `Authorization: Bearer <token>` and a `Host` of
|
|
75
|
+
`127.0.0.1:<port>` or `localhost:<port>`.
|
|
76
|
+
- A browser page is allowed only from an origin passed with `--allow-origin`;
|
|
77
|
+
CORS is off without one. A request carrying an `Origin` is always served
|
|
78
|
+
redacted.
|
|
79
|
+
- Bodies are JSON, at most 64 KiB, and must satisfy the route's schema.
|
|
80
|
+
- Errors follow `contract-error.schema.json`; switch on `error`, never on
|
|
81
|
+
`message`.
|
|
82
|
+
- The server exits after 15 idle minutes (`--idle-minutes`) or on SIGTERM. It
|
|
83
|
+
is never a service; start it when you need it.
|
|
84
|
+
|
|
85
|
+
A client that relays anything off this machine uses `redact=1` (or
|
|
86
|
+
`--redact`) for every read.
|
|
87
|
+
|
|
88
|
+
## Phone routes
|
|
89
|
+
|
|
90
|
+
A phone does not use the bearer token. It holds an Ed25519 key enrolled locally
|
|
91
|
+
with `phone-devices.mjs add` and signs every request; `manifest.json` `phone`
|
|
92
|
+
names the headers, the signed fields, the 60 second window and the scopes, and
|
|
93
|
+
`phone-signed-request.schema.json` describes the signed text.
|
|
94
|
+
|
|
95
|
+
| Surface | Scope | HTTP |
|
|
96
|
+
|---------|-------|------|
|
|
97
|
+
| Runs, redacted | `read` | `GET /v1/phone/runs` |
|
|
98
|
+
| One run, redacted | `read` | `GET /v1/phone/runs/{id}` |
|
|
99
|
+
| Answer a question | `answer` | `POST /v1/phone/runs/{id}/answer` |
|
|
100
|
+
| Queue a launch (off until `phone-devices.mjs launch on`) | `launch` | `POST /v1/phone/launch?repo=P` |
|
|
101
|
+
|
|
102
|
+
The bearer token does not open these routes and a signature opens no other
|
|
103
|
+
route. Responses are always redacted; `redact=0` is refused. There is no pause,
|
|
104
|
+
resume, stop, steer, shell, prompt, run, merge or ready verb; each is `404
|
|
105
|
+
unknown-verb`. Threat model, transport and residual risks:
|
|
106
|
+
`multi-agent-refs/features/phone-api.md`.
|
|
107
|
+
|
|
108
|
+
## Versioning and breaking changes
|
|
109
|
+
|
|
110
|
+
The kit carries one `contractVersion` (`manifest.json`, and the
|
|
111
|
+
`X-Contract-Version` header on every response); each surface also stamps its
|
|
112
|
+
own version in its output.
|
|
113
|
+
|
|
114
|
+
- **Adding** a field, a surface, a query parameter or an error code is a
|
|
115
|
+
**minor** bump. Decoders ignore keys they do not know, so nothing breaks.
|
|
116
|
+
- **Removing** or renaming a field, changing a field's type, narrowing what a
|
|
117
|
+
request accepts, or changing what an error code means is a **major** bump.
|
|
118
|
+
`frozen/toolbox.json` makes the toolbox's fields fail a test before such a
|
|
119
|
+
change can land by accident.
|
|
120
|
+
- **After a major bump the previous major stays served for one minor**,
|
|
121
|
+
selected with `?v=<major>` on any route. The minor after that removes it.
|
|
122
|
+
`?v=` with a major the server does not serve is a 400 `unsupported-version`
|
|
123
|
+
whose `supported` lists the ones it does. Without `?v=` the current major is
|
|
124
|
+
served.
|
|
125
|
+
- Every version change gets a section in `CHANGELOG.md` saying what a client
|
|
126
|
+
has to do.
|
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @file build.mjs - generate the client kit's TypeScript declarations and
|
|
4
|
+
* fixtures from the things they describe.
|
|
5
|
+
*
|
|
6
|
+
* Two outputs, both derived, both checked in so a reader of the repository
|
|
7
|
+
* sees what a client gets:
|
|
8
|
+
*
|
|
9
|
+
* types/index.d.ts one exported type per schema manifest.json lists, read
|
|
10
|
+
* from pipeline/schemas/ (the single copy of each schema);
|
|
11
|
+
* fixtures/*.json what the producers print for a fixed set of runs, one
|
|
12
|
+
* per state a client renders, made by calling the same
|
|
13
|
+
* functions the CLI and contract-server.mjs call.
|
|
14
|
+
*
|
|
15
|
+
* `--write` regenerates both (package.json prepack runs it, so a packed kit
|
|
16
|
+
* never carries stale types). `--check` regenerates in memory and exits 1
|
|
17
|
+
* naming every file that differs; test/contract-kit.test.mjs runs it.
|
|
18
|
+
*
|
|
19
|
+
* The schema-to-TypeScript translation covers the subset the contract schemas
|
|
20
|
+
* use: type (and type unions), enum, const, properties/required,
|
|
21
|
+
* additionalProperties, items, anyOf/oneOf and local $defs references.
|
|
22
|
+
* Conditionals (if/then) narrow nothing TypeScript can express and are left
|
|
23
|
+
* to the schema. Zero dependencies (ADR-0004).
|
|
24
|
+
*
|
|
25
|
+
* Usage:
|
|
26
|
+
* node pipeline/contract/build.mjs --write | --check
|
|
27
|
+
*
|
|
28
|
+
* Exit: 0 written or up to date, 1 drift found by --check, 2 usage error.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { mkdirSync, mkdtempSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
32
|
+
import { tmpdir } from "node:os";
|
|
33
|
+
import { join } from "node:path";
|
|
34
|
+
import { fileURLToPath } from "node:url";
|
|
35
|
+
|
|
36
|
+
const KIT = fileURLToPath(new URL(".", import.meta.url));
|
|
37
|
+
const MANIFEST = JSON.parse(readFileSync(join(KIT, "manifest.json"), "utf8"));
|
|
38
|
+
const SCHEMAS = join(KIT, MANIFEST.schemasDir);
|
|
39
|
+
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// TypeScript declarations
|
|
42
|
+
|
|
43
|
+
const pascal = (s) =>
|
|
44
|
+
s
|
|
45
|
+
.split(/[^A-Za-z0-9]+/)
|
|
46
|
+
.filter(Boolean)
|
|
47
|
+
.map((w) => w[0].toUpperCase() + w.slice(1))
|
|
48
|
+
.join("");
|
|
49
|
+
|
|
50
|
+
export const typeNameFor = (file) => pascal(file.replace(/\.schema\.json$/, ""));
|
|
51
|
+
|
|
52
|
+
const IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
53
|
+
const key = (k) => (IDENT.test(k) ? k : JSON.stringify(k));
|
|
54
|
+
const literal = (v) => JSON.stringify(v);
|
|
55
|
+
|
|
56
|
+
function doc(text, pad) {
|
|
57
|
+
if (!text) return "";
|
|
58
|
+
const clean = String(text).replace(/\*\//g, "* /").replace(/\s+/g, " ").trim();
|
|
59
|
+
return `${pad}/** ${clean} */\n`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function tsType(node, ctx, pad) {
|
|
63
|
+
if (!node || typeof node !== "object") return "unknown";
|
|
64
|
+
if (node.$ref) {
|
|
65
|
+
const m = /^#\/\$defs\/(.+)$/.exec(node.$ref);
|
|
66
|
+
return m ? ctx.base + pascal(m[1]) : "unknown";
|
|
67
|
+
}
|
|
68
|
+
if ("const" in node) return literal(node.const);
|
|
69
|
+
if (Array.isArray(node.enum)) return node.enum.map(literal).join(" | ");
|
|
70
|
+
const alts = node.oneOf ?? node.anyOf;
|
|
71
|
+
if (Array.isArray(alts)) {
|
|
72
|
+
return alts.map((a) => wrap(tsType(a, ctx, pad))).join(" | ");
|
|
73
|
+
}
|
|
74
|
+
const types = node.type === undefined ? [] : [].concat(node.type);
|
|
75
|
+
if (!types.length) return node.properties ? objectType(node, ctx, pad) : "unknown";
|
|
76
|
+
return types.map((t) => wrap(single(t, node, ctx, pad))).join(" | ");
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const wrap = (t) => (/^[^{]*\|/.test(t) && !t.startsWith("(") ? `(${t})` : t);
|
|
80
|
+
|
|
81
|
+
function single(t, node, ctx, pad) {
|
|
82
|
+
switch (t) {
|
|
83
|
+
case "string":
|
|
84
|
+
return "string";
|
|
85
|
+
case "integer":
|
|
86
|
+
case "number":
|
|
87
|
+
return "number";
|
|
88
|
+
case "boolean":
|
|
89
|
+
return "boolean";
|
|
90
|
+
case "null":
|
|
91
|
+
return "null";
|
|
92
|
+
case "array":
|
|
93
|
+
return node.items ? `Array<${tsType(node.items, ctx, pad)}>` : "unknown[]";
|
|
94
|
+
case "object":
|
|
95
|
+
return objectType(node, ctx, pad);
|
|
96
|
+
default:
|
|
97
|
+
return "unknown";
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function objectType(node, ctx, pad) {
|
|
102
|
+
const props = node.properties ?? {};
|
|
103
|
+
const required = new Set(node.required ?? []);
|
|
104
|
+
const inner = `${pad} `;
|
|
105
|
+
const lines = [];
|
|
106
|
+
for (const [k, v] of Object.entries(props)) {
|
|
107
|
+
lines.push(
|
|
108
|
+
doc(v.description, inner) +
|
|
109
|
+
`${inner}${key(k)}${required.has(k) ? "" : "?"}: ${tsType(v, ctx, inner)};`,
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const extra = node.additionalProperties;
|
|
113
|
+
if (extra && typeof extra === "object") {
|
|
114
|
+
lines.push(`${inner}[key: string]: ${tsType(extra, ctx, inner)};`);
|
|
115
|
+
} else if (!Object.keys(props).length) {
|
|
116
|
+
return "Record<string, unknown>";
|
|
117
|
+
}
|
|
118
|
+
return `{\n${lines.join("\n")}\n${pad}}`;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function declare(name, node, ctx) {
|
|
122
|
+
const isObject = [].concat(node.type ?? []).join() === "object" && node.properties;
|
|
123
|
+
const head = doc(node.description ?? node.title, "");
|
|
124
|
+
return isObject
|
|
125
|
+
? `${head}export interface ${name} ${objectType(node, ctx, "")}\n`
|
|
126
|
+
: `${head}export type ${name} = ${tsType(node, ctx, "")};\n`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export function renderTypes() {
|
|
130
|
+
const out = [
|
|
131
|
+
"// Generated by pipeline/contract/build.mjs from pipeline/schemas/*.schema.json.",
|
|
132
|
+
"// Do not edit: change the schema and run `node pipeline/contract/build.mjs --write`.",
|
|
133
|
+
"",
|
|
134
|
+
`export type ContractVersion = ${literal(MANIFEST.contractVersion)};`,
|
|
135
|
+
`export type SurfaceId = ${MANIFEST.surfaces.map((s) => literal(s.id)).join(" | ")};`,
|
|
136
|
+
"",
|
|
137
|
+
];
|
|
138
|
+
for (const file of MANIFEST.schemas) {
|
|
139
|
+
const schema = JSON.parse(readFileSync(join(SCHEMAS, file), "utf8"));
|
|
140
|
+
const base = typeNameFor(file);
|
|
141
|
+
const ctx = { base };
|
|
142
|
+
out.push(declare(base, schema, ctx));
|
|
143
|
+
for (const [defName, def] of Object.entries(schema.$defs ?? {})) {
|
|
144
|
+
out.push(declare(base + pascal(defName), def, ctx));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return out.join("\n");
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
// Fixtures
|
|
152
|
+
|
|
153
|
+
const FIXED_NOW = "2026-09-17T10:30:00.000Z";
|
|
154
|
+
const SHOWN_ROOT = "/Users/example/.claude/logs/multi-agent";
|
|
155
|
+
const QUESTION = {
|
|
156
|
+
id: "maturity",
|
|
157
|
+
stepId: "phase-0/maturity",
|
|
158
|
+
text: "The item has no acceptance criteria. How should the run continue?",
|
|
159
|
+
kind: "single-select",
|
|
160
|
+
options: [
|
|
161
|
+
{ id: "fix", label: "Open the item and fix it" },
|
|
162
|
+
{ id: "continue", label: "Continue without it" },
|
|
163
|
+
{ id: "abort", label: "Abort" },
|
|
164
|
+
],
|
|
165
|
+
};
|
|
166
|
+
const tracker = (taskId, phases) => ({
|
|
167
|
+
task_id: taskId,
|
|
168
|
+
started_at: "2026-09-17T10:00:00Z",
|
|
169
|
+
phases,
|
|
170
|
+
});
|
|
171
|
+
const phase = (id, name, status, extra = {}) => ({ id, name, status, ...extra });
|
|
172
|
+
const DONE = (id, name) =>
|
|
173
|
+
phase(id, name, "completed", {
|
|
174
|
+
model: "opus",
|
|
175
|
+
started_at: "2026-09-17T10:00:00Z",
|
|
176
|
+
completed_at: "2026-09-17T10:05:00Z",
|
|
177
|
+
tokens_in: 1200,
|
|
178
|
+
tokens_out: 340,
|
|
179
|
+
tokens_cached: 900,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
/** One run per state: [agent-state, tracker-state] under example-app/<taskId>. */
|
|
183
|
+
const RUN_STATES = {
|
|
184
|
+
running: [
|
|
185
|
+
{
|
|
186
|
+
taskId: "PROJ-101",
|
|
187
|
+
schemaVersion: "2.2.0",
|
|
188
|
+
rev: 7,
|
|
189
|
+
status: "in_progress",
|
|
190
|
+
currentPhase: 2,
|
|
191
|
+
branch: "feature/PROJ-101",
|
|
192
|
+
baseBranch: "develop",
|
|
193
|
+
startedAt: "2026-09-17T10:00:00Z",
|
|
194
|
+
sessionId: "00000000-0000-4000-8000-000000000101",
|
|
195
|
+
autopilot: true,
|
|
196
|
+
project: "example-app",
|
|
197
|
+
projectRoot: "/Users/example/example-app",
|
|
198
|
+
worktreePath: "/Users/example/example-app/.worktrees/PROJ-101",
|
|
199
|
+
},
|
|
200
|
+
tracker("PROJ-101", [
|
|
201
|
+
DONE("0", "Init"),
|
|
202
|
+
DONE("1", "Plan"),
|
|
203
|
+
phase("2", "Dev", "in_progress", {
|
|
204
|
+
model: "opus",
|
|
205
|
+
started_at: "2026-09-17T10:06:00Z",
|
|
206
|
+
now: "writing tests",
|
|
207
|
+
subs: [
|
|
208
|
+
{ id: "2.1", name: "failing test", status: "completed" },
|
|
209
|
+
{ id: "2.2", name: "implementation", status: "in_progress" },
|
|
210
|
+
],
|
|
211
|
+
}),
|
|
212
|
+
]),
|
|
213
|
+
],
|
|
214
|
+
"awaiting-question": [
|
|
215
|
+
{
|
|
216
|
+
taskId: "PROJ-102",
|
|
217
|
+
schemaVersion: "2.2.0",
|
|
218
|
+
rev: 3,
|
|
219
|
+
status: "awaiting_input",
|
|
220
|
+
currentPhase: 0,
|
|
221
|
+
startedAt: "2026-09-17T10:00:00Z",
|
|
222
|
+
sessionId: "00000000-0000-4000-8000-000000000102",
|
|
223
|
+
autopilot: true,
|
|
224
|
+
project: "example-app",
|
|
225
|
+
waitingFor: "question",
|
|
226
|
+
pendingQuestion: QUESTION,
|
|
227
|
+
},
|
|
228
|
+
tracker("PROJ-102", [phase("0", "Init", "in_progress", { now: "waiting for an answer" })]),
|
|
229
|
+
],
|
|
230
|
+
failed: [
|
|
231
|
+
{
|
|
232
|
+
taskId: "PROJ-103",
|
|
233
|
+
schemaVersion: "2.2.0",
|
|
234
|
+
rev: 12,
|
|
235
|
+
status: "failed",
|
|
236
|
+
currentPhase: 3,
|
|
237
|
+
branch: "bugfix/PROJ-103",
|
|
238
|
+
baseBranch: "develop",
|
|
239
|
+
startedAt: "2026-09-17T10:00:00Z",
|
|
240
|
+
project: "example-app",
|
|
241
|
+
worktreePath: "/Users/example/example-app/.worktrees/PROJ-103",
|
|
242
|
+
},
|
|
243
|
+
tracker("PROJ-103", [
|
|
244
|
+
DONE("0", "Init"),
|
|
245
|
+
DONE("1", "Plan"),
|
|
246
|
+
DONE("2", "Dev"),
|
|
247
|
+
phase("3", "Review", "failed", { model: "fable", started_at: "2026-09-17T10:20:00Z" }),
|
|
248
|
+
]),
|
|
249
|
+
],
|
|
250
|
+
"pr-opened": [
|
|
251
|
+
{
|
|
252
|
+
taskId: "PROJ-104",
|
|
253
|
+
schemaVersion: "2.2.0",
|
|
254
|
+
rev: 21,
|
|
255
|
+
status: "awaiting_input",
|
|
256
|
+
currentPhase: 5,
|
|
257
|
+
branch: "feature/PROJ-104",
|
|
258
|
+
baseBranch: "develop",
|
|
259
|
+
startedAt: "2026-09-17T10:00:00Z",
|
|
260
|
+
project: "example-app",
|
|
261
|
+
worktreePath: "/Users/example/example-app/.worktrees/PROJ-104",
|
|
262
|
+
pr: { url: "https://github.com/example-org/example-app/pull/104" },
|
|
263
|
+
},
|
|
264
|
+
tracker(
|
|
265
|
+
"PROJ-104",
|
|
266
|
+
["Init", "Plan", "Dev", "Review", "Commit", "Report"].map((n, i) => DONE(String(i), n)),
|
|
267
|
+
),
|
|
268
|
+
],
|
|
269
|
+
"old-schema": [
|
|
270
|
+
{
|
|
271
|
+
taskId: "PROJ-105",
|
|
272
|
+
schemaVersion: "2.0.0",
|
|
273
|
+
status: "paused",
|
|
274
|
+
currentPhase: 2,
|
|
275
|
+
branchName: "feature/PROJ-105",
|
|
276
|
+
},
|
|
277
|
+
tracker("PROJ-105", [DONE("0", "Init"), DONE("1", "Plan"), phase("2", "Dev", "pending")]),
|
|
278
|
+
],
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
/** Fields runs-index added after contract 1.0.0; the old-schema fixture has none. */
|
|
282
|
+
const ADDED_SINCE_1_0 = ["sessionId", "waitingFor", "pendingQuestion"];
|
|
283
|
+
|
|
284
|
+
async function withLogsRoot(fn) {
|
|
285
|
+
const base = mkdtempSync(join(tmpdir(), "ma-kit-"));
|
|
286
|
+
const saved = process.env.LOGS_ROOT;
|
|
287
|
+
process.env.LOGS_ROOT = base;
|
|
288
|
+
try {
|
|
289
|
+
return await fn(base);
|
|
290
|
+
} finally {
|
|
291
|
+
if (saved === undefined) delete process.env.LOGS_ROOT;
|
|
292
|
+
else process.env.LOGS_ROOT = saved;
|
|
293
|
+
rmSync(base, { recursive: true, force: true });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const shown = (obj, root) => {
|
|
298
|
+
let text = JSON.stringify(obj);
|
|
299
|
+
for (const r of new Set([root, realpathSync(root)])) text = text.split(r).join(SHOWN_ROOT);
|
|
300
|
+
return JSON.parse(text);
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
export async function renderFixtures() {
|
|
304
|
+
const runsIndex = await import("../scripts/runs-index.mjs");
|
|
305
|
+
const worktrees = await import("../scripts/worktrees.mjs");
|
|
306
|
+
const issues = await import("../scripts/issues.mjs");
|
|
307
|
+
const launch = await import("../scripts/launch-request.mjs");
|
|
308
|
+
const answer = await import("../scripts/answer-question.mjs");
|
|
309
|
+
const out = {};
|
|
310
|
+
|
|
311
|
+
const indexOf = (states, { redact = false } = {}) =>
|
|
312
|
+
withLogsRoot((root) => {
|
|
313
|
+
for (const [state, trackerState] of states) {
|
|
314
|
+
const dir = join(root, "example-app", state.taskId);
|
|
315
|
+
mkdirSync(dir, { recursive: true });
|
|
316
|
+
writeFileSync(join(dir, "agent-state.json"), JSON.stringify(state));
|
|
317
|
+
writeFileSync(join(dir, "tracker-state.json"), JSON.stringify(trackerState));
|
|
318
|
+
}
|
|
319
|
+
return shown(runsIndex.envelope(runsIndex.selectRuns().records, { redact }), root);
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
for (const [name, pair] of Object.entries(RUN_STATES)) {
|
|
323
|
+
const doc = await indexOf([pair]);
|
|
324
|
+
if (name === "old-schema") {
|
|
325
|
+
doc.contractVersion = "1.0.0";
|
|
326
|
+
for (const run of doc.runs) for (const k of ADDED_SINCE_1_0) delete run[k];
|
|
327
|
+
}
|
|
328
|
+
out[`runs-${name}.json`] = doc;
|
|
329
|
+
}
|
|
330
|
+
out["runs-pr-opened-redacted.json"] = await indexOf([RUN_STATES["pr-opened"]], { redact: true });
|
|
331
|
+
out["runs-empty.json"] = await indexOf([]);
|
|
332
|
+
out["worktrees-empty.json"] = await withLogsRoot(() => worktrees.buildList());
|
|
333
|
+
out["issues-empty.json"] = issues.collect({
|
|
334
|
+
env: {
|
|
335
|
+
PATH: process.env.PATH,
|
|
336
|
+
HOME: tmpdir(),
|
|
337
|
+
MA_JIRA_SEARCH: "/nonexistent/jira-search.sh",
|
|
338
|
+
MA_GH_BIN: "/nonexistent/gh",
|
|
339
|
+
},
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
const sessionId = "00000000-0000-4000-8000-000000000201";
|
|
343
|
+
out["launch-plan.json"] = launch.planLaunch({
|
|
344
|
+
request: {
|
|
345
|
+
contractVersion: "1.0.0",
|
|
346
|
+
input: "PROJ-201",
|
|
347
|
+
mode: "autopilot",
|
|
348
|
+
answers: { workspace: "worktree" },
|
|
349
|
+
},
|
|
350
|
+
requestFile: `/Users/example/.claude/autopilot/requests/${sessionId}.json`,
|
|
351
|
+
repoPath: "/Users/example/example-app",
|
|
352
|
+
settingsFile: "/Users/example/.claude/multi-agent-unattended.settings.json",
|
|
353
|
+
runLogsRoot: "/Users/example/.multi-agent-unattended/logs",
|
|
354
|
+
sessionId,
|
|
355
|
+
workingTree: "clean",
|
|
356
|
+
}).out;
|
|
357
|
+
const answered = answer.applyAnswer(
|
|
358
|
+
{ waitingFor: "question", pendingQuestion: QUESTION },
|
|
359
|
+
["continue"],
|
|
360
|
+
new Date(FIXED_NOW),
|
|
361
|
+
);
|
|
362
|
+
out["answer-result.json"] = {
|
|
363
|
+
contractVersion: answer.CONTRACT_VERSION,
|
|
364
|
+
answered: answered.state.lastAnswer,
|
|
365
|
+
};
|
|
366
|
+
out["error-unauthorized.json"] = {
|
|
367
|
+
contractVersion: MANIFEST.contractVersion,
|
|
368
|
+
error: "unauthorized",
|
|
369
|
+
message: "a bearer token is required",
|
|
370
|
+
};
|
|
371
|
+
out["error-unsigned.json"] = {
|
|
372
|
+
contractVersion: MANIFEST.contractVersion,
|
|
373
|
+
error: "unsigned",
|
|
374
|
+
message: "a device signature is required",
|
|
375
|
+
};
|
|
376
|
+
out["error-invalid-request.json"] = {
|
|
377
|
+
contractVersion: MANIFEST.contractVersion,
|
|
378
|
+
error: "invalid-request",
|
|
379
|
+
message: "the launch request was refused",
|
|
380
|
+
errors: ['answers.workspace: "local" is not allowed in autopilot mode'],
|
|
381
|
+
};
|
|
382
|
+
return out;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// ---------------------------------------------------------------------------
|
|
386
|
+
|
|
387
|
+
async function main(argv) {
|
|
388
|
+
const mode = argv[0];
|
|
389
|
+
if (argv.length !== 1 || (mode !== "--write" && mode !== "--check")) {
|
|
390
|
+
process.stderr.write("usage: build.mjs --write | --check\n");
|
|
391
|
+
return 2;
|
|
392
|
+
}
|
|
393
|
+
const files = { "types/index.d.ts": renderTypes() };
|
|
394
|
+
for (const [name, doc] of Object.entries(await renderFixtures())) {
|
|
395
|
+
files[`fixtures/${name}`] = JSON.stringify(doc, null, 2) + "\n";
|
|
396
|
+
}
|
|
397
|
+
const drift = [];
|
|
398
|
+
for (const [rel, text] of Object.entries(files)) {
|
|
399
|
+
const path = join(KIT, rel);
|
|
400
|
+
let current;
|
|
401
|
+
try {
|
|
402
|
+
current = readFileSync(path, "utf8");
|
|
403
|
+
} catch {
|
|
404
|
+
current = null;
|
|
405
|
+
}
|
|
406
|
+
if (current === text) continue;
|
|
407
|
+
if (mode === "--write") {
|
|
408
|
+
mkdirSync(join(path, ".."), { recursive: true });
|
|
409
|
+
writeFileSync(path, text);
|
|
410
|
+
process.stdout.write(`wrote ${rel}\n`);
|
|
411
|
+
} else drift.push(rel);
|
|
412
|
+
}
|
|
413
|
+
if (drift.length) {
|
|
414
|
+
process.stdout.write(
|
|
415
|
+
`contract kit drift (run build.mjs --write):\n${drift.map((d) => ` ${d}\n`).join("")}`,
|
|
416
|
+
);
|
|
417
|
+
return 1;
|
|
418
|
+
}
|
|
419
|
+
return 0;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
if (
|
|
423
|
+
process.argv[1] &&
|
|
424
|
+
realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))
|
|
425
|
+
) {
|
|
426
|
+
process.exitCode = await main(process.argv.slice(2));
|
|
427
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"contractVersion": "1.0.0",
|
|
3
|
+
"valid": true,
|
|
4
|
+
"verified": false,
|
|
5
|
+
"host": "claude",
|
|
6
|
+
"mode": "autopilot",
|
|
7
|
+
"sessionId": "00000000-0000-4000-8000-000000000201",
|
|
8
|
+
"requestFile": "/Users/example/.claude/autopilot/requests/00000000-0000-4000-8000-000000000201.json",
|
|
9
|
+
"bin": "claude",
|
|
10
|
+
"cwd": "/Users/example/example-app",
|
|
11
|
+
"argv": [
|
|
12
|
+
"--bg",
|
|
13
|
+
"--session-id",
|
|
14
|
+
"00000000-0000-4000-8000-000000000201",
|
|
15
|
+
"--permission-prompts",
|
|
16
|
+
"none",
|
|
17
|
+
"--settings",
|
|
18
|
+
"/Users/example/.claude/multi-agent-unattended.settings.json",
|
|
19
|
+
"-p",
|
|
20
|
+
"/multi-agent PROJ-201 autopilot"
|
|
21
|
+
],
|
|
22
|
+
"env": {
|
|
23
|
+
"MULTI_AGENT_UNATTENDED": "1",
|
|
24
|
+
"MULTI_AGENT_SESSION_ID": "00000000-0000-4000-8000-000000000201",
|
|
25
|
+
"MCP_TOOLKIT_URL_POLICY": "strict",
|
|
26
|
+
"MCP_TOOLKIT_INDEX_DENY": "~/.ssh,~/.aws,~/.gnupg,~/Library/Keychains",
|
|
27
|
+
"LOGS_ROOT": "/Users/example/.multi-agent-unattended/logs",
|
|
28
|
+
"MA_LAUNCH_REQUEST": "/Users/example/.claude/autopilot/requests/00000000-0000-4000-8000-000000000201.json"
|
|
29
|
+
},
|
|
30
|
+
"shell": false
|
|
31
|
+
}
|