@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
|
@@ -14,10 +14,15 @@
|
|
|
14
14
|
# 1. A run WAITING FOR YOU is never reaped. An open PR, the Commit or Report
|
|
15
15
|
# phase, or `status: awaiting_input` means the work landed and the pipeline
|
|
16
16
|
# is holding for an answer by design. That is finished work, not residue.
|
|
17
|
+
# A run parked with `verificationFailed` or `waitingFor` is held the same
|
|
18
|
+
# way, even though a rejected verification records `status: failed`.
|
|
17
19
|
# 2. A path that is not strictly inside `<repo>/.worktrees/` is never removed.
|
|
18
20
|
# This is not theoretical: four state files on that machine record
|
|
19
21
|
# `worktreePath` as the REPO ROOT, so a sweep that trusted the field would
|
|
20
|
-
# have deleted the checkout.
|
|
22
|
+
# have deleted the checkout. Inside `.worktrees/`, only a path that
|
|
23
|
+
# `git worktree list --porcelain` reports as a worktree top level is a
|
|
24
|
+
# candidate, and it is removed only by `git worktree remove`; when git
|
|
25
|
+
# refuses, the directory stays and the report says `remove-failed`.
|
|
21
26
|
# 3. Uncommitted work is never destroyed. It goes into a STASH ENTRY labelled
|
|
22
27
|
# `autopilot/abandoned/<task-id>` - `git stash list` finds it - and the
|
|
23
28
|
# directory is left in place, which costs disk and keeps the work. Losing a
|
|
@@ -53,6 +58,14 @@
|
|
|
53
58
|
#
|
|
54
59
|
# SAFE BY DEFAULT: dry-run. Removes nothing until you pass --yes.
|
|
55
60
|
#
|
|
61
|
+
# `--only <file>` narrows both passes to the worktree paths listed in the file,
|
|
62
|
+
# one per line. The continuous-mode runner uses it to hand over the worktrees it
|
|
63
|
+
# created and nothing else: a run it did not start is neither reported nor
|
|
64
|
+
# touched, its state included. Pass 2 then walks the listed paths instead of
|
|
65
|
+
# `--repos`, because a runner's repos can live anywhere on the disk.
|
|
66
|
+
# `--report <file>` appends one JSON line per candidate - task, path, action,
|
|
67
|
+
# reason, idle days, size - for a caller that renders its own report.
|
|
68
|
+
#
|
|
56
69
|
# Usage:
|
|
57
70
|
# gc-abandoned.sh # dry-run, default ages
|
|
58
71
|
# gc-abandoned.sh --yes # apply
|
|
@@ -61,6 +74,8 @@
|
|
|
61
74
|
# gc-abandoned.sh --logs <dir> # another state root (tests)
|
|
62
75
|
# gc-abandoned.sh --repos <dir> # another checkout root (tests)
|
|
63
76
|
# gc-abandoned.sh --state-only # pass 1 only
|
|
77
|
+
# gc-abandoned.sh --only <file> # only the worktree paths listed in <file>
|
|
78
|
+
# gc-abandoned.sh --report <file> # also append one JSON line per candidate
|
|
64
79
|
#
|
|
65
80
|
# Exit: 0 on success (including "nothing to do"), 2 on usage error.
|
|
66
81
|
|
|
@@ -72,6 +87,8 @@ DELETE=0
|
|
|
72
87
|
DAYS=7
|
|
73
88
|
PHASE0_DAYS=1
|
|
74
89
|
STATE_ONLY=0
|
|
90
|
+
ONLY=""
|
|
91
|
+
REPORT=""
|
|
75
92
|
|
|
76
93
|
usage() {
|
|
77
94
|
grep -E '^#( |$)' "$0" | sed -E 's/^# ?//'
|
|
@@ -85,6 +102,8 @@ while [ "$#" -gt 0 ]; do
|
|
|
85
102
|
--logs) LOGS="${2:-}"; shift 2 ;;
|
|
86
103
|
--repos) REPOS="${2:-}"; shift 2 ;;
|
|
87
104
|
--state-only) STATE_ONLY=1; shift ;;
|
|
105
|
+
--only) ONLY="${2:-}"; shift 2 ;;
|
|
106
|
+
--report) REPORT="${2:-}"; shift 2 ;;
|
|
88
107
|
--abandoned) shift ;; # accepted so the command can forward its own flag
|
|
89
108
|
-h | --help) usage; exit 0 ;;
|
|
90
109
|
*) echo "gc-abandoned: unknown option $1" >&2; exit 2 ;;
|
|
@@ -94,6 +113,31 @@ done
|
|
|
94
113
|
case "$DAYS$PHASE0_DAYS" in *[!0-9]*) echo "gc-abandoned: --days and --phase0-days take whole days" >&2; exit 2 ;; esac
|
|
95
114
|
|
|
96
115
|
command -v jq >/dev/null 2>&1 || { echo "gc-abandoned: jq is required"; exit 0; }
|
|
116
|
+
if [ -n "$ONLY" ] && [ ! -f "$ONLY" ]; then echo "gc-abandoned: --only file not found: $ONLY" >&2; exit 2; fi
|
|
117
|
+
|
|
118
|
+
# Real paths, so a symlinked prefix (/var vs /private/var) cannot hide a match.
|
|
119
|
+
ONLY_LIST=""
|
|
120
|
+
if [ -n "$ONLY" ]; then
|
|
121
|
+
while IFS= read -r p || [ -n "$p" ]; do
|
|
122
|
+
[ -n "$p" ] || continue
|
|
123
|
+
r=$(cd "$p" 2>/dev/null && pwd -P) || r="$p"
|
|
124
|
+
ONLY_LIST="$ONLY_LIST
|
|
125
|
+
$r"
|
|
126
|
+
done < "$ONLY"
|
|
127
|
+
fi
|
|
128
|
+
listed_only() { # $1 = real path; true when no --only list was given
|
|
129
|
+
[ -z "$ONLY" ] && return 0
|
|
130
|
+
[ -n "$1" ] || return 1
|
|
131
|
+
printf '%s\n' "$ONLY_LIST" | grep -qxF "$1"
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
emit() { # task path action reason idle_days size_kb pass
|
|
135
|
+
[ -n "$REPORT" ] || return 0
|
|
136
|
+
jq -nc --arg task "$1" --arg path "$2" --arg action "$3" --arg reason "$4" \
|
|
137
|
+
--argjson idle "${5:-0}" --argjson kb "${6:-0}" --argjson pass "$7" \
|
|
138
|
+
'{task:$task, path:$path, action:$action, reason:$reason, idleDays:$idle, sizeKb:$kb, pass:$pass}' \
|
|
139
|
+
>> "$REPORT" 2>/dev/null || true
|
|
140
|
+
}
|
|
97
141
|
[ -d "$LOGS" ] || { echo "gc-abandoned: nothing to do (no state at $LOGS)"; exit 0; }
|
|
98
142
|
|
|
99
143
|
# The phase from which a stopped run is "waiting on you", not residue, is the
|
|
@@ -109,12 +153,35 @@ case "$WAITING_FROM" in *[!0-9]*|"") WAITING_FROM=4 ;; esac
|
|
|
109
153
|
# and are load-bearing; it is the ordering that matters, not the platform.
|
|
110
154
|
_mtime() { stat -c %Y "$1" 2>/dev/null || stat -f %m "$1" 2>/dev/null || echo "$NOW"; }
|
|
111
155
|
|
|
156
|
+
# A run gate-ledger.mjs parked for a person: `verificationFailed` (its own gate
|
|
157
|
+
# rejected the work, written with `status: failed`) or `waitingFor` (a question).
|
|
158
|
+
# Either holds its worktree for the person who looks, whatever `status` says.
|
|
159
|
+
# True when $1 (a physical path) is the top level of a worktree registered with
|
|
160
|
+
# the repo that holds its `.worktrees/` directory. Only such a path is ever
|
|
161
|
+
# removed, and only through `git worktree remove`: a subdirectory of a worktree
|
|
162
|
+
# or a directory made by hand under `.worktrees/` is not ours to delete, and git
|
|
163
|
+
# run inside one would act on the parent checkout.
|
|
164
|
+
registered_top() {
|
|
165
|
+
local repo="${1%%/.worktrees/*}" line top
|
|
166
|
+
while IFS= read -r line; do
|
|
167
|
+
case "$line" in
|
|
168
|
+
"worktree "*)
|
|
169
|
+
top=$(cd "${line#worktree }" 2>/dev/null && pwd -P) || continue
|
|
170
|
+
[ "$top" = "$1" ] && return 0 ;;
|
|
171
|
+
esac
|
|
172
|
+
done < <(git -C "$repo" worktree list --porcelain 2>/dev/null)
|
|
173
|
+
return 1
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
HELD_JQ='if (.verificationFailed != null) or ((.waitingFor // "") != "") then "held" else "" end'
|
|
177
|
+
|
|
112
178
|
NOW=$(date +%s)
|
|
113
179
|
removed=0
|
|
114
180
|
freed_kb=0
|
|
115
181
|
kept_dirty=0
|
|
116
182
|
skipped_waiting=0
|
|
117
183
|
skipped_unsafe=0
|
|
184
|
+
skipped_unregistered=0
|
|
118
185
|
listed=0
|
|
119
186
|
# Paths pass 1 has already decided about. Pass 2 must not revisit them: pass 1
|
|
120
187
|
# stashes a dirty worktree and KEEPS it, which leaves the tree clean, and pass 2
|
|
@@ -147,9 +214,10 @@ while IFS= read -r state; do
|
|
|
147
214
|
# and reaped. Read the shape, do not assume it.
|
|
148
215
|
pr=$(jq -r 'if (.pr|type)=="string" then .pr elif (.pr|type)=="object" then (.pr.url // .pr.number // "") else "" end | tostring' "$state" 2>/dev/null || true)
|
|
149
216
|
wt=$(jq -r '.worktreePath // ""' "$state" 2>/dev/null || true)
|
|
217
|
+
held=$(jq -r "$HELD_JQ" "$state" 2>/dev/null || true)
|
|
150
218
|
|
|
151
219
|
# Rule 1: waiting for you is not residue.
|
|
152
|
-
if [ "$status" = "awaiting_input" ] || [ -n "$pr" ] || { [ "$phase" != "?" ] && [ "$phase" -ge "$WAITING_FROM" ] 2>/dev/null; }; then
|
|
220
|
+
if [ "$status" = "awaiting_input" ] || [ -n "$held" ] || [ -n "$pr" ] || { [ "$phase" != "?" ] && [ "$phase" -ge "$WAITING_FROM" ] 2>/dev/null; }; then
|
|
153
221
|
skipped_waiting=$((skipped_waiting + 1))
|
|
154
222
|
continue
|
|
155
223
|
fi
|
|
@@ -171,11 +239,20 @@ while IFS= read -r state; do
|
|
|
171
239
|
# A worktree path that no longer resolves is the ordinary case here.
|
|
172
240
|
real=$(cd "$wt" 2>/dev/null && pwd -P || true)
|
|
173
241
|
case "$real" in
|
|
174
|
-
*/.worktrees/*)
|
|
242
|
+
*/.worktrees/*)
|
|
243
|
+
if registered_top "$real"; then
|
|
244
|
+
safe_wt="$real"
|
|
245
|
+
else
|
|
246
|
+
skipped_unregistered=$((skipped_unregistered + 1))
|
|
247
|
+
fi ;;
|
|
175
248
|
*) skipped_unsafe=$((skipped_unsafe + 1)) ;;
|
|
176
249
|
esac
|
|
177
250
|
fi
|
|
178
251
|
|
|
252
|
+
# --only: a run whose worktree is not on the list is not ours to judge,
|
|
253
|
+
# and that includes marking its state.
|
|
254
|
+
listed_only "$safe_wt" || continue
|
|
255
|
+
|
|
179
256
|
size_kb=0
|
|
180
257
|
[ -n "$safe_wt" ] && size_kb=$(du -sk "$safe_wt" 2>/dev/null | cut -f1)
|
|
181
258
|
|
|
@@ -192,10 +269,13 @@ $safe_wt"
|
|
|
192
269
|
if [ "$DELETE" -eq 0 ]; then
|
|
193
270
|
if [ "$dirty" -eq 1 ]; then
|
|
194
271
|
printf ' would stash (uncommitted work): %s - %s, idle %sd, %s\n' "$task" "$kind" "$age_days" "$human"
|
|
272
|
+
emit "$task" "$safe_wt" would-stash "$kind" "$age_days" "${size_kb:-0}" 1
|
|
195
273
|
elif [ -n "$safe_wt" ]; then
|
|
196
274
|
printf ' would remove: %s - %s, idle %sd, %s\n' "$task" "$kind" "$age_days" "$human"
|
|
275
|
+
emit "$task" "$safe_wt" would-remove "$kind" "$age_days" "${size_kb:-0}" 1
|
|
197
276
|
else
|
|
198
277
|
printf ' would mark abandoned (no reapable worktree): %s - %s, idle %sd\n' "$task" "$kind" "$age_days"
|
|
278
|
+
emit "$task" "" would-mark "$kind" "$age_days" 0 1
|
|
199
279
|
fi
|
|
200
280
|
continue
|
|
201
281
|
fi
|
|
@@ -219,19 +299,26 @@ $safe_wt"
|
|
|
219
299
|
git -C "$safe_wt" stash push -u -m "$br" >/dev/null 2>&1 &&
|
|
220
300
|
printf '→ stashed uncommitted work, worktree kept: %s (%s)\n' "$task" "$br" ||
|
|
221
301
|
printf '→ could NOT stash, worktree kept untouched: %s\n' "$task"
|
|
302
|
+
emit "$task" "$safe_wt" stashed "$kind" "$age_days" "${size_kb:-0}" 1
|
|
222
303
|
kept_dirty=$((kept_dirty + 1))
|
|
223
304
|
continue
|
|
224
305
|
fi
|
|
225
306
|
|
|
226
307
|
if [ -n "$safe_wt" ]; then
|
|
227
308
|
repo=${safe_wt%%/.worktrees/*}
|
|
228
|
-
git -C "$repo" worktree remove --force "$safe_wt" >/dev/null 2>&1
|
|
309
|
+
if ! git -C "$repo" worktree remove --force "$safe_wt" >/dev/null 2>&1; then
|
|
310
|
+
printf '→ could NOT remove, worktree kept: %s\n' "$task"
|
|
311
|
+
emit "$task" "$safe_wt" remove-failed "$kind" "$age_days" "${size_kb:-0}" 1
|
|
312
|
+
continue
|
|
313
|
+
fi
|
|
229
314
|
# Forgiven: one flaky prune must not end the sweep before its summary line.
|
|
230
315
|
git -C "$repo" worktree prune >/dev/null 2>&1 || true
|
|
231
316
|
printf '→ removed: %s (%s, idle %sd)\n' "$task" "$human" "$age_days"
|
|
317
|
+
emit "$task" "$safe_wt" removed "$kind" "$age_days" "${size_kb:-0}" 1
|
|
232
318
|
freed_kb=$((freed_kb + ${size_kb:-0}))
|
|
233
319
|
else
|
|
234
320
|
printf '→ marked abandoned, no reapable worktree: %s\n' "$task"
|
|
321
|
+
emit "$task" "" marked "$kind" "$age_days" 0 1
|
|
235
322
|
fi
|
|
236
323
|
removed=$((removed + 1))
|
|
237
324
|
done <<EOF
|
|
@@ -255,20 +342,37 @@ if [ "$STATE_ONLY" -eq 0 ] && [ -d "$REPOS" ]; then
|
|
|
255
342
|
# a jq failure inside this subshell ends the loop, and the entries after
|
|
256
343
|
# it would silently not exist - which reads as "no worktree matches" and
|
|
257
344
|
# protects nothing.
|
|
258
|
-
jq -r '[(.worktreePath // ""), (.taskId // .jiraId // ""), (.status // ""), (if (.pr|type)=="string" then .pr elif (.pr|type)=="object" then (.pr.url // .pr.number // "") else "" end | tostring), ((.currentPhase // "") | tostring)] | @tsv' "$f" 2>/dev/null || true
|
|
345
|
+
jq -r '[(.worktreePath // ""), (.taskId // .jiraId // ""), (.status // ""), (if (.pr|type)=="string" then .pr elif (.pr|type)=="object" then (.pr.url // .pr.number // "") else "" end | tostring), ((.currentPhase // "") | tostring), ('"$HELD_JQ"')] | @tsv' "$f" 2>/dev/null || true
|
|
259
346
|
done)
|
|
260
347
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
348
|
+
# The candidates: every `<repo>/.worktrees/*` under --repos, or exactly the
|
|
349
|
+
# --only list. Both go through the same guards below.
|
|
350
|
+
candidates=""
|
|
351
|
+
if [ -n "$ONLY" ]; then
|
|
352
|
+
candidates="$ONLY_LIST"
|
|
353
|
+
else
|
|
354
|
+
for wtroot in "$REPOS"/*/.worktrees; do
|
|
355
|
+
[ -d "$wtroot" ] || continue
|
|
356
|
+
[ -L "$wtroot" ] && continue
|
|
357
|
+
for d in "$wtroot"/*; do
|
|
358
|
+
candidates="$candidates
|
|
359
|
+
$d"
|
|
360
|
+
done
|
|
361
|
+
done
|
|
362
|
+
fi
|
|
363
|
+
while IFS= read -r d; do
|
|
364
|
+
[ -n "$d" ] || continue
|
|
266
365
|
[ -d "$d" ] || continue
|
|
267
366
|
[ -L "$d" ] && continue
|
|
268
367
|
real=$(cd "$d" 2>/dev/null && pwd -P) || continue
|
|
368
|
+
repo=${real%%/.worktrees/*}
|
|
269
369
|
# The namespace guard again, unconditionally: nothing outside a
|
|
270
370
|
# `.worktrees/` directory is a candidate, whatever any record claims.
|
|
271
371
|
case "$real" in */.worktrees/*) ;; *) continue ;; esac
|
|
372
|
+
if ! registered_top "$real"; then
|
|
373
|
+
skipped_unregistered=$((skipped_unregistered + 1))
|
|
374
|
+
continue
|
|
375
|
+
fi
|
|
272
376
|
printf '%s\n' "$HANDLED" | grep -qxF "$real" && continue
|
|
273
377
|
id=$(basename "$real")
|
|
274
378
|
|
|
@@ -276,6 +380,10 @@ if [ "$STATE_ONLY" -eq 0 ] && [ -d "$REPOS" ]; then
|
|
|
276
380
|
st=$(printf '%s' "$row" | cut -f3)
|
|
277
381
|
pr=$(printf '%s' "$row" | cut -f4)
|
|
278
382
|
ph=$(printf '%s' "$row" | cut -f5)
|
|
383
|
+
hd=$(printf '%s' "$row" | cut -f6)
|
|
384
|
+
if [ -n "$hd" ]; then
|
|
385
|
+
skipped_waiting=$((skipped_waiting + 1)); continue
|
|
386
|
+
fi
|
|
279
387
|
|
|
280
388
|
# Rule 1 again: landed work is not residue, whichever pass finds it. Order
|
|
281
389
|
# matters here - the waiting-phase test is a proxy for "still waiting", and
|
|
@@ -323,6 +431,7 @@ if [ "$STATE_ONLY" -eq 0 ] && [ -d "$REPOS" ]; then
|
|
|
323
431
|
printf ' %s %s - %s, idle %sd, %s\n' \
|
|
324
432
|
"$([ "$DELETE" -eq 0 ] && echo "unattributed:" || echo "left alone:")" \
|
|
325
433
|
"$id" "$why" "$age_days" "$human"
|
|
434
|
+
emit "$id" "$real" unattributed "$why" "$age_days" "${size_kb:-0}" 2
|
|
326
435
|
continue
|
|
327
436
|
fi
|
|
328
437
|
|
|
@@ -330,8 +439,10 @@ if [ "$STATE_ONLY" -eq 0 ] && [ -d "$REPOS" ]; then
|
|
|
330
439
|
if [ "$DELETE" -eq 0 ]; then
|
|
331
440
|
if [ "$dirty" -eq 1 ]; then
|
|
332
441
|
printf ' would stash (uncommitted work): %s - %s, idle %sd, %s\n' "$id" "$why" "$age_days" "$human"
|
|
442
|
+
emit "$id" "$real" would-stash "$why" "$age_days" "${size_kb:-0}" 2
|
|
333
443
|
else
|
|
334
444
|
printf ' would remove worktree: %s - %s, idle %sd, %s\n' "$id" "$why" "$age_days" "$human"
|
|
445
|
+
emit "$id" "$real" would-remove "$why" "$age_days" "${size_kb:-0}" 2
|
|
335
446
|
fi
|
|
336
447
|
continue
|
|
337
448
|
fi
|
|
@@ -340,23 +451,31 @@ if [ "$STATE_ONLY" -eq 0 ] && [ -d "$REPOS" ]; then
|
|
|
340
451
|
git -C "$real" stash push -u -m "autopilot/abandoned/$id" >/dev/null 2>&1 &&
|
|
341
452
|
printf '→ stashed uncommitted work, worktree kept: %s\n' "$id" ||
|
|
342
453
|
printf '→ could NOT stash, worktree kept untouched: %s\n' "$id"
|
|
454
|
+
emit "$id" "$real" stashed "$why" "$age_days" "${size_kb:-0}" 2
|
|
343
455
|
kept_dirty=$((kept_dirty + 1))
|
|
344
456
|
continue
|
|
345
457
|
fi
|
|
346
|
-
git -C "$repo" worktree remove --force "$real" >/dev/null 2>&1
|
|
458
|
+
if ! git -C "$repo" worktree remove --force "$real" >/dev/null 2>&1; then
|
|
459
|
+
printf '→ could NOT remove, worktree kept: %s\n' "$id"
|
|
460
|
+
emit "$id" "$real" remove-failed "$why" "$age_days" "${size_kb:-0}" 2
|
|
461
|
+
continue
|
|
462
|
+
fi
|
|
347
463
|
# Same reason as the first pass: a failed prune is not a reason to stop.
|
|
348
464
|
git -C "$repo" worktree prune >/dev/null 2>&1 || true
|
|
349
465
|
printf '→ removed worktree: %s (%s, %s, idle %sd)\n' "$id" "$why" "$human" "$age_days"
|
|
466
|
+
emit "$id" "$real" removed "$why" "$age_days" "${size_kb:-0}" 2
|
|
350
467
|
freed_kb=$((freed_kb + ${size_kb:-0}))
|
|
351
468
|
removed=$((removed + 1))
|
|
352
|
-
|
|
353
|
-
|
|
469
|
+
done <<EOF_CANDIDATES
|
|
470
|
+
$candidates
|
|
471
|
+
EOF_CANDIDATES
|
|
354
472
|
fi
|
|
355
473
|
listed=$((listed + stale_wt))
|
|
356
474
|
|
|
357
475
|
note=""
|
|
358
476
|
[ "$skipped_waiting" -gt 0 ] && note="$note, $skipped_waiting waiting on you (kept)"
|
|
359
477
|
[ "$skipped_unsafe" -gt 0 ] && note="$note, $skipped_unsafe path(s) outside .worktrees/ (kept)"
|
|
478
|
+
[ "$skipped_unregistered" -gt 0 ] && note="$note, $skipped_unregistered path(s) not a registered worktree (kept)"
|
|
360
479
|
[ "$kept_dirty" -gt 0 ] && note="$note, $kept_dirty stashed and kept"
|
|
361
480
|
if [ "$unattributed" -gt 0 ]; then
|
|
362
481
|
uh=$(printf '%s' "$unattributed_kb" | awk '{printf "%.1fG", $1/1048576}')
|
|
@@ -94,7 +94,10 @@ try {
|
|
|
94
94
|
let toolCount = null;
|
|
95
95
|
let toolCategories = null;
|
|
96
96
|
let toolkitVersion = null;
|
|
97
|
-
|
|
97
|
+
// Sibling checkouts are looked up beside this repo; GEN_FACTS_SIBLINGS_DIR
|
|
98
|
+
// names another parent directory (a test points it at an empty one).
|
|
99
|
+
const siblingsDir = process.env.GEN_FACTS_SIBLINGS_DIR || join(ROOT, "..");
|
|
100
|
+
const toolkitDir = join(siblingsDir, "multi-agent-toolkit-mcp");
|
|
98
101
|
if (existsSync(join(toolkitDir, "package.json"))) {
|
|
99
102
|
try {
|
|
100
103
|
toolkitVersion =
|
|
@@ -102,11 +105,10 @@ if (existsSync(join(toolkitDir, "package.json"))) {
|
|
|
102
105
|
} catch {
|
|
103
106
|
toolkitVersion = null;
|
|
104
107
|
}
|
|
105
|
-
// Asked of the server, not counted out of its source
|
|
108
|
+
// Asked of the server, not counted out of its source: three tool families
|
|
106
109
|
// are defined in modules the main file only spreads in, so a regex over
|
|
107
|
-
// index.js
|
|
108
|
-
//
|
|
109
|
-
// a client actually receives, which is the number the site should print.
|
|
110
|
+
// index.js misses them. tools/list is what a client actually receives,
|
|
111
|
+
// which is the number the site should print.
|
|
110
112
|
try {
|
|
111
113
|
const req =
|
|
112
114
|
[
|
|
@@ -164,7 +166,7 @@ if (existsSync(join(toolkitDir, "package.json"))) {
|
|
|
164
166
|
// next to the pipeline's own skill counts, and three different skill
|
|
165
167
|
// populations on one page is exactly the shape that drifts.
|
|
166
168
|
let pluginSkillCount = null;
|
|
167
|
-
const pluginsDir = join(
|
|
169
|
+
const pluginsDir = join(siblingsDir, "multi-agent-plugins", "plugins");
|
|
168
170
|
if (existsSync(pluginsDir)) {
|
|
169
171
|
let n = 0;
|
|
170
172
|
const walk = (d) => {
|
|
@@ -191,17 +193,14 @@ const facts = {
|
|
|
191
193
|
phaseCount: contract.phases.length,
|
|
192
194
|
modes: Object.fromEntries(Object.entries(contract.modes).map(([k, v]) => [k, v.phases])),
|
|
193
195
|
commandCount: countSkillDirs("pipeline/commands/multi-agent"),
|
|
194
|
-
// Two populations
|
|
195
|
-
//
|
|
196
|
-
//
|
|
197
|
-
//
|
|
198
|
-
// generated here rather than counted by hand at the other end.
|
|
196
|
+
// Two populations: `skillCount` is the external set a user installs;
|
|
197
|
+
// `skillCountAll` is every SKILL.md the repo ships, mirrors included. The site
|
|
198
|
+
// states both, so both are generated here rather than counted by hand at the
|
|
199
|
+
// other end.
|
|
199
200
|
skillCount: countSkillDirs("pipeline/skills/shared/external"),
|
|
200
201
|
skillCountAll: countSkillsDeep("pipeline/skills"),
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
// gone stale, naming Claude Code and Copilot CLI while install/codex.mjs had
|
|
204
|
-
// been shipping a third target for releases.
|
|
202
|
+
// Both are headline figures on the site; generated from pipeline/agents and
|
|
203
|
+
// install/, so the sub-agent count and the host list follow what ships.
|
|
205
204
|
agentCount: readdirSync(join(ROOT, "pipeline", "agents")).filter((f) => f.endsWith(".md")).length,
|
|
206
205
|
hosts: readdirSync(join(ROOT, "install"))
|
|
207
206
|
.filter((f) => f.endsWith(".mjs") && !f.startsWith("_") && f !== "index.mjs")
|
|
@@ -257,6 +256,23 @@ if (process.argv.includes("--check")) {
|
|
|
257
256
|
// generatedAt is a timestamp, not a fact: comparing it would fail every day.
|
|
258
257
|
delete onDisk.generatedAt;
|
|
259
258
|
delete fresh.generatedAt;
|
|
259
|
+
// A number read from a sibling checkout cannot be checked without it. Those
|
|
260
|
+
// fields are left out of the comparison and named, so a clean clone checks
|
|
261
|
+
// everything it can and says what it could not.
|
|
262
|
+
const unchecked = [];
|
|
263
|
+
if (!existsSync(join(toolkitDir, "package.json"))) {
|
|
264
|
+
unchecked.push("toolCount", "toolCategories", "toolkitVersion");
|
|
265
|
+
}
|
|
266
|
+
if (!existsSync(pluginsDir)) unchecked.push("pluginSkillCount");
|
|
267
|
+
for (const k of unchecked) {
|
|
268
|
+
delete onDisk[k];
|
|
269
|
+
delete fresh[k];
|
|
270
|
+
}
|
|
271
|
+
if (unchecked.length) {
|
|
272
|
+
console.log(
|
|
273
|
+
`gen-facts: not checked, no sibling checkout in ${siblingsDir}: ${unchecked.join(", ")}`,
|
|
274
|
+
);
|
|
275
|
+
}
|
|
260
276
|
if (JSON.stringify(onDisk) !== JSON.stringify(fresh)) {
|
|
261
277
|
console.error(
|
|
262
278
|
"gen-facts: docs/facts.json is stale - run: node pipeline/scripts/gen-facts.mjs",
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
/**
|
|
4
4
|
* gen-mode-dispatch.mjs - emit the canonical Phase Tracker Contract block
|
|
5
|
-
* for a given mode dispatch file (full /
|
|
5
|
+
* for a given mode dispatch file (full / autopilot / analysis, the modes in
|
|
6
|
+
* pipeline/schemas/phases.json).
|
|
6
7
|
*
|
|
7
8
|
* v8.0.0 introduced this generator as the single source of truth for the
|
|
8
9
|
* "## Required: Phase Tracker Contract" section embedded in every mode
|
|
9
10
|
* dispatch file under pipeline/commands/multi-agent/. Each mode declares its
|
|
10
|
-
* own phase list
|
|
11
|
+
* own phase list, but the tracker call shape, render
|
|
11
12
|
* call, anti-pattern warning, and ref link are identical.
|
|
12
13
|
*
|
|
13
14
|
* Usage:
|
|
14
15
|
* node pipeline/scripts/gen-mode-dispatch.mjs --mode=full # 0..5
|
|
15
|
-
* node pipeline/scripts/gen-mode-dispatch.mjs --mode=local # 0..5 + local-mode caveat
|
|
16
16
|
* node pipeline/scripts/gen-mode-dispatch.mjs --mode=autopilot # 0..5
|
|
17
17
|
* node pipeline/scripts/gen-mode-dispatch.mjs --mode=analysis # 0/1/3/4/5 (no Dev)
|
|
18
18
|
*
|