@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,263 @@
|
|
|
1
|
+
{
|
|
2
|
+
"contractVersion": "1.2.0",
|
|
3
|
+
"supportedMajors": [1],
|
|
4
|
+
"description": "The pipeline's client contract: every surface a client reads or writes, the CLI invocation and the HTTP route that carry it, and the schema its JSON follows. Schemas are not copied here; schemasDir points at the one tree the producers validate against. Paths in cli are relative to the pipeline directory (installed: ~/.claude).",
|
|
5
|
+
"schemasDir": "../schemas",
|
|
6
|
+
"types": "types/index.d.ts",
|
|
7
|
+
"errorSchema": "contract-error.schema.json",
|
|
8
|
+
"server": {
|
|
9
|
+
"cli": ["node", "scripts/contract-server.mjs"],
|
|
10
|
+
"bind": "127.0.0.1",
|
|
11
|
+
"auth": "Authorization: Bearer <token>, token in ~/.claude/logs/multi-agent/contract-server/<pid>.json (0600). Not accepted under phone.pathPrefix, which takes a device signature instead.",
|
|
12
|
+
"query": {
|
|
13
|
+
"redact": "1 drops every x-sensitivity local field, as --redact does; forced for a request that carries an Origin",
|
|
14
|
+
"v": "the major to serve; see README.md"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"phone": {
|
|
18
|
+
"description": "Routes a phone reaches through a forwarder (a private network or a local relay; see multi-agent-refs/features/phone-api.md). Every request is signed with an enrolled device's Ed25519 key; the bearer token is neither needed nor accepted here, and a signature opens no desktop route. Responses are always the redacted view.",
|
|
19
|
+
"pathPrefix": "/v1/phone/",
|
|
20
|
+
"envelopeSchema": "phone-signed-request.schema.json",
|
|
21
|
+
"registrySchema": "phone-devices.schema.json",
|
|
22
|
+
"enrol": [
|
|
23
|
+
"node",
|
|
24
|
+
"scripts/phone-devices.mjs",
|
|
25
|
+
"add",
|
|
26
|
+
"--name",
|
|
27
|
+
"<name>",
|
|
28
|
+
"--public-key",
|
|
29
|
+
"<base64url>",
|
|
30
|
+
"--scopes",
|
|
31
|
+
"<read,answer,launch>"
|
|
32
|
+
],
|
|
33
|
+
"signature": {
|
|
34
|
+
"version": "MA-PHONE-SIG-1",
|
|
35
|
+
"algorithm": "Ed25519",
|
|
36
|
+
"headers": {
|
|
37
|
+
"device": "X-MA-Device",
|
|
38
|
+
"timestamp": "X-MA-Timestamp",
|
|
39
|
+
"nonce": "X-MA-Nonce",
|
|
40
|
+
"signature": "X-MA-Signature"
|
|
41
|
+
},
|
|
42
|
+
"payload": ["version", "method", "target", "bodySha256", "deviceId", "timestamp", "nonce"],
|
|
43
|
+
"join": "\n",
|
|
44
|
+
"windowSeconds": 60,
|
|
45
|
+
"futureSkewSeconds": 5
|
|
46
|
+
},
|
|
47
|
+
"scopes": ["read", "answer", "launch"],
|
|
48
|
+
"launch": "POST /v1/phone/launch is refused with launch-disabled until `phone-devices.mjs launch on`, whatever scopes the device holds. Its input is a structured reference only (a Jira key, a GitHub issue URL, repo#N, #N, or a Jira URL on the configured host), and its repo must be a configured or registered one (repo-not-allowed otherwise)",
|
|
49
|
+
"notOffered": ["pause", "resume", "stop", "steer", "shell", "prompt", "run", "merge", "ready"]
|
|
50
|
+
},
|
|
51
|
+
"schemas": [
|
|
52
|
+
"runs-index.schema.json",
|
|
53
|
+
"command-parameters.schema.json",
|
|
54
|
+
"run-questions.schema.json",
|
|
55
|
+
"issues.schema.json",
|
|
56
|
+
"worktrees.schema.json",
|
|
57
|
+
"launch.schema.json",
|
|
58
|
+
"launch-request.schema.json",
|
|
59
|
+
"launch-plan.schema.json",
|
|
60
|
+
"answer-request.schema.json",
|
|
61
|
+
"answer-result.schema.json",
|
|
62
|
+
"phone-signed-request.schema.json",
|
|
63
|
+
"phone-devices.schema.json",
|
|
64
|
+
"contract-error.schema.json"
|
|
65
|
+
],
|
|
66
|
+
"surfaces": [
|
|
67
|
+
{
|
|
68
|
+
"id": "runs",
|
|
69
|
+
"method": "GET",
|
|
70
|
+
"path": "/v1/runs",
|
|
71
|
+
"query": ["group", "redact"],
|
|
72
|
+
"cli": ["node", "scripts/runs-index.mjs", "--json", "[--group <group>]", "[--redact]"],
|
|
73
|
+
"schema": "runs-index.schema.json",
|
|
74
|
+
"version": "1.1.0"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "run",
|
|
78
|
+
"method": "GET",
|
|
79
|
+
"path": "/v1/runs/{id}",
|
|
80
|
+
"query": ["redact"],
|
|
81
|
+
"cli": ["node", "scripts/runs-index.mjs", "--json", "--task-id", "{id}", "[--redact]"],
|
|
82
|
+
"schema": "runs-index.schema.json",
|
|
83
|
+
"version": "1.1.0"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"id": "commands",
|
|
87
|
+
"method": "GET",
|
|
88
|
+
"path": "/v1/commands",
|
|
89
|
+
"query": ["redact"],
|
|
90
|
+
"cli": ["node", "scripts/commands.mjs", "--json"],
|
|
91
|
+
"schema": "command-parameters.schema.json",
|
|
92
|
+
"version": "1.0.0"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "questions",
|
|
96
|
+
"method": "GET",
|
|
97
|
+
"path": "/v1/questions",
|
|
98
|
+
"query": ["redact"],
|
|
99
|
+
"cli": ["node", "scripts/launch-request.mjs", "questions"],
|
|
100
|
+
"schema": "run-questions.schema.json",
|
|
101
|
+
"version": "1.0.0"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": "issues",
|
|
105
|
+
"method": "GET",
|
|
106
|
+
"path": "/v1/issues",
|
|
107
|
+
"query": ["source", "project", "max", "redact"],
|
|
108
|
+
"cli": [
|
|
109
|
+
"node",
|
|
110
|
+
"scripts/issues.mjs",
|
|
111
|
+
"--json",
|
|
112
|
+
"[--source jira|github|all]",
|
|
113
|
+
"[--project <KEY>]...",
|
|
114
|
+
"[--max <n>]"
|
|
115
|
+
],
|
|
116
|
+
"schema": "issues.schema.json",
|
|
117
|
+
"version": "1.0.0"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "worktrees",
|
|
121
|
+
"method": "GET",
|
|
122
|
+
"path": "/v1/worktrees",
|
|
123
|
+
"query": ["measure", "redact"],
|
|
124
|
+
"cli": ["node", "scripts/worktrees.mjs", "--json", "[--measure]", "[--redact]"],
|
|
125
|
+
"schema": "worktrees.schema.json",
|
|
126
|
+
"version": "1.0.0"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": "launch-spec",
|
|
130
|
+
"method": "GET",
|
|
131
|
+
"path": "/v1/launch-spec",
|
|
132
|
+
"query": ["redact"],
|
|
133
|
+
"cli": ["node", "scripts/launch-request.mjs", "spec"],
|
|
134
|
+
"schema": "launch.schema.json",
|
|
135
|
+
"version": "1.1.0"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"id": "launch",
|
|
139
|
+
"method": "POST",
|
|
140
|
+
"path": "/v1/launch",
|
|
141
|
+
"query": ["repo", "redact"],
|
|
142
|
+
"body": "launch-request.schema.json",
|
|
143
|
+
"cli": [
|
|
144
|
+
"node",
|
|
145
|
+
"scripts/launch-request.mjs",
|
|
146
|
+
"plan",
|
|
147
|
+
"<request-file>",
|
|
148
|
+
"--repo",
|
|
149
|
+
"<repo>",
|
|
150
|
+
"--session-id",
|
|
151
|
+
"<uuid>",
|
|
152
|
+
"[--redact]"
|
|
153
|
+
],
|
|
154
|
+
"schema": "launch-plan.schema.json",
|
|
155
|
+
"version": "1.0.0",
|
|
156
|
+
"note": "The server writes the request file (0600, named for a session id it mints) and returns the plan; the CLI plans a file the client wrote. Neither starts the host."
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "answer",
|
|
160
|
+
"method": "POST",
|
|
161
|
+
"path": "/v1/runs/{id}/answer",
|
|
162
|
+
"query": [],
|
|
163
|
+
"body": "answer-request.schema.json",
|
|
164
|
+
"cli": [
|
|
165
|
+
"node",
|
|
166
|
+
"scripts/answer-question.mjs",
|
|
167
|
+
"<agent-state.json>",
|
|
168
|
+
"--question",
|
|
169
|
+
"<questionId>",
|
|
170
|
+
"--answer",
|
|
171
|
+
"<optionId>[,<optionId>...]"
|
|
172
|
+
],
|
|
173
|
+
"schema": "answer-result.schema.json",
|
|
174
|
+
"version": "1.0.0"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "phone-runs",
|
|
178
|
+
"method": "GET",
|
|
179
|
+
"path": "/v1/phone/runs",
|
|
180
|
+
"query": ["group", "redact"],
|
|
181
|
+
"auth": "device-signature",
|
|
182
|
+
"scope": "read",
|
|
183
|
+
"cli": ["node", "scripts/runs-index.mjs", "--json", "[--group <group>]", "--redact"],
|
|
184
|
+
"schema": "runs-index.schema.json",
|
|
185
|
+
"version": "1.1.0",
|
|
186
|
+
"note": "Always redacted; redact=0 is refused."
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"id": "phone-run",
|
|
190
|
+
"method": "GET",
|
|
191
|
+
"path": "/v1/phone/runs/{id}",
|
|
192
|
+
"query": ["redact"],
|
|
193
|
+
"auth": "device-signature",
|
|
194
|
+
"scope": "read",
|
|
195
|
+
"cli": ["node", "scripts/runs-index.mjs", "--json", "--task-id", "{id}", "--redact"],
|
|
196
|
+
"schema": "runs-index.schema.json",
|
|
197
|
+
"version": "1.1.0",
|
|
198
|
+
"note": "Always redacted; redact=0 is refused."
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"id": "phone-answer",
|
|
202
|
+
"method": "POST",
|
|
203
|
+
"path": "/v1/phone/runs/{id}/answer",
|
|
204
|
+
"query": [],
|
|
205
|
+
"auth": "device-signature",
|
|
206
|
+
"scope": "answer",
|
|
207
|
+
"body": "answer-request.schema.json",
|
|
208
|
+
"cli": [
|
|
209
|
+
"node",
|
|
210
|
+
"scripts/answer-question.mjs",
|
|
211
|
+
"<agent-state.json>",
|
|
212
|
+
"--question",
|
|
213
|
+
"<questionId>",
|
|
214
|
+
"--answer",
|
|
215
|
+
"<optionId>[,<optionId>...]"
|
|
216
|
+
],
|
|
217
|
+
"schema": "answer-result.schema.json",
|
|
218
|
+
"version": "1.0.0",
|
|
219
|
+
"note": "The same refusals as POST /v1/runs/{id}/answer: only an option id the pending question offered is recorded."
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
"id": "phone-launch",
|
|
223
|
+
"method": "POST",
|
|
224
|
+
"path": "/v1/phone/launch",
|
|
225
|
+
"query": ["repo", "redact"],
|
|
226
|
+
"auth": "device-signature",
|
|
227
|
+
"scope": "launch",
|
|
228
|
+
"body": "launch-request.schema.json",
|
|
229
|
+
"cli": [
|
|
230
|
+
"node",
|
|
231
|
+
"scripts/launch-request.mjs",
|
|
232
|
+
"plan",
|
|
233
|
+
"<request-file>",
|
|
234
|
+
"--repo",
|
|
235
|
+
"<repo>",
|
|
236
|
+
"--session-id",
|
|
237
|
+
"<uuid>",
|
|
238
|
+
"--channel",
|
|
239
|
+
"phone",
|
|
240
|
+
"--redact"
|
|
241
|
+
],
|
|
242
|
+
"schema": "launch-plan.schema.json",
|
|
243
|
+
"version": "1.0.0",
|
|
244
|
+
"note": "Off until `phone-devices.mjs launch on`. Writes the request file and returns the redacted plan; nothing starts the host."
|
|
245
|
+
}
|
|
246
|
+
],
|
|
247
|
+
"fixtures": {
|
|
248
|
+
"runs-running.json": "runs-index.schema.json",
|
|
249
|
+
"runs-awaiting-question.json": "runs-index.schema.json",
|
|
250
|
+
"runs-failed.json": "runs-index.schema.json",
|
|
251
|
+
"runs-pr-opened.json": "runs-index.schema.json",
|
|
252
|
+
"runs-pr-opened-redacted.json": "runs-index.schema.json",
|
|
253
|
+
"runs-empty.json": "runs-index.schema.json",
|
|
254
|
+
"runs-old-schema.json": "runs-index.schema.json",
|
|
255
|
+
"worktrees-empty.json": "worktrees.schema.json",
|
|
256
|
+
"issues-empty.json": "issues.schema.json",
|
|
257
|
+
"launch-plan.json": "launch-plan.schema.json",
|
|
258
|
+
"answer-result.json": "answer-result.schema.json",
|
|
259
|
+
"error-unauthorized.json": "contract-error.schema.json",
|
|
260
|
+
"error-invalid-request.json": "contract-error.schema.json",
|
|
261
|
+
"error-unsigned.json": "contract-error.schema.json"
|
|
262
|
+
}
|
|
263
|
+
}
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// Generated by pipeline/contract/build.mjs from pipeline/schemas/*.schema.json.
|
|
2
|
+
// Do not edit: change the schema and run `node pipeline/contract/build.mjs --write`.
|
|
3
|
+
|
|
4
|
+
export type ContractVersion = "1.2.0";
|
|
5
|
+
export type SurfaceId = "runs" | "run" | "commands" | "questions" | "issues" | "worktrees" | "launch-spec" | "launch" | "answer" | "phone-runs" | "phone-run" | "phone-answer" | "phone-launch";
|
|
6
|
+
|
|
7
|
+
/** What `runs-index.mjs --json` prints: every run under the log root, grouped per status/SKILL.md 3b. Fields are only ever added - a decoder ignores keys it does not know. `--redact` drops every x-sensitivity local field (and `logsRoot`) and scrubs the free text in `now`, sub-step names and the pending question. */
|
|
8
|
+
export interface RunsIndex {
|
|
9
|
+
contractVersion: string;
|
|
10
|
+
/** Absent under --redact. */
|
|
11
|
+
logsRoot?: string;
|
|
12
|
+
count: number;
|
|
13
|
+
runs: Array<RunsIndexRun>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface RunsIndexRun {
|
|
17
|
+
taskId: string;
|
|
18
|
+
project: string | null;
|
|
19
|
+
/** The run directory. */
|
|
20
|
+
dir?: string;
|
|
21
|
+
layout: "nested" | "flat";
|
|
22
|
+
/** The other layout's directory for the same task id, when both exist. */
|
|
23
|
+
duplicateOf?: string | null;
|
|
24
|
+
salvaged: boolean;
|
|
25
|
+
kind: "pipeline" | "tracker-only" | "empty";
|
|
26
|
+
stateReadable: boolean;
|
|
27
|
+
status: string | null;
|
|
28
|
+
currentPhase: number | null;
|
|
29
|
+
branch: string | null;
|
|
30
|
+
baseBranch: string | null;
|
|
31
|
+
startedAt: string | null;
|
|
32
|
+
worktreePath?: string | null;
|
|
33
|
+
/** Carries the host, so it stays on this machine. */
|
|
34
|
+
prUrl?: string | null;
|
|
35
|
+
autopilot: boolean;
|
|
36
|
+
/** The run's agent-state schemaVersion. Always a string; a number in a hand-edited state is printed as its string. */
|
|
37
|
+
schemaVersion: string | null;
|
|
38
|
+
rev: number | null;
|
|
39
|
+
/** The session id the run was launched under (agent-state sessionId). A client that launched a run through launch.json finds it by this id. Added in 1.1.0. */
|
|
40
|
+
sessionId?: string | null;
|
|
41
|
+
/** The step a paused run re-enters (agent-state waitingFor): maturity, user-channels-choice or question. Added in 1.1.0. */
|
|
42
|
+
waitingFor?: string | null;
|
|
43
|
+
/** The question the run stopped on, present only with waitingFor question. Answer it with one of options[].id through `answer-question.mjs` or POST /v1/runs/{id}/answer. text and labels are scrubbed under --redact. Added in 1.1.0. */
|
|
44
|
+
pendingQuestion?: null | RunsIndexQuestion;
|
|
45
|
+
group: "waiting" | "stopped" | "question" | "unknown";
|
|
46
|
+
phases: Array<RunsIndexPhase>;
|
|
47
|
+
tokens: {
|
|
48
|
+
in: number;
|
|
49
|
+
out: number;
|
|
50
|
+
cached: number;
|
|
51
|
+
};
|
|
52
|
+
estUsd: number;
|
|
53
|
+
unlockedWrites: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface RunsIndexQuestion {
|
|
57
|
+
id: string;
|
|
58
|
+
stepId: string;
|
|
59
|
+
text: string;
|
|
60
|
+
kind: "single-select" | "multi-select";
|
|
61
|
+
options: Array<{
|
|
62
|
+
id: string;
|
|
63
|
+
label: string;
|
|
64
|
+
}>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface RunsIndexPhase {
|
|
68
|
+
id: string;
|
|
69
|
+
name: string;
|
|
70
|
+
status: string;
|
|
71
|
+
model: string | null;
|
|
72
|
+
startedAt: string | null;
|
|
73
|
+
completedAt: string | null;
|
|
74
|
+
/** The phase's one-line current activity, as phase-tracker.sh recorded it. Scrubbed under --redact. */
|
|
75
|
+
now: string | null;
|
|
76
|
+
/** How many sub-steps the phase has. Kept as a count for existing readers; the sub-steps are subList. */
|
|
77
|
+
subs: number;
|
|
78
|
+
subList: Array<{
|
|
79
|
+
id: string;
|
|
80
|
+
name: string;
|
|
81
|
+
status: string;
|
|
82
|
+
}>;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** What `commands.mjs --json` prints: every /multi-agent:<id> command with the parameters, surface and confirmation it declares in its SKILL.md frontmatter, defaults filled in. A client renders a button or a form from this without hard-coding a command. The frontmatter is the source; `_command-contract.mjs` holds it to `argument-hint`. Every field is `x-sensitivity: none`: nothing here is specific to a machine or a person. */
|
|
86
|
+
export interface CommandParameters {
|
|
87
|
+
/** Major 1. A minor bump adds fields; a consumer ignores keys it does not know. */
|
|
88
|
+
contractVersion: string;
|
|
89
|
+
commands: Array<CommandParametersCommand>;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface CommandParametersCommand {
|
|
93
|
+
/** The command directory name; invoked as /multi-agent:<id>. */
|
|
94
|
+
id: string;
|
|
95
|
+
/** The human hint, verbatim. Empty when the command declares none. */
|
|
96
|
+
argumentHint: string;
|
|
97
|
+
parameters: Array<CommandParametersParameter>;
|
|
98
|
+
/** button: runs with no input. form: collect parameters first. hidden: not offered as an action (maintainer tooling, help text). Independent of disable-model-invocation, which only stops the model invoking the command itself. */
|
|
99
|
+
gui: "button" | "form" | "hidden";
|
|
100
|
+
/** Removes something that is not trivially recreated: a worktree, a branch, logs, an install, user instruction lines. */
|
|
101
|
+
destructive: boolean;
|
|
102
|
+
/** required: a client asks before launching. Always required when destructive. The command keeps its own in-session confirmation either way. */
|
|
103
|
+
confirm: "required" | "none";
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface CommandParametersParameter {
|
|
107
|
+
/** `--name` for a flag, typed as written. Otherwise a positional, in order; a positional of kind flag is a literal keyword typed as its name. */
|
|
108
|
+
name: string;
|
|
109
|
+
/** run-id: #N or a task id. pull-request: a PR number or URL. issue-key: a Jira key or a GitHub issue reference. flag: present or absent, no value. */
|
|
110
|
+
kind: "run-id" | "branch" | "pull-request" | "issue-key" | "path" | "text" | "enum" | "flag";
|
|
111
|
+
/** Omitted in frontmatter means false; the catalog always carries it. */
|
|
112
|
+
required?: boolean;
|
|
113
|
+
/** More than one value: space-separated for a positional, comma-separated for a flag. */
|
|
114
|
+
repeat?: boolean;
|
|
115
|
+
/** The allowed values. Present exactly when kind is enum. */
|
|
116
|
+
enum?: Array<string>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Shape of run-questions.json: the Phase 0 pickers of a /multi-agent run as data. Every field is x-sensitivity none - the file ships with the package and describes questions, never a machine's answers. */
|
|
120
|
+
export interface RunQuestions {
|
|
121
|
+
contractVersion: string;
|
|
122
|
+
description?: string;
|
|
123
|
+
questions: Array<RunQuestionsQuestion>;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface RunQuestionsQuestion {
|
|
127
|
+
/** The key a launch request answers under. */
|
|
128
|
+
id: string;
|
|
129
|
+
/** dynamic: the questions themselves are produced during the run and cannot be answered in advance. */
|
|
130
|
+
kind: "single-select" | "multi-select" | "dynamic";
|
|
131
|
+
/** Where in phase-0-init.md (or the file it names) the picker lives. */
|
|
132
|
+
"asked-at": string;
|
|
133
|
+
/** Whether a launch request may pre-fill it. false: the run always asks. */
|
|
134
|
+
answerable: boolean;
|
|
135
|
+
/** Static options. An answer is one option id. Absent when the options are enumerated at run time; then `answer` constrains the value. */
|
|
136
|
+
options?: Array<{
|
|
137
|
+
id: string;
|
|
138
|
+
label: string;
|
|
139
|
+
}>;
|
|
140
|
+
/** For options enumerated at run time: every answered value must match `pattern`. Phase 0 still checks the value is one of the options it enumerated, and asks when it is not. */
|
|
141
|
+
answer?: {
|
|
142
|
+
pattern: string;
|
|
143
|
+
description?: string;
|
|
144
|
+
/** A neutral value the pattern admits. */
|
|
145
|
+
example?: string;
|
|
146
|
+
};
|
|
147
|
+
/** The option id the picker marks recommended. */
|
|
148
|
+
default?: string;
|
|
149
|
+
/** The agent-state.json field the answer ends up in. */
|
|
150
|
+
stateField?: string;
|
|
151
|
+
/** Conditions under which Phase 0 resolves the step without asking. */
|
|
152
|
+
"skippable-when"?: Array<string>;
|
|
153
|
+
/** An option that may not be chosen under a condition. A launch request choosing it is rejected, not downgraded. */
|
|
154
|
+
"disabled-when"?: Array<{
|
|
155
|
+
option: string;
|
|
156
|
+
mode?: "interactive" | "autopilot";
|
|
157
|
+
workingTree?: "dirty";
|
|
158
|
+
}>;
|
|
159
|
+
/** A command that prints the options as redacted JSON. null when none ships. */
|
|
160
|
+
source: string | null;
|
|
161
|
+
sourceNote?: string;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** What `issues.mjs --json` prints: open items assigned to the current user, Jira and GitHub in one list. No field carries a URL, a host, a person or a path - summaries are scrubbed before they are printed - so every field is x-sensitivity none and --redact changes nothing. */
|
|
165
|
+
export interface Issues {
|
|
166
|
+
contractVersion: string;
|
|
167
|
+
/** Priority first, then status, then newest. */
|
|
168
|
+
items: Array<{
|
|
169
|
+
/** A Jira key, or owner/repo#N for GitHub. */
|
|
170
|
+
key: string;
|
|
171
|
+
summary: string;
|
|
172
|
+
status: string | null;
|
|
173
|
+
type: string | null;
|
|
174
|
+
/** Jira's priority name. Always null for GitHub, which has none. */
|
|
175
|
+
priority: string | null;
|
|
176
|
+
source: "jira" | "github";
|
|
177
|
+
}>;
|
|
178
|
+
sources: Array<{
|
|
179
|
+
source: "jira" | "github";
|
|
180
|
+
ok: boolean;
|
|
181
|
+
count: number;
|
|
182
|
+
/** Why a source contributed nothing. A fixed code, never the tool's own message. */
|
|
183
|
+
reason?: "not-onboarded" | "unavailable" | "failed";
|
|
184
|
+
}>;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** What `worktrees.mjs --json` prints: one entry per run that owns a worktree, with its size when --measure was passed. --redact removes every x-sensitivity local field. */
|
|
188
|
+
export interface Worktrees {
|
|
189
|
+
contractVersion: string;
|
|
190
|
+
worktrees: Array<{
|
|
191
|
+
taskId: string;
|
|
192
|
+
project?: string | null;
|
|
193
|
+
/** Absolute path on this machine. */
|
|
194
|
+
worktreePath?: string;
|
|
195
|
+
/** The directory is on disk. false: removed by Phase 4 or by hand, and the run still names it. */
|
|
196
|
+
exists: boolean;
|
|
197
|
+
/** Disk usage from du -sk. null unless --measure ran and the directory exists. */
|
|
198
|
+
sizeBytes: number | null;
|
|
199
|
+
/** When sizeBytes was taken; null when it was not. */
|
|
200
|
+
measuredAt: string | null;
|
|
201
|
+
}>;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** Shape of launch.json: per host CLI, the argv template and environment that start a run, and where the launch request file goes. Templates use {placeholder} tokens named in `placeholders`. Every field is x-sensitivity none: the file ships with the package and holds templates, never a machine's values. */
|
|
205
|
+
export interface Launch {
|
|
206
|
+
contractVersion: string;
|
|
207
|
+
/** false until a live launch trial confirmed the shape on a real host. */
|
|
208
|
+
verified: boolean;
|
|
209
|
+
note: string;
|
|
210
|
+
requestFile: {
|
|
211
|
+
env: "MA_LAUNCH_REQUEST";
|
|
212
|
+
directory: string;
|
|
213
|
+
directoryDefault: string;
|
|
214
|
+
name: string;
|
|
215
|
+
fileMode: string;
|
|
216
|
+
schema: string;
|
|
217
|
+
lifetime: string;
|
|
218
|
+
};
|
|
219
|
+
placeholders: {
|
|
220
|
+
[key: string]: string;
|
|
221
|
+
};
|
|
222
|
+
hosts: {
|
|
223
|
+
[key: string]: LaunchHost;
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export interface LaunchHost {
|
|
228
|
+
supported: boolean;
|
|
229
|
+
bin?: string;
|
|
230
|
+
cwd?: string;
|
|
231
|
+
note: string;
|
|
232
|
+
modes?: {
|
|
233
|
+
[key: string]: {
|
|
234
|
+
argv: Array<string>;
|
|
235
|
+
env: {
|
|
236
|
+
[key: string]: string;
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/** The file MA_LAUNCH_REQUEST names: what a client asked for before the run started. Phase 0 reads it through `launch-request.mjs resolve` and pre-fills the matching pickers; with the variable unset nothing changes. Answers are data, never instructions: each one is an option id from run-questions.json or a value its `answer.pattern` admits, and anything else rejects the whole request. The file lives on the machine that runs the pipeline, so every field is x-sensitivity local - a client that relays a request elsewhere strips it first. */
|
|
243
|
+
export interface LaunchRequest {
|
|
244
|
+
/** Major 1. A request for another major is rejected rather than half-understood. */
|
|
245
|
+
contractVersion: string;
|
|
246
|
+
/** What the run works on. A structured reference - a Jira key (^[A-Z][A-Z0-9]+-[0-9]+$), https://github.com/<owner>/<repo>/issues/<n>, repo#N, #N, or a Jira URL on the configured Jira host - reaches the prompt as it is. Free text is accepted on the desktop channel only (never on /v1/phone/launch): one line of at most 500 printable characters with no quote, backslash, backtick or URL, reaching the prompt as one double-quoted argument. On every channel a newline, a control or format character, a leading '-', a flag-like token, or a first token naming a pipeline op or mode keyword rejects the request; a later word is not held to that rule, because a quoted argument cannot route on it. launch-request.mjs inputErrors is the rule. */
|
|
247
|
+
input: string;
|
|
248
|
+
/** Whether the run confirms anything. The workspace is a separate answer, and autopilot never runs local. */
|
|
249
|
+
mode: "interactive" | "autopilot";
|
|
250
|
+
/** questionId -> optionId (single-select) or optionId[] (multi-select). Keys come from run-questions.json; an unknown or unanswerable key rejects the request. */
|
|
251
|
+
answers: {
|
|
252
|
+
[key: string]: string | Array<string>;
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** What `launch-request.mjs plan` prints, and POST /v1/launch returns: the command a client runs to start a validated launch request unattended, with launch.json's placeholders filled. Neither carrier runs it. argv is an argument vector for a process spawned without a shell (shell is always false): the input is one element, never a string to be split or interpreted. `verified` repeats launch.json's flag; until it is true the shape is provisional. Under redact every x-sensitivity local field is dropped, leaving the session id a client tracks the run by. */
|
|
257
|
+
export interface LaunchPlan {
|
|
258
|
+
contractVersion: string;
|
|
259
|
+
valid: true;
|
|
260
|
+
verified: boolean;
|
|
261
|
+
host: "claude";
|
|
262
|
+
mode: "autopilot";
|
|
263
|
+
/** Phase 0 records it as sessionId; the runs index carries it, which is how the client finds this run. */
|
|
264
|
+
sessionId: string;
|
|
265
|
+
/** The request file, mode 0600, named for the session. */
|
|
266
|
+
requestFile?: string;
|
|
267
|
+
bin: string;
|
|
268
|
+
cwd?: string;
|
|
269
|
+
/** Carries the request's input, which is local. */
|
|
270
|
+
argv?: Array<string>;
|
|
271
|
+
/** Variables to add to the client's own environment for the launched process. */
|
|
272
|
+
env?: {
|
|
273
|
+
[key: string]: string;
|
|
274
|
+
};
|
|
275
|
+
shell: false;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/** The body of POST /v1/runs/{id}/answer: the answer to the question a run stopped on, as `answer-question.mjs <state> --question <questionId> --answer <optionIds>` takes it. questionId is the pendingQuestion.id the client read from the runs index; a run that has moved on to another question refuses the answer. Every option id must be one the question offered. Nothing here is free text, so nothing here can become an instruction. */
|
|
279
|
+
export interface AnswerRequest {
|
|
280
|
+
questionId: string;
|
|
281
|
+
optionIds: Array<string>;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** What `answer-question.mjs` prints, and POST /v1/runs/{id}/answer returns, once an answer is recorded: the lastAnswer written to the run's state in the same write that cleared pendingQuestion. */
|
|
285
|
+
export interface AnswerResult {
|
|
286
|
+
contractVersion: string;
|
|
287
|
+
answered: {
|
|
288
|
+
questionId: string;
|
|
289
|
+
stepId: string;
|
|
290
|
+
optionIds: Array<string>;
|
|
291
|
+
answeredAt: string;
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/** What a phone signs for every request under /v1/phone/ (features/phone-api.md). The device sends deviceId, timestamp, nonce and signature as the headers X-MA-Device, X-MA-Timestamp, X-MA-Nonce and X-MA-Signature; the server rebuilds the other fields from the request itself. The signed text is the seven fields `version`, `method`, `target`, `bodySha256`, `deviceId`, `timestamp`, `nonce`, in that order, joined by a single \n with no trailing newline, UTF-8, signed with the device's Ed25519 private key. No field may contain a newline, which is what makes the join unambiguous. The server refuses a timestamp more than 60 seconds behind its clock, more than 5 seconds ahead of it or earlier than its own start, and a nonce it has seen inside the window (manifest.json phone.signature windowSeconds and futureSkewSeconds). */
|
|
296
|
+
export interface PhoneSignedRequest {
|
|
297
|
+
/** The scheme; a different version is a different signed text. */
|
|
298
|
+
version: "MA-PHONE-SIG-1";
|
|
299
|
+
/** The HTTP method as sent. */
|
|
300
|
+
method: string;
|
|
301
|
+
/** The request target exactly as sent: path plus query string, percent-encoding untouched. A forwarder must pass it unchanged. */
|
|
302
|
+
target: string;
|
|
303
|
+
/** Lowercase hex SHA-256 of the raw body bytes; an empty body hashes to e3b0c442...b855. */
|
|
304
|
+
bodySha256: string;
|
|
305
|
+
/** The id phone-devices.mjs add printed at enrolment. Header X-MA-Device. */
|
|
306
|
+
deviceId: string;
|
|
307
|
+
/** Unix seconds, as decimal digits. Header X-MA-Timestamp. */
|
|
308
|
+
timestamp: string;
|
|
309
|
+
/** Fresh random base64url per request. Header X-MA-Nonce. */
|
|
310
|
+
nonce: string;
|
|
311
|
+
/** Unpadded base64url of the 64-byte Ed25519 signature over the signed text. Header X-MA-Signature. Never logged. */
|
|
312
|
+
signature: string;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/** <autopilot root>/phone/devices.json, mode 0600 in a 0700 directory, written only by phone-devices.mjs on this machine. Public keys only: a private key never reaches this file. contract-server.mjs reads it on every phone request, so a revocation or a launch toggle applies to the next request, and a file other users can write is treated as empty. A revoked device stays listed so its id is never reissued and the audit log still resolves. */
|
|
316
|
+
export interface PhoneDevices {
|
|
317
|
+
schemaVersion: "1.0.0";
|
|
318
|
+
/** POST /v1/phone/launch is refused (launch-disabled) unless this is true, whatever scopes a device holds. Off by default; `phone-devices.mjs launch on|off` sets it. */
|
|
319
|
+
launchEnabled: boolean;
|
|
320
|
+
devices: Array<PhoneDevicesDevice>;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export interface PhoneDevicesDevice {
|
|
324
|
+
id: string;
|
|
325
|
+
/** A label for a person reading `list`; never used for a decision. */
|
|
326
|
+
name: string;
|
|
327
|
+
/** The raw 32-byte Ed25519 public key, unpadded base64url. */
|
|
328
|
+
publicKey: string;
|
|
329
|
+
/** read: GET /v1/phone/runs and /v1/phone/runs/{id}. answer: POST /v1/phone/runs/{id}/answer. launch: POST /v1/phone/launch, and only while launchEnabled is true. */
|
|
330
|
+
scopes: (Array<"read" | "answer" | "launch">);
|
|
331
|
+
addedAt: string;
|
|
332
|
+
/** Set by `phone-devices.mjs revoke`; a revoked device is refused on its next request. */
|
|
333
|
+
revokedAt: string | null;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** Every non-2xx body contract-server.mjs sends, on the desktop and the phone routes alike. `error` is a fixed code a client switches on; `message` is for a person and names no path, host or token. `errors` lists schema or rule violations for invalid-body and invalid-request; `supported` lists the majors ?v= accepts for unsupported-version. */
|
|
337
|
+
export interface ContractError {
|
|
338
|
+
contractVersion: string;
|
|
339
|
+
error: "unauthorized" | "forbidden-host" | "forbidden-origin" | "not-found" | "method-not-allowed" | "invalid-query" | "unsupported-version" | "unsupported-media-type" | "invalid-body" | "invalid-request" | "no-launch-shape" | "not-waiting" | "wrong-question" | "wrong-arity" | "not-an-option" | "state-moved" | "unsigned" | "unknown-device" | "revoked-device" | "bad-signature" | "stale-request" | "replayed" | "replay-store-full" | "unknown-verb" | "forbidden-scope" | "launch-disabled" | "repo-not-allowed" | "internal";
|
|
340
|
+
message: string;
|
|
341
|
+
errors?: Array<string>;
|
|
342
|
+
supported?: Array<number>;
|
|
343
|
+
}
|
|
@@ -33,6 +33,8 @@
|
|
|
33
33
|
# Exit contract: `jira_auth_resolve` returns 0 when both resolved, 4 when either
|
|
34
34
|
# did not, having already said which on stderr. 4 is the same code both callers
|
|
35
35
|
# already used for "could not resolve", so nothing downstream changes meaning.
|
|
36
|
+
# It returns 3 when a value had to come from prefs and jq is not installed, so
|
|
37
|
+
# a missing tool is not reported as a missing host or token.
|
|
36
38
|
|
|
37
39
|
# shellcheck shell=bash
|
|
38
40
|
|
|
@@ -62,7 +64,9 @@ _jira_auth_store() { # locate credential-store.sh from lib/ or the install
|
|
|
62
64
|
|
|
63
65
|
jira_auth_resolve() {
|
|
64
66
|
JIRA_API_HOST="${JIRA_HOST:-${ACCOUNT_JIRA_HOST:-}}"
|
|
65
|
-
|
|
67
|
+
# `|| return $?`: the pref reader runs in a subshell, and its 3 ("no jq")
|
|
68
|
+
# must reach the caller instead of being reported as a missing value.
|
|
69
|
+
[ -n "$JIRA_API_HOST" ] || JIRA_API_HOST="$(_jira_auth_pref '.global.hosts.jira')" || return $?
|
|
66
70
|
if [ -z "$JIRA_API_HOST" ]; then
|
|
67
71
|
echo "ERR: no Jira host: set JIRA_HOST or prefs .global.hosts.jira" >&2
|
|
68
72
|
return 4
|
|
@@ -76,7 +80,7 @@ jira_auth_resolve() {
|
|
|
76
80
|
if [ -z "$JIRA_API_TOKEN" ]; then
|
|
77
81
|
local key store
|
|
78
82
|
key="${JIRA_TOKEN_KEY:-${ACCOUNT_JIRA_TOKEN_KEY:-}}"
|
|
79
|
-
[ -n "$key" ] || key="$(_jira_auth_pref '.global.keychainMapping.jira')"
|
|
83
|
+
[ -n "$key" ] || key="$(_jira_auth_pref '.global.keychainMapping.jira')" || return $?
|
|
80
84
|
if [ -z "$key" ]; then
|
|
81
85
|
echo "ERR: no Jira token: set JIRA_TOKEN or map prefs .global.keychainMapping.jira" >&2
|
|
82
86
|
return 4
|
|
@@ -66,7 +66,7 @@ except Exception:
|
|
|
66
66
|
|
|
67
67
|
# 1. Pull every credential entry that looks like one of our token services.
|
|
68
68
|
# Includes token entries AND username entries (BB needs the user keychain key).
|
|
69
|
-
# Uses
|
|
69
|
+
# Uses the credential-store wrapper over the macOS Keychain,
|
|
70
70
|
# located via the shared resolver (repo checkout or either install tree) -
|
|
71
71
|
# never a hardcoded path. A missing helper degrades to an empty inventory.
|
|
72
72
|
# A pre-set CRED_STORE (tests, custom installs) is honored as-is.
|