@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
|
@@ -24,6 +24,11 @@
|
|
|
24
24
|
set -uo pipefail
|
|
25
25
|
|
|
26
26
|
PREFS="${MULTI_AGENT_PREFS:-$HOME/.claude/multi-agent-preferences.json}"
|
|
27
|
+
|
|
28
|
+
_MA_MR_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
29
|
+
# shellcheck source=/dev/null
|
|
30
|
+
if [ -f "$_MA_MR_HERE/user-facing.sh" ]; then . "$_MA_MR_HERE/user-facing.sh"; else . "$HOME/.claude/lib/user-facing.sh"; fi
|
|
31
|
+
|
|
27
32
|
ACTION="${1:-report}"
|
|
28
33
|
|
|
29
34
|
case "$ACTION" in
|
|
@@ -43,7 +48,7 @@ if ! command -v jq >/dev/null 2>&1; then
|
|
|
43
48
|
fi
|
|
44
49
|
|
|
45
50
|
if [ ! -f "$PREFS" ]; then
|
|
46
|
-
echo "model-rung: preferences not found at $PREFS - run
|
|
51
|
+
echo "model-rung: preferences not found at $PREFS - run $(ma_command setup) first" >&2
|
|
47
52
|
exit 3
|
|
48
53
|
fi
|
|
49
54
|
|
|
@@ -334,7 +334,7 @@ for r in (state.get("readonlySiblings") or []) + extras:
|
|
|
334
334
|
})
|
|
335
335
|
agent_state["siblings"] = siblings
|
|
336
336
|
|
|
337
|
-
logs_dir = os.path.
|
|
337
|
+
logs_dir = os.path.join(os.environ.get("LOGS_ROOT") or os.path.expanduser("~/.claude/logs/multi-agent"), primary["name"], state["taskId"])
|
|
338
338
|
os.makedirs(logs_dir, exist_ok=True)
|
|
339
339
|
out_path = os.path.join(logs_dir, "agent-state.json")
|
|
340
340
|
tmp_path = out_path + ".tmp"
|
|
@@ -9,24 +9,27 @@
|
|
|
9
9
|
* error messages and file excerpts, any of which can contain a token that was
|
|
10
10
|
* on the machine a second earlier.
|
|
11
11
|
*
|
|
12
|
-
* SCOPE
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* different lists, and only the second one ships.
|
|
12
|
+
* SCOPE: credentials and run-environment leaks, not corporate names. A Jira
|
|
13
|
+
* comment on a corporate ticket legitimately contains the project key, the
|
|
14
|
+
* repo name and the hostname; refusing those would make the gate fire on every
|
|
15
|
+
* correct publish. Repo genericity is smoke-personal-data.sh's job, with a
|
|
16
|
+
* different list.
|
|
18
17
|
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* and
|
|
23
|
-
*
|
|
18
|
+
* SURFACES (exported below, each with the file that enforces it): the PR body
|
|
19
|
+
* an unattended run hands the runner (scripts/pr-request.mjs, which refuses to
|
|
20
|
+
* write pr-request.json and whose `validate` the runner re-runs), the PR text
|
|
21
|
+
* and the post-PR reports the autopilot runner publishes
|
|
22
|
+
* (scripts/autopilot-publish.mjs), Jira comments
|
|
23
|
+
* and descriptions (lib/jira-publish.sh, also the path `channels` posts
|
|
24
|
+
* through), Jira issue creation (lib/analysis-jira-write.sh), Confluence pages
|
|
25
|
+
* (lib/md2confluence-v3.py, the only create/update path), PR reviews
|
|
26
|
+
* (lib/post-pr-review.sh) and GitHub issue progress comments
|
|
27
|
+
* (scripts/update-issue-progress.sh).
|
|
24
28
|
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* that covers three and says so.
|
|
29
|
+
* The limit: an attended run's agent can still compose text and post it with a
|
|
30
|
+
* raw `gh` or `curl` call that no script intercepts. An unattended run cannot:
|
|
31
|
+
* agent-guard blocks every such call under MULTI_AGENT_UNATTENDED=1, so there
|
|
32
|
+
* the runner, publishing from pr-request.json, is the only path out.
|
|
30
33
|
*
|
|
31
34
|
* WHAT IT NEVER DOES: print the thing it found. A gate that echoes the secret
|
|
32
35
|
* into a terminal, a log and a CI transcript has moved it somewhere new.
|
|
@@ -117,6 +120,33 @@ export const RULES = [
|
|
|
117
120
|
},
|
|
118
121
|
];
|
|
119
122
|
|
|
123
|
+
/**
|
|
124
|
+
* Where published text is scanned. `enforcedBy` is the repo-relative file that
|
|
125
|
+
* calls the gate before anything is sent; `call` is what that file must contain.
|
|
126
|
+
* test/outbound-gate.test.mjs reads each file and holds it to this list.
|
|
127
|
+
*/
|
|
128
|
+
export const SURFACES = [
|
|
129
|
+
{ id: "pr-request-body", enforcedBy: "pipeline/scripts/pr-request.mjs", call: /\bscan\(/ },
|
|
130
|
+
{
|
|
131
|
+
id: "runner-publish",
|
|
132
|
+
enforcedBy: "pipeline/scripts/autopilot-publish.mjs",
|
|
133
|
+
call: /\bscan\(/,
|
|
134
|
+
},
|
|
135
|
+
{ id: "jira-comment", enforcedBy: "pipeline/lib/jira-publish.sh", call: /ma_outbound_gate "/ },
|
|
136
|
+
{ id: "jira-issue", enforcedBy: "pipeline/lib/analysis-jira-write.sh", call: /outbound_gate/ },
|
|
137
|
+
{
|
|
138
|
+
id: "confluence-page",
|
|
139
|
+
enforcedBy: "pipeline/lib/md2confluence-v3.py",
|
|
140
|
+
call: /outbound_gate\(md_text\)/,
|
|
141
|
+
},
|
|
142
|
+
{ id: "pr-review", enforcedBy: "pipeline/lib/post-pr-review.sh", call: /outbound_gate/ },
|
|
143
|
+
{
|
|
144
|
+
id: "issue-progress-comment",
|
|
145
|
+
enforcedBy: "pipeline/scripts/update-issue-progress.sh",
|
|
146
|
+
call: /outbound_gate/,
|
|
147
|
+
},
|
|
148
|
+
];
|
|
149
|
+
|
|
120
150
|
/**
|
|
121
151
|
* @param {string} text
|
|
122
152
|
* @returns {{rule: string, certain: boolean, line: number}[]}
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
# 13-19 digit card-like runs -> [REDACTED:card]
|
|
35
35
|
# 11 digit national-id-like numbers -> [REDACTED:national-id]
|
|
36
36
|
# 9+ digit phone-like runs -> [REDACTED:phone]
|
|
37
|
-
# 6-char
|
|
37
|
+
# 6-char reservation/order reference codes (A-Z0-9 mix, or 6 letters
|
|
38
|
+
# right after a reference-code label) -> [REDACTED:reference]
|
|
38
39
|
#
|
|
39
40
|
# Output (stdout, single JSON object):
|
|
40
41
|
# {
|
|
@@ -147,18 +148,24 @@ def extract_ids(text):
|
|
|
147
148
|
|
|
148
149
|
# Order matters: card (13-19 digits, separators allowed) before national-id
|
|
149
150
|
# (exactly 11) before phone (9+); a 16-digit card must not survive as a
|
|
150
|
-
# "phone".
|
|
151
|
+
# "phone". Reference codes last so redacted placeholders are not re-matched.
|
|
152
|
+
REFERENCE_LABELS = (
|
|
153
|
+
r"reference (?:code|number|no)|ref (?:code|no)"
|
|
154
|
+
r"|(?:booking|reservation|order|confirmation) (?:code|number|no|ref|reference)"
|
|
155
|
+
r"|rezervasyon (?:kodu|no)|sipari[s\u015f] (?:kodu|no)|pnr"
|
|
156
|
+
)
|
|
157
|
+
|
|
151
158
|
REDACTIONS = [
|
|
152
159
|
(re.compile(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"), "[REDACTED:email]"),
|
|
153
160
|
(re.compile(r"\b\d(?:[ -]?\d){12,18}\b"), "[REDACTED:card]"),
|
|
154
161
|
(re.compile(r"\b\d{11}\b"), "[REDACTED:national-id]"),
|
|
155
162
|
(re.compile(r"(?<![\w.-])\+?\d(?:[ ()-]?\d){8,14}\b"), "[REDACTED:phone]"),
|
|
156
|
-
(re.compile(r"\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{6}\b"), "[REDACTED:
|
|
157
|
-
#
|
|
158
|
-
#
|
|
163
|
+
(re.compile(r"\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*\d)[A-Z0-9]{6}\b"), "[REDACTED:reference]"),
|
|
164
|
+
# An all-letter code is only taken after a reference-code label: a bare
|
|
165
|
+
# 6-letter uppercase word is far too common to redact blind.
|
|
159
166
|
(
|
|
160
|
-
re.compile(r"\b(?P<kw>
|
|
161
|
-
lambda m: m.group("kw") + m.group("sep") + "[REDACTED:
|
|
167
|
+
re.compile(r"\b(?P<kw>" + REFERENCE_LABELS + r")(?P<sep>[^A-Za-z0-9\n]{0,3})[A-Z]{6}\b", re.IGNORECASE),
|
|
168
|
+
lambda m: m.group("kw") + m.group("sep") + "[REDACTED:reference]",
|
|
162
169
|
),
|
|
163
170
|
]
|
|
164
171
|
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
# step-by-step as Phase 3 works through it.
|
|
7
7
|
#
|
|
8
8
|
# State lives in `agent-state.json` under `.plan.todos[]` per
|
|
9
|
-
# pipeline/schemas/plan-todos.schema.json. Phase
|
|
10
|
-
# initial plan; Phase
|
|
9
|
+
# pipeline/schemas/plan-todos.schema.json. Phase 1 (Plan) emits the
|
|
10
|
+
# initial plan; Phase 2 (Dev) iterates step-by-step; Phase 3 (Review)
|
|
11
11
|
# inspects completion; Phase 5 (Report) renders the rollup.
|
|
12
12
|
#
|
|
13
13
|
# Subcommands:
|
|
@@ -52,7 +52,7 @@ ma_require_jq "read or write the plan" || exit 3
|
|
|
52
52
|
# (nested <root>/<project>/<id>/ and flat <root>/<id>/) and every id spelling.
|
|
53
53
|
_MA_RP_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
54
54
|
# shellcheck source=/dev/null
|
|
55
|
-
|
|
55
|
+
if [ -f "$_MA_RP_HERE/run-paths.sh" ]; then . "$_MA_RP_HERE/run-paths.sh"; else . "$HOME/.claude/lib/run-paths.sh"; fi
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
CMD="${1:-}"
|
|
@@ -90,7 +90,9 @@ ma_outbound_gate_text() {
|
|
|
90
90
|
# (nested <root>/<project>/<id>/ and flat <root>/<id>/) and every id spelling.
|
|
91
91
|
_MA_RP_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
92
92
|
# shellcheck source=/dev/null
|
|
93
|
-
|
|
93
|
+
if [ -f "$_MA_RP_HERE/run-paths.sh" ]; then . "$_MA_RP_HERE/run-paths.sh"; else . "$HOME/.claude/lib/run-paths.sh"; fi
|
|
94
|
+
# shellcheck source=/dev/null
|
|
95
|
+
if [ -f "$_MA_RP_HERE/user-facing.sh" ]; then . "$_MA_RP_HERE/user-facing.sh"; else . "$HOME/.claude/lib/user-facing.sh"; fi
|
|
94
96
|
|
|
95
97
|
|
|
96
98
|
# Basic-auth via a curl config fed through process substitution so the
|
|
@@ -119,12 +121,11 @@ if [ -z "$AGENT_STATE" ]; then
|
|
|
119
121
|
fi
|
|
120
122
|
|
|
121
123
|
if ! jq -e '.review' "$AGENT_STATE" >/dev/null; then
|
|
122
|
-
echo "post-pr-review: agent-state has no .review field - run
|
|
124
|
+
echo "post-pr-review: agent-state has no .review field - run $(ma_command review) first" >&2
|
|
123
125
|
exit 2
|
|
124
126
|
fi
|
|
125
127
|
|
|
126
|
-
OUT_LANG=$(
|
|
127
|
-
case "$OUT_LANG" in tr|en) ;; *) OUT_LANG=en ;; esac
|
|
128
|
+
OUT_LANG=$(ma_output_lang)
|
|
128
129
|
|
|
129
130
|
PROVIDER=$(jq -r '.review.input.provider // empty' "$AGENT_STATE")
|
|
130
131
|
PR_NUM=$(jq -r '.review.input.prNumber // empty' "$AGENT_STATE")
|
|
@@ -162,9 +163,9 @@ echo "post-pr-review: decision=$DECISION (blocking=$ACCEPTED_BLOCKING, important
|
|
|
162
163
|
# when the suggested fix wording changes slightly between iterations.
|
|
163
164
|
finding_fingerprint() {
|
|
164
165
|
local path="$1" line="$2" issue="$3"
|
|
165
|
-
# sha256sum (coreutils) or shasum (perl), whichever this
|
|
166
|
-
#
|
|
167
|
-
#
|
|
166
|
+
# sha256sum (coreutils) or shasum (perl), whichever this machine has. An empty
|
|
167
|
+
# fingerprint would make every finding look new and re-post the whole review on
|
|
168
|
+
# each iteration.
|
|
168
169
|
if command -v sha256sum >/dev/null 2>&1; then
|
|
169
170
|
printf '%s|%s|%s' "$path" "$line" "$issue" | sha256sum | cut -c1-16
|
|
170
171
|
else
|
|
@@ -379,8 +380,7 @@ post_bitbucket_server() {
|
|
|
379
380
|
return 4
|
|
380
381
|
fi
|
|
381
382
|
|
|
382
|
-
# Resolve via the
|
|
383
|
-
# Credential Manager / Linux libsecret) - sourced lazily so this script keeps
|
|
383
|
+
# Resolve via the credential helper (macOS Keychain) - sourced lazily so this script keeps
|
|
384
384
|
# working when run from either ~/.claude/lib or ~/.copilot/lib.
|
|
385
385
|
# shellcheck disable=SC1090
|
|
386
386
|
# Existence check before sourcing: `. <missing>` aborts the shell under `set -e`,
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pr-request-location.mjs - where an unattended run leaves its PR request,
|
|
3
|
+
* and where the runner records what it decided about it.
|
|
4
|
+
*
|
|
5
|
+
* Under MULTI_AGENT_UNATTENDED=1 a run does not push and does not open a PR.
|
|
6
|
+
* Phase 4 writes one file instead, through scripts/pr-request.mjs, and the
|
|
7
|
+
* autopilot runner is the only process that pushes the branch and creates the
|
|
8
|
+
* PR, after it has verified that file. Both sides import this module so they
|
|
9
|
+
* cannot disagree on the path.
|
|
10
|
+
*
|
|
11
|
+
* <run root>/pr-requests/<session id>.json the run writes it
|
|
12
|
+
* <autopilot root>/pr-requests/<session id>.verdict.json the runner writes it
|
|
13
|
+
*
|
|
14
|
+
* The run root is MA_UNATTENDED_RUN_ROOT, else ~/.multi-agent-unattended: the
|
|
15
|
+
* one directory outside the worktree the unattended profile's OS sandbox lets
|
|
16
|
+
* a run write, since Claude Code keeps every command out of ~/.claude. The
|
|
17
|
+
* autopilot root is MA_AUTOPILOT_ROOT, else ~/.claude/autopilot, the same root
|
|
18
|
+
* the runner and launch-request.mjs use, and a run cannot write there. The
|
|
19
|
+
* session id is the one the runner generated and passed as
|
|
20
|
+
* MULTI_AGENT_SESSION_ID.
|
|
21
|
+
*
|
|
22
|
+
* Everything under the autopilot root, and every other session's request, is
|
|
23
|
+
* a protected path for an unattended run (scripts/unattended_policy.py). The
|
|
24
|
+
* Python twin of these paths lives there, and test/pr-request.test.mjs holds
|
|
25
|
+
* the two to the same answer.
|
|
26
|
+
*
|
|
27
|
+
* @module pipeline/lib/pr-request-location
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { homedir } from "node:os";
|
|
31
|
+
import { join } from "node:path";
|
|
32
|
+
|
|
33
|
+
export const PR_REQUESTS_SUBDIR = "pr-requests";
|
|
34
|
+
export const UNATTENDED_RUN_DIR = ".multi-agent-unattended";
|
|
35
|
+
export const PR_REQUEST_FILE_SUFFIX = ".json";
|
|
36
|
+
export const PR_VERDICT_FILE_SUFFIX = ".verdict.json";
|
|
37
|
+
export const SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
38
|
+
|
|
39
|
+
/** @param {Record<string,string|undefined>} [env] */
|
|
40
|
+
export function autopilotRoot(env = process.env) {
|
|
41
|
+
return env.MA_AUTOPILOT_ROOT || join(env.HOME || homedir(), ".claude", "autopilot");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Where an unattended run writes what the runner reads back: its logs and its
|
|
46
|
+
* PR request.
|
|
47
|
+
*
|
|
48
|
+
* @param {Record<string,string|undefined>} [env]
|
|
49
|
+
*/
|
|
50
|
+
export function unattendedRunRoot(env = process.env) {
|
|
51
|
+
return env.MA_UNATTENDED_RUN_ROOT || join(env.HOME || homedir(), UNATTENDED_RUN_DIR);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** @param {Record<string,string|undefined>} [env] */
|
|
55
|
+
export function runRequestsDir(env = process.env) {
|
|
56
|
+
return join(unattendedRunRoot(env), PR_REQUESTS_SUBDIR);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** The log root an unattended run writes its state under. */
|
|
60
|
+
export function unattendedLogsRoot(env = process.env) {
|
|
61
|
+
return join(unattendedRunRoot(env), "logs");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** @param {Record<string,string|undefined>} [env] */
|
|
65
|
+
export function prRequestsDir(env = process.env) {
|
|
66
|
+
return join(autopilotRoot(env), PR_REQUESTS_SUBDIR);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @param {string} sessionId
|
|
71
|
+
* @param {Record<string,string|undefined>} [env]
|
|
72
|
+
*/
|
|
73
|
+
export function prRequestPath(sessionId, env = process.env) {
|
|
74
|
+
if (!SESSION_ID_RE.test(String(sessionId || ""))) throw new Error("session id is not a UUID");
|
|
75
|
+
return join(runRequestsDir(env), `${sessionId}${PR_REQUEST_FILE_SUFFIX}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @param {string} sessionId
|
|
80
|
+
* @param {Record<string,string|undefined>} [env]
|
|
81
|
+
*/
|
|
82
|
+
export function prVerdictPath(sessionId, env = process.env) {
|
|
83
|
+
if (!SESSION_ID_RE.test(String(sessionId || ""))) throw new Error("session id is not a UUID");
|
|
84
|
+
return join(prRequestsDir(env), `${sessionId}${PR_VERDICT_FILE_SUFFIX}`);
|
|
85
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* regular-file.mjs - read a file an agent could have written, without letting
|
|
3
|
+
* it choose what the read does.
|
|
4
|
+
*
|
|
5
|
+
* A synchronous read of a path an unattended run controls is a lever on the
|
|
6
|
+
* process doing the reading. A FIFO under that name blocks the read forever, a
|
|
7
|
+
* character device never ends, a symlink points anywhere, and a large file is
|
|
8
|
+
* read into memory whole. The autopilot runner and its publish step read such
|
|
9
|
+
* paths on the one thread that supervises every run, so a single planted FIFO
|
|
10
|
+
* would stop the queue.
|
|
11
|
+
*
|
|
12
|
+
* readRegularFile opens the resolved path non-blocking and without following a
|
|
13
|
+
* final symlink, checks the open descriptor (not the name) is a regular file
|
|
14
|
+
* no larger than the cap, and reads at most the cap. `within` restricts the
|
|
15
|
+
* resolved path to one of the given directories.
|
|
16
|
+
*
|
|
17
|
+
* O_NOFOLLOW covers only the last path component, so a directory swapped for a
|
|
18
|
+
* symlink between resolving and opening would still be followed. After the
|
|
19
|
+
* open, the descriptor's device and inode are compared with a fresh lstat of
|
|
20
|
+
* the resolved path; a mismatch means the name no longer points at what was
|
|
21
|
+
* opened, and the read is refused. A swap that is made and undone entirely
|
|
22
|
+
* between the open and that lstat is not seen; Node exposes no portable way to
|
|
23
|
+
* ask the kernel for a descriptor's path.
|
|
24
|
+
*
|
|
25
|
+
* @module pipeline/lib/regular-file
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import {
|
|
29
|
+
closeSync,
|
|
30
|
+
constants,
|
|
31
|
+
fstatSync,
|
|
32
|
+
lstatSync,
|
|
33
|
+
openSync,
|
|
34
|
+
readSync,
|
|
35
|
+
realpathSync,
|
|
36
|
+
} from "node:fs";
|
|
37
|
+
import { sep } from "node:path";
|
|
38
|
+
|
|
39
|
+
export const DEFAULT_MAX_BYTES = 16 * 1024 * 1024;
|
|
40
|
+
|
|
41
|
+
export class RegularFileError extends Error {
|
|
42
|
+
/**
|
|
43
|
+
* @param {"missing"|"not-regular"|"outside"|"too-large"|"unreadable"} code
|
|
44
|
+
* @param {string} message
|
|
45
|
+
*/
|
|
46
|
+
constructor(code, message) {
|
|
47
|
+
super(message);
|
|
48
|
+
this.name = "RegularFileError";
|
|
49
|
+
this.code = code;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function realOr(p) {
|
|
54
|
+
try {
|
|
55
|
+
return realpathSync(p);
|
|
56
|
+
} catch {
|
|
57
|
+
return p;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function inside(path, dir) {
|
|
62
|
+
const d = dir.endsWith(sep) ? dir : dir + sep;
|
|
63
|
+
return path === dir || path.startsWith(d);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Throws unless `fd` is the same file the path names right now, reached
|
|
68
|
+
* without a symlink at its last component.
|
|
69
|
+
*
|
|
70
|
+
* @param {number} fd
|
|
71
|
+
* @param {string} path
|
|
72
|
+
*/
|
|
73
|
+
export function assertOpenedIsPath(fd, path) {
|
|
74
|
+
let now;
|
|
75
|
+
try {
|
|
76
|
+
now = lstatSync(path);
|
|
77
|
+
} catch (err) {
|
|
78
|
+
throw new RegularFileError("unreadable", `${path}: ${err.code || err.message}`);
|
|
79
|
+
}
|
|
80
|
+
const opened = fstatSync(fd);
|
|
81
|
+
if (now.isSymbolicLink() || now.dev !== opened.dev || now.ino !== opened.ino) {
|
|
82
|
+
throw new RegularFileError("unreadable", `${path} changed while it was being opened`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* The file's text, or a RegularFileError naming why it was refused.
|
|
88
|
+
*
|
|
89
|
+
* @param {string} path
|
|
90
|
+
* @param {{maxBytes?: number, within?: string[]|null}} [opts]
|
|
91
|
+
* @returns {string}
|
|
92
|
+
*/
|
|
93
|
+
export function readRegularFile(path, { maxBytes = DEFAULT_MAX_BYTES, within = null } = {}) {
|
|
94
|
+
let real;
|
|
95
|
+
try {
|
|
96
|
+
real = realpathSync(path);
|
|
97
|
+
} catch (err) {
|
|
98
|
+
throw new RegularFileError(
|
|
99
|
+
err.code === "ENOENT" ? "missing" : "unreadable",
|
|
100
|
+
`${path}: ${err.code || err.message}`,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (Array.isArray(within) && !within.filter(Boolean).some((d) => inside(real, realOr(d)))) {
|
|
104
|
+
throw new RegularFileError("outside", `${path} resolves outside the directories it may be in`);
|
|
105
|
+
}
|
|
106
|
+
let fd;
|
|
107
|
+
try {
|
|
108
|
+
fd = openSync(
|
|
109
|
+
real,
|
|
110
|
+
constants.O_RDONLY | (constants.O_NONBLOCK ?? 0) | (constants.O_NOFOLLOW ?? 0),
|
|
111
|
+
);
|
|
112
|
+
} catch (err) {
|
|
113
|
+
throw new RegularFileError("unreadable", `${path}: ${err.code || err.message}`);
|
|
114
|
+
}
|
|
115
|
+
try {
|
|
116
|
+
assertOpenedIsPath(fd, real);
|
|
117
|
+
const st = fstatSync(fd);
|
|
118
|
+
if (!st.isFile()) throw new RegularFileError("not-regular", `${path} is not a regular file`);
|
|
119
|
+
if (st.size > maxBytes) {
|
|
120
|
+
throw new RegularFileError("too-large", `${path} is larger than ${maxBytes} bytes`);
|
|
121
|
+
}
|
|
122
|
+
const buf = Buffer.alloc(Math.min(st.size, maxBytes) + 1);
|
|
123
|
+
let n = 0;
|
|
124
|
+
for (;;) {
|
|
125
|
+
const got = readSync(fd, buf, n, buf.length - n, null);
|
|
126
|
+
if (got === 0) break;
|
|
127
|
+
n += got;
|
|
128
|
+
if (n > maxBytes) {
|
|
129
|
+
throw new RegularFileError("too-large", `${path} is larger than ${maxBytes} bytes`);
|
|
130
|
+
}
|
|
131
|
+
if (n === buf.length) break;
|
|
132
|
+
}
|
|
133
|
+
return buf.subarray(0, n).toString("utf8");
|
|
134
|
+
} finally {
|
|
135
|
+
closeSync(fd);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Parsed JSON from a regular file, or `fallback` for anything that is not one,
|
|
141
|
+
* is too large, or does not parse.
|
|
142
|
+
*
|
|
143
|
+
* @param {string} path
|
|
144
|
+
* @param {*} [fallback]
|
|
145
|
+
* @param {{maxBytes?: number, within?: string[]|null}} [opts]
|
|
146
|
+
*/
|
|
147
|
+
export function readRegularJson(path, fallback = null, opts = {}) {
|
|
148
|
+
try {
|
|
149
|
+
return JSON.parse(readRegularFile(path, opts));
|
|
150
|
+
} catch {
|
|
151
|
+
return fallback;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -22,6 +22,10 @@
|
|
|
22
22
|
# ma_hygiene_prune_empty <repo-root> rmdir the artefact parents when
|
|
23
23
|
# their last child is gone.
|
|
24
24
|
#
|
|
25
|
+
# Run as a command, the same four take the repo root as an argument:
|
|
26
|
+
# bash repo-hygiene.sh ensure|release|gitignore|prune <repo-root>
|
|
27
|
+
# so a phase doc calls one simple command instead of sourcing the library.
|
|
28
|
+
#
|
|
25
29
|
# Every function is best-effort: a read-only or non-git directory is not an
|
|
26
30
|
# error, because refusing to run a pipeline over a repo we cannot tidy is worse
|
|
27
31
|
# than leaving it untidy. Callers do not check the return value.
|
|
@@ -167,3 +171,16 @@ ma_hygiene_prune_empty() {
|
|
|
167
171
|
fi
|
|
168
172
|
return 0
|
|
169
173
|
}
|
|
174
|
+
|
|
175
|
+
if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
|
|
176
|
+
case "${1:-}" in
|
|
177
|
+
ensure) ma_hygiene_ensure_exclusions "${2:-}" ;;
|
|
178
|
+
release) ma_hygiene_release_exclusions "${2:-}" ;;
|
|
179
|
+
gitignore) ma_hygiene_local_gitignore "${2:-}" ;;
|
|
180
|
+
prune) ma_hygiene_prune_empty "${2:-}" ;;
|
|
181
|
+
*)
|
|
182
|
+
echo "usage: repo-hygiene.sh ensure|release|gitignore|prune <repo-root>" >&2
|
|
183
|
+
exit 2
|
|
184
|
+
;;
|
|
185
|
+
esac
|
|
186
|
+
fi
|
|
@@ -24,6 +24,10 @@ set -uo pipefail
|
|
|
24
24
|
|
|
25
25
|
PREFS="${MULTI_AGENT_PREFS:-$HOME/.claude/multi-agent-preferences.json}"
|
|
26
26
|
|
|
27
|
+
_MA_RS_HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
28
|
+
# shellcheck source=/dev/null
|
|
29
|
+
if [ -f "$_MA_RS_HERE/user-facing.sh" ]; then . "$_MA_RS_HERE/user-facing.sh"; else . "$HOME/.claude/lib/user-facing.sh"; fi
|
|
30
|
+
|
|
27
31
|
# The scope values this accepts, spelled once. `host-session` is NOT here and
|
|
28
32
|
# must never be added: it would mean rewriting the host's base URL, which routes
|
|
29
33
|
# the user's whole session - work that has nothing to do with this pipeline
|
|
@@ -38,7 +42,7 @@ die() { echo "route-state: $1" >&2; exit "${2:-3}"; }
|
|
|
38
42
|
# come back empty, `route-status` would report disabled, and a user with rules
|
|
39
43
|
# armed would be told there are none.
|
|
40
44
|
command -v jq >/dev/null 2>&1 || die "jq not found - cannot read or write preferences (install: brew install jq)"
|
|
41
|
-
[ -f "$PREFS" ] || die "preferences not found at $PREFS - run
|
|
45
|
+
[ -f "$PREFS" ] || die "preferences not found at $PREFS - run $(ma_command setup) first"
|
|
42
46
|
jq -e . "$PREFS" >/dev/null 2>&1 || die "$PREFS is not valid JSON - refusing to write over it"
|
|
43
47
|
|
|
44
48
|
ACTION="${1:-status}"; shift 2>/dev/null || true
|
|
@@ -58,14 +58,15 @@ ma_is_run_dir() {
|
|
|
58
58
|
|
|
59
59
|
ma_is_reserved() {
|
|
60
60
|
case "$1" in
|
|
61
|
-
review-watch | jira-backups | shadow-git | _analysis-jira | prompts) return 0 ;;
|
|
61
|
+
review-watch | jira-backups | shadow-git | _analysis-jira | prompts | contract-server) return 0 ;;
|
|
62
62
|
esac
|
|
63
63
|
return 1
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
# Newest mtime across a run directory's markers, as epoch seconds. GNU-first
|
|
67
67
|
# `stat -c` ordering is required: `stat -f` is a valid GNU flag
|
|
68
|
-
# (--file-system) that SUCCEEDS, so BSD-first would silently win
|
|
68
|
+
# (--file-system) that SUCCEEDS, so BSD-first would silently win whenever GNU
|
|
69
|
+
# coreutils is first on PATH (Homebrew gnubin).
|
|
69
70
|
ma_run_mtime() {
|
|
70
71
|
local d="$1" m t newest=0 b
|
|
71
72
|
for b in "$d" "$d/$MA_ARTIFACTS_SUBDIR"; do
|
|
@@ -181,6 +181,24 @@ EOF
|
|
|
181
181
|
return 0
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
+
# JSON string escaping without jq, which this file does not otherwise need.
|
|
185
|
+
# "why" can quote a caller-supplied path, so every character JSON reserves is
|
|
186
|
+
# escaped: backslash and quote, then any control character as \uXXXX.
|
|
187
|
+
_ma_json_str() {
|
|
188
|
+
local s="$1" out="" c i
|
|
189
|
+
s="${s//\\/\\\\}"
|
|
190
|
+
s="${s//\"/\\\"}"
|
|
191
|
+
if [[ "$s" == *[[:cntrl:]]* ]]; then
|
|
192
|
+
for ((i = 0; i < ${#s}; i++)); do
|
|
193
|
+
c="${s:i:1}"
|
|
194
|
+
[[ "$c" == [[:cntrl:]] ]] && printf -v c '\\u%04x' "'$c"
|
|
195
|
+
out+="$c"
|
|
196
|
+
done
|
|
197
|
+
s="$out"
|
|
198
|
+
fi
|
|
199
|
+
printf '"%s"' "$s"
|
|
200
|
+
}
|
|
201
|
+
|
|
184
202
|
if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
|
|
185
203
|
_json=0
|
|
186
204
|
case "${1:-}" in --json)
|
|
@@ -192,7 +210,7 @@ if [ "${BASH_SOURCE[0]:-$0}" = "$0" ]; then
|
|
|
192
210
|
if [ "$_json" -eq 1 ]; then
|
|
193
211
|
_arr=""
|
|
194
212
|
for _s in $MA_STACKS; do _arr="${_arr:+$_arr,}\"$_s\""; done
|
|
195
|
-
printf '{"stacks":[%s],"why"
|
|
213
|
+
printf '{"stacks":[%s],"why":%s}\n' "$_arr" "$(_ma_json_str "$MA_STACK_WHY")"
|
|
196
214
|
else
|
|
197
215
|
printf 'MA_STACKS=%s\n' "$(printf '%q' "$MA_STACKS")"
|
|
198
216
|
printf 'MA_STACK_WHY=%s\n' "$(printf '%q' "$MA_STACK_WHY")"
|