@joshuafolkken/kit 1.1050.0 → 1.1128.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/.claude/settings.json +9 -8
- package/.claude/skills/epic-commands/SKILL.md +5 -7
- package/.claude/skills/workflow-commands/SKILL.md +20 -12
- package/.claude/skills/workflow-commands/background-commands.md +36 -84
- package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +8 -6
- package/.claude/skills/workflow-commands/backlogrun-progress.md +30 -33
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun.md +2 -2
- package/.claude/skills/workflow-commands/chain-rule.md +4 -2
- package/.claude/skills/workflow-commands/delegation.md +3 -3
- package/.claude/skills/workflow-commands/followup-reference.md +1 -1
- package/.claude/skills/workflow-commands/followup.md +7 -3
- package/.claude/skills/workflow-commands/fullrun-steps.md +3 -2
- package/.claude/skills/workflow-commands/fullrun.md +8 -6
- package/.claude/skills/workflow-commands/halfrun.md +19 -21
- package/.claude/skills/workflow-commands/issue-comments.md +1 -1
- package/.claude/skills/workflow-commands/issue-fold-existing.md +10 -10
- package/.claude/skills/workflow-commands/issue-scout.md +1 -1
- package/.claude/skills/workflow-commands/kickoff.md +9 -4
- package/.claude/skills/workflow-commands/latest-gate.md +8 -16
- package/.claude/skills/workflow-commands/needs-human-review.md +1 -1
- package/.claude/skills/workflow-commands/observation-filing.md +3 -3
- package/.claude/skills/workflow-commands/pre-gate-cut.md +4 -8
- package/.claude/skills/workflow-commands/prerequisite.md +1 -1
- package/.claude/skills/workflow-commands/prrun.md +36 -0
- package/.claude/skills/workflow-commands/retrospective.md +1 -1
- package/.claude/skills/workflow-commands/split-assessment.md +4 -18
- package/.claude/skills/workflow-commands/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-node/action.yml +33 -0
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/auto-tag.yml +2 -3
- package/.github/workflows/ci.yml +31 -134
- package/.github/workflows/dependabot-auto-merge.yml +1 -0
- package/.github/workflows/pr-classification.yml +6 -44
- package/.github/workflows/production.yml +1 -0
- package/.github/workflows/publish.yml +43 -47
- package/.github/workflows/sonar-qube.yml +41 -4
- package/.pnpmfile.mjs +29 -0
- package/AGENTS.md +5 -2
- package/CLAUDE.md +33 -27
- package/GEMINI.md +5 -2
- package/README.md +66 -20
- package/SECURITY.md +37 -6
- package/cspell/index.yaml +6 -1
- package/dist/CLAUDE.basic.md +6 -6
- package/dist/CLAUDE.md +33 -27
- package/dist/CLAUDE.static.md +6 -6
- package/dist/config-merge/index.js +48 -12
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-4JZDP5X5.js} +152 -155
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-5SD2YM7Z.js} +5 -13
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-77J7IEQM.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-7HVB7SZG.js} +3 -3
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-AIOIOMPX.js} +4413 -1970
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M7QKEKWO.js} +873 -2049
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-MKVGBQPA.js} +2 -2
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-NXYMNPUQ.js} +7 -88
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-QVLT52OV.js} +2 -7
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-XYUIQOW3.js} +2 -2
- package/dist/hooks/codex-hook-adapter.js +12 -48
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +280 -0
- package/dist/hooks/investigation-guard.js +5 -5
- package/dist/hooks/pretool-guard.js +9 -9
- package/dist/hooks/session-lang.js +0 -1
- package/dist/hooks/stop-guard.js +192 -333
- package/dist/josh.js +240 -148
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +70 -78
- package/eslint/rules/promise.js +5 -0
- package/eslint/rules/unicorn.js +3 -2
- package/package.json +26 -5
- package/pnpm-workspace.yaml +5 -7
- package/prompts/collaboration-workflow/glossary.md +17 -0
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/issue-template.md +1 -1
- package/prompts/collaboration-workflow/operating-rules.md +5 -5
- package/prompts/collaboration-workflow/overview.md +13 -1
- package/prompts/collaboration-workflow/principles.md +9 -0
- package/prompts/collaboration-workflow/report-format.md +1 -1
- package/prompts/collaboration-workflow/residency.md +3 -3
- package/prompts/collaboration-workflow/rule-delivery.md +1 -1
- package/prompts/collaboration-workflow/turn-batching.md +3 -3
- package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
- package/prompts/collaboration-workflow/wip-cap.md +25 -22
- package/prompts/collaboration-workflow.md +6 -8
- package/prompts/review-rubric.md +1 -1
- package/prompts/review.md +3 -3
- package/prompts/sonar-hotspot-handling.md +11 -3
- package/prompts/testing-guide.md +3 -3
- package/scripts/adopt/adopt-toolkits.ts +0 -2
- package/scripts/adopt/adopt.ts +0 -2
- package/scripts/agent/agent-argv.ts +0 -2
- package/scripts/agent/agent-diagnostics.ts +1 -1
- package/scripts/agent/agent-role-profile.ts +0 -7
- package/scripts/agent/claude-agent-argv.ts +0 -2
- package/scripts/agent/codex-agent-argv.ts +1 -1
- package/scripts/agent/codex-hooks.ts +92 -0
- package/scripts/agent/interactive-ask.ts +1 -1
- package/scripts/auto-ok/auto-ok-cli.ts +6 -16
- package/scripts/backlog/backlog-arrival.ts +30 -10
- package/scripts/backlog/backlog-budget-cli.ts +15 -16
- package/scripts/backlog/backlog-budget.ts +0 -2
- package/scripts/backlog/backlog-defect-priority.ts +2 -2
- package/scripts/backlog/backlog-drive-cli.ts +10 -8
- package/scripts/backlog/backlog-drive-named-offer.ts +16 -3
- package/scripts/backlog/backlog-drive-named.ts +2 -1
- package/scripts/backlog/backlog-drive.ts +76 -16
- package/scripts/backlog/backlog-named.ts +0 -3
- package/scripts/backlog/backlog-next.ts +9 -15
- package/scripts/backlog/backlog-offer-cli.ts +6 -19
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +30 -19
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +39 -10
- package/scripts/backlog/backlog-scope.ts +1 -3
- package/scripts/backlog/backlog-stalled-detect.ts +2 -2
- package/scripts/backlog/backlog-stalled.ts +0 -1
- package/scripts/backlog/backlog-waves.ts +5 -2
- package/scripts/behavior/behavior-cli.ts +1 -1
- package/scripts/build/build-codex-hooks.ts +26 -0
- package/scripts/build/build-hooks.ts +85 -9
- package/scripts/build/hook-bundle-stamp.ts +111 -0
- package/scripts/cases/cases-cli.ts +1 -1
- package/scripts/cases/cases-logic.ts +1 -1
- package/scripts/ci/composite-actions.ts +30 -0
- package/scripts/ci/pr-classification.ts +3 -3
- package/scripts/claude/workflow-destination.ts +10 -1
- package/scripts/clone/clone-fingerprint.ts +0 -1
- package/scripts/clone/clone-scan-cli.ts +1 -1
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/config-merge/json-format.ts +0 -1
- package/scripts/config-merge/parse-jsonc.ts +33 -3
- package/scripts/config-merge/patch-json-key.ts +13 -6
- package/scripts/config-merge/patch-yaml-list.ts +1 -1
- package/scripts/cost-runtime/codex-usage.ts +2 -9
- package/scripts/cost-runtime/cost-attribute.ts +0 -1
- package/scripts/cost-runtime/cost-cli.ts +3 -10
- package/scripts/cost-runtime/cost-corpus.ts +0 -2
- package/scripts/cost-runtime/cost-format.ts +0 -3
- package/scripts/cost-runtime/cost-pricing.ts +0 -1
- package/scripts/cost-runtime/cost-tokens.ts +0 -1
- package/scripts/delegation/delegation-cli.ts +1 -1
- package/scripts/delegation/delegation-policy.ts +0 -1
- package/scripts/delegation/duplicate-read-guard.ts +0 -8
- package/scripts/delegation/fanout-cli.ts +1 -1
- package/scripts/delegation/fanout.ts +0 -2
- package/scripts/delegation/investigation-reads.ts +1 -164
- package/scripts/discovery/repo-map-logic.ts +0 -1
- package/scripts/discovery/repo-party-cli.ts +1 -1
- package/scripts/doctor/doctor-consumer.ts +6 -10
- package/scripts/doctor/doctor-io.ts +9 -13
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/backlogrun-parent-read-set.ts +12 -1
- package/scripts/document/document-byte-budget.ts +5 -5
- package/scripts/document/document-byte-check.ts +0 -1
- package/scripts/document/document-read-cli.ts +0 -2
- package/scripts/document/document-section-cli.ts +1 -1
- package/scripts/document/document-section.ts +0 -3
- package/scripts/document/edit-files-cli.ts +0 -1
- package/scripts/document/entry-read-budget.ts +21 -7
- package/scripts/document/entry-read-set.ts +32 -8
- package/scripts/document/lane-child-read-set.ts +8 -6
- package/scripts/document/read-files-cli.ts +0 -4
- package/scripts/document/read-set-cli.ts +0 -2
- package/scripts/document/read-set-point-of-use.ts +9 -3
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +4 -2
- package/scripts/epic/epic-add.ts +1 -1
- package/scripts/epic/epic-audit-cli.ts +1 -4
- package/scripts/epic/epic-audit-orphans.ts +1 -3
- package/scripts/epic/epic-audit-rationale.ts +0 -1
- package/scripts/epic/epic-audit-report.ts +0 -2
- package/scripts/epic/epic-audit.ts +8 -22
- package/scripts/epic/epic-bundle-cli.ts +1 -1
- package/scripts/epic/epic-bundle-evidence.ts +0 -1
- package/scripts/epic/epic-bundle-referenced.ts +1 -5
- package/scripts/epic/epic-bundle.ts +0 -4
- package/scripts/epic/epic-busy.ts +4 -5
- package/scripts/epic/epic-candidate-confirm.ts +0 -5
- package/scripts/epic/epic-classify.ts +2 -2
- package/scripts/epic/epic-cli-argv.ts +0 -1
- package/scripts/epic/epic-close-comment.ts +1 -1
- package/scripts/epic/epic-close.ts +5 -2
- package/scripts/epic/epic-cross-repo.ts +2 -4
- package/scripts/epic/epic-decision.ts +0 -1
- package/scripts/epic/epic-fetch.ts +2 -2
- package/scripts/epic/epic-index.ts +2 -3
- package/scripts/epic/epic-issue.ts +1 -15
- package/scripts/epic/epic-lane-offer.ts +9 -8
- package/scripts/epic/epic-nested.ts +1 -1
- package/scripts/epic/epic-next-read.ts +1 -3
- package/scripts/epic/epic-next-views.ts +0 -1
- package/scripts/epic/epic-next.ts +1 -10
- package/scripts/epic/epic-parse.ts +0 -1
- package/scripts/epic/epic-promote.ts +0 -9
- package/scripts/epic/epic-rank.ts +2 -2
- package/scripts/epic/epic-read.ts +1 -2
- package/scripts/epic/epic-reconcile.ts +1 -1
- package/scripts/epic/epic-reference.ts +1 -13
- package/scripts/epic/epic-relation-recheck.ts +1 -1
- package/scripts/epic/epic-relations.ts +1 -1
- package/scripts/epic/epic-remove.ts +1 -1
- package/scripts/epic/epic-report.ts +0 -1
- package/scripts/epic/epic-run.ts +2 -3
- package/scripts/epic/epic-shape.ts +1 -1
- package/scripts/epic/epic-solo-stale.ts +107 -0
- package/scripts/epic/epic-solo.ts +3 -2
- package/scripts/epic/epic-triage.ts +1 -1
- package/scripts/epic/epic-validate.ts +1 -1
- package/scripts/epic/epic.ts +1 -1
- package/scripts/exports/unused-members-cli.ts +53 -0
- package/scripts/{git → followup}/followup-issue-number.ts +1 -6
- package/scripts/{git → followup}/git-followup-cleanup.ts +2 -1
- package/scripts/{git → followup}/git-followup-finish.ts +1 -3
- package/scripts/{git → followup}/git-followup-flush.ts +2 -2
- package/scripts/{git → followup}/git-followup-issue-close.ts +2 -2
- package/scripts/{git → followup}/git-followup-label.ts +4 -4
- package/scripts/followup/git-followup-merged.ts +112 -0
- package/scripts/{git → followup}/git-followup-pending.ts +1 -1
- package/scripts/{git → followup}/git-followup-workflow.ts +19 -11
- package/scripts/{git → followup}/git-pr-followup-wrapup.ts +9 -3
- package/scripts/{git → followup}/git-pr-followup.ts +53 -16
- package/scripts/gate/core-budget.ts +3 -9
- package/scripts/gate/gate-plan.ts +7 -4
- package/scripts/gate/gate-report.ts +0 -6
- package/scripts/gate/gate-tree.ts +1 -1
- package/scripts/gate/pre-commit-type-check.ts +0 -6
- package/scripts/gate/project-checks.ts +7 -8
- package/scripts/gate/scoped-green.ts +0 -1
- package/scripts/gate/type-check-step.ts +1 -1
- package/scripts/gate/verification-gate.ts +0 -2
- package/scripts/gh/fix-gh-packages.ts +15 -12
- package/scripts/gh/gh-spawn.ts +2 -2
- package/scripts/{git → gh}/git-ai-review-scan.ts +1 -5
- package/scripts/{git → gh}/git-gh-check.ts +2 -1
- package/scripts/{git → gh}/git-gh-exec.ts +1 -1
- package/scripts/{git → gh}/git-gh-failure.ts +1 -1
- package/scripts/{git → gh}/git-gh-helpers.ts +0 -1
- package/scripts/{git → gh}/git-gh-issue-list.ts +13 -10
- package/scripts/{git → gh}/git-gh-issue-read.ts +1 -1
- package/scripts/{git → gh}/git-gh-issue-rest.ts +6 -3
- package/scripts/{git → gh}/git-gh-issue-write.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-auto-merge.ts +4 -1
- package/scripts/{git → gh}/git-gh-pr-read.ts +24 -0
- package/scripts/{git → gh}/git-gh-pr-rest.ts +5 -2
- package/scripts/{git → gh}/git-gh-pr-review.ts +2 -2
- package/scripts/{git → gh}/git-gh-pr-rollup.ts +1 -3
- package/scripts/{git → gh}/git-gh-pr.ts +3 -1
- package/scripts/{git → gh}/git-pr-ai-review.ts +2 -5
- package/scripts/{git → gh}/git-pr-checks-eval.ts +0 -10
- package/scripts/{git → gh}/git-pr-checks-parse.ts +4 -20
- package/scripts/{git → gh}/git-pr-checks.ts +2 -1
- package/scripts/{git → gh}/git-pr-coderabbit.ts +2 -5
- package/scripts/{git → gh}/git-pr-confirmation.ts +1 -3
- package/scripts/{git → gh}/git-pr-managed-config.ts +2 -3
- package/scripts/{git → gh}/git-pr.ts +3 -3
- package/scripts/git/changed-file-scope.ts +0 -1
- package/scripts/git/git-branch.ts +3 -6
- package/scripts/git/git-command.ts +6 -1
- package/scripts/git/git-commit.ts +1 -1
- package/scripts/git/git-common-directory.ts +80 -24
- package/scripts/git/git-error.ts +66 -9
- package/scripts/git/git-issue.ts +1 -1
- package/scripts/git/git-preflight.ts +2 -2
- package/scripts/git/git-prompt.ts +6 -31
- package/scripts/git/git-push.ts +1 -1
- package/scripts/git/git-spawn-sync.ts +65 -0
- package/scripts/git/git-spawn.ts +5 -4
- package/scripts/git/git-staging.ts +1 -0
- package/scripts/git/git-status.ts +1 -1
- package/scripts/git/git-workflow.ts +1 -1
- package/scripts/git/gone-branch.ts +1 -0
- package/scripts/git/listing-cutoff.ts +1 -1
- package/scripts/git/main-merge.ts +1 -1
- package/scripts/git/main-sync.ts +19 -1
- package/scripts/git/parse-json-array.ts +0 -3
- package/scripts/git/repository-lock.ts +16 -16
- package/scripts/git/{git-stash.ts → stash/git-stash.ts} +1 -1
- package/scripts/git/{stash-pop-args.ts → stash/stash-pop-args.ts} +2 -7
- package/scripts/git/{stash-pop-cli.ts → stash/stash-pop-cli.ts} +0 -1
- package/scripts/git/{stash-sweep-lock.ts → stash/stash-sweep-lock.ts} +3 -3
- package/scripts/hooks/codex-hook-adapter.ts +0 -1
- package/scripts/hooks/edited-cspell.ts +1 -1
- package/scripts/hooks/format-edited-file.ts +2 -0
- package/scripts/hooks/pre-push-unit.ts +0 -4
- package/scripts/hooks/pretool-guard.ts +22 -4
- package/scripts/hooks/reserved-run.ts +1 -1
- package/scripts/hooks/step-zero-notice.ts +76 -0
- package/scripts/hooks/stop-guard.ts +47 -21
- package/scripts/init/claude-plugin-config.ts +4 -5
- package/scripts/init/hook-command-rewrite.ts +16 -8
- package/scripts/init/hook-launch.ts +41 -15
- package/scripts/init/init-basic.ts +2 -5
- package/scripts/init/init-file-action.ts +54 -0
- package/scripts/init/init-logic-migrate.ts +35 -17
- package/scripts/init/init-logic-secretlint.ts +1 -1
- package/scripts/init/init-logic.ts +10 -19
- package/scripts/init/init.ts +11 -71
- package/scripts/init/kit-written-paths.ts +2 -0
- package/scripts/init/project-profile.ts +9 -17
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +3 -1
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +64 -23
- package/scripts/issue/defect-rate.ts +1 -2
- package/scripts/{git → issue}/git-next-issues.ts +3 -3
- package/scripts/issue/issue-backlinks-cli.ts +1 -5
- package/scripts/issue/issue-backlinks.ts +7 -14
- package/scripts/issue/issue-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +12 -8
- package/scripts/issue/issue-classification.ts +1 -9
- package/scripts/issue/issue-closing-pr.ts +4 -4
- package/scripts/issue/issue-comment-cli.ts +2 -2
- package/scripts/issue/issue-file-cli.ts +5 -5
- package/scripts/issue/issue-file.ts +7 -14
- package/scripts/issue/issue-fold-cli.ts +1 -1
- package/scripts/issue/issue-fold-existing-cli.ts +1 -1
- package/scripts/{git → issue}/issue-labels.ts +8 -0
- package/scripts/issue/issue-lint-cli.ts +1 -1
- package/scripts/issue/issue-merged.ts +2 -2
- package/scripts/{git → issue}/issue-rank.ts +1 -1
- package/scripts/issue/issue-read-cli.ts +8 -47
- package/scripts/issue/issue-read.ts +0 -2
- package/scripts/issue/issue-report-failures.ts +80 -0
- package/scripts/issue/issue-scout-cli.ts +1 -7
- package/scripts/issue/issue-scout-closed.ts +2 -2
- package/scripts/issue/issue-scout.ts +0 -2
- package/scripts/issue/issue-state-cli.ts +5 -46
- package/scripts/issue/issue-state.ts +1 -5
- package/scripts/issue/markdown-section.ts +21 -6
- package/scripts/issue/measure-rerun-cli.ts +74 -15
- package/scripts/issue/reproduction-measure.ts +1 -1
- package/scripts/josh/cli-body.ts +1 -1
- package/scripts/josh/file-map-stamp.ts +0 -3
- package/scripts/josh/josh-command-map.ts +2 -0
- package/scripts/josh/josh-commands-ai.ts +9 -102
- package/scripts/josh/josh-commands-backlog.ts +5 -1
- package/scripts/josh/josh-commands-development.ts +8 -1
- package/scripts/josh/josh-commands-issue.ts +2 -2
- package/scripts/josh/josh-commands-maintenance.ts +7 -0
- package/scripts/josh/josh-commands-project.ts +7 -1
- package/scripts/josh/josh-commands-run.ts +114 -0
- package/scripts/josh/josh-commands-versioning.ts +8 -0
- package/scripts/josh/josh-commands-workflow.ts +3 -3
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/run-github-prerequisite.ts +3 -6
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +46 -19
- package/scripts/lane/lane-capacity.ts +6 -3
- package/scripts/lane/lane-child-invocation.ts +20 -7
- package/scripts/lane/lane-cli.ts +1 -4
- package/scripts/lane/lane-close.ts +5 -4
- package/scripts/lane/lane-dispatch.ts +3 -4
- package/scripts/lane/lane-environment.ts +0 -9
- package/scripts/lane/lane-handoff.ts +38 -0
- package/scripts/lane/lane-launch-cli.ts +31 -27
- package/scripts/lane/lane-open.ts +0 -3
- package/scripts/lane/lane-output.ts +0 -1
- package/scripts/lane/lane-registry.ts +9 -0
- package/scripts/lane/openai-lane-ship.ts +2 -0
- package/scripts/lane/openai-lane-supervisor-decision.ts +2 -1
- package/scripts/lane/openai-lane-supervisor.ts +6 -4
- package/scripts/lane/openai-review-broker.ts +7 -1
- package/scripts/lib/bounded-pool.ts +1 -0
- package/scripts/lib/cli-flags.ts +31 -2
- package/scripts/lib/error-message.ts +12 -1
- package/scripts/lib/json-value.ts +5 -4
- package/scripts/lib/poll.ts +3 -1
- package/scripts/lib/timed-fetch.ts +15 -0
- package/scripts/lib/timeouts.ts +13 -0
- package/scripts/{yaml → lib}/yaml-document.ts +3 -1
- package/scripts/{bytes → lines}/bytes-command.ts +0 -2
- package/scripts/lines/line-targets.ts +0 -11
- package/scripts/lines/lines-command.ts +5 -4
- package/scripts/lint/lint-related-scope.ts +0 -1
- package/scripts/lint/lint-related.ts +1 -1
- package/scripts/{git → notify}/telegram-notify.ts +2 -2
- package/scripts/{git → notify}/telegram-test.ts +4 -4
- package/scripts/observations/observation-ledger-home.ts +0 -1
- package/scripts/observations/observation-ledger-line.ts +0 -1
- package/scripts/observations/observation-ledger-migrate.ts +1 -1
- package/scripts/observations/observations-flush-landing.ts +3 -3
- package/scripts/observations/observations-flush.ts +2 -2
- package/scripts/overrides/lockfile-overrides.ts +1 -1
- package/scripts/overrides/overrides-logic.ts +1 -1
- package/scripts/package/package-scout-cli.ts +2 -7
- package/scripts/package/package-scout.ts +0 -2
- package/scripts/propagate/propagate-git-failure.ts +0 -1
- package/scripts/propagate/propagate-git.ts +3 -10
- package/scripts/propagate/propagate-publish.ts +2 -3
- package/scripts/propagate/propagate-run.ts +0 -2
- package/scripts/propagate/propagate-steps.ts +3 -5
- package/scripts/propagate/propagate-targets.ts +0 -4
- package/scripts/propagate/propagate.ts +0 -4
- package/scripts/refactor/import-graph.ts +0 -1
- package/scripts/refactor/refactor-lint.ts +0 -2
- package/scripts/refactor/refactor-scan.ts +2 -2
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +28 -21
- package/scripts/registry-migration/migrate.ts +25 -14
- package/scripts/release/github-release-cli.ts +19 -6
- package/scripts/release/github-release-environment.ts +46 -0
- package/scripts/release/github-release.ts +151 -94
- package/scripts/release/release-history.ts +0 -1
- package/scripts/release/release-plan.ts +0 -1
- package/scripts/release/release-publish.ts +38 -5
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- package/scripts/release/release-worktree.ts +97 -2
- package/scripts/repo/auto-merge-setting-logic.ts +1 -4
- package/scripts/repo/repo-setting.ts +1 -1
- package/scripts/repo/repository-labels.ts +3 -3
- package/scripts/repo/required-checks-logic.ts +206 -0
- package/scripts/repo/required-checks-report.ts +71 -0
- package/scripts/repo/ruleset-check-cli.ts +53 -0
- package/scripts/repo/ruleset-check.ts +147 -0
- package/scripts/report/report-lint-cli.ts +0 -4
- package/scripts/review/disposition-cli.ts +1 -1
- package/scripts/review/live-evidence.ts +1 -1
- package/scripts/review/review-attest-cli.ts +0 -6
- package/scripts/review/review-attest.ts +4 -16
- package/scripts/review/review-brief-cli.ts +23 -6
- package/scripts/review/review-brief.ts +21 -8
- package/scripts/review/review-checkout.ts +3 -2
- package/scripts/review/review-diff-parts.ts +89 -0
- package/scripts/review/review-diff-write.ts +97 -0
- package/scripts/review/review-finding-ledger.ts +0 -1
- package/scripts/review/review-record-cli.ts +10 -17
- package/scripts/review/review-record.ts +0 -1
- package/scripts/review/review-round2-cli.ts +1 -1
- package/scripts/review/review-stamps.ts +0 -3
- package/scripts/review/review-tree.ts +14 -2
- package/scripts/rules/decision-oracle-stage.ts +18 -0
- package/scripts/rules/decision-oracle.ts +10 -7
- package/scripts/rules/delivered-rules.ts +9 -1
- package/scripts/rules/destructive-command.ts +119 -0
- package/scripts/rules/direct-filing.ts +1 -1
- package/scripts/rules/early-heartbeat.ts +4 -3
- package/scripts/rules/file-body.ts +0 -3
- package/scripts/rules/filing-cap.ts +0 -2
- package/scripts/rules/gh-api.ts +7 -2
- package/scripts/rules/git-argv.ts +18 -7
- package/scripts/rules/git-force.ts +0 -2
- package/scripts/rules/implementation-cut.ts +0 -1
- package/scripts/rules/index-guard.ts +71 -0
- package/scripts/rules/issue-citation.ts +50 -25
- package/scripts/rules/lane-background.ts +15 -7
- package/scripts/rules/lane-park.ts +22 -6
- package/scripts/rules/last-prompt.ts +1 -0
- package/scripts/rules/oracle-consulted.ts +1 -1
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +0 -3
- package/scripts/rules/permission-guards.ts +14 -0
- package/scripts/rules/protected-files.ts +74 -0
- package/scripts/rules/reply-language.ts +1 -1
- package/scripts/rules/rule-body-guard.ts +0 -3
- package/scripts/rules/rule-value-cli.ts +0 -1
- package/scripts/rules/shell-body-trigger.ts +0 -1
- package/scripts/rules/shell-segments.ts +0 -1
- package/scripts/rules/stop-rules.ts +20 -9
- package/scripts/rules/tail-commands.ts +1 -1
- package/scripts/rules/test-declared-commit.ts +1 -1
- package/scripts/rules/third-party-write.ts +0 -1
- package/scripts/rules/worktree-guard.ts +26 -9
- package/scripts/run/run-carry-args.ts +8 -12
- package/scripts/run/run-carry-cli.ts +0 -2
- package/scripts/run/run-carry-stash.ts +2 -2
- package/scripts/run/run-carry-streak.ts +1 -1
- package/scripts/run/run-cut-args.ts +1 -6
- package/scripts/run/run-cut-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +2 -6
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +133 -25
- package/scripts/run/run-entry-stop.ts +104 -0
- package/scripts/run/run-entry.ts +0 -1
- package/scripts/run/run-event-cli.ts +0 -2
- package/scripts/run/run-event-follow.ts +1 -0
- package/scripts/run/run-event-render.ts +1 -1
- package/scripts/run/run-event-scope.ts +53 -4
- package/scripts/run/run-event-stream-emit.ts +7 -2
- package/scripts/run/run-event-stream.ts +0 -3
- package/scripts/run/run-event-watch.ts +1 -0
- package/scripts/run/run-halfrun-resume.ts +20 -7
- package/scripts/run/run-headless.ts +2 -2
- package/scripts/run/run-hold-cli.ts +33 -10
- package/scripts/run/run-hold.ts +29 -6
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +2 -6
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +7 -23
- package/scripts/run/run-merge-steps.ts +5 -5
- package/scripts/run/run-merge.ts +1 -1
- package/scripts/run/run-next-cli.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +4 -2
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +6 -3
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-args.ts +20 -4
- package/scripts/run/run-progress-cli.ts +35 -36
- package/scripts/run/run-progress-clock.ts +10 -35
- package/scripts/run/run-progress-config.ts +0 -4
- package/scripts/run/run-progress-read.ts +1 -2
- package/scripts/run/run-progress.ts +1 -2
- package/scripts/run/run-prrun-resume.ts +117 -0
- package/scripts/run/run-report-cli.ts +1 -2
- package/scripts/run/run-report.ts +0 -1
- package/scripts/run/run-retrospective.ts +1 -1
- package/scripts/run/run-review-cli.ts +0 -3
- package/scripts/run/run-review-steps.ts +2 -0
- package/scripts/run/run-review.ts +0 -2
- package/scripts/run/run-ship-cli.ts +29 -19
- package/scripts/run/run-ship-detach.ts +1 -0
- package/scripts/run/run-ship-next.ts +106 -0
- package/scripts/run/run-ship-preflight.ts +1 -1
- package/scripts/run/run-ship-probe.ts +4 -1
- package/scripts/run/run-ship-return.ts +8 -3
- package/scripts/run/run-ship-review-steps.ts +18 -4
- package/scripts/run/run-ship-review.ts +11 -0
- package/scripts/run/run-ship-scoped.ts +1 -0
- package/scripts/run/run-ship-steps.ts +1 -1
- package/scripts/run/run-ship.ts +0 -1
- package/scripts/run/run-stage-read.ts +62 -0
- package/scripts/run/run-stage.ts +160 -0
- package/scripts/run/run-status-cli.ts +3 -16
- package/scripts/run/run-step-cli.ts +21 -14
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stop-notify.ts +1 -3
- package/scripts/run/run-stranded-cli.ts +0 -4
- package/scripts/run/run-stranded-detect.ts +2 -2
- package/scripts/run/run-tail-cli.ts +17 -11
- package/scripts/run/run-tail.ts +2 -0
- package/scripts/run/run-tidy-lanes.ts +6 -2
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +4 -13
- package/scripts/run/run-wake-loop.ts +2 -2
- package/scripts/run/run-wake.ts +2 -4
- package/scripts/run/run-watcher-guard-cli.ts +0 -4
- package/scripts/run/run-watcher-guard.ts +18 -12
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- package/scripts/safe-chain/pack-hook.ts +92 -0
- package/scripts/safe-chain/project-config.ts +1 -1
- package/scripts/security/security-audit-provision-logic.ts +0 -1
- package/scripts/security/security-audit-provision.ts +3 -2
- package/scripts/security/security-audit.ts +0 -1
- package/scripts/security/security-updates-logic.ts +0 -1
- package/scripts/sonar/sonar-hotspots-cli.ts +10 -52
- package/scripts/sonar/sonar-hotspots.ts +0 -1
- package/scripts/sonar/sonar-new-code-cli.ts +150 -0
- package/scripts/sonar/sonar-new-code.ts +79 -0
- package/scripts/sonar/sonar-project.ts +97 -0
- package/scripts/split/split-assess-cli.ts +1 -1
- package/scripts/split/split-assess.ts +2 -5
- package/scripts/sync/managed-config-scope-cli.ts +1 -1
- package/scripts/sync/skill-migration.ts +0 -1
- package/scripts/sync/sync-ai-files.ts +4 -0
- package/scripts/sync/sync-hook-safety.ts +2 -3
- package/scripts/sync/sync.ts +1 -8
- package/scripts/sync/template-source-logic.ts +0 -1
- package/scripts/sync/workflow-pin-logic.ts +16 -28
- package/scripts/test/test-declared-changed.ts +13 -16
- package/scripts/test/test-declared-logic.ts +0 -1
- package/scripts/test/test-declared.ts +3 -9
- package/scripts/test/test-red-commit.ts +2 -2
- package/scripts/test/test-red.ts +14 -7
- package/scripts/test/test-type-logic.ts +1 -1
- package/scripts/test/unit-worker-share.ts +7 -16
- package/scripts/time-runtime/time-batch-guard.ts +1 -2
- package/scripts/time-runtime/time-bundle-call.ts +0 -1
- package/scripts/time-runtime/time-bundles.ts +0 -4
- package/scripts/time-runtime/time-density-hook.ts +0 -2
- package/scripts/time-runtime/time-followup-stage.ts +1 -1
- package/scripts/time-runtime/time-format.ts +0 -73
- package/scripts/time-runtime/time-round-trips.ts +0 -4
- package/scripts/time-runtime/time-single-check.ts +1 -1
- package/scripts/time-runtime/time-spans.ts +1 -1
- package/scripts/time-runtime/time-transcript-line.ts +1 -2
- package/scripts/ui/ui-routes-cli.ts +0 -5
- package/scripts/ui/ui-routes.ts +0 -5
- package/scripts/version/effective-upstream.ts +2 -2
- package/scripts/version/latest-corepack.ts +7 -9
- package/scripts/version/latest-scope-cli.ts +0 -2
- package/scripts/version/latest-update.ts +0 -2
- package/scripts/version/npm-registry.ts +2 -2
- package/scripts/version/publishable-range-check.ts +1 -1
- package/scripts/version/release-hold.ts +0 -4
- package/scripts/version/running-binary.ts +2 -2
- package/scripts/version/version-check-logic.ts +0 -2
- package/scripts/version/version-commands.ts +11 -1
- package/scripts/version/version-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/CLAUDE.basic.md +6 -6
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/ci.yml +16 -82
- package/templates/workflows/dependabot-auto-merge.yml +6 -3
- package/templates/workflows/github-release.yml +79 -0
- package/tsconfig.sonar.json +4 -22
- package/prompts/collaboration-workflow/cross-repo-epic.md +0 -5
- package/prompts/collaboration-workflow/epic-audit.md +0 -5
- package/prompts/collaboration-workflow/epic-bundle.md +0 -5
- package/scripts/init/plugin-install-hint.ts +0 -47
- package/scripts/version/parse-json.ts +0 -13
- /package/scripts/{git → followup}/git-followup-stages.ts +0 -0
- /package/scripts/{git → gh}/git-gh-api-path.ts +0 -0
- /package/scripts/{git → gh}/git-gh-command.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-snapshot.ts +0 -0
- /package/scripts/{git → gh}/git-gh-reachability.ts +0 -0
- /package/scripts/{git → gh}/git-gh-repo.ts +0 -0
- /package/scripts/{git → gh}/git-gh-rest-state.ts +0 -0
- /package/scripts/{git → gh}/git-pr-checks-watch.ts +0 -0
- /package/scripts/{git → gh}/git-pr-error.ts +0 -0
- /package/scripts/{git → gh}/git-pr-messages.ts +0 -0
- /package/scripts/{git → gh}/github-issue-url.ts +0 -0
- /package/scripts/git/{stash-orphans.ts → stash/stash-orphans.ts} +0 -0
- /package/scripts/{git → issue}/issue-reference.ts +0 -0
- /package/scripts/{git → lib}/animation-helpers.ts +0 -0
- /package/scripts/{git → lib}/git-animation.ts +0 -0
- /package/scripts/{git → notify}/git-notify.ts +0 -0
- /package/scripts/{git → notify}/telegram-test-logic.ts +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { telegram_notify } from '#scripts/
|
|
1
|
+
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
2
2
|
import { run_carry, type CarryRead, type RunCarry } from './run-carry'
|
|
3
3
|
import { run_event_stream } from './run-event-stream'
|
|
4
4
|
import { run_event_stream_emit } from './run-event-stream-emit'
|
|
@@ -128,7 +128,7 @@ async function run_stranded_check(): Promise<void> {
|
|
|
128
128
|
}
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
-
const run_stranded_detect = {
|
|
131
|
+
const run_stranded_detect = { detect_and_report, run_stranded_check }
|
|
132
132
|
|
|
133
133
|
export { run_stranded_detect }
|
|
134
134
|
export type { DetectPorts, RecordTargets }
|
|
@@ -22,7 +22,6 @@ import { run_tail, type TailSection } from './run-tail'
|
|
|
22
22
|
// step for a line written on the default branch outside any issue's run.
|
|
23
23
|
|
|
24
24
|
const ARGV_OFFSET = 2
|
|
25
|
-
const SUCCESS_EXIT_CODE = 0
|
|
26
25
|
const FAILURE_EXIT_CODE = 1
|
|
27
26
|
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
28
27
|
const USAGE = 'Usage: josh run:tail [<issue-number> ...]'
|
|
@@ -33,21 +32,27 @@ interface Step {
|
|
|
33
32
|
argv: (issues: ReadonlyArray<string>) => ReadonlyArray<string>
|
|
34
33
|
}
|
|
35
34
|
|
|
36
|
-
// The steps in the order a run closes on:
|
|
37
|
-
// (joshuafolkken/kit#2763) is committed
|
|
38
|
-
// flush answers `clean` — the citations are read for the completion report, and
|
|
39
|
-
// decided last.
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
35
|
+
// The steps in the order a run closes on: the checkout returns to the default branch, any ledger line
|
|
36
|
+
// the run's own commit did not carry (joshuafolkken/kit#2763) is committed so the recurrence count is on
|
|
37
|
+
// main — on most runs the flush answers `clean` — the citations are read for the completion report, and
|
|
38
|
+
// the release scope is decided last.
|
|
39
|
+
//
|
|
40
|
+
// **The return comes first because the flush refuses anywhere else** (joshuafolkken/kit#2979). A run
|
|
41
|
+
// closes right after its merge, still on the feature branch it shipped from, and `josh ship` reaches
|
|
42
|
+
// this report with nothing in between — so the flush stopped a merged run as failed. `main:sync` is the
|
|
43
|
+
// step a person used to type after the fact; it fast-forwards the local default branch before the
|
|
44
|
+
// checkout, so a ledger line appended after the merge is carried along rather than refused.
|
|
45
|
+
const LEDGER_STEPS: ReadonlyArray<Step> = [
|
|
46
|
+
{ header: run_tail.SYNC_HEADER, argv: () => ['main:sync'] },
|
|
47
|
+
{ header: run_tail.OBSERVATIONS_HEADER, argv: () => ['observations:flush'] },
|
|
48
|
+
]
|
|
44
49
|
const REPORT_STEPS: ReadonlyArray<Step> = [
|
|
45
50
|
{ header: run_tail.CITATIONS_HEADER, argv: (issues) => ['issue:cite', ...issues] },
|
|
46
51
|
{ header: run_tail.RELEASE_HEADER, argv: () => ['release:scope'] },
|
|
47
52
|
]
|
|
48
53
|
|
|
49
54
|
function steps_for(is_lane_child: boolean): ReadonlyArray<Step> {
|
|
50
|
-
return is_lane_child ? REPORT_STEPS : [
|
|
55
|
+
return is_lane_child ? REPORT_STEPS : [...LEDGER_STEPS, ...REPORT_STEPS]
|
|
51
56
|
}
|
|
52
57
|
|
|
53
58
|
// Numbers only — a target `issue:cite` reads as an issue, so a stray flag is refused rather than
|
|
@@ -75,6 +80,7 @@ async function close_run(issues: ReadonlyArray<string>): Promise<ReadonlyArray<T
|
|
|
75
80
|
|
|
76
81
|
const is_lane_child = lane_child_marker.is_child_of(process.cwd())
|
|
77
82
|
|
|
83
|
+
// eslint-disable-next-line no-await-in-loop -- the tail steps run in their declared order
|
|
78
84
|
for (const step of steps_for(is_lane_child)) sections.push(await run_step(step, issues))
|
|
79
85
|
|
|
80
86
|
return sections
|
|
@@ -100,7 +106,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
100
106
|
process.exitCode = await run(argv)
|
|
101
107
|
}
|
|
102
108
|
|
|
103
|
-
const run_tail_cli = {
|
|
109
|
+
const run_tail_cli = { run }
|
|
104
110
|
|
|
105
111
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
106
112
|
|
package/scripts/run/run-tail.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// each step's output under a header and answers the exit code from the collected codes, so a test pins
|
|
10
10
|
// the composite without a ledger ever being committed or a release ever read.
|
|
11
11
|
|
|
12
|
+
const SYNC_HEADER = '=== sync ==='
|
|
12
13
|
const OBSERVATIONS_HEADER = '=== observations ==='
|
|
13
14
|
const CITATIONS_HEADER = '=== citations ==='
|
|
14
15
|
const RELEASE_HEADER = '=== release ==='
|
|
@@ -52,6 +53,7 @@ const run_tail = {
|
|
|
52
53
|
CITATIONS_HEADER,
|
|
53
54
|
OBSERVATIONS_HEADER,
|
|
54
55
|
RELEASE_HEADER,
|
|
56
|
+
SYNC_HEADER,
|
|
55
57
|
exit_code,
|
|
56
58
|
format_report,
|
|
57
59
|
section_body,
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { git_spawn } from '#scripts/git/git-spawn'
|
|
2
|
-
import { git_stash } from '#scripts/git/git-stash'
|
|
2
|
+
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
3
3
|
import { lane_close } from '#scripts/lane/lane-close'
|
|
4
4
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
5
|
+
import { error_text } from '#scripts/lib/error-message'
|
|
5
6
|
import { run_hold } from './run-hold'
|
|
6
7
|
import { run_tidy, type Outcome, type Verdict } from './run-tidy'
|
|
7
8
|
|
|
@@ -31,7 +32,9 @@ async function has_unpushed(directory: string): Promise<boolean> {
|
|
|
31
32
|
])
|
|
32
33
|
|
|
33
34
|
return count !== '0'
|
|
34
|
-
} catch {
|
|
35
|
+
} catch (error) {
|
|
36
|
+
error_text.trace_swallowed('run_tidy_lanes.has_unpushed', error)
|
|
37
|
+
|
|
35
38
|
return true
|
|
36
39
|
}
|
|
37
40
|
}
|
|
@@ -96,6 +99,7 @@ async function tidy_lanes(is_merged: IsMerged): Promise<Array<Outcome>> {
|
|
|
96
99
|
const lanes = await lane_registry.list_lanes()
|
|
97
100
|
|
|
98
101
|
for (const lane of lanes) {
|
|
102
|
+
// eslint-disable-next-line no-await-in-loop -- a close prunes the worktree list the next one reads
|
|
99
103
|
const outcome = await tidy_lane(lane, is_merged)
|
|
100
104
|
|
|
101
105
|
if (outcome !== undefined) outcomes.push(outcome)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { git_stash, type StashEntry } from '#scripts/git/git-stash'
|
|
2
|
-
import { stash_orphans } from '#scripts/git/stash-orphans'
|
|
3
|
-
import { stash_sweep_lock } from '#scripts/git/stash-sweep-lock'
|
|
1
|
+
import { git_stash, type StashEntry } from '#scripts/git/stash/git-stash'
|
|
2
|
+
import { stash_orphans } from '#scripts/git/stash/stash-orphans'
|
|
3
|
+
import { stash_sweep_lock } from '#scripts/git/stash/stash-sweep-lock'
|
|
4
4
|
import { bounded_pool } from '#scripts/lib/bounded-pool'
|
|
5
5
|
import { observation_ledger } from '#scripts/observations/observation-ledger'
|
|
6
6
|
import { observation_ledger_home } from '#scripts/observations/observation-ledger-home'
|
|
@@ -18,20 +18,19 @@ const GONE_REASON = 'already dropped by another run'
|
|
|
18
18
|
const BUSY_REASON = 'another run held the stash sweep lock'
|
|
19
19
|
|
|
20
20
|
// An entry cut before joshuafolkken/kit#2919 holds its lines at an old single-file path, so the lines
|
|
21
|
-
// of every ledger path it touches are carried to the current ledger.
|
|
21
|
+
// of every ledger path it touches are carried to the current ledger. The reads are independent, and the
|
|
22
|
+
// lines come back in path order however the reads finish.
|
|
22
23
|
async function added_ledger_lines(
|
|
23
24
|
hash: string,
|
|
24
25
|
ledger_paths: ReadonlyArray<string>,
|
|
25
26
|
): Promise<Array<string>> {
|
|
26
|
-
const added
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
added.push(...lines)
|
|
32
|
-
}
|
|
27
|
+
const added = await bounded_pool.bounded_map(
|
|
28
|
+
ledger_paths,
|
|
29
|
+
READ_CONCURRENCY,
|
|
30
|
+
async (ledger_path) => await git_stash.added_lines(hash, ledger_path),
|
|
31
|
+
)
|
|
33
32
|
|
|
34
|
-
return added
|
|
33
|
+
return added.flat()
|
|
35
34
|
}
|
|
36
35
|
|
|
37
36
|
// How many ledger lines went into the running work tree's ledger before the drop. The duplicate check
|
|
@@ -107,6 +106,7 @@ async function tidy_entries(
|
|
|
107
106
|
const outcomes: Array<Outcome> = []
|
|
108
107
|
|
|
109
108
|
for (const entry of entries) {
|
|
109
|
+
// eslint-disable-next-line no-await-in-loop -- drops shift the stash stack and append to the same ledger
|
|
110
110
|
const outcome = await tidy_entry(entry, merged)
|
|
111
111
|
|
|
112
112
|
if (outcome !== undefined) outcomes.push(outcome)
|
|
@@ -3,8 +3,8 @@ import { randomUUID } from 'node:crypto'
|
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { fileURLToPath } from 'node:url'
|
|
5
5
|
import type { AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
6
|
-
import { telegram_notify } from '#scripts/git/telegram-notify'
|
|
7
6
|
import { cli_flags } from '#scripts/lib/cli-flags'
|
|
7
|
+
import { telegram_notify } from '#scripts/notify/telegram-notify'
|
|
8
8
|
import { run_carry, type CarryRead } from './run-carry'
|
|
9
9
|
import { run_event_stream } from './run-event-stream'
|
|
10
10
|
import { run_headless } from './run-headless'
|
|
@@ -119,14 +119,6 @@ function note_to_stderr(note: string): void {
|
|
|
119
119
|
console.error(`wake: ${note}`)
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
-
function read_arguments(argv: ReadonlyArray<string>): ParsedValues | undefined {
|
|
123
|
-
return cli_flags.parse_or_undefined({ args: [...argv], options: OPTIONS, strict: true })?.values
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function text_of(value: string | boolean | undefined): string | undefined {
|
|
127
|
-
return typeof value === 'string' ? value : undefined
|
|
128
|
-
}
|
|
129
|
-
|
|
130
122
|
function to_interval_ms(value: string | boolean | undefined): number | undefined {
|
|
131
123
|
if (typeof value !== 'string') return DEFAULT_INTERVAL_SECONDS * MS_PER_SECOND
|
|
132
124
|
if (!INTERVAL_PATTERN.test(value)) return undefined
|
|
@@ -226,7 +218,7 @@ async function warn_of_stop(stop: LoopStop, body: string, context: WakeContext):
|
|
|
226
218
|
}
|
|
227
219
|
|
|
228
220
|
// **Only a failed wake exits non-zero, and the two reasons that newly warn do not**
|
|
229
|
-
// (joshuafolkken/kit#1746). The verdict-and-exit-code table in `docs/josh-commands.md` is a contract
|
|
221
|
+
// (joshuafolkken/kit#1746). The verdict-and-exit-code table in `docs/josh-commands-automation.md` is a contract
|
|
230
222
|
// callers branch on; what `expired` and `unreadable` were missing is the notification, not a different
|
|
231
223
|
// exit code, and changing both at once would break a caller to fix a silence.
|
|
232
224
|
function exit_code_of(reason: WakeStopReason): number {
|
|
@@ -379,14 +371,14 @@ async function dispatch(
|
|
|
379
371
|
interval_ms: number,
|
|
380
372
|
): Promise<number> {
|
|
381
373
|
if (values.loop === true) return await loop(context, interval_ms)
|
|
382
|
-
if (values.start === true) return start(context,
|
|
374
|
+
if (values.start === true) return start(context, cli_flags.string_of(values.interval))
|
|
383
375
|
if (values.stop === true) return stop_supervisor(context)
|
|
384
376
|
|
|
385
377
|
return list(context)
|
|
386
378
|
}
|
|
387
379
|
|
|
388
380
|
async function run(argv: ReadonlyArray<string>): Promise<number> {
|
|
389
|
-
const values =
|
|
381
|
+
const values = cli_flags.values_of(argv, OPTIONS)
|
|
390
382
|
|
|
391
383
|
if (values === undefined || group_count(values) !== ONE_GROUP) return usage()
|
|
392
384
|
|
|
@@ -410,7 +402,6 @@ const run_wake_cli = {
|
|
|
410
402
|
NONE_VERDICT,
|
|
411
403
|
RUNNING_VERDICT,
|
|
412
404
|
STALE_VERDICT,
|
|
413
|
-
STARTED_VERDICT,
|
|
414
405
|
STOPPED_VERDICT,
|
|
415
406
|
SUPERVISING_VERDICT,
|
|
416
407
|
UNKNOWN_VERDICT,
|
|
@@ -199,10 +199,12 @@ async function run_loop(target: string, ports: LoopPorts, interval_ms: number):
|
|
|
199
199
|
let wake = run_wake.read_own_wake(target)
|
|
200
200
|
|
|
201
201
|
while (wake !== undefined) {
|
|
202
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
202
203
|
const stop = await run_pass(target, wake, ports)
|
|
203
204
|
|
|
204
205
|
if (stop !== undefined) return stop
|
|
205
206
|
|
|
207
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
206
208
|
await ports.sleep(next_interval(run_wake.read_own_wake(target), interval_ms, ports.now()))
|
|
207
209
|
wake = run_wake.read_own_wake(target)
|
|
208
210
|
}
|
|
@@ -213,10 +215,8 @@ async function run_loop(target: string, ports: LoopPorts, interval_ms: number):
|
|
|
213
215
|
const run_wake_loop = {
|
|
214
216
|
FAILED_REASON,
|
|
215
217
|
MAX_BACKOFF_FACTOR,
|
|
216
|
-
STOPPED_REASON,
|
|
217
218
|
next_interval,
|
|
218
219
|
run_loop,
|
|
219
|
-
step,
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
export type { DriveResult, LoopPorts, LoopStop }
|
package/scripts/run/run-wake.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
2
2
|
import { backlog_budget } from '#scripts/backlog/backlog-budget'
|
|
3
3
|
import { process_identity } from '#scripts/josh/process-identity'
|
|
4
|
+
import { process_owner_schema } from '#scripts/josh/process-owner'
|
|
4
5
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
5
6
|
import { z } from 'zod'
|
|
6
7
|
import type { CarryRead } from './run-carry'
|
|
@@ -209,11 +210,9 @@ const STOP_REASONS: Record<'none' | 'expired' | 'unreadable', WakeStopReason> =
|
|
|
209
210
|
unreadable: 'unreadable',
|
|
210
211
|
}
|
|
211
212
|
|
|
212
|
-
const run_wake_schema =
|
|
213
|
+
const run_wake_schema = process_owner_schema.extend({
|
|
213
214
|
invocation: z.string(),
|
|
214
215
|
started_at: z.string(),
|
|
215
|
-
pid: z.number(),
|
|
216
|
-
process_start: z.string().optional(),
|
|
217
216
|
woke: z.number(),
|
|
218
217
|
woke_at: z.string().optional(),
|
|
219
218
|
// **Every optional field of `RunWake` has to be listed here.** `z.object` strips what it does not
|
|
@@ -583,7 +582,6 @@ const run_wake = {
|
|
|
583
582
|
IDLE_CEILING_MS,
|
|
584
583
|
MAX_WAKE_ATTEMPTS,
|
|
585
584
|
WAKE_GRACE_MS,
|
|
586
|
-
WAKE_PREFIX,
|
|
587
585
|
claim,
|
|
588
586
|
count_claim,
|
|
589
587
|
count_wake,
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
2
|
+
import { run_headless } from './run-headless'
|
|
2
3
|
import { run_progress_clock } from './run-progress-clock'
|
|
3
4
|
|
|
4
|
-
// A watcher that stopped while children are still in-flight leaves the
|
|
5
|
-
//
|
|
6
|
-
// calls that follow a missed restart (joshuafolkken/kit#2113).
|
|
5
|
+
// A watcher that stopped while children are still in-flight leaves the run's event stream without a
|
|
6
|
+
// heartbeat and the parent without the wake an arrival would deliver. This guard detects that state so
|
|
7
|
+
// a hook can refuse the calls that follow a missed restart (joshuafolkken/kit#2113).
|
|
7
8
|
//
|
|
8
9
|
// **Staleness threshold is `TICK_MULTIPLIER` watcher ticks.** The watcher pings its life record on
|
|
9
10
|
// every tick (every 30 s), so a gap wider than three ticks means the process has almost certainly
|
|
10
|
-
// stopped:
|
|
11
|
+
// stopped: it exited on an arrival, its bound expired, or the session was cut without a restart. A
|
|
12
|
+
// report is no longer one of those (joshuafolkken/kit#3102) — `--wait` streams its reports and keeps
|
|
13
|
+
// running — so a restart is owed only after an exit the parent was woken for. Three gives one missed
|
|
11
14
|
// tick of slack before the guard fires.
|
|
12
15
|
//
|
|
13
16
|
// **It watches no relay** (joshuafolkken/kit#2492). A session following the run's event stream after a
|
|
@@ -23,25 +26,29 @@ const STALE_THRESHOLD_S = STALE_THRESHOLD_MS / MS_PER_SECOND
|
|
|
23
26
|
|
|
24
27
|
const STALE_NOTE =
|
|
25
28
|
`Lane children are in-flight but the progress watcher has not pinged in the last ` +
|
|
26
|
-
`${String(STALE_THRESHOLD_S)}s — run \`pnpm josh run:progress --wait\` in the background before proceeding`
|
|
29
|
+
`${String(STALE_THRESHOLD_S)}s — run \`pnpm josh run:progress --wait\` in the background before proceeding. ` +
|
|
30
|
+
'It reports to the run event stream on its own and exits only when newly runnable work arrives, so ' +
|
|
31
|
+
'start it once and relay nothing'
|
|
27
32
|
|
|
28
33
|
type GuardResult = { kind: 'ok' } | { kind: 'stale'; note: string }
|
|
29
34
|
|
|
30
35
|
const OK_RESULT: GuardResult = { kind: 'ok' }
|
|
31
36
|
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
// **Only the run that opened the lanes owes them a watcher** (joshuafolkken/kit#2965). The lane listing
|
|
38
|
+
// is machine-wide, so a session with no run of its own — an investigation, a `fullrun` beside a batch —
|
|
39
|
+
// used to be refused for another run's lanes. The session that drives the live `backlogrun` carry
|
|
40
|
+
// record is the one that dispatched them; every other session passes.
|
|
41
|
+
async function owes_watcher(): Promise<boolean> {
|
|
42
|
+
if (!(await run_headless.is_backlog_parent())) return false
|
|
36
43
|
|
|
37
|
-
return
|
|
44
|
+
return await lane_registry.has_lanes_in_flight()
|
|
38
45
|
}
|
|
39
46
|
|
|
40
47
|
// `life_target` is the path returned by `run_progress_read.stamp_target()` or
|
|
41
48
|
// `run_progress_clock.life_target_of(git_directory)`. Passed in rather than resolved here so the
|
|
42
49
|
// caller can use whichever resolution fits its sync/async context.
|
|
43
50
|
async function check(life_target: string): Promise<GuardResult> {
|
|
44
|
-
if (!(await
|
|
51
|
+
if (!(await owes_watcher())) return OK_RESULT
|
|
45
52
|
|
|
46
53
|
if (run_progress_clock.is_life_fresh(life_target, STALE_THRESHOLD_MS)) return OK_RESULT
|
|
47
54
|
|
|
@@ -52,7 +59,6 @@ const run_watcher_guard = {
|
|
|
52
59
|
STALE_NOTE,
|
|
53
60
|
STALE_THRESHOLD_MS,
|
|
54
61
|
check,
|
|
55
|
-
has_lanes_in_flight,
|
|
56
62
|
}
|
|
57
63
|
|
|
58
64
|
export type { GuardResult }
|
|
@@ -81,6 +81,6 @@ async function watcher_hook_reason(
|
|
|
81
81
|
return await stale_reason(transcript, now_ms)
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
const run_watcher_hook = {
|
|
84
|
+
const run_watcher_hook = { transcript_of, watcher_hook_reason }
|
|
85
85
|
|
|
86
86
|
export { run_watcher_hook }
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto'
|
|
2
2
|
import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs'
|
|
3
|
+
import { composite_actions } from '#scripts/ci/composite-actions'
|
|
3
4
|
import { execaSync } from 'execa'
|
|
4
5
|
|
|
5
6
|
// Where the workflows that install safe-chain on the runner live. Each carries the release and the
|
|
@@ -25,13 +26,18 @@ function installer_url(version: string): string {
|
|
|
25
26
|
return `https://github.com/AikidoSec/safe-chain/releases/download/${version}/install-safe-chain.sh`
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
// The local composite actions follow the workflows: kit's own pin lives in
|
|
30
|
+
// `.github/actions/setup-pnpm`, which every kit workflow installs through (joshuafolkken/kit#2982).
|
|
28
31
|
function list_workflows(): Array<string> {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
const workflows = WORKFLOW_DIRECTORIES.filter((directory) => existsSync(directory)).flatMap(
|
|
33
|
+
(directory) =>
|
|
34
|
+
readdirSync(directory)
|
|
35
|
+
.filter((file_name) => WORKFLOW_FILE_RE.test(file_name))
|
|
36
|
+
.toSorted((left, right) => left.localeCompare(right))
|
|
37
|
+
.map((file_name) => `${directory}/${file_name}`),
|
|
34
38
|
)
|
|
39
|
+
|
|
40
|
+
return [...workflows, ...composite_actions.list()]
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
function extract_pinned_version(content: string): string | undefined {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { existsSync, readFileSync, rmSync } from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
|
+
import { file_reader } from '#scripts/lib/read-file'
|
|
4
|
+
import { file_content } from '#scripts/sync/file-content'
|
|
5
|
+
import { z } from 'zod'
|
|
6
|
+
|
|
7
|
+
// kit writes the Safe Chain `preinstall` into every project it sets up, and a package that publishes
|
|
8
|
+
// would ship it: the consumer's pnpm then refuses it as an unapproved build script and `pnpm add`
|
|
9
|
+
// exits 1 (joshuafolkken/kit#3110). kit's own `.pnpmfile.mjs` strips it at pack time
|
|
10
|
+
// (joshuafolkken/kit#2693), so that one file is what a publishing project receives — never a copy of
|
|
11
|
+
// its logic.
|
|
12
|
+
//
|
|
13
|
+
// A private package is left alone: it never packs, and a new pnpmfile changes the lockfile's
|
|
14
|
+
// `pnpmfileChecksum`, which fails a frozen install until the lockfile is refreshed.
|
|
15
|
+
const PACK_HOOK_FILE = '.pnpmfile.mjs'
|
|
16
|
+
const MANAGED_LINE = '// josh-managed-pnpmfile: @joshuafolkken/kit'
|
|
17
|
+
const MANIFEST_FILE = 'package.json'
|
|
18
|
+
// pnpm loads `.pnpmfile.mjs` in preference to `.pnpmfile.cjs`, and neither once a `pnpmfile` setting
|
|
19
|
+
// names another file — so writing ours beside either would silently drop the project's hooks, or
|
|
20
|
+
// report a hook pnpm never runs.
|
|
21
|
+
const LEGACY_HOOK_FILE = '.pnpmfile.cjs'
|
|
22
|
+
const CONFIG_FILES: ReadonlyArray<string> = ['pnpm-workspace.yaml', '.npmrc']
|
|
23
|
+
const PNPMFILE_SETTINGS: ReadonlySet<string> = new Set(['pnpmfile', 'pnpmfiles'])
|
|
24
|
+
const SETTING_KEY_END = /[\s:=]/u
|
|
25
|
+
const manifest_schema = z.looseObject({ private: z.boolean().optional() })
|
|
26
|
+
|
|
27
|
+
type PackHookResult = 'written' | 'unchanged' | 'private' | 'owned' | 'withdrawn'
|
|
28
|
+
|
|
29
|
+
function is_published(manifest_text: string): boolean {
|
|
30
|
+
return manifest_schema.parse(JSON.parse(manifest_text)).private !== true
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function sets_pnpmfile(config_text: string): boolean {
|
|
34
|
+
return config_text
|
|
35
|
+
.split('\n')
|
|
36
|
+
.some((line) => PNPMFILE_SETTINGS.has(line.trimStart().split(SETTING_KEY_END, 1)[0] ?? ''))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function has_own_hook_source(project_root: string): boolean {
|
|
40
|
+
if (existsSync(path.join(project_root, LEGACY_HOOK_FILE))) return true
|
|
41
|
+
|
|
42
|
+
return CONFIG_FILES.some((name) =>
|
|
43
|
+
sets_pnpmfile(file_reader.read_file_or_empty(path.join(project_root, name))),
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function write_hook(destination: string, package_directory: string): PackHookResult {
|
|
48
|
+
const source = readFileSync(path.join(package_directory, PACK_HOOK_FILE), 'utf8')
|
|
49
|
+
|
|
50
|
+
return file_content.write_text_if_changed(destination, source) ? 'written' : 'unchanged'
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// A copy kit wrote before the project added its own pnpmfile would still shadow that one.
|
|
54
|
+
function withdraw(destination: string, existing: string | undefined): PackHookResult {
|
|
55
|
+
if (existing === undefined) return 'owned'
|
|
56
|
+
rmSync(destination)
|
|
57
|
+
|
|
58
|
+
return 'withdrawn'
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// A pnpmfile without the managed line is the project's own; overwriting it would drop its hooks.
|
|
62
|
+
function apply(project_root: string, package_directory: string): PackHookResult {
|
|
63
|
+
const destination = path.join(project_root, PACK_HOOK_FILE)
|
|
64
|
+
const existing = file_reader.read_optional(destination)
|
|
65
|
+
if (existing !== undefined && !existing.startsWith(MANAGED_LINE)) return 'owned'
|
|
66
|
+
if (has_own_hook_source(project_root)) return withdraw(destination, existing)
|
|
67
|
+
|
|
68
|
+
return write_hook(destination, package_directory)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const MESSAGES: Readonly<Record<PackHookResult, string | undefined>> = {
|
|
72
|
+
written: ` ✔ synced ${PACK_HOOK_FILE} (run \`pnpm install\` to refresh pnpmfileChecksum)`,
|
|
73
|
+
unchanged: ` ✔ unchanged ${PACK_HOOK_FILE}`,
|
|
74
|
+
private: undefined,
|
|
75
|
+
owned: ` ⚠ skipped ${PACK_HOOK_FILE} — the project has its own pnpmfile; strip the safe-chain preinstall at pack time there`,
|
|
76
|
+
withdrawn: ` ⚠ removed ${PACK_HOOK_FILE} — it shadowed the project's own pnpmfile; strip the safe-chain preinstall at pack time there`,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function sync_pack_hook(project_root: string, package_directory: string): PackHookResult {
|
|
80
|
+
const manifest_text = file_reader.read_optional(path.join(project_root, MANIFEST_FILE))
|
|
81
|
+
const is_private = manifest_text === undefined || !is_published(manifest_text)
|
|
82
|
+
const result = is_private ? 'private' : apply(project_root, package_directory)
|
|
83
|
+
const message = MESSAGES[result]
|
|
84
|
+
if (message !== undefined) console.info(message)
|
|
85
|
+
|
|
86
|
+
return result
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const pack_hook = { MANAGED_LINE, sync_pack_hook }
|
|
90
|
+
|
|
91
|
+
export { pack_hook, PACK_HOOK_FILE }
|
|
92
|
+
export type { PackHookResult }
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { file_reader } from '#scripts/lib/read-file'
|
|
4
|
+
import { yaml_document } from '#scripts/lib/yaml-document'
|
|
4
5
|
import { release_age } from '#scripts/version/release-age'
|
|
5
|
-
import { yaml_document } from '#scripts/yaml/yaml-document'
|
|
6
6
|
import { dump } from 'js-yaml'
|
|
7
7
|
import { z } from 'zod'
|
|
8
8
|
|
|
@@ -5,6 +5,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
5
5
|
import { PROJECT_ROOT } from '#scripts/init/init-paths'
|
|
6
6
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
7
|
import { error_text } from '#scripts/lib/error-message'
|
|
8
|
+
import { timed_fetch } from '#scripts/lib/timed-fetch'
|
|
8
9
|
import { security_audit } from './security-audit'
|
|
9
10
|
import { security_audit_logic } from './security-audit-logic'
|
|
10
11
|
import { security_audit_provision_logic, type ScannerAsset } from './security-audit-provision-logic'
|
|
@@ -33,7 +34,7 @@ interface ProvisionOutcome {
|
|
|
33
34
|
// catch-all would drop the release URL out of the message that names where the fetch went.
|
|
34
35
|
async function download(url: string, timeout_ms: number): Promise<DownloadOutcome> {
|
|
35
36
|
try {
|
|
36
|
-
const response = await
|
|
37
|
+
const response = await timed_fetch(url, {}, timeout_ms)
|
|
37
38
|
if (!response.ok) return { reason: `HTTP ${String(response.status)}` }
|
|
38
39
|
|
|
39
40
|
return { content: Buffer.from(await response.arrayBuffer()), reason: '' }
|
|
@@ -180,6 +181,6 @@ async function main(): Promise<void> {
|
|
|
180
181
|
|
|
181
182
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main()
|
|
182
183
|
|
|
183
|
-
const security_audit_provision = { attempt,
|
|
184
|
+
const security_audit_provision = { attempt, provision, report }
|
|
184
185
|
|
|
185
186
|
export { security_audit_provision }
|