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