@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +912 -1
- package/README.md +104 -81
- package/README.tr.md +103 -62
- package/docs/FIGMA_PIPELINE.md +35 -35
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
- package/docs/architecture.md +50 -14
- package/docs/best-practices.md +1 -1
- package/docs/ecosystem.md +56 -32
- package/docs/facts.json +10 -10
- package/docs/features.md +97 -5
- package/docs/recovery-guide.md +7 -14
- package/docs/server-readiness.md +31 -24
- package/index.js +1 -1
- package/install/_common.mjs +3 -5
- package/install/_platform-filter.mjs +23 -1
- package/install/_unattended-profile.mjs +321 -75
- package/install/claude.mjs +51 -10
- package/install/codex.mjs +2 -0
- package/install/copilot.mjs +2 -0
- package/install/index.mjs +30 -17
- package/install/templates/claude-hooks.json +16 -5
- package/install/templates/copilot-instructions.md +1 -1
- package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
- package/install/templates/multi-agent-autopilot.plist.template +12 -5
- package/install/unattended-profile-legacy.json +80 -0
- package/manifest.json +616 -483
- package/package.json +8 -3
- package/pipeline/agents/code-reviewer.md +10 -0
- package/pipeline/agents/plan-critic.md +98 -0
- package/pipeline/agents/security-auditor.md +10 -0
- package/pipeline/agents/task-clarifier.md +10 -0
- package/pipeline/commands/multi-agent/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
- package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
- package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
- package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
- package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
- package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
- package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
- package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
- package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
- package/pipeline/contract/CHANGELOG.md +74 -0
- package/pipeline/contract/README.md +126 -0
- package/pipeline/contract/build.mjs +427 -0
- package/pipeline/contract/fixtures/answer-result.json +11 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
- package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
- package/pipeline/contract/fixtures/error-unsigned.json +5 -0
- package/pipeline/contract/fixtures/issues-empty.json +18 -0
- package/pipeline/contract/fixtures/launch-plan.json +31 -0
- package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
- package/pipeline/contract/fixtures/runs-empty.json +6 -0
- package/pipeline/contract/fixtures/runs-failed.json +84 -0
- package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
- package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
- package/pipeline/contract/fixtures/runs-running.json +84 -0
- package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
- package/pipeline/contract/frozen/toolbox.json +107 -0
- package/pipeline/contract/manifest.json +263 -0
- package/pipeline/contract/types/index.d.ts +343 -0
- package/pipeline/lib/_jira-auth.sh +6 -2
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/autopilot-state.sh +19 -0
- package/pipeline/lib/context-link-extractor.sh +12 -5
- package/pipeline/lib/credential-inventory.sh +12 -5
- package/pipeline/lib/credential-store.sh +116 -185
- package/pipeline/lib/fetch-confluence.sh +44 -3
- package/pipeline/lib/fetch-document.sh +3 -4
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/figma-mcp-refresh.sh +2 -2
- package/pipeline/lib/figma-token.sh +5 -1
- package/pipeline/lib/issue-fetcher.sh +233 -16
- package/pipeline/lib/json-file-lock.mjs +172 -0
- package/pipeline/lib/model-dispatch.sh +21 -12
- package/pipeline/lib/model-rung.sh +6 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/outbound-gate.mjs +46 -16
- package/pipeline/lib/parse-complaints.sh +14 -7
- package/pipeline/lib/plan-todos.sh +3 -3
- package/pipeline/lib/post-pr-review.sh +9 -9
- package/pipeline/lib/pr-request-location.mjs +85 -0
- package/pipeline/lib/regular-file.mjs +153 -0
- package/pipeline/lib/repo-hygiene.sh +17 -0
- package/pipeline/lib/route-state.sh +5 -1
- package/pipeline/lib/run-paths.sh +3 -2
- package/pipeline/lib/stack-detect.sh +19 -1
- package/pipeline/lib/unattended-profile-check.mjs +178 -0
- package/pipeline/lib/unattended-settings-location.mjs +28 -0
- package/pipeline/lib/unattended.mjs +76 -0
- package/pipeline/lib/unattended.sh +32 -0
- package/pipeline/lib/untrusted.mjs +76 -0
- package/pipeline/lib/user-facing.mjs +82 -0
- package/pipeline/lib/user-facing.sh +58 -0
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
- package/pipeline/multi-agent-refs/analysis/render.md +4 -3
- package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
- package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
- package/pipeline/multi-agent-refs/analysis-template.md +10 -17
- package/pipeline/multi-agent-refs/channels/jira.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
- package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
- package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
- package/pipeline/multi-agent-refs/features/constitution.md +196 -0
- package/pipeline/multi-agent-refs/features/doctor.md +6 -3
- package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
- package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
- package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
- package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
- package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
- package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
- package/pipeline/multi-agent-refs/features/research.md +150 -0
- package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
- package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
- package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
- package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
- package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
- package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
- package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
- package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -35
- package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
- package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
- package/pipeline/multi-agent-refs/keychain.md +6 -11
- package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
- package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
- package/pipeline/multi-agent-refs/phases/modes.md +10 -12
- package/pipeline/multi-agent-refs/phases/operations.md +11 -5
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
- package/pipeline/multi-agent-refs/phases.md +1 -1
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/progress-contract.md +13 -16
- package/pipeline/multi-agent-refs/readiness-review.md +1 -1
- package/pipeline/multi-agent-refs/research/engine.md +91 -0
- package/pipeline/multi-agent-refs/rules.md +6 -4
- package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
- package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
- package/pipeline/rules/figma-pipeline.md +12 -12
- package/pipeline/schemas/agent-state.schema.json +480 -18
- package/pipeline/schemas/analysis-spec.schema.json +4 -4
- package/pipeline/schemas/answer-request.schema.json +24 -0
- package/pipeline/schemas/answer-result.schema.json +28 -0
- package/pipeline/schemas/autopilot-config.schema.json +111 -13
- package/pipeline/schemas/command-parameters.schema.json +99 -0
- package/pipeline/schemas/constitution.schema.json +56 -0
- package/pipeline/schemas/contract-error.schema.json +52 -0
- package/pipeline/schemas/design-check-config.schema.json +5 -1
- package/pipeline/schemas/issues.schema.json +61 -0
- package/pipeline/schemas/launch-plan.schema.json +46 -0
- package/pipeline/schemas/launch-request.schema.json +45 -0
- package/pipeline/schemas/launch.json +61 -0
- package/pipeline/schemas/launch.schema.json +84 -0
- package/pipeline/schemas/phases.json +2 -2
- package/pipeline/schemas/phases.schema.json +68 -0
- package/pipeline/schemas/phone-devices.schema.json +61 -0
- package/pipeline/schemas/phone-signed-request.schema.json +67 -0
- package/pipeline/schemas/plan-critique.schema.json +99 -0
- package/pipeline/schemas/plan-todos.schema.json +7 -7
- package/pipeline/schemas/planning-output.schema.json +5 -0
- package/pipeline/schemas/pr-request.schema.json +46 -0
- package/pipeline/schemas/prefs.schema.json +79 -8
- package/pipeline/schemas/research-output.schema.json +118 -0
- package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
- package/pipeline/schemas/reviewer-output.schema.json +40 -4
- package/pipeline/schemas/run-questions.json +392 -0
- package/pipeline/schemas/run-questions.schema.json +118 -0
- package/pipeline/schemas/runs-index.schema.json +189 -0
- package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
- package/pipeline/schemas/secret-patterns.schema.json +28 -0
- package/pipeline/schemas/stack-adapters.json +527 -0
- package/pipeline/schemas/stack-adapters.schema.json +184 -0
- package/pipeline/schemas/token-budget.json +1 -1
- package/pipeline/schemas/token-budget.schema.json +26 -0
- package/pipeline/schemas/triage-output.schema.json +64 -3
- package/pipeline/schemas/unattended-policy.json +139 -0
- package/pipeline/schemas/unattended-policy.schema.json +73 -0
- package/pipeline/schemas/unattended-profile.json +248 -0
- package/pipeline/schemas/unattended-profile.schema.json +198 -0
- package/pipeline/schemas/worktrees.schema.json +51 -0
- package/pipeline/scripts/README.md +1 -0
- package/pipeline/scripts/_autopilot-config.mjs +130 -0
- package/pipeline/scripts/_autopilot-ops.mjs +567 -0
- package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
- package/pipeline/scripts/_command-contract.mjs +384 -0
- package/pipeline/scripts/_cost.mjs +40 -0
- package/pipeline/scripts/_notices.mjs +160 -0
- package/pipeline/scripts/_phone-auth.mjs +485 -0
- package/pipeline/scripts/_pre-existing.mjs +294 -0
- package/pipeline/scripts/_redact.mjs +77 -0
- package/pipeline/scripts/_run-paths.mjs +4 -2
- package/pipeline/scripts/_stack-adapter.mjs +678 -0
- package/pipeline/scripts/_stack-routing.mjs +1 -1
- package/pipeline/scripts/agent-guard.py +348 -37
- package/pipeline/scripts/agent-guard.sh +41 -13
- package/pipeline/scripts/analysis-story-tree.mjs +79 -3
- package/pipeline/scripts/answer-question.mjs +181 -0
- package/pipeline/scripts/audit-log-rotate.sh +1 -4
- package/pipeline/scripts/audit-log.sh +4 -4
- package/pipeline/scripts/autopilot-arming.mjs +389 -21
- package/pipeline/scripts/autopilot-awake.mjs +255 -0
- package/pipeline/scripts/autopilot-intake.mjs +137 -36
- package/pipeline/scripts/autopilot-menubar.swift +156 -44
- package/pipeline/scripts/autopilot-publish.mjs +1625 -0
- package/pipeline/scripts/autopilot-runner.mjs +1678 -222
- package/pipeline/scripts/autopilot-status.sh +198 -33
- package/pipeline/scripts/build-lock.sh +120 -0
- package/pipeline/scripts/build-references.mjs +4 -1
- package/pipeline/scripts/build-stack-plugins.mjs +59 -22
- package/pipeline/scripts/capture-flush.sh +1 -1
- package/pipeline/scripts/capture-resume.sh +13 -9
- package/pipeline/scripts/check-derived-drift.mjs +52 -11
- package/pipeline/scripts/commands.mjs +88 -0
- package/pipeline/scripts/constitution.mjs +362 -0
- package/pipeline/scripts/contract-server.mjs +776 -0
- package/pipeline/scripts/cost-analyze.mjs +89 -39
- package/pipeline/scripts/diff-explain.mjs +12 -1
- package/pipeline/scripts/doctor.mjs +77 -28
- package/pipeline/scripts/evidence-gate.mjs +192 -12
- package/pipeline/scripts/feedback-send.mjs +4 -2
- package/pipeline/scripts/gate-ledger.mjs +449 -0
- package/pipeline/scripts/gc-abandoned.sh +132 -13
- package/pipeline/scripts/gen-facts.mjs +31 -15
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/github-ssh-setup.sh +140 -29
- package/pipeline/scripts/graph-mermaid.mjs +4 -1
- package/pipeline/scripts/issues.mjs +236 -0
- package/pipeline/scripts/jira-attach.sh +6 -2
- package/pipeline/scripts/jira-search.sh +4 -3
- package/pipeline/scripts/keychain-save.sh +125 -24
- package/pipeline/scripts/keychain.py +63 -93
- package/pipeline/scripts/launch-request.mjs +747 -0
- package/pipeline/scripts/localize-commands.mjs +4 -10
- package/pipeline/scripts/log-metric.sh +6 -5
- package/pipeline/scripts/maturity-followup.mjs +13 -4
- package/pipeline/scripts/memory-save.sh +25 -0
- package/pipeline/scripts/migrate-prefs.mjs +4 -3
- package/pipeline/scripts/open-questions-gate.mjs +276 -0
- package/pipeline/scripts/phase-tracker.sh +41 -27
- package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
- package/pipeline/scripts/phone-devices.mjs +224 -0
- package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
- package/pipeline/scripts/plan-critique-gate.mjs +591 -0
- package/pipeline/scripts/pr-request.mjs +188 -0
- package/pipeline/scripts/pre-commit-check.sh +115 -4
- package/pipeline/scripts/probe-evidence-capability.sh +44 -5
- package/pipeline/scripts/record-phase.mjs +71 -0
- package/pipeline/scripts/render-agent-log-cost.sh +17 -2
- package/pipeline/scripts/render-cost-summary.sh +1 -1
- package/pipeline/scripts/render-work-summary.sh +1 -1
- package/pipeline/scripts/require-supported-version.sh +4 -1
- package/pipeline/scripts/research-gate.mjs +704 -0
- package/pipeline/scripts/review-decision-gate.mjs +403 -0
- package/pipeline/scripts/routine-registry.mjs +5 -2
- package/pipeline/scripts/runs-index.mjs +135 -27
- package/pipeline/scripts/scaffold-gate.mjs +393 -0
- package/pipeline/scripts/skill-conformance.mjs +25 -8
- package/pipeline/scripts/skill-siblings.mjs +2 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
- package/pipeline/scripts/smoke-schema-validation.sh +6 -2
- package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
- package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
- package/pipeline/scripts/test-gap-scan.mjs +40 -2
- package/pipeline/scripts/test-integrity-gate.mjs +20 -4
- package/pipeline/scripts/test-strength.mjs +484 -0
- package/pipeline/scripts/test-summary.mjs +651 -0
- package/pipeline/scripts/triage-memory.mjs +49 -9
- package/pipeline/scripts/unattended_policy.py +2786 -0
- package/pipeline/scripts/uninstall.mjs +10 -10
- package/pipeline/scripts/update-issue-progress.sh +1 -1
- package/pipeline/scripts/usage-identity.mjs +288 -0
- package/pipeline/scripts/usage-register.mjs +185 -65
- package/pipeline/scripts/usage-report.mjs +230 -66
- package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
- package/pipeline/scripts/validate-planning.mjs +6 -0
- package/pipeline/scripts/verify-citations.mjs +151 -38
- package/pipeline/scripts/verify.mjs +58 -18
- package/pipeline/scripts/worktree-prepare.sh +126 -0
- package/pipeline/scripts/worktrees.mjs +124 -0
- package/pipeline/scripts/write-state.mjs +48 -17
- package/pipeline/skills/.skill-manifest.json +222 -226
- package/pipeline/skills/.skills-index.json +77 -88
- package/pipeline/skills/shared/README.md +44 -45
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
- package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
- package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
- package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
- package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
- package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
- package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
- package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
- package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
- package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
- package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
- package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
- package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
- package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
- package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
- package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
- package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
- package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
- package/pipeline/skills/shared/external/council/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
- package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
- package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
- package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
- package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
- package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
- package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
- package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
- package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
- package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
- package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
- package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
- package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
- package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
- package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
- package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
- package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
- package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
- package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
- package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
- package/pipeline/skills/skills-index.md +40 -41
- package/docs/token-budget-history.md +0 -24
- package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
- package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
- package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
- package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
- package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
|
@@ -19,14 +19,115 @@ set -uo pipefail
|
|
|
19
19
|
# miras kalır ve bazı sistemlerde `ps e` ile görünür; borudan okumak onu
|
|
20
20
|
# yalnız bu sürecin belleğinde tutar. Aynı sebeple argv'ye de hiç değmez.
|
|
21
21
|
|
|
22
|
+
# Every line a person reads resolves through the table below, so this script
|
|
23
|
+
# answers to the same language preference the rest of the pipeline answers to.
|
|
24
|
+
#
|
|
25
|
+
# The resolver is located the same way the credential store is located further
|
|
26
|
+
# down - the file is checked for before it is sourced, because a `.` of a path
|
|
27
|
+
# that is not there takes the shell with it and the later candidates are never
|
|
28
|
+
# reached.
|
|
29
|
+
for _ma_uf in \
|
|
30
|
+
"$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")" && pwd)/user-facing.sh" \
|
|
31
|
+
"$(cd "$(dirname "${BASH_SOURCE[0]:-$0}")/../lib" 2>/dev/null && pwd)/user-facing.sh" \
|
|
32
|
+
"$HOME/.claude/lib/user-facing.sh" \
|
|
33
|
+
"$HOME/.copilot/lib/user-facing.sh" \
|
|
34
|
+
"$HOME/.codex/lib/user-facing.sh"; do
|
|
35
|
+
[ -f "$_ma_uf" ] || continue
|
|
36
|
+
# shellcheck source=/dev/null
|
|
37
|
+
. "$_ma_uf" 2>/dev/null || true
|
|
38
|
+
if command -v ma_output_lang >/dev/null 2>&1; then break; fi
|
|
39
|
+
done
|
|
40
|
+
unset _ma_uf
|
|
41
|
+
if ! command -v ma_output_lang >/dev/null 2>&1; then
|
|
42
|
+
echo "Error: user-facing.sh not found. Install: npx @mmerterden/multi-agent-pipeline install" >&2
|
|
43
|
+
exit 1
|
|
44
|
+
fi
|
|
45
|
+
OUT_LANG=$(ma_output_lang)
|
|
46
|
+
|
|
47
|
+
# One table, both languages on the same line, so a wording change cannot land
|
|
48
|
+
# on one of them. English is the default and the fallback.
|
|
49
|
+
msg() { # $1 = key, $2.. = printf arguments
|
|
50
|
+
local key="$1" en tr fmt
|
|
51
|
+
shift
|
|
52
|
+
case "$key" in
|
|
53
|
+
usage)
|
|
54
|
+
en='Usage: %s <service-name> (interactive)\n %s <service-name> --stdin (token from a pipe)\n %s <service-name> --json <path> (token from a JSON file)'
|
|
55
|
+
tr='Kullanım: %s <service-adı> (interaktif)\n %s <service-adı> --stdin (token borudan)\n %s <service-adı> --json <yol> (JSON dosyadan)' ;;
|
|
56
|
+
no-mode-unattended)
|
|
57
|
+
en='Error: MULTI_AGENT_UNATTENDED=1 and no mode was given.'
|
|
58
|
+
tr='Hata: MULTI_AGENT_UNATTENDED=1 ve mod verilmedi.' ;;
|
|
59
|
+
no-mode-headless)
|
|
60
|
+
en='Error: there is no terminal and no mode was given.'
|
|
61
|
+
tr='Hata: terminal yok ve mod verilmedi.' ;;
|
|
62
|
+
file-missing)
|
|
63
|
+
en='Error: file not found: %s'
|
|
64
|
+
tr='Hata: Dosya bulunamadı: %s' ;;
|
|
65
|
+
stdin-empty)
|
|
66
|
+
en='Error: stdin is empty.'
|
|
67
|
+
tr='Hata: stdin boş.' ;;
|
|
68
|
+
json-needs-path)
|
|
69
|
+
en='Error: --json wants a file path.'
|
|
70
|
+
tr='Hata: --json bir dosya yolu ister.' ;;
|
|
71
|
+
file-unreadable)
|
|
72
|
+
en='Error: the file could not be read.'
|
|
73
|
+
tr='Hata: Dosya okunamadı.' ;;
|
|
74
|
+
kind-question)
|
|
75
|
+
en='What kind of secret are you saving?'
|
|
76
|
+
tr='Ne tür bir secret kaydedeceksin?' ;;
|
|
77
|
+
kind-token)
|
|
78
|
+
en=' 1) Personal Access Token / API Key'
|
|
79
|
+
tr=' 1) Personal Access Token / API Key' ;;
|
|
80
|
+
kind-json)
|
|
81
|
+
en=' 2) JSON file (service account and the like)'
|
|
82
|
+
tr=' 2) JSON dosyası (service account vb.)' ;;
|
|
83
|
+
ask-kind)
|
|
84
|
+
en='Choice (1/2): '
|
|
85
|
+
tr='Seçim (1/2): ' ;;
|
|
86
|
+
ask-token)
|
|
87
|
+
en='Paste the token (it is typed hidden): '
|
|
88
|
+
tr="Token'ı yapıştır (gizli yazılır): " ;;
|
|
89
|
+
token-empty)
|
|
90
|
+
en='Error: the token cannot be empty.'
|
|
91
|
+
tr='Hata: Token boş olamaz.' ;;
|
|
92
|
+
ask-json-path)
|
|
93
|
+
en='Enter the JSON file path: '
|
|
94
|
+
tr='JSON dosya yolunu gir: ' ;;
|
|
95
|
+
json-stored-verbatim)
|
|
96
|
+
en='The JSON will be stored as it is.'
|
|
97
|
+
tr='JSON olduğu gibi saklanacak.' ;;
|
|
98
|
+
invalid-choice)
|
|
99
|
+
en='Invalid choice.'
|
|
100
|
+
tr='Geçersiz seçim.' ;;
|
|
101
|
+
unknown-mode)
|
|
102
|
+
en='Error: unknown mode: %s'
|
|
103
|
+
tr='Hata: bilinmeyen mod: %s' ;;
|
|
104
|
+
no-credential-store)
|
|
105
|
+
en='Error: credential-store not found. Install: npx @mmerterden/multi-agent-pipeline install'
|
|
106
|
+
tr='Hata: credential-store bulunamadi. Kurulum: npx @mmerterden/multi-agent-pipeline install' ;;
|
|
107
|
+
saved)
|
|
108
|
+
en='Saved: %s (platform: %s)'
|
|
109
|
+
tr='Kaydedildi: %s (platform: %s)' ;;
|
|
110
|
+
read-it-back)
|
|
111
|
+
en='To read it back:'
|
|
112
|
+
tr='Okumak icin:' ;;
|
|
113
|
+
save-failed)
|
|
114
|
+
en='Error: could not save.'
|
|
115
|
+
tr='Hata: Kaydedilemedi.' ;;
|
|
116
|
+
*)
|
|
117
|
+
printf 'keychain-save: no message for %s\n' "$key" >&2
|
|
118
|
+
return 1 ;;
|
|
119
|
+
esac
|
|
120
|
+
[ "$OUT_LANG" = tr ] && fmt="$tr" || fmt="$en"
|
|
121
|
+
# shellcheck disable=SC2059
|
|
122
|
+
printf "$fmt\n" "$@"
|
|
123
|
+
}
|
|
124
|
+
|
|
22
125
|
SERVICE_NAME="${1:-}"
|
|
23
126
|
MODE="${2:-}"
|
|
24
127
|
MODE_ARG="${3:-}"
|
|
25
128
|
|
|
26
129
|
usage() {
|
|
27
|
-
|
|
28
|
-
echo " $0 <service-adı> --stdin (token borudan)"
|
|
29
|
-
echo " $0 <service-adı> --json <yol> (JSON dosyadan)"
|
|
130
|
+
msg usage "$0" "$0" "$0"
|
|
30
131
|
}
|
|
31
132
|
|
|
32
133
|
if [ -z "$SERVICE_NAME" ]; then
|
|
@@ -40,9 +141,9 @@ if [ -z "$MODE" ] && { [ ! -t 0 ] || [ "${MULTI_AGENT_UNATTENDED:-}" = "1" ]; };
|
|
|
40
141
|
# Sebebi doğru söyle. "terminal yok" derken terminalin VAR olması,
|
|
41
142
|
# okuyanı kendi kurulumunu yanlış yerde aramaya gönderir.
|
|
42
143
|
if [ "${MULTI_AGENT_UNATTENDED:-}" = "1" ]; then
|
|
43
|
-
|
|
144
|
+
msg no-mode-unattended >&2
|
|
44
145
|
else
|
|
45
|
-
|
|
146
|
+
msg no-mode-headless >&2
|
|
46
147
|
fi
|
|
47
148
|
usage >&2
|
|
48
149
|
exit 1
|
|
@@ -56,7 +157,7 @@ read_json_file() {
|
|
|
56
157
|
# Tilde (~) expand
|
|
57
158
|
path="${path/#\~/$HOME}"
|
|
58
159
|
if [ ! -f "$path" ]; then
|
|
59
|
-
|
|
160
|
+
msg file-missing "$path" >&2
|
|
60
161
|
return 1
|
|
61
162
|
fi
|
|
62
163
|
# JSON olduğu gibi saklanır. Kimlik deposu çok satırlı değeri
|
|
@@ -71,56 +172,56 @@ case "$MODE" in
|
|
|
71
172
|
# JSON'unun geri kalanını sessizce atar.
|
|
72
173
|
SECRET=$(cat)
|
|
73
174
|
if [ -z "$SECRET" ]; then
|
|
74
|
-
|
|
175
|
+
msg stdin-empty >&2
|
|
75
176
|
exit 1
|
|
76
177
|
fi
|
|
77
178
|
;;
|
|
78
179
|
--json)
|
|
79
180
|
if [ -z "$MODE_ARG" ]; then
|
|
80
|
-
|
|
181
|
+
msg json-needs-path >&2
|
|
81
182
|
usage >&2
|
|
82
183
|
exit 1
|
|
83
184
|
fi
|
|
84
185
|
SECRET=$(read_json_file "$MODE_ARG") || exit 1
|
|
85
186
|
if [ -z "$SECRET" ]; then
|
|
86
|
-
|
|
187
|
+
msg file-unreadable >&2
|
|
87
188
|
exit 1
|
|
88
189
|
fi
|
|
89
190
|
;;
|
|
90
191
|
"")
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
192
|
+
msg kind-question
|
|
193
|
+
msg kind-token
|
|
194
|
+
msg kind-json
|
|
94
195
|
# EOF (Ctrl-D) bir cevaptır: korumasız `read` onu boş bir seçime
|
|
95
196
|
# çevirip aşağıdaki "Geçersiz seçim"e düşürür, ki doğru sonuç.
|
|
96
|
-
read -rp "
|
|
197
|
+
read -rp "$(msg ask-kind)" CHOICE || CHOICE=""
|
|
97
198
|
|
|
98
199
|
case "$CHOICE" in
|
|
99
200
|
1)
|
|
100
|
-
read -rsp "
|
|
201
|
+
read -rsp "$(msg ask-token)" SECRET || SECRET=""
|
|
101
202
|
echo ""
|
|
102
203
|
if [ -z "$SECRET" ]; then
|
|
103
|
-
|
|
204
|
+
msg token-empty
|
|
104
205
|
exit 1
|
|
105
206
|
fi
|
|
106
207
|
;;
|
|
107
208
|
2)
|
|
108
|
-
read -rp "
|
|
209
|
+
read -rp "$(msg ask-json-path)" JSON_PATH || JSON_PATH=""
|
|
109
210
|
SECRET=$(read_json_file "$JSON_PATH") || exit 1
|
|
110
211
|
if [ -z "$SECRET" ]; then
|
|
111
|
-
|
|
212
|
+
msg file-unreadable
|
|
112
213
|
exit 1
|
|
113
214
|
fi
|
|
114
|
-
|
|
215
|
+
msg json-stored-verbatim
|
|
115
216
|
;;
|
|
116
217
|
*)
|
|
117
|
-
|
|
218
|
+
msg invalid-choice
|
|
118
219
|
exit 1
|
|
119
220
|
;;
|
|
120
221
|
esac
|
|
121
222
|
;;
|
|
122
223
|
*)
|
|
123
|
-
|
|
224
|
+
msg unknown-mode "$MODE" >&2
|
|
124
225
|
usage >&2
|
|
125
226
|
exit 1
|
|
126
227
|
;;
|
|
@@ -150,7 +251,7 @@ for _cred_resolver in \
|
|
|
150
251
|
done
|
|
151
252
|
unset _cred_resolver
|
|
152
253
|
if [ -z "${CRED_STORE:-}" ]; then
|
|
153
|
-
|
|
254
|
+
msg no-credential-store
|
|
154
255
|
exit 1
|
|
155
256
|
fi
|
|
156
257
|
CRED="$CRED_STORE"
|
|
@@ -158,11 +259,11 @@ CRED="$CRED_STORE"
|
|
|
158
259
|
"$CRED" delete "$SERVICE_NAME" >/dev/null 2>&1 || true
|
|
159
260
|
# Secret goes through stdin ("set <key> -") so it never appears on argv.
|
|
160
261
|
if printf '%s' "$SECRET" | "$CRED" set "$SERVICE_NAME" -; then
|
|
161
|
-
|
|
262
|
+
msg saved "$SERVICE_NAME" "$("$CRED" platform)"
|
|
162
263
|
echo ""
|
|
163
|
-
|
|
264
|
+
msg read-it-back
|
|
164
265
|
echo " $CRED get \"$SERVICE_NAME\""
|
|
165
266
|
else
|
|
166
|
-
|
|
267
|
+
msg save-failed
|
|
167
268
|
exit 1
|
|
168
269
|
fi
|
|
@@ -5,7 +5,7 @@ keychain.py - deterministic Keychain helper, Python counterpart to credential-
|
|
|
5
5
|
Purpose
|
|
6
6
|
-------
|
|
7
7
|
The pipeline reads Keychain tokens from many places (Phase 0 setup, Phase 1
|
|
8
|
-
Jira fetch, Phase
|
|
8
|
+
Jira fetch, Phase 4 push retry, channels, ...). Shell `security` calls work
|
|
9
9
|
fine but make error handling and structured output painful. This module is
|
|
10
10
|
the single deterministic Python entry point for those operations.
|
|
11
11
|
|
|
@@ -26,7 +26,7 @@ list_labels(filter_substring=None) -> list[str]
|
|
|
26
26
|
|
|
27
27
|
doctor() -> dict
|
|
28
28
|
Probe backend availability. Returns
|
|
29
|
-
{"platform": "macos|
|
|
29
|
+
{"platform": "macos|unknown", "backend_ok": bool, "remediation": str|None}
|
|
30
30
|
|
|
31
31
|
CLI
|
|
32
32
|
---
|
|
@@ -40,18 +40,17 @@ Exit codes
|
|
|
40
40
|
----------
|
|
41
41
|
0 success
|
|
42
42
|
1 item missing (get) / does not exist (delete)
|
|
43
|
-
2 backend unavailable (no `security
|
|
43
|
+
2 backend unavailable (no `security`, or not macOS)
|
|
44
44
|
3 usage error
|
|
45
45
|
4 unexpected backend error (stderr captured to stdout for diagnostics)
|
|
46
46
|
|
|
47
47
|
Behaviour
|
|
48
48
|
---------
|
|
49
|
-
-
|
|
50
|
-
-
|
|
51
|
-
- Windows / unknown platforms: backend unavailable; `doctor` prints remediation.
|
|
49
|
+
- Shells out to /usr/bin/security, parsing structured output. macOS only
|
|
50
|
+
(ADR-0012): on any other host the backend is unavailable and `doctor` says so.
|
|
52
51
|
- Never logs the secret value. `set` accepts the value via argv (CLI) or via
|
|
53
52
|
stdin when the value is exactly `-` (preferred for scripts to avoid shell
|
|
54
|
-
history leak).
|
|
53
|
+
history leak). The write goes through `security -i` with the
|
|
55
54
|
command on stdin, so the value never appears on a child process argv.
|
|
56
55
|
- get returns the raw value to stdout with no trailing newline manipulation
|
|
57
56
|
beyond stripping the OS-level final \\n that `security -w` appends.
|
|
@@ -75,8 +74,6 @@ def _platform() -> str:
|
|
|
75
74
|
s = platform.system()
|
|
76
75
|
if s == "Darwin":
|
|
77
76
|
return "macos"
|
|
78
|
-
if s == "Linux":
|
|
79
|
-
return "linux"
|
|
80
77
|
return "unknown"
|
|
81
78
|
|
|
82
79
|
|
|
@@ -84,6 +81,14 @@ def _account_default(explicit: Optional[str] = None) -> str:
|
|
|
84
81
|
return explicit or os.environ.get("USER") or os.environ.get("LOGNAME") or "user"
|
|
85
82
|
|
|
86
83
|
|
|
84
|
+
def _keychain() -> list[str]:
|
|
85
|
+
"""The keychain file every call is scoped to, when CREDENTIAL_STORE_KEYCHAIN
|
|
86
|
+
names one; otherwise the user's search list. Tests point it at a throwaway
|
|
87
|
+
keychain so they never write to the login keychain."""
|
|
88
|
+
path = os.environ.get("CREDENTIAL_STORE_KEYCHAIN", "")
|
|
89
|
+
return [path] if path else []
|
|
90
|
+
|
|
91
|
+
|
|
87
92
|
def _run(argv: list[str], input_value: Optional[bytes] = None) -> tuple[int, bytes, bytes]:
|
|
88
93
|
"""Run a subprocess; return (rc, stdout_bytes, stderr_bytes). Never raises on non-zero."""
|
|
89
94
|
proc = subprocess.run(
|
|
@@ -105,17 +110,10 @@ def doctor() -> dict:
|
|
|
105
110
|
"backend_ok": ok,
|
|
106
111
|
"remediation": None if ok else "macOS Keychain CLI missing - /usr/bin/security should ship with macOS; reinstall Command Line Tools.",
|
|
107
112
|
}
|
|
108
|
-
if pf == "linux":
|
|
109
|
-
ok = shutil.which("secret-tool") is not None
|
|
110
|
-
return {
|
|
111
|
-
"platform": pf,
|
|
112
|
-
"backend_ok": ok,
|
|
113
|
-
"remediation": None if ok else "Install libsecret-tools: `sudo apt install libsecret-tools` or `sudo dnf install libsecret`.",
|
|
114
|
-
}
|
|
115
113
|
return {
|
|
116
114
|
"platform": pf,
|
|
117
115
|
"backend_ok": False,
|
|
118
|
-
"remediation": "
|
|
116
|
+
"remediation": "macOS only, see ADR-0012.",
|
|
119
117
|
}
|
|
120
118
|
|
|
121
119
|
|
|
@@ -180,7 +178,7 @@ def _macos_find(args: list[str]) -> Optional[str]:
|
|
|
180
178
|
A value whose trailing newline is meaningful is not something this store has
|
|
181
179
|
ever been able to return.
|
|
182
180
|
"""
|
|
183
|
-
rc, _, err = _run(["/usr/bin/security", "find-generic-password", *args, "-g"])
|
|
181
|
+
rc, _, err = _run(["/usr/bin/security", "find-generic-password", *args, "-g", *_keychain()])
|
|
184
182
|
if rc != 0:
|
|
185
183
|
return None
|
|
186
184
|
value = _decode_security_password(err)
|
|
@@ -192,63 +190,45 @@ def get(label: str, account: Optional[str] = None) -> Optional[str]:
|
|
|
192
190
|
- User's manually-added tokens (e.g. ${USER}_Vercel_Access_Token) use -l (label).
|
|
193
191
|
- credential-store.sh-managed items use -s (service).
|
|
194
192
|
The helper finds either."""
|
|
195
|
-
|
|
193
|
+
_ensure_backend()
|
|
196
194
|
acct = _account_default(account)
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
)
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
return value
|
|
208
|
-
return None
|
|
209
|
-
# linux / secret-tool - store under both `label` and `service` schema attrs
|
|
210
|
-
rc, out, _ = _run(["secret-tool", "lookup", "label", label, "account", acct])
|
|
211
|
-
if rc == 0:
|
|
212
|
-
return out.decode("utf-8", errors="replace").rstrip("\n")
|
|
213
|
-
rc, out, _ = _run(["secret-tool", "lookup", "service", label])
|
|
214
|
-
if rc == 0:
|
|
215
|
-
return out.decode("utf-8", errors="replace").rstrip("\n")
|
|
195
|
+
for args in (
|
|
196
|
+
["-a", acct, "-l", label],
|
|
197
|
+
["-a", acct, "-s", label],
|
|
198
|
+
# account-agnostic last resort - some entries were written without -a
|
|
199
|
+
["-l", label],
|
|
200
|
+
["-s", label],
|
|
201
|
+
):
|
|
202
|
+
value = _macos_find(args)
|
|
203
|
+
if value is not None:
|
|
204
|
+
return value
|
|
216
205
|
return None
|
|
217
206
|
|
|
218
207
|
|
|
219
208
|
def set_(label: str, value: str, account: Optional[str] = None) -> None:
|
|
220
209
|
"""Write the entry with both -l (label) and -s (service) set to the same id, so
|
|
221
210
|
both lookup conventions succeed. -U overwrites if the item already exists."""
|
|
222
|
-
|
|
211
|
+
_ensure_backend()
|
|
223
212
|
acct = _account_default(account)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
)
|
|
242
|
-
rc, _, err = _run(["/usr/bin/security", "-i"], input_value=command.encode("utf-8"))
|
|
243
|
-
if rc != 0:
|
|
244
|
-
sys.stderr.write(err.decode("utf-8", errors="replace"))
|
|
245
|
-
sys.exit(4)
|
|
246
|
-
return
|
|
247
|
-
# linux / secret-tool - store reads the secret from stdin; tag both schema attrs
|
|
248
|
-
rc, _, err = _run(
|
|
249
|
-
["secret-tool", "store", "--label", label, "label", label, "service", label, "account", acct],
|
|
250
|
-
input_value=value.encode("utf-8"),
|
|
213
|
+
# `security -i` reads the add command from stdin, so the secret never
|
|
214
|
+
# lands on the security argv (visible to ps). Backslashes and double
|
|
215
|
+
# quotes are escaped for security's interactive tokenizer.
|
|
216
|
+
def quote(text: str) -> str:
|
|
217
|
+
return text.replace("\\", "\\\\").replace('"', '\\"')
|
|
218
|
+
|
|
219
|
+
# The secret goes in as `-X <hex>`, not `-w "<text>"`. `security -i`
|
|
220
|
+
# tokenizes ONE command per line, so a newline inside the value ends the
|
|
221
|
+
# command and the remainder is read as further commands - which is how a
|
|
222
|
+
# service-account JSON turned into "security: unknown command" instead of
|
|
223
|
+
# a stored credential. Hex is single-line by construction and byte-exact,
|
|
224
|
+
# and it stays on stdin, so the argv exposure this branch exists to avoid
|
|
225
|
+
# is still avoided.
|
|
226
|
+
target = "".join(f' "{quote(k)}"' for k in _keychain())
|
|
227
|
+
command = (
|
|
228
|
+
f'add-generic-password -U -a "{quote(acct)}" -l "{quote(label)}" '
|
|
229
|
+
f'-s "{quote(label)}" -X {value.encode("utf-8").hex()}{target}\n'
|
|
251
230
|
)
|
|
231
|
+
rc, _, err = _run(["/usr/bin/security", "-i"], input_value=command.encode("utf-8"))
|
|
252
232
|
if rc != 0:
|
|
253
233
|
sys.stderr.write(err.decode("utf-8", errors="replace"))
|
|
254
234
|
sys.exit(4)
|
|
@@ -256,40 +236,30 @@ def set_(label: str, value: str, account: Optional[str] = None) -> None:
|
|
|
256
236
|
|
|
257
237
|
def delete(label: str, account: Optional[str] = None) -> bool:
|
|
258
238
|
"""Delete by either convention. Returns True if any matching item was removed."""
|
|
259
|
-
|
|
239
|
+
_ensure_backend()
|
|
260
240
|
acct = _account_default(account)
|
|
261
|
-
if pf == "macos":
|
|
262
|
-
deleted = False
|
|
263
|
-
for flag in ("-l", "-s"):
|
|
264
|
-
while True:
|
|
265
|
-
rc, _, _ = _run(["/usr/bin/security", "delete-generic-password", "-a", acct, flag, label])
|
|
266
|
-
if rc != 0:
|
|
267
|
-
break
|
|
268
|
-
deleted = True
|
|
269
|
-
for flag in ("-l", "-s"):
|
|
270
|
-
while True:
|
|
271
|
-
rc, _, _ = _run(["/usr/bin/security", "delete-generic-password", flag, label])
|
|
272
|
-
if rc != 0:
|
|
273
|
-
break
|
|
274
|
-
deleted = True
|
|
275
|
-
return deleted
|
|
276
241
|
deleted = False
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
242
|
+
for flag in ("-l", "-s"):
|
|
243
|
+
while True:
|
|
244
|
+
rc, _, _ = _run(
|
|
245
|
+
["/usr/bin/security", "delete-generic-password", "-a", acct, flag, label, *_keychain()]
|
|
246
|
+
)
|
|
247
|
+
if rc != 0:
|
|
248
|
+
break
|
|
249
|
+
deleted = True
|
|
250
|
+
for flag in ("-l", "-s"):
|
|
251
|
+
while True:
|
|
252
|
+
rc, _, _ = _run(["/usr/bin/security", "delete-generic-password", flag, label, *_keychain()])
|
|
253
|
+
if rc != 0:
|
|
254
|
+
break
|
|
255
|
+
deleted = True
|
|
283
256
|
return deleted
|
|
284
257
|
|
|
285
258
|
|
|
286
259
|
def list_labels(filter_substring: Optional[str] = None) -> list[str]:
|
|
287
|
-
|
|
288
|
-
if pf != "macos":
|
|
289
|
-
# secret-tool has no native list; we can't enumerate all entries portably.
|
|
290
|
-
return []
|
|
260
|
+
_ensure_backend()
|
|
291
261
|
# `security dump-keychain` prints every item; we extract the 0x00000007 (label) attr.
|
|
292
|
-
rc, out, _ = _run(["/usr/bin/security", "dump-keychain"])
|
|
262
|
+
rc, out, _ = _run(["/usr/bin/security", "dump-keychain", *_keychain()])
|
|
293
263
|
if rc != 0:
|
|
294
264
|
return []
|
|
295
265
|
labels: list[str] = []
|