@joshuafolkken/kit 1.1050.0 → 1.1094.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 +19 -11
- package/.claude/skills/workflow-commands/background-commands.md +4 -3
- 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 +1 -1
- package/.claude/skills/workflow-commands/backlogrun-steps.md +10 -10
- 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 +3 -2
- package/.claude/skills/workflow-commands/halfrun.md +16 -19
- 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 +1 -1
- 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/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/working-tree-hold.md +22 -2
- package/.codex/hooks.json +16 -20
- package/.github/actions/setup-pnpm/action.yml +93 -0
- package/.github/dependabot.yml +5 -1
- package/.github/workflows/ci.yml +26 -128
- package/.github/workflows/pr-classification.yml +5 -41
- package/.github/workflows/publish.yml +33 -38
- package/.github/workflows/sonar-qube.yml +37 -4
- package/AGENTS.md +12 -2
- package/CLAUDE.md +15 -16
- package/GEMINI.md +14 -2
- package/README.md +59 -18
- package/SECURITY.md +36 -6
- package/cspell/index.yaml +2 -1
- package/dist/CLAUDE.md +15 -16
- package/dist/config-merge/index.js +15 -3
- package/dist/hooks/batch-guard.js +4 -4
- package/dist/hooks/{chunk-HJIISEAC.js → chunk-3C4YCCEF.js} +5 -13
- package/dist/hooks/{chunk-EJDX2TOB.js → chunk-7ZPFAVR7.js} +7 -88
- package/dist/hooks/{chunk-WQ4OSBSS.js → chunk-E54KGFEQ.js} +2 -2
- package/dist/hooks/{chunk-GQ7KP45M.js → chunk-IL27YTPH.js} +2 -2
- package/dist/hooks/{chunk-DMQN45FN.js → chunk-KHWHKJOM.js} +3 -3
- package/dist/hooks/{chunk-5BK3K7V4.js → chunk-M2XDCUKD.js} +997 -478
- package/dist/hooks/{chunk-7VPDUBRN.js → chunk-NKOG3XAV.js} +150 -153
- package/dist/hooks/{chunk-NJQOBE6L.js → chunk-O4LL4HTI.js} +2 -7
- package/dist/hooks/{chunk-NAS4C7GP.js → chunk-OIZUHPJI.js} +2 -2
- package/dist/hooks/{chunk-RLDX5SOC.js → chunk-UD24EAIL.js} +2084 -1412
- package/dist/hooks/codex-hook-adapter.js +10 -11
- package/dist/hooks/duplicate-read-guard.js +5 -5
- package/dist/hooks/format-edited.js +2 -2
- package/dist/hooks/inputs.json +279 -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 +178 -324
- package/dist/josh.js +162 -119
- package/dist/managed-marker/index.js +2 -1
- package/dist/version/index.js +34 -58
- package/eslint/rules/promise.js +5 -0
- package/package.json +9 -4
- package/prompts/collaboration-workflow/issue-citation.md +5 -5
- package/prompts/collaboration-workflow/operating-rules.md +4 -4
- package/prompts/collaboration-workflow/overview.md +13 -1
- 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 +5 -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-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 +0 -5
- package/scripts/backlog/backlog-plan-cli.ts +1 -7
- package/scripts/backlog/backlog-plan.ts +1 -1
- package/scripts/backlog/backlog-pool.ts +3 -6
- package/scripts/backlog/backlog-rank.ts +2 -2
- package/scripts/backlog/backlog-ready.ts +19 -3
- 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/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 +0 -3
- 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 +4 -6
- package/scripts/doctor/doctor-logic.ts +0 -4
- package/scripts/doctor/doctor.ts +14 -9
- package/scripts/document/document-byte-budget.ts +4 -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 +10 -2
- package/scripts/document/lane-child-read-set.ts +1 -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 +1 -0
- package/scripts/document/read-set-pricing.ts +0 -1
- package/scripts/document/read-set-trim.ts +1 -1
- 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 +5 -4
- 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 +2 -0
- 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-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-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-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} +1 -1
- 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-logic.ts +7 -0
- package/scripts/init/init.ts +0 -3
- package/scripts/init/project-profile.ts +6 -11
- package/scripts/init/start-exec.ts +1 -1
- package/scripts/init/start-setup-pr.ts +6 -6
- package/scripts/init/start-steps.ts +1 -0
- package/scripts/issue/behavior-change-lint.ts +0 -1
- package/scripts/issue/defect-rate-cli.ts +3 -3
- 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-cite-cli.ts +2 -6
- package/scripts/issue/issue-cite.ts +0 -2
- 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 +2 -2
- 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 +1 -1
- package/scripts/issue/measure-rerun-cli.ts +1 -1
- 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 +6 -0
- 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 +2 -2
- package/scripts/josh/path-decision.ts +0 -3
- package/scripts/josh/process-owner.ts +16 -0
- package/scripts/josh/session-language-cli.ts +0 -1
- package/scripts/lane/lane-await.ts +3 -6
- 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 +1 -3
- 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 +21 -11
- 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 +3 -0
- package/scripts/lib/bounded-pool.ts +1 -0
- 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/lines-command.ts +0 -1
- 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 +0 -2
- 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 +0 -1
- package/scripts/refactor/refactor-targets.ts +0 -1
- package/scripts/registry-migration/migrate-logic.ts +0 -2
- package/scripts/registry-migration/migrate.ts +19 -9
- package/scripts/release/github-release-cli.ts +8 -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 +2 -3
- package/scripts/release/release-scope-cli.ts +1 -2
- package/scripts/release/release-tag.ts +2 -4
- 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-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 +1 -1
- 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/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 +13 -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 +13 -5
- 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-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-cli.ts +0 -7
- package/scripts/run/run-cut.ts +8 -54
- package/scripts/run/run-ending-cli.ts +1 -1
- package/scripts/run/run-ending.ts +1 -4
- package/scripts/run/run-entry-cli.ts +101 -24
- 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.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 +25 -5
- package/scripts/run/run-issue-number.ts +1 -1
- package/scripts/run/run-liveness-cli.ts +1 -1
- package/scripts/run/run-liveness.ts +2 -3
- package/scripts/run/run-merge-cli.ts +5 -13
- 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 +0 -1
- package/scripts/run/run-preflight.ts +2 -9
- package/scripts/run/run-prep-cli.ts +2 -2
- package/scripts/run/run-prep-locate.ts +1 -1
- package/scripts/run/run-progress-cli.ts +4 -7
- package/scripts/run/run-progress-clock.ts +6 -34
- 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 +21 -3
- 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-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 +1 -1
- 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 +2 -1
- package/scripts/run/run-tidy-stashes.ts +12 -12
- package/scripts/run/run-wake-cli.ts +2 -3
- 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 +9 -7
- package/scripts/run/run-watcher-hook.ts +1 -1
- package/scripts/safe-chain/ci-installer-pin.ts +11 -5
- 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-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-logic.ts +0 -1
- package/scripts/test/test-declared.ts +0 -2
- 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-remote.ts +3 -3
- package/scripts/version/version-targets.ts +4 -4
- package/templates/sonar-project.properties +28 -1
- package/templates/workflows/dependabot-auto-merge.yml +5 -3
- package/templates/workflows/github-release.yml +81 -0
- 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-write.ts +0 -0
- /package/scripts/{git → gh}/git-gh-issue.ts +0 -0
- /package/scripts/{git → gh}/git-gh-pr-auto-merge.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
|
@@ -238,13 +238,10 @@ const run_event_stream = {
|
|
|
238
238
|
EVENT_CAP,
|
|
239
239
|
EVENT_KIND,
|
|
240
240
|
EVENT_KINDS,
|
|
241
|
-
EVENT_PREFIX,
|
|
242
|
-
EVENT_SUFFIX,
|
|
243
241
|
TRACE_KINDS,
|
|
244
242
|
append,
|
|
245
243
|
format_event,
|
|
246
244
|
has_since,
|
|
247
|
-
is_event_kind,
|
|
248
245
|
read_events,
|
|
249
246
|
read_from,
|
|
250
247
|
read_last,
|
|
@@ -22,6 +22,7 @@ async function watch(ports: WatchPorts, position: number): Promise<number> {
|
|
|
22
22
|
let next = position
|
|
23
23
|
|
|
24
24
|
while (ports.should_continue()) {
|
|
25
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
25
26
|
const read = await ports.pass(next)
|
|
26
27
|
|
|
27
28
|
for (const event of read.events) ports.write(ports.render(event))
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { run_hold, type HoldRead, type RunHold } from './run-hold'
|
|
1
|
+
import { run_hold, type HoldRead, type RunHold, type StopMarkFields } from './run-hold'
|
|
2
2
|
|
|
3
3
|
// joshuafolkken/kit#2796: a `halfrun` stops before its commit and **keeps** its hold, because the
|
|
4
4
|
// uncommitted, hand-verified work is exactly what a second run would trample. The person then types
|
|
@@ -38,7 +38,13 @@ function is_own_record(read: HoldRead, issue: string): boolean {
|
|
|
38
38
|
return hold === undefined || hold.issue === issue || hold.issue === run_hold.UNNUMBERED_ISSUE
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
|
|
41
|
+
// `mark` is the `halfrun` stop's by default; a `prrun` stop passes its own (joshuafolkken/kit#3023), so
|
|
42
|
+
// the own-record check is one check whichever run is stopping.
|
|
43
|
+
function mark_stop_at(
|
|
44
|
+
target: string,
|
|
45
|
+
issue: string,
|
|
46
|
+
mark: StopMarkFields = run_hold.HALFRUN_STOP_FIELDS,
|
|
47
|
+
): StopMark {
|
|
42
48
|
const read = run_hold.read_hold(target)
|
|
43
49
|
|
|
44
50
|
if (read.kind === 'unreadable') return UNREADABLE
|
|
@@ -47,7 +53,14 @@ function mark_stop_at(target: string, issue: string): StopMark {
|
|
|
47
53
|
|
|
48
54
|
run_hold.release_hold(target)
|
|
49
55
|
|
|
50
|
-
return run_hold.
|
|
56
|
+
return run_hold.create_stop_hold(target, issue, mark) ? MARKED : FOREIGN
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The stopped run's record is replaced by this `fullrun`'s, shared with the `prrun` resume.
|
|
60
|
+
function take_over(target: string, issue: string): boolean {
|
|
61
|
+
run_hold.release_hold(target)
|
|
62
|
+
|
|
63
|
+
return run_hold.create_hold(target, issue, new Date(), true)
|
|
51
64
|
}
|
|
52
65
|
|
|
53
66
|
// `false` leaves the record untouched, so the ordinary claim that follows decides the tree exactly as
|
|
@@ -55,9 +68,7 @@ function mark_stop_at(target: string, issue: string): StopMark {
|
|
|
55
68
|
function adopt_at(target: string, issue: string, is_dirty: boolean): boolean {
|
|
56
69
|
if (!is_halfrun_stop(run_hold.read_hold(target), issue, is_dirty)) return false
|
|
57
70
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
return run_hold.create_hold(target, issue, new Date(), true)
|
|
71
|
+
return take_over(target, issue)
|
|
61
72
|
}
|
|
62
73
|
|
|
63
74
|
// **An unreadable git directory is no resume**, never a crash: `run:entry` must still print its one
|
|
@@ -95,9 +106,11 @@ const run_halfrun_resume = {
|
|
|
95
106
|
UNREADABLE,
|
|
96
107
|
adopt,
|
|
97
108
|
adopt_at,
|
|
98
|
-
|
|
109
|
+
hold_of,
|
|
110
|
+
hold_target,
|
|
99
111
|
is_pending,
|
|
100
112
|
mark_stop_at,
|
|
113
|
+
take_over,
|
|
101
114
|
}
|
|
102
115
|
|
|
103
116
|
export type { StopMark }
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
2
2
|
import { lane_reap } from '#scripts/lane/lane-reap'
|
|
3
|
+
import { lane_registry } from '#scripts/lane/lane-registry'
|
|
3
4
|
import { run_carry, type CarryRead, type RunCarry } from './run-carry'
|
|
4
|
-
import { run_watcher_guard } from './run-watcher-guard'
|
|
5
5
|
|
|
6
6
|
// The headless `backlogrun` parent (joshuafolkken/kit#2437). `run:wake` starts a cut's successor as
|
|
7
7
|
// `claude -p`, and there a turn that ends is the process that ends: its background `lane:await` and
|
|
@@ -51,7 +51,7 @@ async function read_carry_here(): Promise<CarryRead | undefined> {
|
|
|
51
51
|
async function must_keep_waiting(source: EnvironmentSource = process.env): Promise<boolean> {
|
|
52
52
|
const is_candidate = is_headless(source) && lane_child_marker.marked_issue(source) === undefined
|
|
53
53
|
|
|
54
|
-
if (!is_candidate || !(await
|
|
54
|
+
if (!is_candidate || !(await lane_registry.has_lanes_in_flight())) return false
|
|
55
55
|
|
|
56
56
|
return is_driving(await read_carry_here())
|
|
57
57
|
}
|
|
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url'
|
|
|
3
3
|
import { run_halfrun_resume } from './run-halfrun-resume'
|
|
4
4
|
import { run_hold, type HoldRead, type RunHold } from './run-hold'
|
|
5
5
|
import { run_preflight, type PreflightDecision } from './run-preflight'
|
|
6
|
+
import { run_prrun_resume } from './run-prrun-resume'
|
|
6
7
|
import { run_tidy_cli } from './run-tidy-cli'
|
|
7
8
|
|
|
8
9
|
// `josh run:hold [<N>]` and `josh run:release [<N> | --force]` — the working-tree guard the typed
|
|
@@ -48,11 +49,13 @@ const FORCE_FLAG = '--force'
|
|
|
48
49
|
// implementation cut outside a lane resumes as `fullrun #N` (joshuafolkken/kit#2760).
|
|
49
50
|
const FULLRUN_FLAG = '--fullrun'
|
|
50
51
|
const HALFRUN_STOP_FLAG = '--halfrun-stop'
|
|
52
|
+
// A `prrun`'s stop before merge (joshuafolkken/kit#3023): its record keeps the commit it stopped on.
|
|
53
|
+
const PRRUN_STOP_FLAG = '--prrun-stop'
|
|
51
54
|
// The most a claim reads: the issue number and the one flag after it.
|
|
52
55
|
const MAX_CLAIM_ARGUMENTS = 2
|
|
53
56
|
const ISSUE_NUMBER_PATTERN = /^[1-9]\d*$/u
|
|
54
57
|
const USAGE =
|
|
55
|
-
'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop]] | josh run:release [<issue-number> | --force]'
|
|
58
|
+
'Usage: josh run:hold [<issue-number> [--fullrun | --halfrun-stop | --prrun-stop]] | josh run:release [<issue-number> | --force]'
|
|
56
59
|
|
|
57
60
|
const HOLD_VERDICT = 'hold'
|
|
58
61
|
const BUSY_VERDICT = 'busy'
|
|
@@ -65,6 +68,7 @@ const HELD_VERDICT = 'held'
|
|
|
65
68
|
|
|
66
69
|
const FORCE_RELEASE_KIND = 'force-release'
|
|
67
70
|
const HALFRUN_STOP_KIND = 'halfrun-stop'
|
|
71
|
+
const PRRUN_STOP_KIND = 'prrun-stop'
|
|
68
72
|
|
|
69
73
|
interface ClaimRequest {
|
|
70
74
|
kind: 'claim'
|
|
@@ -72,11 +76,20 @@ interface ClaimRequest {
|
|
|
72
76
|
is_fullrun?: boolean
|
|
73
77
|
}
|
|
74
78
|
|
|
79
|
+
interface StopRequest {
|
|
80
|
+
kind: typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND
|
|
81
|
+
issue: string
|
|
82
|
+
}
|
|
83
|
+
|
|
75
84
|
type HoldRequest =
|
|
76
85
|
| ClaimRequest
|
|
86
|
+
| StopRequest
|
|
77
87
|
| { kind: 'release'; claimant: string }
|
|
78
88
|
| { kind: typeof FORCE_RELEASE_KIND }
|
|
79
|
-
|
|
89
|
+
|
|
90
|
+
function is_stop_request(request: HoldRequest): request is StopRequest {
|
|
91
|
+
return request.kind === HALFRUN_STOP_KIND || request.kind === PRRUN_STOP_KIND
|
|
92
|
+
}
|
|
80
93
|
|
|
81
94
|
const FORCE_RELEASE_REQUEST: HoldRequest = { kind: FORCE_RELEASE_KIND }
|
|
82
95
|
|
|
@@ -84,12 +97,20 @@ function release_request(claimant: string): HoldRequest {
|
|
|
84
97
|
return { kind: 'release', claimant }
|
|
85
98
|
}
|
|
86
99
|
|
|
87
|
-
|
|
88
|
-
|
|
100
|
+
const STOP_KIND_BY_FLAG: ReadonlyMap<string, typeof HALFRUN_STOP_KIND | typeof PRRUN_STOP_KIND> =
|
|
101
|
+
new Map([
|
|
102
|
+
[HALFRUN_STOP_FLAG, HALFRUN_STOP_KIND],
|
|
103
|
+
[PRRUN_STOP_FLAG, PRRUN_STOP_KIND],
|
|
104
|
+
])
|
|
105
|
+
|
|
106
|
+
// The flag after a numbered claim: absent, `--fullrun`, `--halfrun-stop` or `--prrun-stop`. Anything
|
|
107
|
+
// else is a usage error.
|
|
89
108
|
function numbered_claim(issue: string, flag: string | undefined): HoldRequest | undefined {
|
|
90
109
|
if (flag === undefined) return { kind: 'claim', issue }
|
|
91
110
|
|
|
92
|
-
|
|
111
|
+
const stop_kind = STOP_KIND_BY_FLAG.get(flag)
|
|
112
|
+
|
|
113
|
+
if (stop_kind !== undefined) return { kind: stop_kind, issue }
|
|
93
114
|
|
|
94
115
|
return flag === FULLRUN_FLAG ? { kind: 'claim', issue, is_fullrun: true } : undefined
|
|
95
116
|
}
|
|
@@ -293,8 +314,12 @@ async function read_worktree(): Promise<string | undefined> {
|
|
|
293
314
|
|
|
294
315
|
// **A `halfrun` stop marks its own record** (joshuafolkken/kit#2796) — the positive "this run has ended
|
|
295
316
|
// over its verified diff" that `run:entry` adopts on `fullrun #N`. Another run's record is left alone.
|
|
296
|
-
|
|
297
|
-
|
|
317
|
+
// A `prrun` stop marks its record the same way, with the commit it stopped on (joshuafolkken/kit#3023).
|
|
318
|
+
async function mark_stop(target: string, request: StopRequest): Promise<number> {
|
|
319
|
+
const mark =
|
|
320
|
+
request.kind === PRRUN_STOP_KIND
|
|
321
|
+
? await run_prrun_resume.mark_stop_at(target, request.issue)
|
|
322
|
+
: run_halfrun_resume.mark_stop_at(target, request.issue)
|
|
298
323
|
|
|
299
324
|
if (mark === run_halfrun_resume.MARKED) return report_hold()
|
|
300
325
|
|
|
@@ -306,7 +331,7 @@ function mark_halfrun_stop(target: string, issue: string): number {
|
|
|
306
331
|
async function dispatch(request: HoldRequest, target: string, is_linked: boolean): Promise<number> {
|
|
307
332
|
if (request.kind === 'claim') return await claim(target, request, is_linked)
|
|
308
333
|
|
|
309
|
-
if (request
|
|
334
|
+
if (is_stop_request(request)) return await mark_stop(target, request)
|
|
310
335
|
|
|
311
336
|
if (request.kind === FORCE_RELEASE_KIND) return force_release(target)
|
|
312
337
|
|
|
@@ -351,8 +376,6 @@ const run_hold_cli = {
|
|
|
351
376
|
RELEASED_VERDICT,
|
|
352
377
|
UNKNOWN_VERDICT,
|
|
353
378
|
USAGE,
|
|
354
|
-
blocking_message,
|
|
355
|
-
main,
|
|
356
379
|
parse_request,
|
|
357
380
|
run,
|
|
358
381
|
}
|
package/scripts/run/run-hold.ts
CHANGED
|
@@ -52,6 +52,10 @@ interface RunHold {
|
|
|
52
52
|
// the positive record that the run has *ended* over its verified diff, which is what lets
|
|
53
53
|
// `fullrun #N` adopt the hold. A running `halfrun` or a `backlogrun` child never carries it.
|
|
54
54
|
is_halfrun_stop?: boolean | undefined
|
|
55
|
+
// Set only at a `prrun`'s stop before merge (`run:hold <N> --prrun-stop`, joshuafolkken/kit#3023): the
|
|
56
|
+
// commit the green pull request stood on, so `fullrun #N` can tell an untouched branch — merge it —
|
|
57
|
+
// from one that moved since and has to pass the gate and the review again.
|
|
58
|
+
prrun_stop_head?: string | undefined
|
|
55
59
|
}
|
|
56
60
|
|
|
57
61
|
type HoldRead =
|
|
@@ -92,6 +96,7 @@ const run_hold_schema = z.object({
|
|
|
92
96
|
pid: z.number(),
|
|
93
97
|
is_fullrun: z.boolean().optional(),
|
|
94
98
|
is_halfrun_stop: z.boolean().optional(),
|
|
99
|
+
prrun_stop_head: z.string().optional(),
|
|
95
100
|
})
|
|
96
101
|
|
|
97
102
|
// `undefined` for anything that is not a well-formed record, so the caller decides what a broken one
|
|
@@ -161,9 +166,24 @@ function create_hold(
|
|
|
161
166
|
return stamp_file.create_stamp(target, build_hold(issue, now, is_fullrun))
|
|
162
167
|
}
|
|
163
168
|
|
|
164
|
-
//
|
|
169
|
+
// What a stopped run's record carries on top of the claim: the `halfrun` stop's flag, or the commit a
|
|
170
|
+
// `prrun` stop stood on (joshuafolkken/kit#3023).
|
|
171
|
+
type StopMarkFields = Pick<RunHold, 'is_halfrun_stop' | 'prrun_stop_head'>
|
|
172
|
+
|
|
173
|
+
const HALFRUN_STOP_FIELDS: StopMarkFields = { is_halfrun_stop: true }
|
|
174
|
+
|
|
175
|
+
// The claim a stop leaves behind: the same exclusive create, carrying the stop mark.
|
|
176
|
+
function create_stop_hold(
|
|
177
|
+
target: string,
|
|
178
|
+
issue: string,
|
|
179
|
+
mark: StopMarkFields,
|
|
180
|
+
now: Date = new Date(),
|
|
181
|
+
): boolean {
|
|
182
|
+
return stamp_file.create_stamp(target, { ...build_hold(issue, now), ...mark })
|
|
183
|
+
}
|
|
184
|
+
|
|
165
185
|
function create_halfrun_stop_hold(target: string, issue: string, now: Date = new Date()): boolean {
|
|
166
|
-
return
|
|
186
|
+
return create_stop_hold(target, issue, HALFRUN_STOP_FIELDS, now)
|
|
167
187
|
}
|
|
168
188
|
|
|
169
189
|
// **A tree with uncommitted work in it is never handed over, however old its record is.** No age can
|
|
@@ -260,8 +280,9 @@ const run_hold = {
|
|
|
260
280
|
UNNUMBERED_ISSUE,
|
|
261
281
|
classify,
|
|
262
282
|
create_halfrun_stop_hold,
|
|
283
|
+
create_stop_hold,
|
|
284
|
+
HALFRUN_STOP_FIELDS,
|
|
263
285
|
create_hold,
|
|
264
|
-
describe_holder,
|
|
265
286
|
foreign_release_message,
|
|
266
287
|
forced_release_message,
|
|
267
288
|
held_message,
|
|
@@ -270,7 +291,6 @@ const run_hold = {
|
|
|
270
291
|
is_own_hold,
|
|
271
292
|
is_tree_dirty,
|
|
272
293
|
own_release_command,
|
|
273
|
-
parse_hold,
|
|
274
294
|
race_message,
|
|
275
295
|
read_hold,
|
|
276
296
|
release_hold,
|
|
@@ -282,5 +302,5 @@ const run_hold = {
|
|
|
282
302
|
write_hold,
|
|
283
303
|
}
|
|
284
304
|
|
|
285
|
-
export type { HoldRead, RunHold }
|
|
305
|
+
export type { HoldRead, RunHold, StopMarkFields }
|
|
286
306
|
export { run_hold }
|
|
@@ -14,6 +14,6 @@ function require_issue_number(issue: string): void {
|
|
|
14
14
|
if (!ISSUE_NUMBER_PATTERN.test(issue)) throw new Error(`${BAD_ISSUE_MESSAGE}${issue}`)
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const run_issue_number = {
|
|
17
|
+
const run_issue_number = { ISSUE_NUMBER_PATTERN, require_issue_number }
|
|
18
18
|
|
|
19
19
|
export { run_issue_number }
|
|
@@ -159,7 +159,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
159
159
|
process.exitCode = await run(argv)
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
const run_liveness_cli = { USAGE,
|
|
162
|
+
const run_liveness_cli = { USAGE, parse_request, run }
|
|
163
163
|
|
|
164
164
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
165
165
|
|
|
@@ -3,8 +3,8 @@ import { homedir, tmpdir } from 'node:os'
|
|
|
3
3
|
import path from 'node:path'
|
|
4
4
|
import { setTimeout as sleep } from 'node:timers/promises'
|
|
5
5
|
import { agent_event, type AgentEventState } from '#scripts/agent/agent-event'
|
|
6
|
-
import { git_gh_issue_read } from '#scripts/
|
|
7
|
-
import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/
|
|
6
|
+
import { git_gh_issue_read } from '#scripts/gh/git-gh-issue-read'
|
|
7
|
+
import { ALREADY_DONE_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
8
8
|
import { issue_state } from '#scripts/issue/issue-state'
|
|
9
9
|
import { PLATFORM_TEMP_ROOT } from '#scripts/josh/platform-temporary'
|
|
10
10
|
import { run_hold } from './run-hold'
|
|
@@ -401,7 +401,6 @@ const run_liveness = {
|
|
|
401
401
|
decide,
|
|
402
402
|
describe_agent_state,
|
|
403
403
|
read_child_settled,
|
|
404
|
-
read_agent_state,
|
|
405
404
|
read_output_frozen,
|
|
406
405
|
sample_output,
|
|
407
406
|
to_safe_path,
|
|
@@ -5,6 +5,7 @@ import { api_outage } from '#scripts/agent/api-outage'
|
|
|
5
5
|
import { CONTEXT_CUT_THRESHOLD } from '#scripts/cost-runtime/context-cut-threshold'
|
|
6
6
|
import { issue_closing_pr } from '#scripts/issue/issue-closing-pr'
|
|
7
7
|
import { issue_state_cli } from '#scripts/issue/issue-state-cli'
|
|
8
|
+
import { lane_handoff } from '#scripts/lane/lane-handoff'
|
|
8
9
|
import { run_carry, type CarryOwner, type RunCarry } from './run-carry'
|
|
9
10
|
import { run_ending } from './run-ending'
|
|
10
11
|
import { run_event_stream } from './run-event-stream'
|
|
@@ -12,8 +13,6 @@ import { run_event_stream_emit } from './run-event-stream-emit'
|
|
|
12
13
|
import { run_issue_number } from './run-issue-number'
|
|
13
14
|
import { run_merge, type ChildOutcome, type EndingSignals } from './run-merge'
|
|
14
15
|
import { run_merge_steps, type MergeContext } from './run-merge-steps'
|
|
15
|
-
import { run_ship_detach } from './run-ship-detach'
|
|
16
|
-
import { run_ship_probe } from './run-ship-probe'
|
|
17
16
|
|
|
18
17
|
// `josh run:merge <N>` — one composite command for a `backlogrun` merge event (joshuafolkken/kit#2024).
|
|
19
18
|
// The parent's context is the largest and its per-turn cost the highest, and the event was two turns:
|
|
@@ -316,7 +315,10 @@ async function on_cut(ctx: MergeContext): Promise<MergeVerdict> {
|
|
|
316
315
|
|
|
317
316
|
// A child that parked itself: nothing is counted, but the park is written to the stream as a failed
|
|
318
317
|
// child's is, so a reader restoring the run from its events sees the child settled (joshuafolkken/kit#2508).
|
|
318
|
+
// Its `in-progress` is dropped as a failed child's is: left on, it outlived the `needs-decision` a
|
|
319
|
+
// person later lifted, and a `run:solo` child then held the whole backlog (joshuafolkken/kit#3017).
|
|
319
320
|
async function on_parked(ctx: MergeContext): Promise<MergeVerdict> {
|
|
321
|
+
await run_merge_steps.remove_in_progress(ctx.child)
|
|
320
322
|
await run_event_stream_emit.emit(run_event_stream.EVENT_KIND.PARK, `#${ctx.child} parked`)
|
|
321
323
|
|
|
322
324
|
return emit(await run_merge_steps.ask_next(ctx), SUCCESS_EXIT_CODE)
|
|
@@ -355,18 +357,10 @@ const HANDLERS: Readonly<Record<ChildOutcome, (ctx: MergeContext) => Promise<Mer
|
|
|
355
357
|
shipping: on_shipping,
|
|
356
358
|
}
|
|
357
359
|
|
|
358
|
-
async function is_ship_running(child: string): Promise<boolean> {
|
|
359
|
-
const repository = await run_ship_probe.repository_directory()
|
|
360
|
-
|
|
361
|
-
return (
|
|
362
|
-
repository !== undefined && run_ship_detach.read_result(repository, child)?.result === 'running'
|
|
363
|
-
)
|
|
364
|
-
}
|
|
365
|
-
|
|
366
360
|
// The whole merge event for one returned child, in-process: read its state, classify it, and run the
|
|
367
361
|
// handler. The CLI prints the token; `backlog:drive` branches on the outcome (joshuafolkken/kit#2508).
|
|
368
362
|
async function merge_child(ctx: MergeContext): Promise<MergeResult> {
|
|
369
|
-
if (
|
|
363
|
+
if (lane_handoff.is_ship_running(ctx.child, process.cwd())) {
|
|
370
364
|
return { outcome: 'shipping', ...(await on_shipping()) }
|
|
371
365
|
}
|
|
372
366
|
|
|
@@ -405,8 +399,6 @@ const run_merge_cli = {
|
|
|
405
399
|
RESUMED_TOKEN,
|
|
406
400
|
RETRY_TOKEN,
|
|
407
401
|
STOP_TOKEN,
|
|
408
|
-
USAGE,
|
|
409
|
-
main,
|
|
410
402
|
merge_child,
|
|
411
403
|
parse,
|
|
412
404
|
run,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs'
|
|
2
2
|
import path from 'node:path'
|
|
3
|
-
import { git_followup_issue_close } from '#scripts/
|
|
4
|
-
import { git_gh_issue_write } from '#scripts/
|
|
5
|
-
import { git_stash } from '#scripts/git/git-stash'
|
|
6
|
-
import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/
|
|
3
|
+
import { git_followup_issue_close } from '#scripts/followup/git-followup-issue-close'
|
|
4
|
+
import { git_gh_issue_write } from '#scripts/gh/git-gh-issue-write'
|
|
5
|
+
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
6
|
+
import { IN_PROGRESS_LABEL, NEEDS_DECISION_LABEL } from '#scripts/issue/issue-labels'
|
|
7
7
|
import { josh_command, type JoshResult } from '#scripts/josh/josh-run'
|
|
8
8
|
import { lane_close } from '#scripts/lane/lane-close'
|
|
9
9
|
import { lane_reap } from '#scripts/lane/lane-reap'
|
|
@@ -347,7 +347,6 @@ async function ask_next(ctx: MergeContext): Promise<string> {
|
|
|
347
347
|
|
|
348
348
|
const run_merge_steps = {
|
|
349
349
|
CUT_RELAUNCH_CAUSE,
|
|
350
|
-
apply_carry,
|
|
351
350
|
ask_next,
|
|
352
351
|
do_failed,
|
|
353
352
|
do_merged,
|
|
@@ -355,6 +354,7 @@ const run_merge_steps = {
|
|
|
355
354
|
has_resumable_cut,
|
|
356
355
|
is_over_budget,
|
|
357
356
|
refused_carry,
|
|
357
|
+
remove_in_progress,
|
|
358
358
|
resume_cut,
|
|
359
359
|
}
|
|
360
360
|
|
package/scripts/run/run-merge.ts
CHANGED
|
@@ -41,7 +41,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
41
41
|
process.exitCode = await run(argv)
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
const run_next_cli = {
|
|
44
|
+
const run_next_cli = { run }
|
|
45
45
|
|
|
46
46
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
47
47
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { git_gh_pr_read } from '#scripts/gh/git-gh-pr-read'
|
|
1
2
|
import { git_command } from '#scripts/git/git-command'
|
|
2
|
-
import { git_gh_pr_read } from '#scripts/git/git-gh-pr-read'
|
|
3
3
|
import { lane_registry, type LaneInfo } from '#scripts/lane/lane-registry'
|
|
4
4
|
import { z } from 'zod'
|
|
5
5
|
import { run_hold } from './run-hold'
|
|
@@ -89,7 +89,7 @@ const STASH_LABEL_PREFIX = 'run:hold reclaimed before #'
|
|
|
89
89
|
// so the shape it may take is pinned beside the interpolation rather than only in the CLI that
|
|
90
90
|
// happens to be today's single caller. `run:liveness` interpolates it the same way, so the pattern
|
|
91
91
|
// and the refusal live in one module both read (joshuafolkken/kit#1485).
|
|
92
|
-
const {
|
|
92
|
+
const { require_issue_number } = run_issue_number
|
|
93
93
|
const UNREADABLE_PR_MESSAGE = 'The pull request could not be read for branch '
|
|
94
94
|
|
|
95
95
|
function needs_reclaim(tree: TreeState): boolean {
|
|
@@ -385,15 +385,8 @@ async function check(issue: string): Promise<PreflightDecision> {
|
|
|
385
385
|
}
|
|
386
386
|
|
|
387
387
|
const run_preflight = {
|
|
388
|
-
CLEAN_ADVICE,
|
|
389
|
-
CLEAN_REASON,
|
|
390
388
|
CLEAN_VERDICT,
|
|
391
|
-
ISSUE_NUMBER_PATTERN,
|
|
392
|
-
PARK_ADVICE,
|
|
393
|
-
PARK_VERDICT,
|
|
394
|
-
RECLAIM_VERDICT,
|
|
395
389
|
RESUME_ADVICE,
|
|
396
|
-
RESUME_VERDICT,
|
|
397
390
|
MERGED_PR,
|
|
398
391
|
STASH_LABEL_PREFIX,
|
|
399
392
|
check,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
import { fileURLToPath } from 'node:url'
|
|
3
|
-
import { git_stash } from '#scripts/git/git-stash'
|
|
3
|
+
import { git_stash } from '#scripts/git/stash/git-stash'
|
|
4
4
|
import { issue_read_cli, type BlockRead } from '#scripts/issue/issue-read-cli'
|
|
5
5
|
import { issue_state_cli, type StateRead } from '#scripts/issue/issue-state-cli'
|
|
6
6
|
import { lane_child_marker } from '#scripts/lane/lane-child-marker'
|
|
@@ -150,7 +150,7 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
150
150
|
// `gather` and `to_parts` are exported so `run:next` reads the same state from the same three reads
|
|
151
151
|
// rather than growing a second copy of the gather (joshuafolkken/kit#2188) — `run:next` is the
|
|
152
152
|
// consumer of `run:prep` the epic #2166 wanted.
|
|
153
|
-
const run_prep_cli = {
|
|
153
|
+
const run_prep_cli = { gather, parse_number, run, to_parts }
|
|
154
154
|
|
|
155
155
|
if (process.argv[1] === fileURLToPath(import.meta.url)) await main(process.argv.slice(ARGV_OFFSET))
|
|
156
156
|
|
|
@@ -159,7 +159,7 @@ async function locate(text: string): Promise<string> {
|
|
|
159
159
|
return format_locations(located)
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
const run_prep_locate = { extract_targets,
|
|
162
|
+
const run_prep_locate = { extract_targets, locate, parse_hits }
|
|
163
163
|
|
|
164
164
|
export type { Hit, Located }
|
|
165
165
|
export { run_prep_locate }
|
|
@@ -28,7 +28,7 @@ import { run_progress_read, type ObservationRead } from './run-progress-read'
|
|
|
28
28
|
// `backlogrun` parent — `ready #N · free lanes N` — which is itself something the parent acts on.
|
|
29
29
|
//
|
|
30
30
|
// **It cannot send a Telegram.** That is structural rather than a promise — nothing here imports
|
|
31
|
-
// `scripts/
|
|
31
|
+
// `scripts/notify/telegram-notify`, which is the only egress there is. A heartbeat every twenty minutes on
|
|
32
32
|
// a phone is notification fatigue, and it would cheapen the `confirmation` and `completion` messages
|
|
33
33
|
// that do need to interrupt someone.
|
|
34
34
|
|
|
@@ -347,10 +347,13 @@ async function run_ticks(
|
|
|
347
347
|
let loop = seed_loop(target, started_ms)
|
|
348
348
|
|
|
349
349
|
while (Date.now() - started_ms < options.max_ms && !run_progress_clock.is_life_ended(life)) {
|
|
350
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
350
351
|
await sleep(options.tick_ms)
|
|
351
352
|
run_progress_clock.ping_life(life)
|
|
353
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
352
354
|
loop = await step(options, target, loop)
|
|
353
355
|
|
|
356
|
+
// eslint-disable-next-line no-await-in-loop -- polling: each read waits on the state the previous one saw
|
|
354
357
|
const exit = await wait_exit(loop, wait)
|
|
355
358
|
|
|
356
359
|
if (exit !== undefined) return exit
|
|
@@ -491,27 +494,21 @@ async function main(argv: ReadonlyArray<string>): Promise<void> {
|
|
|
491
494
|
}
|
|
492
495
|
|
|
493
496
|
const run_progress_cli = {
|
|
494
|
-
DECLINE_RETRY_SECONDS,
|
|
495
497
|
DEFAULT_MAX_HOURS,
|
|
496
498
|
DISABLED_NOTICE,
|
|
497
499
|
FAILED_TICK_PREFIX,
|
|
498
500
|
FRESH_LOOP,
|
|
499
501
|
IDLE_NOTICE,
|
|
500
502
|
LANE_CHILD_NOTICE,
|
|
501
|
-
MARKED_NOTICE,
|
|
502
503
|
REPO_UNRESOLVED_NOTICE,
|
|
503
|
-
TICK_SECONDS,
|
|
504
504
|
UNREADABLE_NOTICE,
|
|
505
505
|
USAGE,
|
|
506
506
|
WAIT_EXPIRED_NOTICE,
|
|
507
|
-
main,
|
|
508
507
|
read_arguments: run_progress_args.read_arguments,
|
|
509
|
-
report_decline,
|
|
510
508
|
run,
|
|
511
509
|
step,
|
|
512
510
|
to_interval_ms: run_progress_args.to_interval_ms,
|
|
513
511
|
to_max_ms: run_progress_args.to_max_ms,
|
|
514
|
-
to_options,
|
|
515
512
|
wait_once,
|
|
516
513
|
}
|
|
517
514
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { git_common_directory } from '#scripts/git/git-common-directory'
|
|
2
2
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
3
|
-
import { execaSync } from 'execa'
|
|
4
3
|
import { z } from 'zod'
|
|
5
4
|
|
|
6
5
|
// The report clock `josh run:progress` keeps, in the one form both of its readers can use
|
|
@@ -16,9 +15,10 @@ import { z } from 'zod'
|
|
|
16
15
|
//
|
|
17
16
|
// **The key is the work tree's own git directory**, the way `run_hold` keys its record: two lanes of
|
|
18
17
|
// one repository are two runs, and one lane's report must not silence the other's clock. The
|
|
19
|
-
// synchronous twin
|
|
20
|
-
// `git_command.git_directories` reads and
|
|
21
|
-
//
|
|
18
|
+
// synchronous twin is `git_common_directory.own()`, which asks the same two lines
|
|
19
|
+
// `git_command.git_directories` reads and takes the first — so the two spellings cannot name different
|
|
20
|
+
// files. A git read that fails or times out answers `undefined`, which reads as "no clock here" and
|
|
21
|
+
// lets the call through.
|
|
22
22
|
|
|
23
23
|
const PROGRESS_PREFIX = 'josh-run-progress-'
|
|
24
24
|
// The watcher's own liveness record, kept apart from the report clock above: that one says *when* the
|
|
@@ -55,14 +55,6 @@ const MS_PER_MINUTE = 60_000
|
|
|
55
55
|
const LOG_STALE_MINUTES = 90
|
|
56
56
|
const LOG_STALE_MS = LOG_STALE_MINUTES * MS_PER_MINUTE
|
|
57
57
|
const BLOCK_SEPARATOR = '\n\n'
|
|
58
|
-
// The lookup only ever decides whether a rule speaks, so a git call that hangs must not hold the hook
|
|
59
|
-
// that is holding the user's call. A timeout answers `undefined`, which reads as "no clock here" and
|
|
60
|
-
// lets the call through — the direction every other failure in this path already takes.
|
|
61
|
-
const GIT_TIMEOUT_MS = 5000
|
|
62
|
-
// The first of the two lines `git_command.git_directories` reads, asked on its own because that is the
|
|
63
|
-
// one the record is keyed on. Asking git rather than assuming a directory named `.git` is what makes a
|
|
64
|
-
// linked work tree, a bare repository and a `--separate-git-dir` clone all answer correctly.
|
|
65
|
-
const GIT_DIRECTORY_ARGUMENTS: ReadonlyArray<string> = ['rev-parse', '--absolute-git-dir']
|
|
66
58
|
|
|
67
59
|
// `line` is the last heartbeat the watcher printed, kept verbatim beside the clock so a reader that
|
|
68
60
|
// cannot see the watcher's transcript — a person checking a woken headless `backlogrun` through
|
|
@@ -259,25 +251,8 @@ function end_life(target: string): void {
|
|
|
259
251
|
stamp_file.remove_stamp(target)
|
|
260
252
|
}
|
|
261
253
|
|
|
262
|
-
// execa runs the binary directly with an argument array and no `shell` option, so CLI args cannot
|
|
263
|
-
// break out of a shell sandbox; the git command and args are internally controlled, never untrusted
|
|
264
|
-
// input. tssecurity:S8705 is a false positive here.
|
|
265
|
-
function git_directory_sync(): string | undefined {
|
|
266
|
-
const git_binary = git_utilities.get_git_command_for_spawn()
|
|
267
|
-
const result = execaSync(git_binary, GIT_DIRECTORY_ARGUMENTS, {
|
|
268
|
-
reject: false,
|
|
269
|
-
timeout: GIT_TIMEOUT_MS,
|
|
270
|
-
}) // NOSONAR
|
|
271
|
-
|
|
272
|
-
if (result.exitCode !== 0) return undefined
|
|
273
|
-
|
|
274
|
-
const output = result.stdout.trim()
|
|
275
|
-
|
|
276
|
-
return output === '' ? undefined : output
|
|
277
|
-
}
|
|
278
|
-
|
|
279
254
|
function stamp_target_sync(): string | undefined {
|
|
280
|
-
const directory =
|
|
255
|
+
const directory = git_common_directory.own()
|
|
281
256
|
|
|
282
257
|
return directory === undefined ? undefined : stamp_target_of(directory)
|
|
283
258
|
}
|
|
@@ -299,8 +274,6 @@ const run_progress_clock = {
|
|
|
299
274
|
LIFE_PREFIX,
|
|
300
275
|
LOG_KEEP,
|
|
301
276
|
LOG_STALE_MS,
|
|
302
|
-
PROGRESS_PREFIX,
|
|
303
|
-
append_line,
|
|
304
277
|
begin_life,
|
|
305
278
|
end_life,
|
|
306
279
|
is_life_ended,
|
|
@@ -314,7 +287,6 @@ const run_progress_clock = {
|
|
|
314
287
|
read_last_report,
|
|
315
288
|
read_last_report_sync,
|
|
316
289
|
stamp_target_of,
|
|
317
|
-
stamp_target_sync,
|
|
318
290
|
}
|
|
319
291
|
|
|
320
292
|
export { run_progress_clock }
|
|
@@ -27,8 +27,6 @@ import { run_progress } from './run-progress'
|
|
|
27
27
|
// watcher it guards kept the default, which is the one state this module exists to prevent.
|
|
28
28
|
|
|
29
29
|
const PACKAGE_FILE = 'package.json'
|
|
30
|
-
const CONFIG_FIELD = 'josh'
|
|
31
|
-
const INTERVAL_FIELD = 'progress_interval_minutes'
|
|
32
30
|
|
|
33
31
|
// Deep enough to cross a workspace package and its root, and bounded so a path that never reaches a
|
|
34
32
|
// root — a broken mount, a mocked `dirname` — cannot spin.
|
|
@@ -108,8 +106,6 @@ function configured_interval_ms(directory: string = process.cwd()): number {
|
|
|
108
106
|
}
|
|
109
107
|
|
|
110
108
|
const run_progress_config = {
|
|
111
|
-
CONFIG_FIELD,
|
|
112
|
-
INTERVAL_FIELD,
|
|
113
109
|
PACKAGE_FILE,
|
|
114
110
|
configured_interval_ms,
|
|
115
111
|
read_package_minutes,
|