@mmerterden/multi-agent-pipeline 20.2.0 → 20.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +923 -1
- package/README.md +104 -81
- package/README.tr.md +103 -62
- package/docs/FIGMA_PIPELINE.md +35 -35
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
- package/docs/architecture.md +50 -14
- package/docs/best-practices.md +1 -1
- package/docs/ecosystem.md +56 -32
- package/docs/facts.json +10 -10
- package/docs/features.md +97 -5
- package/docs/recovery-guide.md +7 -14
- package/docs/server-readiness.md +31 -24
- package/index.js +1 -1
- package/install/_common.mjs +3 -5
- package/install/_platform-filter.mjs +23 -1
- package/install/_unattended-profile.mjs +321 -75
- package/install/claude.mjs +51 -10
- package/install/codex.mjs +2 -0
- package/install/copilot.mjs +2 -0
- package/install/index.mjs +30 -17
- package/install/templates/claude-hooks.json +16 -5
- package/install/templates/copilot-instructions.md +1 -1
- package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
- package/install/templates/multi-agent-autopilot.plist.template +12 -5
- package/install/unattended-profile-legacy.json +80 -0
- package/manifest.json +616 -483
- package/package.json +8 -3
- package/pipeline/agents/code-reviewer.md +10 -0
- package/pipeline/agents/plan-critic.md +98 -0
- package/pipeline/agents/security-auditor.md +10 -0
- package/pipeline/agents/task-clarifier.md +10 -0
- package/pipeline/commands/multi-agent/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
- package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
- package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
- package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
- package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
- package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
- package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
- package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
- package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
- package/pipeline/contract/CHANGELOG.md +74 -0
- package/pipeline/contract/README.md +126 -0
- package/pipeline/contract/build.mjs +427 -0
- package/pipeline/contract/fixtures/answer-result.json +11 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
- package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
- package/pipeline/contract/fixtures/error-unsigned.json +5 -0
- package/pipeline/contract/fixtures/issues-empty.json +18 -0
- package/pipeline/contract/fixtures/launch-plan.json +31 -0
- package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
- package/pipeline/contract/fixtures/runs-empty.json +6 -0
- package/pipeline/contract/fixtures/runs-failed.json +84 -0
- package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
- package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
- package/pipeline/contract/fixtures/runs-running.json +84 -0
- package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
- package/pipeline/contract/frozen/toolbox.json +107 -0
- package/pipeline/contract/manifest.json +263 -0
- package/pipeline/contract/types/index.d.ts +343 -0
- package/pipeline/lib/_jira-auth.sh +6 -2
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/autopilot-state.sh +19 -0
- package/pipeline/lib/context-link-extractor.sh +12 -5
- package/pipeline/lib/credential-inventory.sh +12 -5
- package/pipeline/lib/credential-store.sh +116 -185
- package/pipeline/lib/fetch-confluence.sh +44 -3
- package/pipeline/lib/fetch-document.sh +3 -4
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/figma-mcp-refresh.sh +2 -2
- package/pipeline/lib/figma-token.sh +5 -1
- package/pipeline/lib/issue-fetcher.sh +233 -16
- package/pipeline/lib/json-file-lock.mjs +172 -0
- package/pipeline/lib/model-dispatch.sh +21 -12
- package/pipeline/lib/model-rung.sh +6 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/outbound-gate.mjs +46 -16
- package/pipeline/lib/parse-complaints.sh +14 -7
- package/pipeline/lib/plan-todos.sh +3 -3
- package/pipeline/lib/post-pr-review.sh +9 -9
- package/pipeline/lib/pr-request-location.mjs +85 -0
- package/pipeline/lib/regular-file.mjs +153 -0
- package/pipeline/lib/repo-hygiene.sh +17 -0
- package/pipeline/lib/route-state.sh +5 -1
- package/pipeline/lib/run-paths.sh +3 -2
- package/pipeline/lib/stack-detect.sh +19 -1
- package/pipeline/lib/unattended-profile-check.mjs +178 -0
- package/pipeline/lib/unattended-settings-location.mjs +28 -0
- package/pipeline/lib/unattended.mjs +76 -0
- package/pipeline/lib/unattended.sh +32 -0
- package/pipeline/lib/untrusted.mjs +76 -0
- package/pipeline/lib/user-facing.mjs +82 -0
- package/pipeline/lib/user-facing.sh +58 -0
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
- package/pipeline/multi-agent-refs/analysis/render.md +4 -3
- package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
- package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
- package/pipeline/multi-agent-refs/analysis-template.md +10 -17
- package/pipeline/multi-agent-refs/channels/jira.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
- package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
- package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
- package/pipeline/multi-agent-refs/features/constitution.md +196 -0
- package/pipeline/multi-agent-refs/features/doctor.md +6 -3
- package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
- package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
- package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
- package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
- package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
- package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
- package/pipeline/multi-agent-refs/features/research.md +150 -0
- package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
- package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
- package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
- package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
- package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
- package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
- package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
- package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -31
- package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
- package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
- package/pipeline/multi-agent-refs/keychain.md +6 -11
- package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
- package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
- package/pipeline/multi-agent-refs/phases/modes.md +10 -12
- package/pipeline/multi-agent-refs/phases/operations.md +11 -5
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
- package/pipeline/multi-agent-refs/phases.md +1 -1
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/progress-contract.md +13 -16
- package/pipeline/multi-agent-refs/readiness-review.md +1 -1
- package/pipeline/multi-agent-refs/research/engine.md +91 -0
- package/pipeline/multi-agent-refs/rules.md +6 -4
- package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
- package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
- package/pipeline/rules/figma-pipeline.md +12 -12
- package/pipeline/schemas/agent-state.schema.json +480 -18
- package/pipeline/schemas/analysis-spec.schema.json +4 -4
- package/pipeline/schemas/answer-request.schema.json +24 -0
- package/pipeline/schemas/answer-result.schema.json +28 -0
- package/pipeline/schemas/autopilot-config.schema.json +111 -13
- package/pipeline/schemas/command-parameters.schema.json +99 -0
- package/pipeline/schemas/constitution.schema.json +56 -0
- package/pipeline/schemas/contract-error.schema.json +52 -0
- package/pipeline/schemas/design-check-config.schema.json +5 -1
- package/pipeline/schemas/issues.schema.json +61 -0
- package/pipeline/schemas/launch-plan.schema.json +46 -0
- package/pipeline/schemas/launch-request.schema.json +45 -0
- package/pipeline/schemas/launch.json +61 -0
- package/pipeline/schemas/launch.schema.json +84 -0
- package/pipeline/schemas/phases.json +2 -2
- package/pipeline/schemas/phases.schema.json +68 -0
- package/pipeline/schemas/phone-devices.schema.json +61 -0
- package/pipeline/schemas/phone-signed-request.schema.json +67 -0
- package/pipeline/schemas/plan-critique.schema.json +99 -0
- package/pipeline/schemas/plan-todos.schema.json +7 -7
- package/pipeline/schemas/planning-output.schema.json +5 -0
- package/pipeline/schemas/pr-request.schema.json +46 -0
- package/pipeline/schemas/prefs.schema.json +82 -7
- package/pipeline/schemas/research-output.schema.json +118 -0
- package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
- package/pipeline/schemas/reviewer-output.schema.json +40 -4
- package/pipeline/schemas/run-questions.json +392 -0
- package/pipeline/schemas/run-questions.schema.json +118 -0
- package/pipeline/schemas/runs-index.schema.json +189 -0
- package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
- package/pipeline/schemas/secret-patterns.schema.json +28 -0
- package/pipeline/schemas/stack-adapters.json +527 -0
- package/pipeline/schemas/stack-adapters.schema.json +184 -0
- package/pipeline/schemas/token-budget.json +1 -1
- package/pipeline/schemas/token-budget.schema.json +26 -0
- package/pipeline/schemas/triage-output.schema.json +64 -3
- package/pipeline/schemas/unattended-policy.json +139 -0
- package/pipeline/schemas/unattended-policy.schema.json +73 -0
- package/pipeline/schemas/unattended-profile.json +248 -0
- package/pipeline/schemas/unattended-profile.schema.json +198 -0
- package/pipeline/schemas/worktrees.schema.json +51 -0
- package/pipeline/scripts/README.md +1 -0
- package/pipeline/scripts/_autopilot-config.mjs +130 -0
- package/pipeline/scripts/_autopilot-ops.mjs +567 -0
- package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
- package/pipeline/scripts/_command-contract.mjs +384 -0
- package/pipeline/scripts/_cost.mjs +40 -0
- package/pipeline/scripts/_notices.mjs +160 -0
- package/pipeline/scripts/_phone-auth.mjs +485 -0
- package/pipeline/scripts/_pre-existing.mjs +294 -0
- package/pipeline/scripts/_redact.mjs +77 -0
- package/pipeline/scripts/_run-paths.mjs +4 -2
- package/pipeline/scripts/_stack-adapter.mjs +678 -0
- package/pipeline/scripts/_stack-routing.mjs +1 -1
- package/pipeline/scripts/agent-guard.py +348 -37
- package/pipeline/scripts/agent-guard.sh +41 -13
- package/pipeline/scripts/analysis-story-tree.mjs +79 -3
- package/pipeline/scripts/answer-question.mjs +181 -0
- package/pipeline/scripts/audit-log-rotate.sh +1 -4
- package/pipeline/scripts/audit-log.sh +4 -4
- package/pipeline/scripts/autopilot-arming.mjs +389 -21
- package/pipeline/scripts/autopilot-awake.mjs +255 -0
- package/pipeline/scripts/autopilot-intake.mjs +137 -36
- package/pipeline/scripts/autopilot-menubar.swift +156 -44
- package/pipeline/scripts/autopilot-publish.mjs +1625 -0
- package/pipeline/scripts/autopilot-runner.mjs +1678 -222
- package/pipeline/scripts/autopilot-status.sh +198 -33
- package/pipeline/scripts/build-lock.sh +120 -0
- package/pipeline/scripts/build-references.mjs +4 -1
- package/pipeline/scripts/build-stack-plugins.mjs +59 -22
- package/pipeline/scripts/capture-flush.sh +1 -1
- package/pipeline/scripts/capture-resume.sh +13 -9
- package/pipeline/scripts/check-derived-drift.mjs +52 -11
- package/pipeline/scripts/commands.mjs +88 -0
- package/pipeline/scripts/constitution.mjs +362 -0
- package/pipeline/scripts/contract-server.mjs +776 -0
- package/pipeline/scripts/cost-analyze.mjs +89 -39
- package/pipeline/scripts/diff-explain.mjs +12 -1
- package/pipeline/scripts/doctor.mjs +77 -28
- package/pipeline/scripts/evidence-gate.mjs +192 -12
- package/pipeline/scripts/feedback-send.mjs +4 -2
- package/pipeline/scripts/gate-ledger.mjs +449 -0
- package/pipeline/scripts/gc-abandoned.sh +132 -13
- package/pipeline/scripts/gen-facts.mjs +31 -15
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/github-ssh-setup.sh +140 -29
- package/pipeline/scripts/graph-mermaid.mjs +4 -1
- package/pipeline/scripts/issues.mjs +236 -0
- package/pipeline/scripts/jira-attach.sh +6 -2
- package/pipeline/scripts/jira-search.sh +4 -3
- package/pipeline/scripts/keychain-save.sh +125 -24
- package/pipeline/scripts/keychain.py +63 -93
- package/pipeline/scripts/launch-request.mjs +747 -0
- package/pipeline/scripts/localize-commands.mjs +4 -10
- package/pipeline/scripts/log-metric.sh +6 -5
- package/pipeline/scripts/maturity-followup.mjs +13 -4
- package/pipeline/scripts/memory-save.sh +25 -0
- package/pipeline/scripts/migrate-prefs.mjs +4 -3
- package/pipeline/scripts/open-questions-gate.mjs +276 -0
- package/pipeline/scripts/phase-tracker.sh +41 -27
- package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
- package/pipeline/scripts/phone-devices.mjs +224 -0
- package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
- package/pipeline/scripts/plan-critique-gate.mjs +591 -0
- package/pipeline/scripts/pr-request.mjs +188 -0
- package/pipeline/scripts/pre-commit-check.sh +115 -4
- package/pipeline/scripts/probe-evidence-capability.sh +44 -5
- package/pipeline/scripts/record-phase.mjs +71 -0
- package/pipeline/scripts/render-agent-log-cost.sh +17 -2
- package/pipeline/scripts/render-cost-summary.sh +1 -1
- package/pipeline/scripts/render-work-summary.sh +1 -1
- package/pipeline/scripts/require-supported-version.sh +4 -1
- package/pipeline/scripts/research-gate.mjs +704 -0
- package/pipeline/scripts/review-decision-gate.mjs +403 -0
- package/pipeline/scripts/routine-registry.mjs +5 -2
- package/pipeline/scripts/runs-index.mjs +135 -27
- package/pipeline/scripts/scaffold-gate.mjs +393 -0
- package/pipeline/scripts/skill-conformance.mjs +25 -8
- package/pipeline/scripts/skill-siblings.mjs +2 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
- package/pipeline/scripts/smoke-schema-validation.sh +6 -2
- package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
- package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
- package/pipeline/scripts/test-gap-scan.mjs +40 -2
- package/pipeline/scripts/test-integrity-gate.mjs +20 -4
- package/pipeline/scripts/test-strength.mjs +484 -0
- package/pipeline/scripts/test-summary.mjs +651 -0
- package/pipeline/scripts/triage-memory.mjs +49 -9
- package/pipeline/scripts/unattended_policy.py +2786 -0
- package/pipeline/scripts/uninstall.mjs +10 -10
- package/pipeline/scripts/update-issue-progress.sh +1 -1
- package/pipeline/scripts/usage-identity.mjs +288 -0
- package/pipeline/scripts/usage-register.mjs +185 -63
- package/pipeline/scripts/usage-report.mjs +230 -66
- package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
- package/pipeline/scripts/validate-planning.mjs +6 -0
- package/pipeline/scripts/verify-citations.mjs +151 -38
- package/pipeline/scripts/verify.mjs +58 -18
- package/pipeline/scripts/worktree-prepare.sh +126 -0
- package/pipeline/scripts/worktrees.mjs +124 -0
- package/pipeline/scripts/write-state.mjs +48 -17
- package/pipeline/skills/.skill-manifest.json +222 -226
- package/pipeline/skills/.skills-index.json +77 -88
- package/pipeline/skills/shared/README.md +44 -45
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
- package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
- package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
- package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
- package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
- package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
- package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
- package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
- package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
- package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
- package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
- package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
- package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
- package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
- package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
- package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
- package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
- package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
- package/pipeline/skills/shared/external/council/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
- package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
- package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
- package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
- package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
- package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
- package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
- package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
- package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
- package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
- package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
- package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
- package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
- package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
- package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
- package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
- package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
- package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
- package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
- package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
- package/pipeline/skills/skills-index.md +40 -41
- package/docs/token-budget-history.md +0 -24
- package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
- package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
- package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
- package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
- package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* usage-report.mjs - optional, opt-in per-run operational reporting.
|
|
3
3
|
*
|
|
4
|
-
* Off by default; a no-op unless prefs.global.usageLog.enabled is true
|
|
5
|
-
* token resolves
|
|
6
|
-
*
|
|
4
|
+
* Off by default; a no-op unless prefs.global.usageLog.enabled is true, a
|
|
5
|
+
* token resolves, and a logged-in GitHub account can read the pipeline
|
|
6
|
+
* repository (usage-identity.mjs). Emits one compact run record keyed by run
|
|
7
|
+
* id (`taskId`), upserted at every phase transition and at completion, halt
|
|
8
|
+
* and park, fire-and-forget - never throws, never delays a run.
|
|
7
9
|
* Only coarse run metadata is included; never prompts, code, diffs, token
|
|
8
|
-
* values, or absolute paths.
|
|
10
|
+
* values, or absolute paths. The task title and the PR URL are sent only when
|
|
11
|
+
* usageLog.includeTitle / usageLog.includePrUrl are true.
|
|
9
12
|
*
|
|
10
13
|
* Enable + configure via prefs.global.usageLog:
|
|
11
14
|
* { "enabled": true,
|
|
12
15
|
* "endpoint": "https://mmerterden.com/api/usage/ingest",
|
|
13
16
|
* "token": "<shared ingest token>" } // token may instead come from
|
|
14
17
|
* // env MULTI_AGENT_USAGE_TOKEN
|
|
15
|
-
* Nothing is sent when enabled is not true
|
|
18
|
+
* Nothing is sent when enabled is not true, no token resolves, or no account
|
|
19
|
+
* has access (one line on stderr says which).
|
|
16
20
|
*
|
|
17
21
|
* Usage:
|
|
18
|
-
* node usage-report.mjs --state /path/to/agent-state.json
|
|
19
|
-
* node usage-report.mjs --task-id PROJ-123
|
|
22
|
+
* node usage-report.mjs --state /path/to/agent-state.json [--event <kind>]
|
|
23
|
+
* node usage-report.mjs --task-id PROJ-123 [--phase N] [--event <kind>]
|
|
24
|
+
*
|
|
25
|
+
* --event phase | completed | halted | parked (default: derived from state)
|
|
20
26
|
*
|
|
21
27
|
* @module pipeline/scripts/usage-report
|
|
22
28
|
*/
|
|
@@ -28,6 +34,7 @@ import { fileURLToPath, pathToFileURL } from "url";
|
|
|
28
34
|
import { execFileSync } from "child_process";
|
|
29
35
|
import { createHash } from "crypto";
|
|
30
36
|
import { costUsd } from "./_cost.mjs";
|
|
37
|
+
import { defaultPrefsPath, resolveReportingLogin } from "./usage-identity.mjs";
|
|
31
38
|
|
|
32
39
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
33
40
|
const ENDPOINT_DEFAULT = "https://mmerterden.com/api/usage/ingest";
|
|
@@ -47,13 +54,21 @@ function hostFile(...parts) {
|
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
function parseArgs(argv) {
|
|
50
|
-
const out = {
|
|
57
|
+
const out = {
|
|
58
|
+
state: null,
|
|
59
|
+
taskId: null,
|
|
60
|
+
phase: null,
|
|
61
|
+
status: null,
|
|
62
|
+
event: null,
|
|
63
|
+
dryRun: false,
|
|
64
|
+
};
|
|
51
65
|
for (let i = 0; i < argv.length; i += 1) {
|
|
52
66
|
const a = argv[i];
|
|
53
67
|
if (a === "--state") out.state = argv[++i];
|
|
54
68
|
else if (a === "--task-id") out.taskId = argv[++i];
|
|
55
69
|
else if (a === "--phase") out.phase = argv[++i];
|
|
56
70
|
else if (a === "--status") out.status = argv[++i];
|
|
71
|
+
else if (a === "--event") out.event = argv[++i];
|
|
57
72
|
else if (a === "--dry-run") out.dryRun = true;
|
|
58
73
|
}
|
|
59
74
|
return out;
|
|
@@ -68,9 +83,7 @@ function readJson(path) {
|
|
|
68
83
|
}
|
|
69
84
|
|
|
70
85
|
function resolveGlobalPrefs() {
|
|
71
|
-
|
|
72
|
-
process.env.MULTI_AGENT_PREFS || join(homedir(), ".claude", "multi-agent-preferences.json");
|
|
73
|
-
return readJson(path)?.global ?? {};
|
|
86
|
+
return readJson(defaultPrefsPath())?.global ?? {};
|
|
74
87
|
}
|
|
75
88
|
|
|
76
89
|
function resolvePrefs() {
|
|
@@ -269,16 +282,61 @@ function inputType(state) {
|
|
|
269
282
|
return "free-text";
|
|
270
283
|
}
|
|
271
284
|
|
|
272
|
-
// The
|
|
273
|
-
//
|
|
274
|
-
//
|
|
275
|
-
//
|
|
276
|
-
function
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
285
|
+
// The mode set is read from phases.json, which ships next to this script in
|
|
286
|
+
// every install tree (<root>/schemas/phases.json). A mode that file does not
|
|
287
|
+
// declare is reported as "unknown", so a state written by an older version
|
|
288
|
+
// cannot put a mode name on the panel that the pipeline no longer has.
|
|
289
|
+
function allowedModes() {
|
|
290
|
+
const candidates = [
|
|
291
|
+
join(__dirname, "..", "schemas", "phases.json"),
|
|
292
|
+
hostFile("schemas", "phases.json"),
|
|
293
|
+
];
|
|
294
|
+
for (const p of candidates) {
|
|
295
|
+
const modes = p ? readJson(p)?.modes : null;
|
|
296
|
+
if (modes && typeof modes === "object" && !Array.isArray(modes)) return modes;
|
|
297
|
+
}
|
|
298
|
+
return {};
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export function modeNames() {
|
|
302
|
+
return Object.keys(allowedModes());
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
function commandName(state) {
|
|
306
|
+
const c = typeof state.command === "string" ? state.command.trim() : "";
|
|
307
|
+
const m = c.match(/^\/multi-agent:([a-z0-9-]+)$/);
|
|
308
|
+
return m ? m[1] : null;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* The run's mode, always one of phases.json's modes or "unknown". Order: the
|
|
313
|
+
* invoked command when it names a mode, an explicit state.mode, the autopilot
|
|
314
|
+
* flag (the mode phases.json marks autopilot: true), then "full", which is
|
|
315
|
+
* what an absent mode means in agent-state.schema.json.
|
|
316
|
+
*/
|
|
317
|
+
export function modeOf(state, modes = allowedModes()) {
|
|
318
|
+
const names = Object.keys(modes);
|
|
319
|
+
const has = (n) => typeof n === "string" && names.includes(n);
|
|
320
|
+
const cmd = commandName(state);
|
|
321
|
+
if (has(cmd)) return cmd;
|
|
322
|
+
if (typeof state.mode === "string" && state.mode.trim()) {
|
|
323
|
+
return has(state.mode.trim()) ? state.mode.trim() : "unknown";
|
|
324
|
+
}
|
|
325
|
+
if (state.autopilot === true) {
|
|
326
|
+
const ap = names.find((n) => modes[n]?.autopilot === true);
|
|
327
|
+
if (ap) return ap;
|
|
328
|
+
}
|
|
329
|
+
return has("full") ? "full" : "unknown";
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// The command that was invoked, when the state names one that still ships
|
|
333
|
+
// (`<root>/commands/multi-agent/<name>/`); otherwise the run's mode.
|
|
334
|
+
function commandOf(state, mode) {
|
|
335
|
+
const name = commandName(state);
|
|
336
|
+
if (name && existsSync(join(__dirname, "..", "commands", "multi-agent", name))) {
|
|
337
|
+
return `/multi-agent:${name}`;
|
|
338
|
+
}
|
|
339
|
+
return mode;
|
|
282
340
|
}
|
|
283
341
|
|
|
284
342
|
// A repository name is the user's, not ours. It put a corporate project into
|
|
@@ -322,6 +380,7 @@ function trackerSummary(state) {
|
|
|
322
380
|
models: [],
|
|
323
381
|
startedAt: null,
|
|
324
382
|
endedAt: null,
|
|
383
|
+
current: null,
|
|
325
384
|
};
|
|
326
385
|
const path = resolveTracker(state);
|
|
327
386
|
if (!path) return empty;
|
|
@@ -365,6 +424,11 @@ function trackerSummary(state) {
|
|
|
365
424
|
});
|
|
366
425
|
}
|
|
367
426
|
phs.sort((a, b) => Number(a.p) - Number(b.p));
|
|
427
|
+
const numeric = phs.filter((p) => typeof p.p === "number");
|
|
428
|
+
const running = numeric.filter((p) => p.st === "in_progress");
|
|
429
|
+
const reached = numeric.filter((p) => ["completed", "failed"].includes(p.st));
|
|
430
|
+
const pick = running.length ? running : reached;
|
|
431
|
+
const current = pick.length ? pick[pick.length - 1].p : null;
|
|
368
432
|
|
|
369
433
|
const total = tin + tout + tcache;
|
|
370
434
|
// Price each phase at its OWN model's rate, matching phase-tracker.sh; a run
|
|
@@ -400,12 +464,14 @@ function trackerSummary(state) {
|
|
|
400
464
|
models: Array.from(models).slice(0, 10),
|
|
401
465
|
startedAt,
|
|
402
466
|
endedAt,
|
|
467
|
+
current,
|
|
403
468
|
};
|
|
404
469
|
}
|
|
405
470
|
|
|
406
471
|
function deriveErrors(state, failedPhases) {
|
|
407
472
|
const errs = new Set();
|
|
408
|
-
|
|
473
|
+
const halt = reasonCode(state, "halted");
|
|
474
|
+
if (halt) errs.add(halt);
|
|
409
475
|
for (const id of failedPhases ?? []) errs.add(`phase-${id}-failed`);
|
|
410
476
|
const s = String(state.status || "").toLowerCase();
|
|
411
477
|
if (s === "failed") errs.add("run-failed");
|
|
@@ -431,17 +497,108 @@ function runId(state) {
|
|
|
431
497
|
return base == null ? null : String(base);
|
|
432
498
|
}
|
|
433
499
|
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
500
|
+
export const EVENT_KINDS = ["phase", "completed", "halted", "parked"];
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* The run status the panel shows, from the event that triggered the report or,
|
|
504
|
+
* without one, from the state file. Values: completed, halted, parked, failed,
|
|
505
|
+
* in_progress. A parked run is waiting on a person (awaiting_input, or a
|
|
506
|
+
* waitingFor step); a halted one stopped on an error and is resumable.
|
|
507
|
+
*/
|
|
508
|
+
function runStatus(state, event) {
|
|
509
|
+
if (event === "completed") return "completed";
|
|
510
|
+
if (event === "halted") return "halted";
|
|
511
|
+
if (event === "parked") return "parked";
|
|
512
|
+
const s = String(state.status || "").toLowerCase();
|
|
513
|
+
if (s === "failed" && !state.haltReason) return "failed";
|
|
514
|
+
if (state.haltReason || s === "paused" || s === "halted" || s === "failed") return "halted";
|
|
515
|
+
if (s === "awaiting_input" || state.waitingFor) return "parked";
|
|
516
|
+
if (s === "complete" || s === "completed") return "completed";
|
|
517
|
+
return "in_progress";
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
function codeOf(raw, max = 60) {
|
|
521
|
+
if (typeof raw !== "string") return null;
|
|
522
|
+
const c = raw
|
|
523
|
+
.trim()
|
|
524
|
+
.toLowerCase()
|
|
525
|
+
.replace(/[^a-z0-9:_-]+/g, "-")
|
|
526
|
+
.replace(/-+/g, "-")
|
|
527
|
+
.replace(/^-|-$/g, "")
|
|
528
|
+
.slice(0, max);
|
|
529
|
+
return c || null;
|
|
438
530
|
}
|
|
439
531
|
|
|
440
|
-
const
|
|
532
|
+
const ABSOLUTE_PATH = /(?:~|\/(?:Users|home|var|private|tmp|opt|etc|Volumes))\/\S*|[A-Za-z]:\\\S*/g;
|
|
441
533
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
534
|
+
/**
|
|
535
|
+
* A short machine-readable reason: the halt cause as `<phase>:<cause>` or the
|
|
536
|
+
* step a parked run waits at. Paths are removed before the text is reduced to
|
|
537
|
+
* [a-z0-9:_-], so a cause that quoted a file cannot carry a home directory.
|
|
538
|
+
*/
|
|
539
|
+
function reasonCode(state, status) {
|
|
540
|
+
if (status === "halted" || status === "failed") {
|
|
541
|
+
const hr =
|
|
542
|
+
typeof state.haltReason === "string" ? state.haltReason.replace(ABSOLUTE_PATH, " ") : "";
|
|
543
|
+
if (!hr.trim()) return status === "failed" ? "run-failed" : null;
|
|
544
|
+
const m = hr.match(/^\s*(\d+)\s*:(.*)$/);
|
|
545
|
+
if (m) {
|
|
546
|
+
const cause = codeOf(m[2], 40);
|
|
547
|
+
return cause ? `${m[1]}:${cause}` : m[1];
|
|
548
|
+
}
|
|
549
|
+
return codeOf(hr, 48);
|
|
550
|
+
}
|
|
551
|
+
if (status === "parked") {
|
|
552
|
+
return codeOf(state.waitingFor) || codeOf(state.status) || "awaiting-input";
|
|
553
|
+
}
|
|
554
|
+
return null;
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/** Opt-in: a one-line task title with paths, markup and code spans removed. */
|
|
558
|
+
export function titleSummary(state, prefs) {
|
|
559
|
+
if (prefs?.includeTitle !== true) return null;
|
|
560
|
+
const candidates = [
|
|
561
|
+
state.title,
|
|
562
|
+
state.jiraSummary,
|
|
563
|
+
state.jiraTitle,
|
|
564
|
+
state.jira?.summary,
|
|
565
|
+
state.issue?.title,
|
|
566
|
+
state.issue?.summary,
|
|
567
|
+
state.githubIssue?.title,
|
|
568
|
+
];
|
|
569
|
+
const raw = candidates.find((c) => typeof c === "string" && c.trim());
|
|
570
|
+
if (!raw) return null;
|
|
571
|
+
const clean = raw
|
|
572
|
+
.replace(/`[^`]*`/g, " ")
|
|
573
|
+
.replace(ABSOLUTE_PATH, " ")
|
|
574
|
+
.replace(/[<>{}[\]`]/g, " ")
|
|
575
|
+
.replace(/\s+/g, " ")
|
|
576
|
+
.trim();
|
|
577
|
+
if (!clean) return null;
|
|
578
|
+
return clean.length > 80 ? `${clean.slice(0, 79)}...` : clean;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/** Opt-in: the PR URL, https only. */
|
|
582
|
+
export function prUrlOf(state, prefs) {
|
|
583
|
+
if (prefs?.includePrUrl !== true) return null;
|
|
584
|
+
const url = typeof state.pr === "string" ? state.pr : state.pr?.url;
|
|
585
|
+
if (typeof url !== "string") return null;
|
|
586
|
+
try {
|
|
587
|
+
const u = new URL(url.trim());
|
|
588
|
+
return u.protocol === "https:" ? u.href.slice(0, 200) : null;
|
|
589
|
+
} catch {
|
|
590
|
+
return null;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
function hasPr(state) {
|
|
595
|
+
if (typeof state.pr === "string") return Boolean(state.pr.trim());
|
|
596
|
+
return Boolean(state.pr && (state.pr.url || state.pr.number));
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
function eventTimestamp(state, status) {
|
|
600
|
+
if (status === "completed" && state.finishedAt) return state.finishedAt;
|
|
601
|
+
return new Date().toISOString();
|
|
445
602
|
}
|
|
446
603
|
|
|
447
604
|
function appendErrorLedger(event) {
|
|
@@ -464,49 +621,46 @@ function appendErrorLedger(event) {
|
|
|
464
621
|
}
|
|
465
622
|
}
|
|
466
623
|
|
|
467
|
-
// Telemetry identity is the GitHub
|
|
468
|
-
// (
|
|
469
|
-
//
|
|
470
|
-
//
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
try {
|
|
474
|
-
const out = execFileSync("gh", ["api", "user", "--jq", ".login"], {
|
|
475
|
-
encoding: "utf-8",
|
|
476
|
-
timeout: 3000,
|
|
477
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
478
|
-
}).trim();
|
|
479
|
-
if (out) return out;
|
|
480
|
-
} catch {
|
|
481
|
-
/* gh absent or not authenticated - stay silent */
|
|
482
|
-
}
|
|
483
|
-
return null;
|
|
624
|
+
// Telemetry identity is the GitHub account that can read the pipeline
|
|
625
|
+
// repository (usage-identity.mjs), never the git identity.name and never the
|
|
626
|
+
// account gh merely has active. The server replaces it with the login pinned to
|
|
627
|
+
// the ingest token, so this value is informational.
|
|
628
|
+
function resolveUser(opts = {}) {
|
|
629
|
+
return resolveReportingLogin(opts).login;
|
|
484
630
|
}
|
|
485
631
|
|
|
486
|
-
function
|
|
487
|
-
const fromIdentity = state.identity?.username;
|
|
488
|
-
if (typeof fromIdentity === "string" && fromIdentity.trim()) return fromIdentity.trim();
|
|
489
|
-
return resolveGithubLogin();
|
|
490
|
-
}
|
|
491
|
-
|
|
492
|
-
function buildEvent(state) {
|
|
632
|
+
function buildEvent(state, { event = null, login = null } = {}) {
|
|
493
633
|
const spend = trackerSummary(state);
|
|
494
634
|
const ctx = deriveContext(state);
|
|
635
|
+
const prefs = resolvePrefs();
|
|
636
|
+
const st = runStatus(state, event);
|
|
637
|
+
const rc = reasonCode(state, st);
|
|
638
|
+
const mode = modeOf(state);
|
|
639
|
+
const phase =
|
|
640
|
+
typeof state.currentPhase === "number" && !Number.isNaN(state.currentPhase)
|
|
641
|
+
? state.currentPhase
|
|
642
|
+
: null;
|
|
495
643
|
return {
|
|
496
644
|
id: runId(state),
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
645
|
+
ev: EVENT_KINDS.includes(event) ? event : null,
|
|
646
|
+
t: eventTimestamp(state, st),
|
|
647
|
+
t0: state.startedAt || spend.startedAt || null,
|
|
648
|
+
u: login,
|
|
649
|
+
c: commandOf(state, mode),
|
|
650
|
+
m: mode,
|
|
651
|
+
tt: codeOf(state.taskType, 30),
|
|
501
652
|
ap: Boolean(state.autopilot),
|
|
502
653
|
lo: Boolean(state.localMode),
|
|
503
654
|
in: inputType(state),
|
|
504
655
|
rp: projectDigest(state.project),
|
|
505
|
-
ph:
|
|
506
|
-
st
|
|
507
|
-
hr:
|
|
656
|
+
ph: state._phaseOverride ?? spend.current ?? phase,
|
|
657
|
+
st,
|
|
658
|
+
hr: st === "halted" || st === "failed" ? rc : null,
|
|
659
|
+
rc,
|
|
508
660
|
ri: Array.isArray(state.reviewIterations) ? state.reviewIterations.length : 0,
|
|
509
|
-
pr:
|
|
661
|
+
pr: hasPr(state),
|
|
662
|
+
pru: prUrlOf(state, prefs),
|
|
663
|
+
ti: titleSummary(state, prefs),
|
|
510
664
|
du: durationSec(state, spend),
|
|
511
665
|
tk: spend.tk,
|
|
512
666
|
cost: spend.cost,
|
|
@@ -536,6 +690,7 @@ async function post(endpoint, token, event) {
|
|
|
536
690
|
"X-Usage-Token": token,
|
|
537
691
|
},
|
|
538
692
|
body: JSON.stringify(event),
|
|
693
|
+
redirect: "error",
|
|
539
694
|
signal: ctrl.signal,
|
|
540
695
|
});
|
|
541
696
|
} catch {
|
|
@@ -589,22 +744,29 @@ async function main() {
|
|
|
589
744
|
|
|
590
745
|
if (args.phase != null) {
|
|
591
746
|
const n = Number(args.phase);
|
|
592
|
-
|
|
747
|
+
if (!Number.isNaN(n)) state._phaseOverride = n;
|
|
593
748
|
}
|
|
594
749
|
if (args.status) state.status = args.status;
|
|
750
|
+
const kind = EVENT_KINDS.includes(args.event) ? args.event : null;
|
|
751
|
+
|
|
752
|
+
const who = resolveReportingLogin();
|
|
753
|
+
if (!who.login) {
|
|
754
|
+
process.stderr.write(`usage-report: not sent - ${who.reason}\n`);
|
|
755
|
+
if (!args.dryRun) return;
|
|
756
|
+
}
|
|
595
757
|
|
|
596
|
-
const event = buildEvent(state);
|
|
758
|
+
const event = buildEvent(state, { event: kind, login: who.login });
|
|
597
759
|
|
|
598
760
|
if (args.dryRun) {
|
|
599
761
|
process.stdout.write(JSON.stringify(event, null, 2) + "\n");
|
|
600
762
|
return;
|
|
601
763
|
}
|
|
602
764
|
|
|
603
|
-
if (
|
|
765
|
+
if (event.st !== "in_progress") appendErrorLedger(event);
|
|
604
766
|
await post(endpoint, token, event);
|
|
605
767
|
}
|
|
606
768
|
|
|
607
|
-
//
|
|
769
|
+
// Entry-point check: compare file URLs, never string-split a path.
|
|
608
770
|
const invokedDirectly = process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href;
|
|
609
771
|
if (invokedDirectly) {
|
|
610
772
|
// Exit 0 stays: usage telemetry must never be the reason a run fails, and a
|
|
@@ -629,4 +791,6 @@ export {
|
|
|
629
791
|
trackerSummary,
|
|
630
792
|
buildEvent,
|
|
631
793
|
resolveUser,
|
|
794
|
+
runStatus,
|
|
795
|
+
reasonCode,
|
|
632
796
|
};
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
// section-sign / curly quotes anywhere.
|
|
30
30
|
// - Redaction leak scan: an email address or a 13-19 digit card-like run is
|
|
31
31
|
// an ERROR; a bare 11-digit run is a WARN (could be a numeric trx id); a
|
|
32
|
-
//
|
|
33
|
-
// letters right after a
|
|
32
|
+
// reservation/order reference code (6-char uppercase letter+digit mix, or
|
|
33
|
+
// 6 uppercase letters right after a reference-code label) is a WARN.
|
|
34
34
|
//
|
|
35
35
|
// Usage:
|
|
36
36
|
// node validate-complaint-doc.mjs complaints/complaints-20260810.md
|
|
@@ -79,12 +79,30 @@ const BANNED_PUNCT = [
|
|
|
79
79
|
const EMAIL_RE = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/;
|
|
80
80
|
const CARD_RE = /\b\d(?:[ -]?\d){12,18}\b/;
|
|
81
81
|
const NATIONAL_ID_RE = /\b\d{11}\b/;
|
|
82
|
-
// Same
|
|
83
|
-
// one letter AND one digit), so a leak the parser should have caught
|
|
84
|
-
// loudly here too.
|
|
85
|
-
// 6-letter word is far too common, so
|
|
86
|
-
|
|
87
|
-
const
|
|
82
|
+
// Same shapes parse-complaints.sh redacts (6-char uppercase alnum with at
|
|
83
|
+
// least one letter AND one digit), so a leak the parser should have caught
|
|
84
|
+
// fails loudly here too. An all-letter code is only flaggable with context: a
|
|
85
|
+
// bare 6-letter word is far too common, so it warns only right after a
|
|
86
|
+
// reference-code label (matched case-insensitively, as the parser does).
|
|
87
|
+
const REF_CODE_MIXED_RE = /\b(?=[A-Z0-9]{6}\b)(?=[A-Z0-9]*\d)(?=\d*[A-Z])[A-Z0-9]{6}\b/;
|
|
88
|
+
const REF_CODE_LABELLED_RE = new RegExp(
|
|
89
|
+
"(?<![\\p{L}\\p{N}])(?:" +
|
|
90
|
+
[
|
|
91
|
+
"reference (?:code|number|no)",
|
|
92
|
+
"ref (?:code|no)",
|
|
93
|
+
"(?:booking|reservation|order|confirmation) (?:code|number|no|ref|reference)",
|
|
94
|
+
"rezervasyon (?:kodu|no)",
|
|
95
|
+
"sipari[s\u015f] (?:kodu|no)",
|
|
96
|
+
"pnr",
|
|
97
|
+
].join("|") +
|
|
98
|
+
")[^A-Za-z0-9\\n]{0,3}([A-Za-z]{6})(?![\\p{L}\\p{N}])",
|
|
99
|
+
"giu",
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
function hasReferenceCode(line) {
|
|
103
|
+
if (REF_CODE_MIXED_RE.test(line)) return true;
|
|
104
|
+
return [...line.matchAll(REF_CODE_LABELLED_RE)].some((m) => /^[A-Z]{6}$/.test(m[1]));
|
|
105
|
+
}
|
|
88
106
|
|
|
89
107
|
function readInput() {
|
|
90
108
|
const args = process.argv.slice(2).filter((a) => a !== "--strict");
|
|
@@ -240,9 +258,9 @@ function main() {
|
|
|
240
258
|
`possible redaction leak: bare 11-digit run at line ${i + 1} (national-id-like; ignore if it is a numeric trx id)`,
|
|
241
259
|
);
|
|
242
260
|
}
|
|
243
|
-
if (
|
|
261
|
+
if (hasReferenceCode(bodyLines[i])) {
|
|
244
262
|
warns.push(
|
|
245
|
-
`possible redaction leak:
|
|
263
|
+
`possible redaction leak: reference-code-shaped token at line ${i + 1} (parse-complaints.sh should have redacted it)`,
|
|
246
264
|
);
|
|
247
265
|
}
|
|
248
266
|
}
|
|
@@ -108,6 +108,12 @@ async function main() {
|
|
|
108
108
|
if (t.acceptanceCriteria !== undefined && !Array.isArray(t.acceptanceCriteria)) {
|
|
109
109
|
errors.push(`tasks[${i}].acceptanceCriteria: must be array if present`);
|
|
110
110
|
}
|
|
111
|
+
if (
|
|
112
|
+
t.requirements !== undefined &&
|
|
113
|
+
!(Array.isArray(t.requirements) && t.requirements.every((r) => typeof r === "string"))
|
|
114
|
+
) {
|
|
115
|
+
errors.push(`tasks[${i}].requirements: must be an array of requirement ids if present`);
|
|
116
|
+
}
|
|
111
117
|
});
|
|
112
118
|
|
|
113
119
|
// Validate dependsOn edges point to real ids and don't cycle
|