@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +912 -1
- package/README.md +104 -81
- package/README.tr.md +103 -62
- package/docs/FIGMA_PIPELINE.md +35 -35
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
- package/docs/architecture.md +50 -14
- package/docs/best-practices.md +1 -1
- package/docs/ecosystem.md +56 -32
- package/docs/facts.json +10 -10
- package/docs/features.md +97 -5
- package/docs/recovery-guide.md +7 -14
- package/docs/server-readiness.md +31 -24
- package/index.js +1 -1
- package/install/_common.mjs +3 -5
- package/install/_platform-filter.mjs +23 -1
- package/install/_unattended-profile.mjs +321 -75
- package/install/claude.mjs +51 -10
- package/install/codex.mjs +2 -0
- package/install/copilot.mjs +2 -0
- package/install/index.mjs +30 -17
- package/install/templates/claude-hooks.json +16 -5
- package/install/templates/copilot-instructions.md +1 -1
- package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
- package/install/templates/multi-agent-autopilot.plist.template +12 -5
- package/install/unattended-profile-legacy.json +80 -0
- package/manifest.json +616 -483
- package/package.json +8 -3
- package/pipeline/agents/code-reviewer.md +10 -0
- package/pipeline/agents/plan-critic.md +98 -0
- package/pipeline/agents/security-auditor.md +10 -0
- package/pipeline/agents/task-clarifier.md +10 -0
- package/pipeline/commands/multi-agent/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
- package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
- package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
- package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
- package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
- package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
- package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
- package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
- package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
- package/pipeline/contract/CHANGELOG.md +74 -0
- package/pipeline/contract/README.md +126 -0
- package/pipeline/contract/build.mjs +427 -0
- package/pipeline/contract/fixtures/answer-result.json +11 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
- package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
- package/pipeline/contract/fixtures/error-unsigned.json +5 -0
- package/pipeline/contract/fixtures/issues-empty.json +18 -0
- package/pipeline/contract/fixtures/launch-plan.json +31 -0
- package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
- package/pipeline/contract/fixtures/runs-empty.json +6 -0
- package/pipeline/contract/fixtures/runs-failed.json +84 -0
- package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
- package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
- package/pipeline/contract/fixtures/runs-running.json +84 -0
- package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
- package/pipeline/contract/frozen/toolbox.json +107 -0
- package/pipeline/contract/manifest.json +263 -0
- package/pipeline/contract/types/index.d.ts +343 -0
- package/pipeline/lib/_jira-auth.sh +6 -2
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/autopilot-state.sh +19 -0
- package/pipeline/lib/context-link-extractor.sh +12 -5
- package/pipeline/lib/credential-inventory.sh +12 -5
- package/pipeline/lib/credential-store.sh +116 -185
- package/pipeline/lib/fetch-confluence.sh +44 -3
- package/pipeline/lib/fetch-document.sh +3 -4
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/figma-mcp-refresh.sh +2 -2
- package/pipeline/lib/figma-token.sh +5 -1
- package/pipeline/lib/issue-fetcher.sh +233 -16
- package/pipeline/lib/json-file-lock.mjs +172 -0
- package/pipeline/lib/model-dispatch.sh +21 -12
- package/pipeline/lib/model-rung.sh +6 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/outbound-gate.mjs +46 -16
- package/pipeline/lib/parse-complaints.sh +14 -7
- package/pipeline/lib/plan-todos.sh +3 -3
- package/pipeline/lib/post-pr-review.sh +9 -9
- package/pipeline/lib/pr-request-location.mjs +85 -0
- package/pipeline/lib/regular-file.mjs +153 -0
- package/pipeline/lib/repo-hygiene.sh +17 -0
- package/pipeline/lib/route-state.sh +5 -1
- package/pipeline/lib/run-paths.sh +3 -2
- package/pipeline/lib/stack-detect.sh +19 -1
- package/pipeline/lib/unattended-profile-check.mjs +178 -0
- package/pipeline/lib/unattended-settings-location.mjs +28 -0
- package/pipeline/lib/unattended.mjs +76 -0
- package/pipeline/lib/unattended.sh +32 -0
- package/pipeline/lib/untrusted.mjs +76 -0
- package/pipeline/lib/user-facing.mjs +82 -0
- package/pipeline/lib/user-facing.sh +58 -0
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
- package/pipeline/multi-agent-refs/analysis/render.md +4 -3
- package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
- package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
- package/pipeline/multi-agent-refs/analysis-template.md +10 -17
- package/pipeline/multi-agent-refs/channels/jira.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
- package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
- package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
- package/pipeline/multi-agent-refs/features/constitution.md +196 -0
- package/pipeline/multi-agent-refs/features/doctor.md +6 -3
- package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
- package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
- package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
- package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
- package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
- package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
- package/pipeline/multi-agent-refs/features/research.md +150 -0
- package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
- package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
- package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
- package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
- package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
- package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
- package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
- package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -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 +185 -65
- package/pipeline/scripts/usage-report.mjs +230 -66
- package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
- package/pipeline/scripts/validate-planning.mjs +6 -0
- package/pipeline/scripts/verify-citations.mjs +151 -38
- package/pipeline/scripts/verify.mjs +58 -18
- package/pipeline/scripts/worktree-prepare.sh +126 -0
- package/pipeline/scripts/worktrees.mjs +124 -0
- package/pipeline/scripts/write-state.mjs +48 -17
- package/pipeline/skills/.skill-manifest.json +222 -226
- package/pipeline/skills/.skills-index.json +77 -88
- package/pipeline/skills/shared/README.md +44 -45
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
- package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
- package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
- package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
- package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
- package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
- package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
- package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
- package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
- package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
- package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
- package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
- package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
- package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
- package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
- package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
- package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
- package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
- package/pipeline/skills/shared/external/council/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
- package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
- package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
- package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
- package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
- package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
- package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
- package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
- package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
- package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
- package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
- package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
- package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
- package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
- package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
- package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
- package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
- package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
- package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
- package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
- package/pipeline/skills/skills-index.md +40 -41
- package/docs/token-budget-history.md +0 -24
- package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
- package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
- package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
- package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
- package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
|
@@ -25,14 +25,34 @@
|
|
|
25
25
|
* every one of them invented.
|
|
26
26
|
* --json Machine-readable report
|
|
27
27
|
* --quiet Exit code only
|
|
28
|
+
* --state <path> agent-state.json, for the unattended pre-existing check
|
|
29
|
+
* --base <sha> Base commit for that check. Default: state.baseline.sha,
|
|
30
|
+
* else the merge-base of HEAD with state.baseBranch
|
|
28
31
|
*
|
|
29
32
|
* Accepted shapes, detected rather than declared, so one script serves both
|
|
30
33
|
* callers and neither has to say which it is:
|
|
31
34
|
* - reviewer output `{findings: [{file, line, ...}]}`
|
|
32
|
-
* - triage output `{accepted
|
|
35
|
+
* - triage output `{accepted: [{file, line}], deferred|rejected: [{finding: {file, line}}]}`
|
|
33
36
|
* - analysis spec `{evidence: {repoEvidence: {<repo>: {buckets: ...}}}}`
|
|
34
37
|
* - markdown every `path/to/file.ext:123` in the prose
|
|
35
38
|
*
|
|
39
|
+
* While the quality gates are active (lib/unattended.mjs, gatesActive:
|
|
40
|
+
* MULTI_AGENT_UNATTENDED=1 or a run in autopilot mode) the check goes further:
|
|
41
|
+
*
|
|
42
|
+
* - the `finding` inside each deferred / rejected triage item is resolved too;
|
|
43
|
+
* - a citation that carries a `quote` must match: after whitespace is
|
|
44
|
+
* collapsed, the quote is contained in the cited line (a multi-line quote
|
|
45
|
+
* in the lines starting there) and has at least QUOTE_MIN non-space
|
|
46
|
+
* characters, or is the whole line. A line number with no quote only says
|
|
47
|
+
* the line exists; the quote says what the reviewer read on it;
|
|
48
|
+
* - every finding claimed pre-existing is checked against the base commit
|
|
49
|
+
* (_pre-existing.mjs);
|
|
50
|
+
* - the verdict is appended to state.gates[] as `verify-citations`
|
|
51
|
+
* (gate-ledger.mjs), `not-applicable` when there was nothing to check.
|
|
52
|
+
*
|
|
53
|
+
* An attended run resolves `file:line` as it always did: flat findings only,
|
|
54
|
+
* quotes not read.
|
|
55
|
+
*
|
|
36
56
|
* Exit codes:
|
|
37
57
|
* 0 - every citation resolved, or there were none to resolve
|
|
38
58
|
* 1 - at least one citation did not resolve
|
|
@@ -43,10 +63,12 @@
|
|
|
43
63
|
*/
|
|
44
64
|
|
|
45
65
|
import { readFileSync, realpathSync, statSync } from "node:fs";
|
|
46
|
-
import { resolve as resolvePath, sep } from "node:path";
|
|
66
|
+
import { dirname, resolve as resolvePath, sep } from "node:path";
|
|
47
67
|
import { spawnSync } from "node:child_process";
|
|
48
68
|
import { runMain } from "../lib/fatal.mjs";
|
|
49
69
|
import { invokedDirectly } from "../lib/invoked-directly.mjs";
|
|
70
|
+
import { checkPreExisting, resolveBase } from "./_pre-existing.mjs";
|
|
71
|
+
import { gateContext, recordQuietly } from "./gate-ledger.mjs";
|
|
50
72
|
|
|
51
73
|
/**
|
|
52
74
|
* Reject a path before it reaches git.
|
|
@@ -145,14 +167,21 @@ export const SOURCE_EXTENSIONS = new Set([
|
|
|
145
167
|
/**
|
|
146
168
|
* Pull `{file, line}` pairs out of whatever was handed over.
|
|
147
169
|
*
|
|
170
|
+
* `nested` reads the `finding` inside deferred / rejected triage items and
|
|
171
|
+
* `quotes` keeps each citation's `quote`; both are on by default. An attended
|
|
172
|
+
* run turns both off (see main), which keeps its verdicts where they were.
|
|
173
|
+
*
|
|
148
174
|
* @param {string} raw
|
|
149
|
-
* @
|
|
175
|
+
* @param {{nested?: boolean, quotes?: boolean}} [opts]
|
|
176
|
+
* @returns {{file: string, line: number|null, where: string, quote?: string}[]}
|
|
150
177
|
*/
|
|
151
|
-
export function extract(raw) {
|
|
178
|
+
export function extract(raw, { nested = true, quotes = true } = {}) {
|
|
152
179
|
const out = [];
|
|
153
|
-
const push = (file, line, where) => {
|
|
180
|
+
const push = (file, line, where, quote) => {
|
|
154
181
|
if (typeof file === "string" && file.trim()) {
|
|
155
|
-
|
|
182
|
+
const c = { file: file.trim(), line: Number.isFinite(line) ? line : null, where };
|
|
183
|
+
if (quotes && typeof quote === "string" && quote.trim()) c.quote = quote;
|
|
184
|
+
out.push(c);
|
|
156
185
|
}
|
|
157
186
|
};
|
|
158
187
|
|
|
@@ -164,9 +193,13 @@ export function extract(raw) {
|
|
|
164
193
|
}
|
|
165
194
|
|
|
166
195
|
if (doc && typeof doc === "object") {
|
|
196
|
+
// Deferred and rejected triage items wrap the reviewer's finding as
|
|
197
|
+
// `{finding, reason}`; accepted items and reviewer findings are flat.
|
|
167
198
|
for (const key of ["findings", "accepted", "deferred", "rejected"]) {
|
|
168
|
-
for (const [i,
|
|
169
|
-
if (
|
|
199
|
+
for (const [i, item] of (Array.isArray(doc[key]) ? doc[key] : []).entries()) {
|
|
200
|
+
if (!item || typeof item !== "object") continue;
|
|
201
|
+
const f = nested && item.finding && typeof item.finding === "object" ? item.finding : item;
|
|
202
|
+
push(f.file, Number(f.line), `${key}[${i}]`, f.quote);
|
|
170
203
|
}
|
|
171
204
|
}
|
|
172
205
|
const repoEvidence = doc?.evidence?.repoEvidence || doc?.analysisSpec?.evidence?.repoEvidence;
|
|
@@ -229,7 +262,7 @@ export function extract(raw) {
|
|
|
229
262
|
* @param {string} repo
|
|
230
263
|
* @param {string|null} rev
|
|
231
264
|
* @param {{file: string, line: number|null}} c
|
|
232
|
-
* @param {Map<string,
|
|
265
|
+
* @param {Map<string, string[]|null>} lineCache
|
|
233
266
|
* @returns {string|null} the reason it failed, or null
|
|
234
267
|
*/
|
|
235
268
|
export function resolveOne(repo, rev, c, lineCache) {
|
|
@@ -240,22 +273,53 @@ export function resolveOne(repo, rev, c, lineCache) {
|
|
|
240
273
|
lineCache.set(c.file, rev === null ? worktreeLines(repo, c.file) : revLines(repo, rev, c.file));
|
|
241
274
|
}
|
|
242
275
|
|
|
243
|
-
const
|
|
276
|
+
const content = lineCache.get(c.file);
|
|
244
277
|
const at = rev === null ? "in the working tree" : `at ${rev.slice(0, 12)}`;
|
|
245
|
-
if (
|
|
278
|
+
if (content === null) return `no such file ${at}`;
|
|
279
|
+
const lines = content.length;
|
|
246
280
|
if (c.line === null) return null;
|
|
247
281
|
if (c.line < 1) return `line ${c.line} is not a line number`;
|
|
248
282
|
if (c.line > lines) return `line ${c.line} is past the end of the file (${lines} lines)`;
|
|
283
|
+
if (c.quote !== undefined && !quoteMatches(content, c.line, c.quote)) {
|
|
284
|
+
return `quote does not match line ${c.line} ${at}`;
|
|
285
|
+
}
|
|
249
286
|
return null;
|
|
250
287
|
}
|
|
251
288
|
|
|
289
|
+
const collapse = (s) => String(s).replace(/\s+/g, " ").trim();
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Shortest quote that says what the line holds. A shorter one resolves only
|
|
293
|
+
* when it is the whole cited line: "e" is on most lines of any file.
|
|
294
|
+
*/
|
|
295
|
+
export const QUOTE_MIN = 8;
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* True when the quote, whitespace collapsed, is inside the cited line - or,
|
|
299
|
+
* for a quote spanning N lines, inside lines line..line+N-1 joined - and has
|
|
300
|
+
* at least QUOTE_MIN non-space characters or is that whole text.
|
|
301
|
+
*
|
|
302
|
+
* @param {string[]} content the file's lines
|
|
303
|
+
* @param {number} line 1-based
|
|
304
|
+
* @param {string} quote
|
|
305
|
+
* @returns {boolean}
|
|
306
|
+
*/
|
|
307
|
+
export function quoteMatches(content, line, quote) {
|
|
308
|
+
const span = String(quote).trim().split("\n").length;
|
|
309
|
+
const window = collapse(content.slice(line - 1, line - 1 + span).join("\n"));
|
|
310
|
+
const want = collapse(quote);
|
|
311
|
+
if (want === "") return true;
|
|
312
|
+
if (want.replace(/\s/g, "").length < QUOTE_MIN) return window === want;
|
|
313
|
+
return window.includes(want);
|
|
314
|
+
}
|
|
315
|
+
|
|
252
316
|
/**
|
|
253
|
-
*
|
|
317
|
+
* Lines of a blob at a commit, or null when the path is not a file there.
|
|
254
318
|
*
|
|
255
319
|
* @param {string} repo
|
|
256
320
|
* @param {string} rev
|
|
257
321
|
* @param {string} file
|
|
258
|
-
* @returns {
|
|
322
|
+
* @returns {string[]|null}
|
|
259
323
|
*/
|
|
260
324
|
function revLines(repo, rev, file) {
|
|
261
325
|
const t = spawnSync("git", ["-C", repo, "cat-file", "-t", `${rev}:${file}`], {
|
|
@@ -266,11 +330,11 @@ function revLines(repo, rev, file) {
|
|
|
266
330
|
encoding: "utf-8",
|
|
267
331
|
maxBuffer: 64 * 1024 * 1024,
|
|
268
332
|
});
|
|
269
|
-
return
|
|
333
|
+
return splitLines(show.status === 0 ? show.stdout : "");
|
|
270
334
|
}
|
|
271
335
|
|
|
272
336
|
/**
|
|
273
|
-
*
|
|
337
|
+
* Lines in the checkout, or null when there is no such file.
|
|
274
338
|
*
|
|
275
339
|
* `unsafePath` cannot see a symlink: `docs/out -> /etc` is a relative path with
|
|
276
340
|
* no `..` in it, and git never followed it because git reads blobs rather than
|
|
@@ -279,7 +343,7 @@ function revLines(repo, rev, file) {
|
|
|
279
343
|
*
|
|
280
344
|
* @param {string} repo
|
|
281
345
|
* @param {string} file
|
|
282
|
-
* @returns {
|
|
346
|
+
* @returns {string[]|null}
|
|
283
347
|
*/
|
|
284
348
|
function worktreeLines(repo, file) {
|
|
285
349
|
let real;
|
|
@@ -293,29 +357,31 @@ function worktreeLines(repo, file) {
|
|
|
293
357
|
if (real !== root && !real.startsWith(root + sep)) return null;
|
|
294
358
|
try {
|
|
295
359
|
if (!statSync(real).isFile()) return null;
|
|
296
|
-
return
|
|
360
|
+
return splitLines(readFileSync(real, "utf-8"));
|
|
297
361
|
} catch {
|
|
298
362
|
return null;
|
|
299
363
|
}
|
|
300
364
|
}
|
|
301
365
|
|
|
302
366
|
/**
|
|
303
|
-
* A file with no trailing newline still has its last line.
|
|
367
|
+
* A file's lines. A file with no trailing newline still has its last line.
|
|
304
368
|
*
|
|
305
369
|
* @param {string} text
|
|
306
|
-
* @returns {
|
|
370
|
+
* @returns {string[]}
|
|
307
371
|
*/
|
|
308
|
-
function
|
|
309
|
-
if (text.length === 0) return
|
|
310
|
-
|
|
372
|
+
function splitLines(text) {
|
|
373
|
+
if (text.length === 0) return [];
|
|
374
|
+
const lines = text.split("\n");
|
|
375
|
+
if (text.endsWith("\n")) lines.pop();
|
|
376
|
+
return lines;
|
|
311
377
|
}
|
|
312
378
|
|
|
313
379
|
/**
|
|
314
380
|
* @param {object} params
|
|
315
381
|
* @returns {{checked: number, unresolved: object[], rev: string}}
|
|
316
382
|
*/
|
|
317
|
-
export function verify({ raw, repo, rev }) {
|
|
318
|
-
const citations = extract(raw);
|
|
383
|
+
export function verify({ raw, repo, rev, gated = true }) {
|
|
384
|
+
const citations = extract(raw, { nested: gated, quotes: gated });
|
|
319
385
|
const lineCache = new Map();
|
|
320
386
|
const unresolved = [];
|
|
321
387
|
for (const c of citations) {
|
|
@@ -325,7 +391,7 @@ export function verify({ raw, repo, rev }) {
|
|
|
325
391
|
return { checked: citations.length, unresolved, rev };
|
|
326
392
|
}
|
|
327
393
|
|
|
328
|
-
const VALUE_FLAGS = new Set(["--repo", "--rev"]);
|
|
394
|
+
const VALUE_FLAGS = new Set(["--repo", "--rev", "--state", "--base"]);
|
|
329
395
|
|
|
330
396
|
/**
|
|
331
397
|
* One pass, positionally. `argv.indexOf(a)` finds the FIRST occurrence of a
|
|
@@ -333,30 +399,27 @@ const VALUE_FLAGS = new Set(["--repo", "--rev"]);
|
|
|
333
399
|
* target; walking the list is both simpler and correct.
|
|
334
400
|
*
|
|
335
401
|
* @param {string[]} argv
|
|
336
|
-
* @returns {{target: string|null, repo: string|null, rev: string|null}}
|
|
402
|
+
* @returns {{target: string|null, repo: string|null, rev: string|null, state: string|null, base: string|null}}
|
|
337
403
|
*/
|
|
338
404
|
export function parseArgs(argv) {
|
|
339
|
-
|
|
340
|
-
let repo = null;
|
|
341
|
-
let rev = null;
|
|
405
|
+
const v = { target: null, repo: null, rev: null, state: null, base: null };
|
|
342
406
|
for (let i = 0; i < argv.length; i++) {
|
|
343
407
|
const a = argv[i];
|
|
344
408
|
if (VALUE_FLAGS.has(a)) {
|
|
345
|
-
const
|
|
346
|
-
if (
|
|
347
|
-
|
|
348
|
-
else rev = v;
|
|
409
|
+
const next = argv[i + 1];
|
|
410
|
+
if (next !== undefined && !next.startsWith("--")) {
|
|
411
|
+
v[a.slice(2)] = next;
|
|
349
412
|
i++;
|
|
350
413
|
}
|
|
351
414
|
continue;
|
|
352
415
|
}
|
|
353
416
|
if (a.startsWith("--")) continue;
|
|
354
|
-
if (target === null) target = a;
|
|
417
|
+
if (v.target === null) v.target = a;
|
|
355
418
|
}
|
|
356
|
-
return
|
|
419
|
+
return v;
|
|
357
420
|
}
|
|
358
421
|
|
|
359
|
-
function main() {
|
|
422
|
+
async function main() {
|
|
360
423
|
const argv = process.argv.slice(2);
|
|
361
424
|
const parsed = parseArgs(argv);
|
|
362
425
|
const target = parsed.target;
|
|
@@ -400,9 +463,51 @@ function main() {
|
|
|
400
463
|
sha = head.stdout.trim();
|
|
401
464
|
}
|
|
402
465
|
|
|
403
|
-
const
|
|
466
|
+
const ctx = gateContext({ statePath: parsed.state, repo });
|
|
467
|
+
const report = verify({ raw, repo, rev: sha, gated: ctx.active });
|
|
404
468
|
const where = sha === null ? "in the working tree" : `at ${sha.slice(0, 12)}`;
|
|
405
469
|
|
|
470
|
+
if (ctx.active) {
|
|
471
|
+
let doc;
|
|
472
|
+
try {
|
|
473
|
+
doc = JSON.parse(raw);
|
|
474
|
+
} catch {
|
|
475
|
+
doc = null;
|
|
476
|
+
}
|
|
477
|
+
if (parsed.state && ctx.state === null) {
|
|
478
|
+
console.error(`verify-citations: cannot read ${parsed.state}`);
|
|
479
|
+
process.exit(2);
|
|
480
|
+
}
|
|
481
|
+
if (doc && typeof doc === "object") {
|
|
482
|
+
const base = resolveBase(repo, ctx.state, parsed.base);
|
|
483
|
+
report.preExisting = checkPreExisting({
|
|
484
|
+
doc,
|
|
485
|
+
repo,
|
|
486
|
+
rev: sha,
|
|
487
|
+
state: ctx.state,
|
|
488
|
+
base,
|
|
489
|
+
stateDir: ctx.statePath ? dirname(ctx.statePath) : null,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
const preRejected = report.preExisting?.rejected.length ?? 0;
|
|
494
|
+
const failed = report.unresolved.length > 0 || preRejected > 0;
|
|
495
|
+
if (ctx.active) {
|
|
496
|
+
const nothing = report.checked === 0 && (report.preExisting?.claims ?? 0) === 0;
|
|
497
|
+
await recordQuietly(
|
|
498
|
+
"verify-citations",
|
|
499
|
+
failed ? "fail" : nothing ? "not-applicable" : "pass",
|
|
500
|
+
{
|
|
501
|
+
input: target === "-" ? "stdin" : target,
|
|
502
|
+
checked: report.checked,
|
|
503
|
+
unresolved: report.unresolved.length,
|
|
504
|
+
preExistingClaims: report.preExisting?.claims ?? 0,
|
|
505
|
+
preExistingRejected: preRejected,
|
|
506
|
+
},
|
|
507
|
+
{ repo, statePath: ctx.statePath },
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
|
|
406
511
|
if (json) {
|
|
407
512
|
console.log(JSON.stringify(report, null, 2));
|
|
408
513
|
} else if (!quiet) {
|
|
@@ -420,9 +525,17 @@ function main() {
|
|
|
420
525
|
// is the moment someone is deciding what to do about it.
|
|
421
526
|
console.log(" Re-search and correct the citation; never drop the line number to pass.");
|
|
422
527
|
}
|
|
528
|
+
if (preRejected > 0) {
|
|
529
|
+
console.log(
|
|
530
|
+
`verify-citations: ${preRejected} pre-existing claim(s) not backed by the base commit:`,
|
|
531
|
+
);
|
|
532
|
+
for (const r of report.preExisting.rejected) {
|
|
533
|
+
console.log(` ${r.where}: ${r.file}${r.line ? `:${r.line}` : ""} - ${r.reason}`);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
423
536
|
}
|
|
424
537
|
|
|
425
|
-
process.exit(
|
|
538
|
+
process.exit(failed ? 1 : 0);
|
|
426
539
|
}
|
|
427
540
|
|
|
428
541
|
if (invokedDirectly(import.meta.url)) {
|
|
@@ -43,8 +43,54 @@ import { homedir } from "node:os";
|
|
|
43
43
|
import { dirname, join, relative } from "node:path";
|
|
44
44
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
45
45
|
import { runMain } from "../lib/fatal.mjs";
|
|
46
|
+
import { messages, outputLanguage } from "../lib/user-facing.mjs";
|
|
46
47
|
|
|
47
48
|
const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
49
|
+
|
|
50
|
+
// The human report renders in `prefs.global.outputLanguage`; `--json` is
|
|
51
|
+
// untouched, because that half is parsed rather than read. Both languages sit
|
|
52
|
+
// on one key so a wording change cannot land on only one of them.
|
|
53
|
+
const REPORT = {
|
|
54
|
+
en: {
|
|
55
|
+
pkg: (version, commit, files, signature) =>
|
|
56
|
+
`package: ${version} (${commit}) - ${files} files, signature: ${signature}`,
|
|
57
|
+
unknownCommit: "commit unknown",
|
|
58
|
+
pkgClean: " every file is as published",
|
|
59
|
+
changed: (f) => ` ! changed: ${f}`,
|
|
60
|
+
missing: (f) => ` ! missing: ${f}`,
|
|
61
|
+
more: (n) => ` ... and ${n} more files`,
|
|
62
|
+
installAbsent: (reason) => `install: ${reason}`,
|
|
63
|
+
installHeader: (trees, files) => `install: ~/.claude - ${trees} trees, ${files} files compared`,
|
|
64
|
+
presenceOnly: " (presence only: descriptions are translated at install time)",
|
|
65
|
+
treeDrift: (tree, changed, missing, how) =>
|
|
66
|
+
` ${tree}: ${changed} differ, ${missing} missing${how}`,
|
|
67
|
+
neverWritten: (f) => ` ? ${f} (never written)`,
|
|
68
|
+
installClean: " byte for byte with the source",
|
|
69
|
+
otherHosts: (hosts) =>
|
|
70
|
+
` ${hosts} installed - their paths are rewritten at install time, so no byte comparison was made`,
|
|
71
|
+
},
|
|
72
|
+
tr: {
|
|
73
|
+
pkg: (version, commit, files, signature) =>
|
|
74
|
+
`paket: ${version} (${commit}) - ${files} dosya, imza: ${signature}`,
|
|
75
|
+
unknownCommit: "commit bilinmiyor",
|
|
76
|
+
pkgClean: " butun dosyalar yayinlandigi gibi",
|
|
77
|
+
changed: (f) => ` ! degismis: ${f}`,
|
|
78
|
+
missing: (f) => ` ! eksik: ${f}`,
|
|
79
|
+
more: (n) => ` ... ve ${n} dosya daha`,
|
|
80
|
+
installAbsent: (reason) => `kurulum: ${reason}`,
|
|
81
|
+
installHeader: (trees, files) =>
|
|
82
|
+
`kurulum: ~/.claude - ${trees} agac, ${files} dosya karsilastirildi`,
|
|
83
|
+
presenceOnly: " (yalnizca varlik: aciklamalar kurulumda cevriliyor)",
|
|
84
|
+
treeDrift: (tree, changed, missing, how) =>
|
|
85
|
+
` ${tree}: ${changed} farkli, ${missing} eksik${how}`,
|
|
86
|
+
neverWritten: (f) => ` ? ${f} (hic yazilmamis)`,
|
|
87
|
+
installClean: " kaynakla birebir ayni",
|
|
88
|
+
otherHosts: (hosts) =>
|
|
89
|
+
` ${hosts} kurulu - yollari kurulumda yeniden yazildigi icin bayt karsilastirmasi yapilmadi`,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const say = messages(REPORT, outputLanguage());
|
|
48
94
|
const MANIFEST = join(ROOT, "manifest.json");
|
|
49
95
|
|
|
50
96
|
const argv = process.argv.slice(2);
|
|
@@ -255,44 +301,38 @@ async function main() {
|
|
|
255
301
|
} else {
|
|
256
302
|
if (pkg) {
|
|
257
303
|
process.stdout.write(
|
|
258
|
-
|
|
304
|
+
`${say.pkg(pkg.version, pkg.commit?.slice(0, 12) ?? say.unknownCommit, pkg.fileCount, pkg.signature)}\n`,
|
|
259
305
|
);
|
|
260
|
-
if (!pkg.changed.length && !pkg.missing.length)
|
|
261
|
-
process.stdout.write(" butun dosyalar yayinlandigi gibi\n");
|
|
306
|
+
if (!pkg.changed.length && !pkg.missing.length) process.stdout.write(`${say.pkgClean}\n`);
|
|
262
307
|
const SHOWN = 20;
|
|
263
|
-
for (const f of pkg.changed.slice(0, SHOWN)) process.stdout.write(
|
|
264
|
-
for (const f of pkg.missing.slice(0, SHOWN)) process.stdout.write(
|
|
308
|
+
for (const f of pkg.changed.slice(0, SHOWN)) process.stdout.write(`${say.changed(f)}\n`);
|
|
309
|
+
for (const f of pkg.missing.slice(0, SHOWN)) process.stdout.write(`${say.missing(f)}\n`);
|
|
265
310
|
// Counted per list against what was actually PRINTED. Subtracting a flat
|
|
266
311
|
// 40 from the combined total spent a budget the lists had not used: with
|
|
267
312
|
// 25 changed and 0 missing it printed 20, hid 5, and said nothing - a
|
|
268
313
|
// tampered install under-reported by up to twenty files with no sign.
|
|
269
314
|
const hidden =
|
|
270
315
|
Math.max(0, pkg.changed.length - SHOWN) + Math.max(0, pkg.missing.length - SHOWN);
|
|
271
|
-
if (hidden > 0) process.stdout.write(
|
|
316
|
+
if (hidden > 0) process.stdout.write(`${say.more(hidden)}\n`);
|
|
272
317
|
}
|
|
273
318
|
if (inst) {
|
|
274
|
-
if (!inst.present) process.stdout.write(
|
|
319
|
+
if (!inst.present) process.stdout.write(`${say.installAbsent(inst.reason)}\n`);
|
|
275
320
|
else {
|
|
276
321
|
const total = inst.trees.reduce((a, t) => a + t.files, 0);
|
|
277
|
-
process.stdout.write(
|
|
278
|
-
`kurulum: ~/.claude - ${inst.trees.length} agac, ${total} dosya karsilastirildi\n`,
|
|
279
|
-
);
|
|
322
|
+
process.stdout.write(`${say.installHeader(inst.trees.length, total)}\n`);
|
|
280
323
|
for (const t of inst.trees) {
|
|
281
324
|
if (!t.changed.length && !t.missing.length) continue;
|
|
282
|
-
const how =
|
|
283
|
-
t.mode === "presence" ? " (yalnizca varlik: aciklamalar kurulumda cevriliyor)" : "";
|
|
325
|
+
const how = t.mode === "presence" ? say.presenceOnly : "";
|
|
284
326
|
process.stdout.write(
|
|
285
|
-
|
|
327
|
+
`${say.treeDrift(t.tree, t.changed.length, t.missing.length, how)}\n`,
|
|
286
328
|
);
|
|
287
329
|
for (const f of [...t.changed.slice(0, 5)]) process.stdout.write(` ! ${f}\n`);
|
|
288
330
|
for (const f of [...t.missing.slice(0, 5)])
|
|
289
|
-
process.stdout.write(
|
|
331
|
+
process.stdout.write(`${say.neverWritten(f)}\n`);
|
|
290
332
|
}
|
|
291
|
-
if (inst.ok) process.stdout.write(
|
|
333
|
+
if (inst.ok) process.stdout.write(`${say.installClean}\n`);
|
|
292
334
|
if (inst.otherHosts.length)
|
|
293
|
-
process.stdout.write(
|
|
294
|
-
` ${inst.otherHosts.join(", ")} kurulu - yollari kurulumda yeniden yazildigi icin bayt karsilastirmasi yapilmadi\n`,
|
|
295
|
-
);
|
|
335
|
+
process.stdout.write(`${say.otherHosts(inst.otherHosts.join(", "))}\n`);
|
|
296
336
|
}
|
|
297
337
|
}
|
|
298
338
|
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# worktree-prepare.sh - create (or re-enter) one task worktree, healed and
|
|
4
|
+
# excluded. Phase 0 Step 6b calls it once per repo; worktree-finalize.sh is its
|
|
5
|
+
# counterpart at the other end of the run.
|
|
6
|
+
#
|
|
7
|
+
# In order, for one repo:
|
|
8
|
+
# 1. heal stale admin state: a stale lock on the path is cleared and
|
|
9
|
+
# `worktree prune` drops entries whose directory is gone. A run killed
|
|
10
|
+
# mid-add leaves one behind, and the retry then fails with "already exists".
|
|
11
|
+
# 2. the residue guard: lib/repo-hygiene.sh keeps .worktrees/, .pipeline/ and
|
|
12
|
+
# the loose logs out of the index through the clone-local exclude file.
|
|
13
|
+
# 3. a path still registered and readable after the heal is entered and
|
|
14
|
+
# fast-forwarded, not re-added; paths are compared physically, so a path
|
|
15
|
+
# named through a symlink still matches its registration. Otherwise the
|
|
16
|
+
# worktree is added on <branch> when that branch already exists (a
|
|
17
|
+
# re-entered task keeps its commits), else `worktree add -b <branch>
|
|
18
|
+
# origin/<base>`.
|
|
19
|
+
# 4. the identity, when given, is set on the worktree.
|
|
20
|
+
#
|
|
21
|
+
# One simple command per repo, so an unattended run can take this step under
|
|
22
|
+
# the guard, which refuses shell control flow.
|
|
23
|
+
#
|
|
24
|
+
# Usage:
|
|
25
|
+
# worktree-prepare.sh --project <repo-root> --path <worktree> --branch <name>
|
|
26
|
+
# --base <base-branch> [--name <git user.name>]
|
|
27
|
+
# [--email <git user.email>]
|
|
28
|
+
#
|
|
29
|
+
# Output (stdout, JSON): {project, worktreePath, branch, baseBranch,
|
|
30
|
+
# action: created|reused|failed, pulled: true|false|null, error}
|
|
31
|
+
#
|
|
32
|
+
# Exit: 0 ready, 1 the add failed (nothing was created; the caller runs its
|
|
33
|
+
# rollback / collision flow), 2 usage.
|
|
34
|
+
set -uo pipefail
|
|
35
|
+
|
|
36
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
37
|
+
PROJECT=""; WT=""; BRANCH=""; BASE=""; NAME=""; EMAIL=""
|
|
38
|
+
|
|
39
|
+
usage() {
|
|
40
|
+
echo "usage: worktree-prepare.sh --project <repo-root> --path <worktree> --branch <name> --base <base-branch> [--name <n>] [--email <e>]" >&2
|
|
41
|
+
exit 2
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
while [ "$#" -gt 0 ]; do
|
|
45
|
+
case "$1" in
|
|
46
|
+
--project) [ "$#" -ge 2 ] || usage; PROJECT="$2"; shift 2 ;;
|
|
47
|
+
--path) [ "$#" -ge 2 ] || usage; WT="$2"; shift 2 ;;
|
|
48
|
+
--branch) [ "$#" -ge 2 ] || usage; BRANCH="$2"; shift 2 ;;
|
|
49
|
+
--base) [ "$#" -ge 2 ] || usage; BASE="$2"; shift 2 ;;
|
|
50
|
+
--name) [ "$#" -ge 2 ] || usage; NAME="$2"; shift 2 ;;
|
|
51
|
+
--email) [ "$#" -ge 2 ] || usage; EMAIL="$2"; shift 2 ;;
|
|
52
|
+
*) usage ;;
|
|
53
|
+
esac
|
|
54
|
+
done
|
|
55
|
+
[ -n "$PROJECT" ] && [ -n "$WT" ] && [ -n "$BRANCH" ] && [ -n "$BASE" ] || usage
|
|
56
|
+
command -v jq >/dev/null 2>&1 || { echo "worktree-prepare: jq is required" >&2; exit 2; }
|
|
57
|
+
git -C "$PROJECT" rev-parse --git-dir >/dev/null 2>&1 || {
|
|
58
|
+
echo "worktree-prepare: not a git repository: $PROJECT" >&2
|
|
59
|
+
exit 2
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
report() { # $1 action, $2 pulled (true|false|null), $3 error
|
|
63
|
+
jq -n --arg project "$PROJECT" --arg wt "$WT" --arg branch "$BRANCH" --arg base "$BASE" \
|
|
64
|
+
--arg action "$1" --argjson pulled "$2" --arg error "$3" \
|
|
65
|
+
'{project: $project, worktreePath: $wt, branch: $branch, baseBranch: $base,
|
|
66
|
+
action: $action, pulled: $pulled, error: (if $error == "" then null else $error end)}'
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
# Physical path of $1, for comparing paths that may go through a symlink.
|
|
70
|
+
# A path that does not exist yet resolves through its nearest existing parent.
|
|
71
|
+
canonical() {
|
|
72
|
+
local p="${1%/}" tail=""
|
|
73
|
+
[ -n "$p" ] || p="/"
|
|
74
|
+
while [ ! -d "$p" ]; do
|
|
75
|
+
tail="/$(basename "$p")$tail"
|
|
76
|
+
p=$(dirname "$p")
|
|
77
|
+
done
|
|
78
|
+
printf '%s%s\n' "$(cd -P "$p" 2>/dev/null && pwd -P)" "$tail"
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
registered() {
|
|
82
|
+
local want line
|
|
83
|
+
want=$(canonical "$WT")
|
|
84
|
+
while IFS= read -r line; do
|
|
85
|
+
case "$line" in
|
|
86
|
+
"worktree "*) [ "$(canonical "${line#worktree }")" = "$want" ] && return 0 ;;
|
|
87
|
+
esac
|
|
88
|
+
done < <(git -C "$PROJECT" worktree list --porcelain 2>/dev/null)
|
|
89
|
+
return 1
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
# Unlock before pruning: prune skips a locked entry, so a lock left by a killed
|
|
93
|
+
# add would otherwise keep a missing directory registered.
|
|
94
|
+
if registered; then
|
|
95
|
+
git -C "$PROJECT" worktree unlock "$WT" 2>/dev/null || true
|
|
96
|
+
fi
|
|
97
|
+
git -C "$PROJECT" worktree prune 2>/dev/null || true
|
|
98
|
+
|
|
99
|
+
HYGIENE="$HERE/../lib/repo-hygiene.sh"
|
|
100
|
+
[ -f "$HYGIENE" ] && bash "$HYGIENE" ensure "$PROJECT"
|
|
101
|
+
|
|
102
|
+
set_identity() {
|
|
103
|
+
[ -n "$NAME" ] && git -C "$WT" config user.name "$NAME"
|
|
104
|
+
[ -n "$EMAIL" ] && git -C "$WT" config user.email "$EMAIL"
|
|
105
|
+
return 0
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if registered && git -C "$WT" rev-parse --git-dir >/dev/null 2>&1; then
|
|
109
|
+
pulled=false
|
|
110
|
+
git -C "$WT" pull --ff-only -q >/dev/null 2>&1 && pulled=true
|
|
111
|
+
set_identity
|
|
112
|
+
report reused "$pulled" ""
|
|
113
|
+
exit 0
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
if git -C "$PROJECT" show-ref --verify --quiet "refs/heads/$BRANCH"; then
|
|
117
|
+
add_args=("$WT" "$BRANCH")
|
|
118
|
+
else
|
|
119
|
+
add_args=("$WT" -b "$BRANCH" "origin/$BASE")
|
|
120
|
+
fi
|
|
121
|
+
if ! err=$(git -C "$PROJECT" worktree add -q "${add_args[@]}" 2>&1); then
|
|
122
|
+
report failed null "$err"
|
|
123
|
+
exit 1
|
|
124
|
+
fi
|
|
125
|
+
set_identity
|
|
126
|
+
report created null ""
|