@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.1
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 +919 -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 +617 -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/usage-endpoint.mjs +33 -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 -35
- 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 +79 -8
- 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 +187 -67
- package/pipeline/scripts/usage-report.mjs +232 -67
- 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
|
@@ -8,21 +8,33 @@
|
|
|
8
8
|
#
|
|
9
9
|
# (default) a paragraph for a human reading the terminal
|
|
10
10
|
# --short one line, for autopilot-off and the session hook
|
|
11
|
-
# --json status.json, which is what bin/menubar renders
|
|
11
|
+
# --json status.json, which is what bin/menubar renders. Besides the
|
|
12
|
+
# queue it carries the runner's operations: inhibitorHeld,
|
|
13
|
+
# lastGcReport, lastDigest (paths, empty when none),
|
|
14
|
+
# maxParallelAgents (null when unlimited) and
|
|
15
|
+
# awake: {held, display} from the awake agent.
|
|
12
16
|
# --write compute and write status.json, print nothing
|
|
13
17
|
# --subjects one line per in-flight item for the native task widget
|
|
14
18
|
#
|
|
15
19
|
# `--json` and `--write` produce the SAME bytes. A menu bar fed by a different
|
|
16
20
|
# code path than the terminal is a second source of truth with a nicer font.
|
|
17
21
|
#
|
|
18
|
-
#
|
|
19
|
-
# the
|
|
22
|
+
# Every line a person reads renders in `prefs.global.outputLanguage`, including
|
|
23
|
+
# the ones that travel to the menu bar inside status.json: this script is the
|
|
24
|
+
# only place that wording exists, so the corner of the screen and the terminal
|
|
25
|
+
# cannot say it two ways.
|
|
26
|
+
#
|
|
27
|
+
# Exit: 0 always when it can read the state, 2 on usage, 3 when --json or
|
|
28
|
+
# --write cannot build the envelope (jq missing, or jq rejecting an input;
|
|
29
|
+
# --json still prints a JSON {"error": ...} object, --write leaves the previous
|
|
30
|
+
# status.json in place). Never non-zero because the mode is off - "off" is an
|
|
31
|
+
# answer.
|
|
20
32
|
|
|
21
33
|
set -uo pipefail
|
|
22
34
|
|
|
23
35
|
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
24
36
|
# shellcheck source=/dev/null
|
|
25
|
-
|
|
37
|
+
if [ -f "$HERE/../lib/autopilot-state.sh" ]; then . "$HERE/../lib/autopilot-state.sh"; else . "$HOME/.claude/lib/autopilot-state.sh"; fi
|
|
26
38
|
|
|
27
39
|
MODE="human"
|
|
28
40
|
case "${1:-}" in
|
|
@@ -41,7 +53,105 @@ case "${1:-}" in
|
|
|
41
53
|
;;
|
|
42
54
|
esac
|
|
43
55
|
|
|
44
|
-
|
|
56
|
+
# A decoder reads stdout, so under --json even this failure is JSON, and the exit
|
|
57
|
+
# code says the envelope is not a status.
|
|
58
|
+
if ! command -v jq >/dev/null 2>&1; then
|
|
59
|
+
case "$MODE" in
|
|
60
|
+
json) printf '%s\n' '{"error":"jq-required","message":"autopilot-status: jq is required"}'; exit 3 ;;
|
|
61
|
+
write) echo "autopilot-status: jq is required" >&2; exit 3 ;;
|
|
62
|
+
*) echo "autopilot-status: jq is required"; exit 0 ;;
|
|
63
|
+
esac
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# The same resolver every other shipped script reads, so a run whose preferences
|
|
67
|
+
# are pointed at a fixture renders this surface and the arming verdict inside it
|
|
68
|
+
# from one file. The codes are the schema's, lowercase and exact.
|
|
69
|
+
OUT_LANG=$(ma_output_lang 2>/dev/null || echo en)
|
|
70
|
+
case "$OUT_LANG" in tr | en) ;; *) OUT_LANG=en ;; esac
|
|
71
|
+
|
|
72
|
+
# One table, both languages on the same line, so a wording change cannot land on
|
|
73
|
+
# one of them. English is the default and the fallback for a language the table
|
|
74
|
+
# does not carry.
|
|
75
|
+
msg() { # $1 = key, $2.. = printf arguments
|
|
76
|
+
local key="$1" en='' tr='' fmt=''
|
|
77
|
+
shift
|
|
78
|
+
case "$key" in
|
|
79
|
+
power-ac)
|
|
80
|
+
en='plugged in, sleep is held while a run is in flight'
|
|
81
|
+
tr='prizde, bir koşu sürerken uyku engelleniyor' ;;
|
|
82
|
+
power-battery)
|
|
83
|
+
en='on battery, sleep is free - it continues when you plug in'
|
|
84
|
+
tr='bataryada, uyku serbest - prize takınca devam eder' ;;
|
|
85
|
+
awake-held)
|
|
86
|
+
en='kept awake while autopilot is on - system sleep held on AC, idle sleep on battery too'
|
|
87
|
+
tr='autopilot açıkken uyanık tutuluyor - prizde sistem uykusu, bataryada da boşta uyku engelleniyor' ;;
|
|
88
|
+
awake-held-display)
|
|
89
|
+
en='kept awake while autopilot is on, display included'
|
|
90
|
+
tr='autopilot açıkken ekran dahil uyanık tutuluyor' ;;
|
|
91
|
+
orphaned)
|
|
92
|
+
en='the config is on but launchd holds no job - re-arm with %s'
|
|
93
|
+
tr='config açık ama launchd bir iş tutmuyor - %s ile yeniden kur' ;;
|
|
94
|
+
phase-word)
|
|
95
|
+
en='Phase'
|
|
96
|
+
tr='Faz' ;;
|
|
97
|
+
awaiting-subject)
|
|
98
|
+
en='waiting for an answer'
|
|
99
|
+
tr='cevap bekliyor' ;;
|
|
100
|
+
short-off)
|
|
101
|
+
en='autopilot: off (%s repos selected)'
|
|
102
|
+
tr='autopilot: kapalı (%s repo seçili)' ;;
|
|
103
|
+
short-absent)
|
|
104
|
+
en='autopilot: not set up'
|
|
105
|
+
tr='autopilot: kurulu değil' ;;
|
|
106
|
+
short-on)
|
|
107
|
+
en='autopilot: on · %s running, %s queued, %s awaiting an answer · %s'
|
|
108
|
+
tr='autopilot: açık · %s koşuyor, %s sırada, %s cevap bekliyor · %s' ;;
|
|
109
|
+
human-absent)
|
|
110
|
+
en='autopilot: not set up on this machine.'
|
|
111
|
+
tr='autopilot: bu makinede kurulu değil.' ;;
|
|
112
|
+
human-turn-on)
|
|
113
|
+
en=' To turn it on: %s'
|
|
114
|
+
tr=' Açmak için: %s' ;;
|
|
115
|
+
human-on)
|
|
116
|
+
en='autopilot: ON · %s repos · %s slots (this machine holds %s) · scanning every %ss'
|
|
117
|
+
tr='autopilot: AÇIK · %s repo · %s slot (bu makine %s kaldırır) · her %ssn tarıyor' ;;
|
|
118
|
+
human-off)
|
|
119
|
+
en='autopilot: OFF · %s repos selected, nothing scheduled'
|
|
120
|
+
tr='autopilot: KAPALI · %s repo seçili, zamanlama yok' ;;
|
|
121
|
+
heading-running)
|
|
122
|
+
en='Running (%s):'
|
|
123
|
+
tr='Koşuyor (%s):' ;;
|
|
124
|
+
heading-queued)
|
|
125
|
+
en='Queued (%s):'
|
|
126
|
+
tr='Sırada (%s):' ;;
|
|
127
|
+
heading-awaiting)
|
|
128
|
+
en='Waiting for an answer (%s) - the open questions are posted, and it continues once they are answered:'
|
|
129
|
+
tr='Cevap bekliyor (%s) - açık soruları yorumladık, cevap gelince devam edecek:' ;;
|
|
130
|
+
queue-empty)
|
|
131
|
+
en='Nothing queued.'
|
|
132
|
+
tr='Sırada iş yok.' ;;
|
|
133
|
+
queue-empty-hint)
|
|
134
|
+
en=' To give it an item: add the label to a GitHub issue, or to a Jira item assigned to you.'
|
|
135
|
+
tr=' Bir madde alması için: GitHub issue veya sana atanmış Jira maddesine label ekle.' ;;
|
|
136
|
+
blocked)
|
|
137
|
+
en='Not taking new items: %s'
|
|
138
|
+
tr='Yeni madde alınmıyor: %s' ;;
|
|
139
|
+
spend)
|
|
140
|
+
en='Last 24 hours: $%s / $%s'
|
|
141
|
+
tr='Son 24 saat: $%s / $%s' ;;
|
|
142
|
+
heading-reports)
|
|
143
|
+
en='Last 24 hours (%s PRs):'
|
|
144
|
+
tr='Son 24 saat (%s PR):' ;;
|
|
145
|
+
*)
|
|
146
|
+
printf 'autopilot-status: no message for %s\n' "$key" >&2
|
|
147
|
+
return 1 ;;
|
|
148
|
+
esac
|
|
149
|
+
# English is the fallback per key, not only per language: a key whose Turkish
|
|
150
|
+
# half is absent renders its English one rather than a bare newline.
|
|
151
|
+
if [ "$OUT_LANG" = tr ] && [ -n "$tr" ]; then fmt="$tr"; else fmt="$en"; fi
|
|
152
|
+
# shellcheck disable=SC2059
|
|
153
|
+
printf "$fmt\n" "$@"
|
|
154
|
+
}
|
|
45
155
|
|
|
46
156
|
ON=false; ma_ap_is_on && ON=true
|
|
47
157
|
CONFIGURED=false; ma_ap_is_configured && CONFIGURED=true
|
|
@@ -81,40 +191,95 @@ if [ -f "$(ma_ap_root)/attempted.jsonl" ]; then
|
|
|
81
191
|
| sort_by(-.finishedAt) | .[0:10]' "$(ma_ap_root)/attempted.jsonl" 2>/dev/null || echo '[]')
|
|
82
192
|
fi
|
|
83
193
|
TODAY_N=$(printf '%s' "$REPORTS" | jq 'length' 2>/dev/null || echo 0)
|
|
194
|
+
|
|
195
|
+
# The operations the runner owns. The inhibitor is held when the pid its
|
|
196
|
+
# record names is alive; a record left by a runner that died is not a held lock.
|
|
197
|
+
AP_ROOT=$(ma_ap_root)
|
|
198
|
+
INHIBITOR_HELD=false
|
|
199
|
+
INH_PID=$(jq -r '.pid // empty' "$AP_ROOT/inhibitor.json" 2>/dev/null || true)
|
|
200
|
+
case "$INH_PID" in
|
|
201
|
+
"" | *[!0-9]*) ;;
|
|
202
|
+
*) kill -0 "$INH_PID" 2>/dev/null && INHIBITOR_HELD=true ;;
|
|
203
|
+
esac
|
|
204
|
+
latest_daily() { # $1 = prefix; the newest <prefix><date>.json, or empty
|
|
205
|
+
local f last=""
|
|
206
|
+
for f in "$AP_ROOT/$1"*.json; do [ -f "$f" ] && last="$f"; done
|
|
207
|
+
printf '%s' "$last"
|
|
208
|
+
}
|
|
209
|
+
LAST_GC=$(latest_daily gc-report-)
|
|
210
|
+
LAST_DIGEST=$(latest_daily digest-)
|
|
211
|
+
# The awake agent: the launchd job that holds sleep off for as long as the mode
|
|
212
|
+
# is on, read by the same script that installs and removes it.
|
|
213
|
+
AWAKE='{"held":false,"display":false}'
|
|
214
|
+
AWAKE_SCRIPT=$(ma_ap_asset scripts/autopilot-awake.mjs 2>/dev/null || true)
|
|
215
|
+
if [ -n "$AWAKE_SCRIPT" ]; then
|
|
216
|
+
AWAKE_OUT=$(node "$AWAKE_SCRIPT" status --json 2>/dev/null || true)
|
|
217
|
+
if printf '%s' "$AWAKE_OUT" | jq -e '(.held|type=="boolean") and (.display|type=="boolean")' >/dev/null 2>&1; then
|
|
218
|
+
AWAKE=$(printf '%s' "$AWAKE_OUT" | jq -c '{held, display}')
|
|
219
|
+
fi
|
|
220
|
+
fi
|
|
221
|
+
AWAKE_HELD=$(printf '%s' "$AWAKE" | jq -r '.held')
|
|
222
|
+
AWAKE_DISPLAY=$(printf '%s' "$AWAKE" | jq -r '.display')
|
|
223
|
+
MAX_PAR=$(ma_ap_cfg '.maxParallelAgents' null 2>/dev/null || echo null)
|
|
224
|
+
case "$MAX_PAR" in "" | *[!0-9]*) MAX_PAR=null ;; esac
|
|
84
225
|
TODAY_USD=$(printf '%s' "$QUEUE" | jq -r '.todayUsd // 0' 2>/dev/null || echo 0)
|
|
85
226
|
|
|
86
227
|
NOTE=""
|
|
87
228
|
if [ "$ON" = true ]; then
|
|
88
|
-
if [ "$
|
|
229
|
+
if [ "$AWAKE_HELD" = true ] && [ "$AWAKE_DISPLAY" = true ]; then NOTE=$(msg awake-held-display)
|
|
230
|
+
elif [ "$AWAKE_HELD" = true ]; then NOTE=$(msg awake-held)
|
|
231
|
+
elif [ "$POWER" = "ac" ]; then NOTE=$(msg power-ac)
|
|
232
|
+
else NOTE=$(msg power-battery); fi
|
|
89
233
|
fi
|
|
90
234
|
if ma_ap_is_orphaned; then
|
|
91
|
-
NOTE
|
|
235
|
+
NOTE=$(msg orphaned "$(ma_ap_command autopilot-on)")
|
|
92
236
|
fi
|
|
93
237
|
|
|
238
|
+
STOP_COMMAND=$(ma_ap_command autopilot-off)
|
|
239
|
+
|
|
94
240
|
build_json() {
|
|
95
241
|
jq -nc \
|
|
96
242
|
--argjson on "$ON" --argjson slots "$SLOTS" \
|
|
97
243
|
--argjson running "$RUNNING" --argjson queued "$QUEUED" --argjson awaiting "$AWAITING" \
|
|
98
244
|
--argjson reports "$REPORTS" --argjson todayCount "$TODAY_N" --argjson todayUsd "$TODAY_USD" \
|
|
99
|
-
--arg power "$POWER" --arg note "$NOTE" \
|
|
245
|
+
--arg power "$POWER" --arg note "$NOTE" --arg stopCommand "$STOP_COMMAND" \
|
|
100
246
|
--arg emptyReason "$EMPTY_REASON" --arg blockedReason "$BLOCKED" \
|
|
101
247
|
--argjson interval "$INTERVAL" --argjson spendUsd "${SPEND:-0}" \
|
|
102
248
|
--argjson ceilingUsd "${CEILING_USD:-0}" \
|
|
103
249
|
--argjson lastTickAt "${LAST_TICK:-null}" \
|
|
250
|
+
--argjson inhibitorHeld "$INHIBITOR_HELD" --arg lastGcReport "$LAST_GC" \
|
|
251
|
+
--arg lastDigest "$LAST_DIGEST" --argjson maxParallelAgents "$MAX_PAR" \
|
|
252
|
+
--argjson awake "$AWAKE" \
|
|
104
253
|
'{on:$on, slots:$slots, running:$running, queued:$queued, awaiting:$awaiting,
|
|
105
254
|
reports:$reports, todayCount:$todayCount, todayUsd:$todayUsd,
|
|
106
|
-
lastTickAt:$lastTickAt, power:$power, note:$note,
|
|
255
|
+
lastTickAt:$lastTickAt, power:$power, note:$note, stopCommand:$stopCommand,
|
|
107
256
|
scanIntervalSeconds:$interval, emptyReason:$emptyReason,
|
|
108
|
-
blockedReason:$blockedReason, spendUsd:$spendUsd, ceilingUsd:$ceilingUsd
|
|
257
|
+
blockedReason:$blockedReason, spendUsd:$spendUsd, ceilingUsd:$ceilingUsd,
|
|
258
|
+
inhibitorHeld:$inhibitorHeld, lastGcReport:$lastGcReport, lastDigest:$lastDigest,
|
|
259
|
+
maxParallelAgents:$maxParallelAgents, awake:$awake}'
|
|
109
260
|
}
|
|
110
261
|
|
|
262
|
+
# The envelope, or nothing when jq could not build a JSON object from the inputs
|
|
263
|
+
# (a config value of the wrong type, for one). status.json is only ever replaced
|
|
264
|
+
# by a complete envelope, so the menu bar keeps its last good answer.
|
|
265
|
+
ENVELOPE=$(build_json 2>/dev/null) || ENVELOPE=""
|
|
266
|
+
printf '%s' "$ENVELOPE" | jq -e 'type == "object"' >/dev/null 2>&1 || ENVELOPE=""
|
|
267
|
+
|
|
111
268
|
case "$MODE" in
|
|
112
269
|
json)
|
|
113
|
-
|
|
270
|
+
if [ -z "$ENVELOPE" ]; then
|
|
271
|
+
printf '%s\n' '{"error":"envelope-failed","message":"autopilot-status: could not build the status envelope"}'
|
|
272
|
+
exit 3
|
|
273
|
+
fi
|
|
274
|
+
printf '%s\n' "$ENVELOPE"
|
|
114
275
|
exit 0
|
|
115
276
|
;;
|
|
116
277
|
write)
|
|
117
|
-
|
|
278
|
+
if [ -z "$ENVELOPE" ]; then
|
|
279
|
+
echo "autopilot-status: could not build the status envelope; status.json left unchanged" >&2
|
|
280
|
+
exit 3
|
|
281
|
+
fi
|
|
282
|
+
printf '%s\n' "$ENVELOPE" | ma_ap_write status.json || exit 3
|
|
118
283
|
exit 0
|
|
119
284
|
;;
|
|
120
285
|
esac
|
|
@@ -125,8 +290,8 @@ esac
|
|
|
125
290
|
# that never turned this on, `ma_ap_write` would create ~/.claude/autopilot/ and
|
|
126
291
|
# quietly break the guarantee that a clean install writes nothing. Caught by
|
|
127
292
|
# running this file on this machine, which then had the directory.
|
|
128
|
-
if [ "$CONFIGURED" = true ]; then
|
|
129
|
-
|
|
293
|
+
if [ "$CONFIGURED" = true ] && [ -n "$ENVELOPE" ]; then
|
|
294
|
+
printf '%s\n' "$ENVELOPE" | ma_ap_write status.json 2>/dev/null || true
|
|
130
295
|
fi
|
|
131
296
|
|
|
132
297
|
NR=$(printf '%s' "$RUNNING" | jq 'length')
|
|
@@ -136,78 +301,78 @@ NA=$(printf '%s' "$AWAITING" | jq 'length')
|
|
|
136
301
|
if [ "$MODE" = "subjects" ]; then
|
|
137
302
|
# One line per item, with the numbers INSIDE the string: the widget takes
|
|
138
303
|
# exactly one string per row, so anything the reader needs has to travel in it.
|
|
139
|
-
printf '%s' "$RUNNING" | jq -r '.[] |
|
|
140
|
-
"\(.id) · \(
|
|
141
|
-
printf '%s' "$AWAITING" | jq -r '.[] | "\(.id) ·
|
|
304
|
+
printf '%s' "$RUNNING" | jq -r --arg phase "$(msg phase-word)" '.[] |
|
|
305
|
+
"\(.id) · \($phase) \(.phase // "?")\(if .phaseTotal then "/\(.phaseTotal)" else "" end) \(.phaseName // "") · \(.stack // "")"'
|
|
306
|
+
printf '%s' "$AWAITING" | jq -r --arg awaiting "$(msg awaiting-subject)" '.[] | "\(.id) · \($awaiting)"'
|
|
142
307
|
exit 0
|
|
143
308
|
fi
|
|
144
309
|
|
|
145
310
|
if [ "$MODE" = "short" ]; then
|
|
146
311
|
if [ "$ON" != true ]; then
|
|
147
312
|
if [ "$CONFIGURED" = true ]; then
|
|
148
|
-
|
|
313
|
+
msg short-off "$(ma_ap_cfg '.repos | length' 0)"
|
|
149
314
|
else
|
|
150
|
-
|
|
315
|
+
msg short-absent
|
|
151
316
|
fi
|
|
152
317
|
exit 0
|
|
153
318
|
fi
|
|
154
|
-
|
|
319
|
+
msg short-on "$NR" "$NQ" "$NA" "$NOTE"
|
|
155
320
|
exit 0
|
|
156
321
|
fi
|
|
157
322
|
|
|
158
323
|
# --- human -------------------------------------------------------------------
|
|
159
324
|
if [ "$CONFIGURED" != true ]; then
|
|
160
|
-
|
|
161
|
-
|
|
325
|
+
msg human-absent
|
|
326
|
+
msg human-turn-on "$(ma_ap_command autopilot-on)"
|
|
162
327
|
exit 0
|
|
163
328
|
fi
|
|
164
329
|
|
|
165
330
|
NREPOS=$(ma_ap_cfg '.repos | length' 0)
|
|
166
331
|
if [ "$ON" = true ]; then
|
|
167
|
-
|
|
332
|
+
msg human-on "$NREPOS" "$SLOTS" "$CEILING" "$INTERVAL"
|
|
168
333
|
else
|
|
169
|
-
|
|
170
|
-
|
|
334
|
+
msg human-off "$NREPOS"
|
|
335
|
+
msg human-turn-on "$(ma_ap_command autopilot-on)"
|
|
171
336
|
fi
|
|
172
337
|
[ -n "$NOTE" ] && echo " $NOTE"
|
|
173
338
|
|
|
174
339
|
echo
|
|
175
340
|
if [ "$NR" -gt 0 ]; then
|
|
176
|
-
|
|
341
|
+
msg heading-running "$NR"
|
|
177
342
|
printf '%s' "$RUNNING" | jq -r '.[] | " \(.id) · \(.phaseName // .phase // "?") · \(.stack // "")"'
|
|
178
343
|
fi
|
|
179
344
|
if [ "$NQ" -gt 0 ]; then
|
|
180
|
-
|
|
345
|
+
msg heading-queued "$NQ"
|
|
181
346
|
printf '%s' "$QUEUED" | jq -r '.[0:8][] | " \(.id)"'
|
|
182
347
|
fi
|
|
183
348
|
if [ "$NA" -gt 0 ]; then
|
|
184
|
-
|
|
349
|
+
msg heading-awaiting "$NA"
|
|
185
350
|
printf '%s' "$AWAITING" | jq -r '.[] | " \(.id)"'
|
|
186
351
|
fi
|
|
187
352
|
if [ "$NR" -eq 0 ] && [ "$NQ" -eq 0 ] && [ "$NA" -eq 0 ]; then
|
|
188
|
-
|
|
353
|
+
msg queue-empty
|
|
189
354
|
# The single most common "why is nothing happening" answer, and it is not a
|
|
190
355
|
# fault: no item carries the label yet. When intake recorded a more specific
|
|
191
356
|
# reason, that one is truer and goes first.
|
|
192
357
|
if [ -n "$EMPTY_REASON" ]; then
|
|
193
358
|
echo " $EMPTY_REASON"
|
|
194
359
|
fi
|
|
195
|
-
|
|
360
|
+
msg queue-empty-hint
|
|
196
361
|
fi
|
|
197
362
|
|
|
198
363
|
# The queue refusing to take work is not the same as having none, and reading
|
|
199
364
|
# one as the other is the whole reason this line exists separately.
|
|
200
365
|
if [ -n "$BLOCKED" ]; then
|
|
201
366
|
echo
|
|
202
|
-
|
|
367
|
+
msg blocked "$BLOCKED"
|
|
203
368
|
fi
|
|
204
369
|
if [ "$CEILING_USD" != "0" ]; then
|
|
205
|
-
|
|
370
|
+
msg spend "$SPEND" "$CEILING_USD"
|
|
206
371
|
fi
|
|
207
372
|
|
|
208
373
|
if [ "$TODAY_N" -gt 0 ]; then
|
|
209
374
|
echo
|
|
210
|
-
|
|
375
|
+
msg heading-reports "$TODAY_N"
|
|
211
376
|
printf '%s' "$REPORTS" | jq -r '.[0:6][] | " \(.id) · \(.url)"'
|
|
212
377
|
fi
|
|
213
378
|
exit 0
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# build-lock.sh - the build queue: one xcodebuild or Gradle build at a time
|
|
4
|
+
# across every worktree on this machine.
|
|
5
|
+
#
|
|
6
|
+
# DerivedData, simulators and the Gradle daemon contend across parallel
|
|
7
|
+
# worktrees, so every ios/android build and test call sits between
|
|
8
|
+
# `acquire` and `release`. The lock is a directory, because `mkdir` is atomic.
|
|
9
|
+
# `owner` inside it names the task holding it on its first line and, when
|
|
10
|
+
# MA_BUILD_LOCK_PID is set, the process that holds it (`pid=<n>`). The owner
|
|
11
|
+
# file is written to a temporary name and renamed into place, so a reader sees
|
|
12
|
+
# either no owner or a complete one.
|
|
13
|
+
#
|
|
14
|
+
# A waiter takes the lock over only when its holder is gone: the recorded
|
|
15
|
+
# owner process no longer exists, the owner file is older than the stale limit,
|
|
16
|
+
# or there is no owner file and the lock directory is older than the grace
|
|
17
|
+
# window (the holder crashed between `mkdir` and writing its owner).
|
|
18
|
+
#
|
|
19
|
+
# Two separate calls, so the build itself stays a command the caller runs (and
|
|
20
|
+
# the unattended guard judges) on its own:
|
|
21
|
+
# bash build-lock.sh acquire <task-id>
|
|
22
|
+
# xcodebuild ... 2>&1 | tail -5
|
|
23
|
+
# bash build-lock.sh release <task-id>
|
|
24
|
+
# `release` removes the lock only when <task-id> matches its owner.
|
|
25
|
+
#
|
|
26
|
+
# Environment: MA_BUILD_LOCK (default /tmp/claude-xcodebuild.lock),
|
|
27
|
+
# MA_BUILD_LOCK_STALE_SEC (default 900), MA_BUILD_LOCK_POLL_SEC (default 5),
|
|
28
|
+
# MA_BUILD_LOCK_GRACE_SEC (default 5), MA_BUILD_LOCK_PID (owner process, optional).
|
|
29
|
+
#
|
|
30
|
+
# Exit: 0 acquired or released, 1 release refused (lock held by another task),
|
|
31
|
+
# 2 usage.
|
|
32
|
+
set -uo pipefail
|
|
33
|
+
|
|
34
|
+
BUILD_LOCK="${MA_BUILD_LOCK:-/tmp/claude-xcodebuild.lock}"
|
|
35
|
+
STALE_SEC="${MA_BUILD_LOCK_STALE_SEC:-900}"
|
|
36
|
+
POLL_SEC="${MA_BUILD_LOCK_POLL_SEC:-5}"
|
|
37
|
+
GRACE_SEC="${MA_BUILD_LOCK_GRACE_SEC:-5}"
|
|
38
|
+
|
|
39
|
+
# GNU first: `stat -f` is a valid GNU flag (file-system status) that succeeds
|
|
40
|
+
# with the wrong answer, so BSD-first would silently win on Linux.
|
|
41
|
+
mtime() {
|
|
42
|
+
stat -c "%Y" "$1" 2>/dev/null || stat -f "%m" "$1" 2>/dev/null || echo 0
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
owner_task() {
|
|
46
|
+
head -n 1 "$BUILD_LOCK/owner" 2>/dev/null
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
owner_pid() {
|
|
50
|
+
sed -n 's/^pid=\([0-9][0-9]*\)$/\1/p' "$BUILD_LOCK/owner" 2>/dev/null | head -n 1
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Prints the reason the current lock may be taken over, or nothing.
|
|
54
|
+
takeover_reason() {
|
|
55
|
+
local now pid age
|
|
56
|
+
now=$(date +%s)
|
|
57
|
+
if [ ! -f "$BUILD_LOCK/owner" ]; then
|
|
58
|
+
age=$((now - $(mtime "$BUILD_LOCK")))
|
|
59
|
+
[ -d "$BUILD_LOCK" ] && [ "$age" -gt "$GRACE_SEC" ] && echo "no owner after ${age}s"
|
|
60
|
+
return 0
|
|
61
|
+
fi
|
|
62
|
+
pid=$(owner_pid)
|
|
63
|
+
if [ -n "$pid" ] && ! kill -0 "$pid" 2>/dev/null; then
|
|
64
|
+
echo "owner process $pid is gone"
|
|
65
|
+
return 0
|
|
66
|
+
fi
|
|
67
|
+
age=$((now - $(mtime "$BUILD_LOCK/owner")))
|
|
68
|
+
[ "$age" -gt "$STALE_SEC" ] && echo "stale (${age}s)"
|
|
69
|
+
return 0
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
write_owner() {
|
|
73
|
+
local tmp="$BUILD_LOCK/.owner.$$"
|
|
74
|
+
{
|
|
75
|
+
printf '%s\n' "$1"
|
|
76
|
+
if [ -n "${MA_BUILD_LOCK_PID:-}" ]; then printf 'pid=%s\n' "$MA_BUILD_LOCK_PID"; fi
|
|
77
|
+
} >"$tmp" && mv -f "$tmp" "$BUILD_LOCK/owner"
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
case "${1:-}" in
|
|
81
|
+
acquire)
|
|
82
|
+
task="${2:-unknown}"
|
|
83
|
+
while ! mkdir "$BUILD_LOCK" 2>/dev/null; do
|
|
84
|
+
judged=$(cat "$BUILD_LOCK/owner" 2>/dev/null || echo "")
|
|
85
|
+
reason=$(takeover_reason)
|
|
86
|
+
if [ -n "$reason" ]; then
|
|
87
|
+
current=$(cat "$BUILD_LOCK/owner" 2>/dev/null || echo "")
|
|
88
|
+
if [ "$current" = "$judged" ]; then
|
|
89
|
+
echo "Taking over the build lock: $reason"
|
|
90
|
+
trash="$BUILD_LOCK.stale.$$"
|
|
91
|
+
mv "$BUILD_LOCK" "$trash" 2>/dev/null && rm -rf "$trash"
|
|
92
|
+
fi
|
|
93
|
+
continue
|
|
94
|
+
fi
|
|
95
|
+
owner=$(owner_task)
|
|
96
|
+
age=$(($(date +%s) - $(mtime "$BUILD_LOCK/owner")))
|
|
97
|
+
echo "Build queue: waiting (${owner:-unknown}, ${age}s)"
|
|
98
|
+
sleep "$POLL_SEC"
|
|
99
|
+
done
|
|
100
|
+
write_owner "$task"
|
|
101
|
+
;;
|
|
102
|
+
release)
|
|
103
|
+
task="${2:-}"
|
|
104
|
+
if [ -z "$task" ]; then
|
|
105
|
+
echo "usage: build-lock.sh release <task-id>" >&2
|
|
106
|
+
exit 2
|
|
107
|
+
fi
|
|
108
|
+
[ -d "$BUILD_LOCK" ] || exit 0
|
|
109
|
+
owner=$(owner_task)
|
|
110
|
+
if [ "$owner" != "$task" ]; then
|
|
111
|
+
echo "build lock is held by ${owner:-an unknown owner}, not $task; left in place" >&2
|
|
112
|
+
exit 1
|
|
113
|
+
fi
|
|
114
|
+
rm -rf "$BUILD_LOCK"
|
|
115
|
+
;;
|
|
116
|
+
*)
|
|
117
|
+
echo "usage: build-lock.sh acquire <task-id> | release <task-id>" >&2
|
|
118
|
+
exit 2
|
|
119
|
+
;;
|
|
120
|
+
esac
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
|
|
24
24
|
import { readFileSync } from "node:fs";
|
|
25
25
|
import { runMain } from "../lib/fatal.mjs";
|
|
26
|
+
import { outputLanguage } from "../lib/user-facing.mjs";
|
|
26
27
|
|
|
27
28
|
const HEADERS = {
|
|
28
29
|
tr: ["Tür", "Kaynak", "URL / Yol", "Sürüm / Ref", "Rol", "Erişim", "Notlar"],
|
|
@@ -352,7 +353,9 @@ function main() {
|
|
|
352
353
|
return;
|
|
353
354
|
}
|
|
354
355
|
|
|
355
|
-
|
|
356
|
+
// The table is part of an analysis document a person reads, so the language
|
|
357
|
+
// is the run's own when the state records one and the preference otherwise.
|
|
358
|
+
const lang = argOf(argv, "--lang") ?? spec.language ?? outputLanguage();
|
|
356
359
|
if (!HEADERS[lang]) {
|
|
357
360
|
process.stderr.write(`ERROR: unknown language "${lang}"; expected tr or en\n`);
|
|
358
361
|
process.exitCode = 2;
|
|
@@ -18,10 +18,17 @@
|
|
|
18
18
|
* ai-analyst-toolkit (neither is copied into each stack plugin). Apple/
|
|
19
19
|
* Xcode-only vendored skills that match no stack pattern belong to iOS only.
|
|
20
20
|
*
|
|
21
|
+
* A vendored skill ships beside its upstream's NOTICE-*.md. Before anything is
|
|
22
|
+
* written, every NOTICE's `## Skills (N)` list is checked against the skills'
|
|
23
|
+
* `metadata.source` lines (_notices.mjs); a vendored skill no NOTICE lists stops
|
|
24
|
+
* the build, so an unattributed copy is never published.
|
|
25
|
+
*
|
|
21
26
|
* Usage:
|
|
22
27
|
* node build-stack-plugins.mjs [--plugins-repo <path>] [--pipeline <path>] [--dry-run]
|
|
28
|
+
* node build-stack-plugins.mjs --check-routing | --check-notices
|
|
23
29
|
*
|
|
24
|
-
* Exit code 0
|
|
30
|
+
* Exit code 0 on a build, 1 when the attribution check fails or a --check-* mode
|
|
31
|
+
* finds a problem; prints a JSON-ish summary + per-plugin diff.
|
|
25
32
|
*/
|
|
26
33
|
import {
|
|
27
34
|
readdirSync,
|
|
@@ -58,11 +65,10 @@ const getArg = (k, d) => {
|
|
|
58
65
|
}
|
|
59
66
|
return v;
|
|
60
67
|
};
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
const HOME = process.env.HOME || process.env.USERPROFILE;
|
|
68
|
+
// Checked up front so join() never throws a raw TypeError before any diagnostic.
|
|
69
|
+
const HOME = process.env.HOME;
|
|
64
70
|
if (!HOME) {
|
|
65
|
-
console.error("ERROR:
|
|
71
|
+
console.error("ERROR: HOME is not set; cannot resolve default paths.");
|
|
66
72
|
process.exit(2);
|
|
67
73
|
}
|
|
68
74
|
const PLUGINS_REPO = getArg("--plugins-repo", join(HOME, "multi-agent-plugins"));
|
|
@@ -85,6 +91,7 @@ import {
|
|
|
85
91
|
STACK_ONLY,
|
|
86
92
|
STACK_PATTERNS,
|
|
87
93
|
} from "./_stack-routing.mjs";
|
|
94
|
+
import { NOTICE_FILE, noticeProblems, readNotices } from "./_notices.mjs";
|
|
88
95
|
|
|
89
96
|
const isDir = (p) => {
|
|
90
97
|
try {
|
|
@@ -209,7 +216,24 @@ if (args.includes("--check-routing")) {
|
|
|
209
216
|
process.exit(0);
|
|
210
217
|
}
|
|
211
218
|
|
|
219
|
+
// --- 2c. attribution audit ----------------------------------------------
|
|
220
|
+
const attribution = noticeProblems(EXTERNAL);
|
|
221
|
+
if (attribution.length) {
|
|
222
|
+
console.error(`check-notices: ${attribution.length} attribution problem(s); nothing was written`);
|
|
223
|
+
for (const a of attribution) console.error(` FAIL ${a}`);
|
|
224
|
+
console.error(
|
|
225
|
+
'fix: list each vendored skill in its NOTICE-*.md "## Skills (N)" section, with a matching metadata.source',
|
|
226
|
+
);
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
if (args.includes("--check-notices")) {
|
|
230
|
+
console.log(`check-notices: clean (${readNotices(EXTERNAL).length} NOTICE files)`);
|
|
231
|
+
process.exit(0);
|
|
232
|
+
}
|
|
233
|
+
|
|
212
234
|
// --- 3. sync each plugin's knowledge/ + regenerate plugin.json -----------
|
|
235
|
+
// A NOTICE covers exactly the skills its `## Skills (N)` section lists.
|
|
236
|
+
const noticeFiles = readNotices(EXTERNAL);
|
|
213
237
|
const report = [];
|
|
214
238
|
for (const [plugin, want] of Object.entries(desired)) {
|
|
215
239
|
const pdir = join(PLUGINS_REPO, "plugins", plugin);
|
|
@@ -226,23 +250,12 @@ for (const [plugin, want] of Object.entries(desired)) {
|
|
|
226
250
|
const setChanged = toAdd.length > 0 || toRemove.length > 0;
|
|
227
251
|
|
|
228
252
|
// Compare EVERY wanted skill against the source, not just the newly added
|
|
229
|
-
// ones
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
235
|
-
// to date".
|
|
236
|
-
//
|
|
237
|
-
// The rm-before-copy matters too: cpSync overlays and never deletes, so a file
|
|
238
|
-
// REMOVED inside a still-wanted skill survived in every plugin copy forever -
|
|
239
|
-
// and because the overlay kept the orphan on both sides of the fingerprint
|
|
240
|
-
// comparison, the version was not bumped either.
|
|
241
|
-
// Detect content drift in BOTH modes so --dry-run (the pre-flight for a
|
|
242
|
-
// destructive run) reports the same "would change" verdict a real run acts on.
|
|
243
|
-
// Previously contentChanged was computed only inside `if (!DRY)`, so dry-run
|
|
244
|
-
// was blind to a file edit that did not change set membership - exactly the
|
|
245
|
-
// case the fingerprint machinery was added to catch.
|
|
253
|
+
// ones: an edit inside a skill changes no set membership, and the plugin has to
|
|
254
|
+
// serve the edited text all the same. Replace (rm + copy) rather than overlay,
|
|
255
|
+
// because cpSync never deletes, so a file removed from a still-wanted skill
|
|
256
|
+
// would survive in the plugin copy and sit on both sides of the fingerprint.
|
|
257
|
+
// Drift is detected in BOTH modes so --dry-run, the pre-flight for a
|
|
258
|
+
// destructive run, reports the verdict a real run acts on.
|
|
246
259
|
if (!DRY && !existsSync(kdir)) mkdirSync(kdir, { recursive: true });
|
|
247
260
|
let contentChanged = false;
|
|
248
261
|
for (const s of want) {
|
|
@@ -258,6 +271,30 @@ for (const [plugin, want] of Object.entries(desired)) {
|
|
|
258
271
|
if (!DRY) {
|
|
259
272
|
for (const s of toRemove) rmSync(join(kdir, s), { recursive: true, force: true });
|
|
260
273
|
}
|
|
274
|
+
|
|
275
|
+
// A vendored skill ships with its upstream's notice. A plugin carries every
|
|
276
|
+
// NOTICE that lists one of its skills and none that lists none of them.
|
|
277
|
+
for (const notice of noticeFiles) {
|
|
278
|
+
const to = join(kdir, notice.file);
|
|
279
|
+
const needed = [...want].some((sk) => notice.skills.has(sk));
|
|
280
|
+
const present = existsSync(to);
|
|
281
|
+
if (needed) {
|
|
282
|
+
if (present && readFileSync(to).equals(notice.bytes)) continue;
|
|
283
|
+
contentChanged = true;
|
|
284
|
+
if (!DRY) writeFileSync(to, notice.bytes);
|
|
285
|
+
} else if (present) {
|
|
286
|
+
contentChanged = true;
|
|
287
|
+
if (!DRY) rmSync(to, { force: true });
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// A notice whose source file was deleted is in no list above, so it is found
|
|
291
|
+
// by what the plugin holds rather than by what the source names.
|
|
292
|
+
const sourceNotices = new Set(noticeFiles.map((n) => n.file));
|
|
293
|
+
for (const file of existsSync(kdir) ? readdirSync(kdir) : []) {
|
|
294
|
+
if (!NOTICE_FILE.test(file) || sourceNotices.has(file)) continue;
|
|
295
|
+
contentChanged = true;
|
|
296
|
+
if (!DRY) rmSync(join(kdir, file), { force: true });
|
|
297
|
+
}
|
|
261
298
|
const changed = setChanged || contentChanged;
|
|
262
299
|
|
|
263
300
|
// regenerate plugin.json skills[]: keep non-knowledge entries, rebuild knowledge set
|
|
@@ -62,7 +62,7 @@ while [ "$#" -gt 0 ]; do
|
|
|
62
62
|
esac
|
|
63
63
|
done
|
|
64
64
|
|
|
65
|
-
LOGS="$HOME/.claude/logs/multi-agent"
|
|
65
|
+
LOGS="${LOGS_ROOT:-$HOME/.claude/logs/multi-agent}"
|
|
66
66
|
SCRIPTS="$HOME/.claude/scripts"
|
|
67
67
|
[ -d "$SCRIPTS" ] || SCRIPTS="$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)"
|
|
68
68
|
|