@joshuafolkken/kit 1.1471.0 → 1.1784.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/agents/investigator.md +1 -1
- package/.claude/settings.json +6 -6
- package/.claude/skills/epic-commands/SKILL.md +26 -77
- package/.claude/skills/epic-commands/epic-bundle.md +12 -6
- package/.claude/skills/epic-commands/execution-waves.md +1 -2
- package/.claude/skills/verify-ui/SKILL.md +1 -2
- package/.claude/skills/workflow-commands/SKILL.md +12 -14
- package/.claude/skills/workflow-commands/background-commands.md +8 -12
- package/.claude/skills/workflow-commands/backlogrun-child.md +13 -18
- package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +7 -25
- package/.claude/skills/workflow-commands/backlogrun-lanes.md +23 -28
- package/.claude/skills/workflow-commands/backlogrun-park.md +16 -31
- package/.claude/skills/workflow-commands/backlogrun-progress.md +12 -21
- package/.claude/skills/workflow-commands/backlogrun-recovery.md +12 -12
- package/.claude/skills/workflow-commands/backlogrun-steps.md +12 -20
- package/.claude/skills/workflow-commands/backlogrun.md +32 -51
- package/.claude/skills/workflow-commands/chain-rule.md +18 -11
- package/.claude/skills/workflow-commands/delegation.md +13 -8
- package/.claude/skills/workflow-commands/entry-sequence.md +10 -12
- package/.claude/skills/workflow-commands/followup.md +10 -35
- package/.claude/skills/workflow-commands/fullrun-steps.md +38 -49
- package/.claude/skills/workflow-commands/fullrun.md +6 -8
- package/.claude/skills/workflow-commands/halfrun.md +20 -32
- package/.claude/skills/workflow-commands/into-target.md +1 -2
- package/.claude/skills/workflow-commands/issue-comments.md +19 -15
- package/.claude/skills/workflow-commands/issue-scout.md +5 -4
- package/.claude/skills/workflow-commands/kickoff.md +24 -23
- package/.claude/skills/workflow-commands/latest-gate.md +9 -18
- package/.claude/skills/workflow-commands/needs-human-review.md +11 -19
- package/.claude/skills/workflow-commands/observation-filing.md +4 -50
- package/.claude/skills/workflow-commands/observation-ledger.md +5 -10
- package/.claude/skills/workflow-commands/pre-gate-cut.md +22 -44
- package/.claude/skills/workflow-commands/prerequisite.md +11 -18
- package/.claude/skills/workflow-commands/progress-watcher.md +3 -8
- package/.claude/skills/workflow-commands/prrun.md +6 -12
- package/.claude/skills/workflow-commands/retrospective.md +5 -5
- package/.claude/skills/workflow-commands/split-assessment.md +14 -4
- package/.claude/skills/workflow-commands/target-repository.md +1 -2
- package/.claude/skills/workflow-commands/working-tree-hold.md +11 -13
- package/.codex/hooks.json +6 -6
- package/.github/actions/setup-node/action.yml +10 -1
- package/.github/actions/setup-pnpm/action.yml +1 -1
- package/.github/dependabot.yml +16 -0
- package/.github/release.yml +0 -2
- package/.github/workflows/ci.yml +121 -11
- package/.github/workflows/publish.yml +10 -3
- package/.github/workflows/sonar-qube.yml +1 -0
- package/.prettierignore +2 -0
- package/.vscode/tasks.json +1 -2
- package/CLAUDE.md +4 -8
- package/README.md +4 -2
- package/SECURITY.md +1 -1
- package/cspell/index.yaml +7 -0
- package/dist/CLAUDE.md +4 -8
- package/dist/commands/document-read-cli.js +882 -0
- package/dist/commands/{document-section-cli.js → document-section-main.js} +137 -62
- package/dist/commands/read-set-cli.js +1867 -0
- package/dist/commands/run-prep-main.js +21653 -0
- package/dist/commands/run-step-cli.js +23880 -0
- package/dist/config-merge/index.js +5 -1
- package/dist/hooks/audit-provision.js +20 -35
- package/dist/hooks/{chunk-DGT54IH5.js → chunk-AZX4FGQ3.js} +63 -17
- package/dist/hooks/chunk-CWMBGKYW.js +6483 -0
- package/dist/hooks/chunk-O2YBIDSI.js +4306 -0
- package/dist/hooks/{chunk-AS74OU3D.js → chunk-PT5R6UJD.js} +4582 -2118
- package/dist/hooks/chunk-TUIFS5E7.js +72 -0
- package/dist/hooks/{chunk-723HKZO5.js → chunk-VWWCFGWK.js} +1 -1
- package/dist/hooks/{chunk-E7OIKX5Z.js → chunk-WR2KQAYZ.js} +1863 -382
- package/dist/hooks/{chunk-KC5AK2GF.js → chunk-XGBNSWEI.js} +248 -46
- package/dist/hooks/chunk-YCDOIR3I.js +3456 -0
- package/dist/hooks/codex-hook-adapter.js +10 -19
- package/dist/hooks/format-edited.js +5 -5
- package/dist/hooks/inputs.json +436 -257
- package/dist/hooks/pretool-guard.js +7 -22
- package/dist/hooks/session-lang.js +380 -42
- package/dist/hooks/stop-guard.js +8711 -782
- package/dist/josh.js +5263 -997
- package/dist/self-sync-guard/index.js +74 -10
- package/dist/version/index.js +115 -406
- package/eslint/base.js +1 -1
- package/lefthook/base.yml +8 -4
- package/package.json +17 -53
- package/pnpm-workspace.yaml +4 -2
- package/prompts/coding-standards.md +1 -1
- package/prompts/collaboration-workflow/file-edits.md +1 -9
- package/prompts/collaboration-workflow/gh-rest.md +1 -2
- package/prompts/collaboration-workflow/issue-citation.md +2 -4
- package/prompts/collaboration-workflow/issue-template.md +42 -17
- package/prompts/collaboration-workflow/lane-instructions.md +34 -0
- package/prompts/collaboration-workflow/measurement.md +37 -0
- package/prompts/collaboration-workflow/operating-rules.md +6 -12
- package/prompts/collaboration-workflow/output-bounds.md +4 -9
- package/prompts/collaboration-workflow/overview.md +1 -1
- package/prompts/collaboration-workflow/plan-comment.md +3 -42
- package/prompts/collaboration-workflow/principles.md +19 -8
- package/prompts/collaboration-workflow/report-format.md +37 -57
- package/prompts/collaboration-workflow/residency.md +12 -8
- package/prompts/collaboration-workflow/rule-delivery.md +3 -11
- package/prompts/collaboration-workflow/shell-body.md +8 -18
- package/prompts/collaboration-workflow/turn-batching.md +4 -6
- package/prompts/collaboration-workflow/upstream-interrupt.md +16 -6
- package/prompts/collaboration-workflow/wip-cap.md +7 -7
- package/prompts/collaboration-workflow.md +4 -7
- package/prompts/refactoring.md +1 -1
- package/prompts/review-rubric.md +1 -2
- package/prompts/review.md +45 -26
- package/prompts/testing-guide.md +10 -45
- package/scripts/agent/agent-argv.ts +20 -4
- package/scripts/agent/agent-event.ts +15 -15
- package/scripts/agent/agent-exit-record.ts +13 -1
- package/scripts/agent/agent-role-profile.ts +101 -45
- package/scripts/agent/agent-safe-text.ts +60 -0
- package/scripts/agent/api-auth.ts +41 -0
- package/scripts/agent/api-outage.ts +1 -1
- package/scripts/agent/claude-agent-argv.ts +14 -0
- package/scripts/agent/codex-agent-argv.ts +2 -0
- package/scripts/agent/lane-instructions.ts +144 -0
- package/scripts/auto-ok/auto-ok-cli.ts +14 -16
- package/scripts/auto-ok/auto-ok-judge-read.ts +12 -3
- package/scripts/auto-ok/auto-ok-judge-write.ts +46 -19
- package/scripts/auto-ok/auto-ok-judge.ts +13 -2
- package/scripts/auto-ok/auto-ok-main.ts +17 -0
- package/scripts/backlog/backlog-arrival.ts +14 -3
- package/scripts/backlog/backlog-budget-cli.ts +7 -33
- package/scripts/backlog/backlog-budget-main.ts +16 -0
- package/scripts/backlog/backlog-budget.ts +6 -7
- package/scripts/backlog/backlog-defect-priority.ts +4 -3
- package/scripts/backlog/backlog-drive-adopt.ts +67 -0
- package/scripts/backlog/backlog-drive-args.ts +4 -5
- package/scripts/backlog/backlog-drive-cli.ts +113 -28
- package/scripts/backlog/backlog-drive-hold.ts +162 -0
- package/scripts/backlog/backlog-drive-idle.ts +151 -0
- package/scripts/backlog/backlog-drive-judge.ts +25 -0
- package/scripts/backlog/backlog-drive-memory.ts +126 -0
- package/scripts/backlog/backlog-drive-named-offer.ts +5 -10
- package/scripts/backlog/backlog-drive-named.ts +54 -7
- package/scripts/backlog/backlog-drive-offer-argv.ts +3 -8
- package/scripts/backlog/backlog-drive-paused.ts +169 -0
- package/scripts/backlog/backlog-drive-restore.ts +39 -8
- package/scripts/backlog/backlog-drive-seats.ts +18 -8
- package/scripts/backlog/backlog-drive-token-handling.ts +38 -0
- package/scripts/backlog/backlog-drive.ts +79 -75
- package/scripts/backlog/backlog-next-main.ts +16 -0
- package/scripts/backlog/backlog-next-shared.ts +73 -0
- package/scripts/backlog/backlog-next.ts +48 -16
- package/scripts/backlog/backlog-occupied.ts +69 -0
- package/scripts/backlog/backlog-offer-cli.ts +6 -21
- package/scripts/backlog/backlog-offer-exclude.ts +15 -0
- package/scripts/backlog/backlog-offer-main.ts +12 -0
- package/scripts/backlog/backlog-offer.ts +36 -3
- package/scripts/backlog/backlog-overlap.ts +22 -4
- package/scripts/backlog/backlog-plan-read.ts +6 -2
- package/scripts/backlog/backlog-plan.ts +18 -4
- package/scripts/backlog/backlog-pool.ts +10 -10
- package/scripts/backlog/backlog-rank.ts +10 -2
- package/scripts/backlog/backlog-ready.ts +137 -18
- package/scripts/backlog/backlog-stalled-detect.ts +109 -36
- package/scripts/backlog/backlog-stalled.ts +52 -16
- package/scripts/backlog/backlog-wait-cause.ts +86 -0
- package/scripts/backlog/backlog-waves.ts +39 -13
- package/scripts/backlog/backlogrun-args.ts +19 -7
- package/scripts/backlog/backlogrun-cli.ts +19 -5
- package/scripts/backlog/backlogrun-launch.ts +6 -0
- package/scripts/backlog/backlogrun-restart.ts +97 -0
- package/scripts/backlog/backlogrun-stop.ts +79 -7
- package/scripts/behavior/behavior-cli.ts +2 -2
- package/scripts/behavior/behavior-rules.ts +47 -24
- package/scripts/build/build-bin.ts +2 -16
- package/scripts/build/build-claude-md.ts +0 -7
- package/scripts/build/build-commands.ts +0 -13
- package/scripts/build/build-hooks.ts +49 -48
- package/scripts/build/hook-bundle-stamp.ts +29 -11
- package/scripts/build/local-bin.ts +1 -1
- package/scripts/cases/cases-cli.ts +25 -13
- package/scripts/cases/cases-interaction-scan.ts +134 -0
- package/scripts/cases/cases-interaction.ts +183 -0
- package/scripts/cases/cases-logic.ts +39 -6
- package/scripts/ci/pr-classification-main.ts +18 -0
- package/scripts/ci/pr-classification.ts +10 -17
- package/scripts/clone/clone-scan.ts +1 -1
- package/scripts/cost-runtime/cost-blocks.ts +22 -37
- package/scripts/cost-runtime/cost-cli.ts +31 -14
- package/scripts/cost-runtime/cost-main.ts +12 -0
- package/scripts/cost-runtime/cost-transcript.ts +1 -0
- package/scripts/delegation/delegation-policy.ts +17 -4
- package/scripts/delegation/duplicate-read-guard.ts +2 -10
- package/scripts/delegation/investigation-guard.ts +15 -73
- package/scripts/delegation/investigation-reads.ts +3 -5
- package/scripts/dependabot/dependabot-cooldown.ts +194 -0
- package/scripts/discovery/repo-discovery.ts +24 -6
- package/scripts/doctor/doctor-consumer.ts +2 -5
- package/scripts/document/document-byte-budget.ts +9 -6
- package/scripts/document/document-scan.ts +1 -1
- package/scripts/document/document-section-cli.ts +17 -13
- package/scripts/document/document-section-main.ts +12 -0
- package/scripts/document/entry-read-budget.ts +2 -2
- package/scripts/document/read-set-cli.ts +4 -1
- package/scripts/epic/epic-audit-cli.ts +12 -6
- package/scripts/epic/epic-audit-orphans.ts +5 -8
- package/scripts/epic/epic-audit.ts +52 -1
- package/scripts/epic/epic-bundle-apply.ts +137 -0
- package/scripts/epic/epic-bundle-cli.ts +32 -121
- package/scripts/epic/epic-bundle-evidence.ts +49 -26
- package/scripts/epic/epic-bundle-format.ts +116 -0
- package/scripts/epic/epic-bundle-main.ts +17 -0
- package/scripts/epic/epic-bundle-referenced.ts +14 -3
- package/scripts/epic/epic-bundle.ts +17 -9
- package/scripts/epic/epic-busy.ts +5 -12
- package/scripts/epic/epic-classify.ts +24 -15
- package/scripts/epic/epic-cli-argv.ts +31 -0
- package/scripts/epic/epic-cli-decide.ts +42 -0
- package/scripts/epic/epic-cli.ts +6 -38
- package/scripts/epic/epic-close.ts +112 -55
- package/scripts/epic/epic-cross-repo.ts +4 -7
- package/scripts/epic/epic-decide.ts +119 -0
- package/scripts/epic/epic-decision.ts +9 -0
- package/scripts/epic/epic-fetch.ts +4 -0
- package/scripts/epic/epic-graph.ts +2 -0
- package/scripts/epic/epic-issue.ts +5 -1
- package/scripts/epic/epic-label-age.ts +1 -1
- package/scripts/epic/epic-lane-offer.ts +39 -4
- package/scripts/epic/epic-next-main.ts +24 -0
- package/scripts/epic/epic-next.ts +6 -24
- package/scripts/epic/epic-outside-blocker.ts +6 -2
- package/scripts/epic/epic-parse.ts +9 -3
- package/scripts/epic/epic-read.ts +1 -0
- package/scripts/epic/epic-reconcile.ts +39 -0
- package/scripts/epic/epic-run.ts +10 -1
- package/scripts/epic/epic-solo.ts +50 -14
- package/scripts/epic/epic.ts +41 -7
- package/scripts/exports/unused-members-cli.ts +2 -2
- package/scripts/followup/followup-checks-event.ts +8 -3
- package/scripts/followup/followup-coderabbit-wait.ts +82 -0
- package/scripts/followup/followup-review-gates.ts +81 -0
- package/scripts/followup/git-followup-stages.ts +13 -3
- package/scripts/followup/git-followup-workflow.ts +31 -60
- package/scripts/followup/git-pr-followup-wrapup.ts +9 -14
- package/scripts/followup/git-pr-followup.ts +36 -8
- package/scripts/fresh-machine/fresh-machine-cli.ts +1 -1
- package/scripts/fresh-machine/fresh-machine-run.ts +8 -8
- package/scripts/fresh-machine/specs/kit-test-backlogrun.json +1 -1
- package/scripts/gate/busy-average.ts +58 -0
- package/scripts/gate/check-cpu.ts +60 -0
- package/scripts/gate/check-inputs.ts +73 -0
- package/scripts/gate/check-reuse.ts +141 -0
- package/scripts/gate/command-memory.ts +192 -0
- package/scripts/gate/core-admission.ts +218 -28
- package/scripts/gate/core-budget-timing.ts +37 -0
- package/scripts/gate/core-budget.ts +150 -119
- package/scripts/gate/core-wait-record.ts +48 -0
- package/scripts/gate/core-wait.ts +162 -0
- package/scripts/gate/core-weights.ts +86 -0
- package/scripts/gate/free-cores.ts +72 -0
- package/scripts/gate/gate-ledger.ts +49 -7
- package/scripts/gate/gate-plan.ts +44 -15
- package/scripts/gate/gate-report.ts +29 -4
- package/scripts/gate/gate-run-steps.ts +195 -0
- package/scripts/gate/gate-skip.ts +12 -2
- package/scripts/gate/gate-steps.ts +12 -1
- package/scripts/gate/held-mark.ts +55 -0
- package/scripts/gate/input-fingerprint.ts +42 -0
- package/scripts/gate/machine-capacity.ts +124 -31
- package/scripts/gate/moved-paths.ts +67 -0
- package/scripts/gate/pre-commit-type-check.ts +14 -1
- package/scripts/gate/project-checks.ts +5 -12
- package/scripts/gate/scoped-green.ts +12 -8
- package/scripts/gate/since-green.ts +62 -0
- package/scripts/gate/toolchain-inputs.ts +115 -0
- package/scripts/gate/verification-gate.ts +65 -129
- package/scripts/gate/verification-inputs.ts +250 -0
- package/scripts/gh/gh-author-association.ts +96 -9
- package/scripts/gh/git-ai-review-scan.ts +4 -2
- package/scripts/gh/git-gh-api-path.ts +15 -0
- package/scripts/gh/git-gh-branch-rules.ts +73 -0
- package/scripts/gh/git-gh-conditional.ts +5 -2
- package/scripts/gh/git-gh-issue-read.ts +5 -1
- package/scripts/gh/git-gh-issue-rest.ts +1 -0
- package/scripts/gh/git-gh-issue-write.ts +77 -17
- package/scripts/gh/git-gh-issue.ts +7 -3
- package/scripts/gh/git-gh-poll-read.ts +89 -0
- package/scripts/gh/git-gh-pr-auto-merge.ts +8 -3
- package/scripts/gh/git-gh-pr-rest.ts +1 -1
- package/scripts/gh/git-gh-pr-snapshot.ts +33 -20
- package/scripts/gh/git-gh-pr.ts +27 -15
- package/scripts/gh/git-pr-checks-eval.ts +39 -7
- package/scripts/gh/git-pr-checks-parse.ts +39 -9
- package/scripts/gh/git-pr-merge-checked.ts +80 -0
- package/scripts/gh/git-pr.ts +13 -1
- package/scripts/git/base-tree.ts +19 -2
- package/scripts/git/changed-file-scope.ts +6 -4
- package/scripts/git/changed-paths.ts +18 -1
- package/scripts/git/git-diff-reads.ts +27 -2
- package/scripts/git/git-grep-hits.ts +85 -0
- package/scripts/git/git-location-environment.ts +1 -1
- package/scripts/git/git-merge-conflicts.ts +83 -0
- package/scripts/git/git-preflight.ts +37 -12
- package/scripts/git/git-push-transport.ts +1 -2
- package/scripts/git/git-schemas.ts +17 -7
- package/scripts/git/git-spawn.ts +1 -2
- package/scripts/git/git-status.ts +4 -4
- package/scripts/git/main-merge-main.ts +12 -0
- package/scripts/git/main-merge-regenerate.ts +78 -0
- package/scripts/git/main-merge.ts +39 -14
- package/scripts/git/main-sync-main.ts +12 -0
- package/scripts/git/main-sync.ts +0 -9
- package/scripts/git/stash/git-stash.ts +27 -4
- package/scripts/git/stash/{stash-pop-args.ts → stash-args.ts} +13 -10
- package/scripts/git/stash/stash-pop-cli.ts +6 -12
- package/scripts/git/stash/stash-pop-main.ts +12 -0
- package/scripts/git/stash/stash-push-cli.ts +76 -0
- package/scripts/git/stash/stash-push-main.ts +12 -0
- package/scripts/hooks/batch-guard.ts +5 -16
- package/scripts/hooks/check-commit-message-main.ts +8 -0
- package/scripts/hooks/check-commit-message.ts +4 -7
- package/scripts/hooks/format-edited-file.ts +8 -24
- package/scripts/hooks/pre-commit-lint.ts +118 -0
- package/scripts/hooks/pre-push-unit.ts +4 -2
- package/scripts/hooks/pretool-guard-cli.ts +1 -8
- package/scripts/hooks/pretool-guard.ts +57 -69
- package/scripts/hooks/reserved-run.ts +67 -8
- package/scripts/hooks/run-hook.sh +18 -11
- package/scripts/hooks/shell-rules-notice.ts +37 -0
- package/scripts/hooks/stop-actions.ts +185 -0
- package/scripts/hooks/stop-guard.ts +72 -27
- package/scripts/init/hook-command-rewrite.ts +19 -5
- package/scripts/init/hook-launch.ts +15 -12
- package/scripts/init/init-actions.ts +0 -6
- package/scripts/init/init-ai-copy.ts +10 -36
- package/scripts/init/init-bootstrap.ts +9 -8
- package/scripts/init/init-dry-run-report.ts +1 -1
- package/scripts/init/init-dry-run.ts +1 -1
- package/scripts/init/init-file-action.ts +7 -9
- package/scripts/init/init-logic-json-merge.ts +2 -2
- package/scripts/init/init-logic-migrate.ts +9 -82
- package/scripts/init/init-logic.ts +3 -2
- package/scripts/init/init-main.ts +12 -0
- package/scripts/init/init.ts +5 -12
- package/scripts/init/kit-development-versions.ts +3 -7
- package/scripts/init/kit-written-paths.ts +2 -2
- package/scripts/init/project-profile.ts +5 -4
- package/scripts/init/tsconfig-preset-migration.ts +2 -1
- package/scripts/init/vscode-tasks.ts +1 -1
- package/scripts/issue/defect-origin-cli.ts +106 -0
- package/scripts/issue/defect-origin-line.ts +60 -0
- package/scripts/issue/defect-origin-main.ts +11 -0
- package/scripts/issue/defect-origin.ts +114 -0
- package/scripts/issue/defect-rate-cli.ts +34 -78
- package/scripts/issue/defect-rate.ts +0 -16
- package/scripts/issue/defect-report-cli.ts +128 -0
- package/scripts/issue/defect-report-format.ts +56 -0
- package/scripts/issue/defect-report-main.ts +11 -0
- package/scripts/issue/defect-report.ts +160 -0
- package/scripts/issue/expected-effect-lint.ts +60 -0
- package/scripts/issue/issue-already-done-cli.ts +62 -0
- package/scripts/issue/issue-body-or-comment.ts +40 -0
- package/scripts/issue/issue-cite-cli.ts +33 -22
- package/scripts/issue/issue-cite-main.ts +12 -0
- package/scripts/issue/issue-classification.ts +13 -8
- package/scripts/issue/issue-comment-cli.ts +10 -24
- package/scripts/issue/issue-comment-main.ts +12 -0
- package/scripts/issue/issue-evidence-exit.ts +100 -0
- package/scripts/issue/issue-file-cli.ts +29 -7
- package/scripts/issue/issue-file.ts +19 -19
- package/scripts/issue/issue-fold-cli.ts +2 -11
- package/scripts/issue/issue-fold-main.ts +12 -0
- package/scripts/issue/issue-labels.ts +81 -90
- package/scripts/issue/issue-lint-cli.ts +7 -13
- package/scripts/issue/issue-lint-main.ts +12 -0
- package/scripts/issue/issue-measured-cli.ts +56 -0
- package/scripts/issue/issue-merged.ts +19 -2
- package/scripts/issue/issue-not-before-label.ts +135 -0
- package/scripts/issue/issue-not-before.ts +111 -0
- package/scripts/issue/issue-number-shape.ts +15 -1
- package/scripts/issue/issue-park.ts +28 -0
- package/scripts/issue/issue-plan-cli.ts +151 -0
- package/scripts/issue/issue-priority.ts +151 -0
- package/scripts/issue/issue-rank.ts +7 -1
- package/scripts/issue/issue-read-cli.ts +3 -10
- package/scripts/issue/issue-read-main.ts +12 -0
- package/scripts/issue/issue-read.ts +29 -5
- package/scripts/issue/issue-release-cli.ts +0 -10
- package/scripts/issue/issue-release-main.ts +13 -0
- package/scripts/issue/issue-release.ts +7 -12
- package/scripts/issue/issue-sample-gate.ts +192 -0
- package/scripts/issue/issue-sample-source.ts +76 -0
- package/scripts/issue/issue-scout-cli.ts +19 -25
- package/scripts/issue/issue-scout-main.ts +14 -0
- package/scripts/issue/issue-state-cli.ts +0 -10
- package/scripts/issue/issue-state-main.ts +12 -0
- package/scripts/issue/issue-watch-diff.ts +56 -15
- package/scripts/issue/issue-watch.ts +2 -1
- package/scripts/issue/issue-wip.ts +2 -7
- package/scripts/issue/markdown-section.ts +19 -5
- package/scripts/issue/measure-rerun-cli.ts +13 -8
- package/scripts/issue/plan-consumers-cli.ts +39 -0
- package/scripts/issue/plan-consumers-main.ts +11 -0
- package/scripts/issue/plan-consumers-section.ts +55 -0
- package/scripts/issue/plan-consumers.ts +127 -0
- package/scripts/josh/agent-session-environment.ts +1 -1
- package/scripts/josh/command-usage.ts +82 -0
- package/scripts/josh/file-map-stamp.ts +49 -16
- package/scripts/josh/hook-decision.ts +32 -20
- package/scripts/josh/josh-command-map.ts +6 -1
- package/scripts/josh/josh-command-types.ts +65 -13
- package/scripts/josh/josh-commands-agent-hooks.ts +83 -0
- package/scripts/josh/josh-commands-ai.ts +169 -157
- package/scripts/josh/josh-commands-backlog.ts +82 -16
- package/scripts/josh/josh-commands-clone.ts +1 -0
- package/scripts/josh/josh-commands-development.ts +111 -71
- package/scripts/josh/josh-commands-document.ts +43 -1
- package/scripts/josh/josh-commands-epic.ts +171 -0
- package/scripts/josh/josh-commands-hooks.ts +31 -2
- package/scripts/josh/josh-commands-issue-write.ts +181 -0
- package/scripts/josh/josh-commands-issue.ts +124 -24
- package/scripts/josh/josh-commands-lane.ts +112 -2
- package/scripts/josh/josh-commands-lint.ts +19 -8
- package/scripts/josh/josh-commands-maintenance.ts +112 -4
- package/scripts/josh/josh-commands-pause.ts +29 -0
- package/scripts/josh/josh-commands-progress.ts +87 -0
- package/scripts/josh/josh-commands-project.ts +138 -9
- package/scripts/josh/josh-commands-review.ts +124 -0
- package/scripts/josh/josh-commands-run.ts +211 -23
- package/scripts/josh/josh-commands-ship.ts +169 -0
- package/scripts/josh/josh-commands-split.ts +9 -0
- package/scripts/josh/josh-commands-versioning.ts +49 -2
- package/scripts/josh/josh-commands-workflow.ts +149 -6
- package/scripts/josh/josh-logic.ts +11 -27
- package/scripts/josh/josh.ts +14 -5
- package/scripts/josh/package-directory.ts +18 -0
- package/scripts/josh/process-identity.ts +13 -4
- package/scripts/josh/session-language-cli.ts +4 -8
- package/scripts/josh/session-language-main.ts +13 -0
- package/scripts/josh/session-language.ts +6 -1
- package/scripts/josh/shared-cache.ts +90 -0
- package/scripts/josh/stamp-file.ts +9 -15
- package/scripts/lane/lane-await.ts +51 -12
- package/scripts/lane/lane-cache.ts +5 -30
- package/scripts/lane/lane-capacity.ts +19 -22
- package/scripts/lane/lane-check-stats.ts +97 -0
- package/scripts/lane/lane-child-invocation.ts +43 -4
- package/scripts/lane/lane-cli.ts +15 -5
- package/scripts/lane/lane-close.ts +86 -18
- package/scripts/lane/lane-core-wait-stats.ts +66 -0
- package/scripts/lane/lane-dispatch.ts +27 -6
- package/scripts/lane/lane-gap-stats.ts +156 -0
- package/scripts/lane/lane-guard-policy.ts +2 -2
- package/scripts/lane/lane-handoff.ts +76 -1
- package/scripts/lane/lane-held-stats.ts +129 -0
- package/scripts/lane/lane-install.ts +16 -15
- package/scripts/lane/lane-launch-cli.ts +0 -9
- package/scripts/lane/lane-launch-main.ts +12 -0
- package/scripts/lane/lane-ledger-schema.ts +266 -0
- package/scripts/lane/lane-ledger.ts +108 -97
- package/scripts/lane/lane-limit-cli.ts +19 -9
- package/scripts/lane/lane-measure-cli.ts +58 -10
- package/scripts/lane/lane-open.ts +9 -1
- package/scripts/lane/lane-parked.ts +3 -3
- package/scripts/lane/lane-pause-cli.ts +130 -0
- package/scripts/lane/lane-pause.ts +158 -0
- package/scripts/lane/lane-preserve.ts +29 -1
- package/scripts/lane/lane-process-table.ts +166 -0
- package/scripts/lane/lane-reap-settle.ts +124 -0
- package/scripts/lane/lane-reap.ts +50 -15
- package/scripts/lane/lane-registry.ts +33 -10
- package/scripts/lane/lane-residents.ts +162 -0
- package/scripts/lane/lane-restart.ts +26 -27
- package/scripts/lane/lane-round-two-stats.ts +49 -0
- package/scripts/lane/lane-sampler.ts +4 -0
- package/scripts/lane/lane-session-action.ts +160 -0
- package/scripts/lane/lane-session-broker.ts +134 -134
- package/scripts/lane/lane-snapshot-trace.ts +84 -0
- package/scripts/lane/lane-spans.ts +51 -0
- package/scripts/lane/lane-spent.ts +6 -3
- package/scripts/lane/lane-stage-stats.ts +7 -2
- package/scripts/lane/lane-state.ts +302 -0
- package/scripts/lane/lane-stats.ts +58 -4
- package/scripts/lane/lane-stop-stats.ts +113 -37
- package/scripts/lane/lane-test-related-stats.ts +127 -0
- package/scripts/lane/lane-transcript-calls.ts +145 -0
- package/scripts/lane/lane-transcript-stats.ts +168 -0
- package/scripts/lane/lane-vacant.ts +13 -3
- package/scripts/lane/lane-withdraw-cli.ts +72 -0
- package/scripts/lane/lane-withdraw.ts +183 -0
- package/scripts/lane/process-directories.ts +70 -0
- package/scripts/lane/process-lane-marks.ts +94 -0
- package/scripts/lib/atomic-write.ts +62 -0
- package/scripts/lib/buffered-process.ts +12 -5
- package/scripts/lib/cli-flags.ts +53 -0
- package/scripts/lib/figure-format.ts +63 -0
- package/scripts/lib/json-value.ts +9 -1
- package/scripts/lib/package-manifest.ts +35 -0
- package/scripts/lib/read-file.ts +3 -1
- package/scripts/lib/stamped-memo.ts +63 -0
- package/scripts/lib/stdout-on-stderr.ts +24 -0
- package/scripts/lib/timeouts.ts +9 -0
- package/scripts/lib/transcript-record.ts +91 -0
- package/scripts/lines/effective-limit.ts +1 -1
- package/scripts/lint/eslint-cache-dependencies.ts +145 -0
- package/scripts/lint/eslint-daemon.ts +265 -0
- package/scripts/lint/format.ts +14 -5
- package/scripts/lint/import-graph.ts +279 -0
- package/scripts/lint/lint-gate-scope.ts +102 -0
- package/scripts/lint/lint-parallel-main.ts +19 -0
- package/scripts/lint/lint-parallel.ts +72 -33
- package/scripts/lint/lint-related-scope.ts +33 -24
- package/scripts/lint/lint-related.ts +38 -6
- package/scripts/notify/confirmation-options.ts +1 -2
- package/scripts/notify/telegram-notify.ts +20 -20
- package/scripts/notify/telegram-test-logic.ts +0 -1
- package/scripts/notify/telegram-test-main.ts +8 -0
- package/scripts/notify/telegram-test.ts +12 -11
- package/scripts/observations/observation-ledger.ts +13 -0
- package/scripts/observations/observations-flush-landing.ts +5 -3
- package/scripts/observations/observations-flush.ts +6 -1
- package/scripts/overrides/overrides-check.ts +2 -5
- package/scripts/overrides/overrides-files.ts +2 -1
- package/scripts/overrides/overrides-logic.ts +3 -6
- package/scripts/package/verify-optional-eslint-install.ts +8 -6
- package/scripts/propagate/propagate-publish.ts +2 -7
- package/scripts/propagate/propagate-targets.ts +4 -12
- package/scripts/refactor/import-graph.ts +9 -7
- package/scripts/release/github-release-runs.ts +17 -6
- package/scripts/release/release-approval-prune.ts +18 -0
- package/scripts/release/release-history.ts +1 -3
- package/scripts/release/release-progress.ts +42 -22
- package/scripts/release/release-publish-run.ts +39 -0
- package/scripts/release/release-publish.ts +6 -6
- package/scripts/release/release-scope-cli.ts +0 -10
- package/scripts/release/release-scope-main.ts +12 -0
- package/scripts/repo/repo-setting.ts +3 -6
- package/scripts/repo/required-checks-logic.ts +6 -15
- package/scripts/report/report-format-reference.ts +4 -0
- package/scripts/report/report-labels.ts +155 -0
- package/scripts/report/report-lint-cli.ts +3 -0
- package/scripts/report/report-lint.ts +85 -110
- package/scripts/report/report-template-cli.ts +59 -0
- package/scripts/report/report-template.ts +112 -0
- package/scripts/review/acceptance-map-check.ts +61 -0
- package/scripts/review/acceptance-map.ts +206 -0
- package/scripts/review/removed-tests-check.ts +86 -0
- package/scripts/review/removed-tests.ts +149 -0
- package/scripts/review/review-brief-cli.ts +82 -16
- package/scripts/review/review-brief-main.ts +12 -0
- package/scripts/review/review-brief.ts +31 -3
- package/scripts/review/review-code-tree.ts +10 -6
- package/scripts/review/review-comment-round.ts +26 -8
- package/scripts/review/review-finding-ledger.ts +30 -15
- package/scripts/review/review-interaction.ts +94 -0
- package/scripts/review/review-readers-scan.ts +163 -0
- package/scripts/review/review-record-cli.ts +69 -30
- package/scripts/review/review-record-main.ts +12 -0
- package/scripts/review/review-round-one-blobs.ts +221 -0
- package/scripts/review/review-round2-cli.ts +49 -12
- package/scripts/review/review-round2.ts +80 -12
- package/scripts/review/review-stamps.ts +19 -1
- package/scripts/review/review-stop-log.ts +96 -0
- package/scripts/review/review-stops-cli.ts +85 -0
- package/scripts/review/review-tree.ts +6 -17
- package/scripts/review/review-untouched-readers.ts +146 -0
- package/scripts/review/test-titles.ts +118 -0
- package/scripts/rules/agent-model.ts +67 -0
- package/scripts/rules/bash-triggers.ts +46 -3
- package/scripts/rules/decision-oracle-batch.ts +9 -1
- package/scripts/rules/decision-oracle.ts +2 -2
- package/scripts/rules/delivered-rules.ts +90 -3
- package/scripts/rules/destructive-command.ts +8 -1
- package/scripts/rules/direct-filing.ts +10 -2
- package/scripts/rules/direct-issue-comment.ts +117 -0
- package/scripts/rules/direct-pr-create.ts +69 -3
- package/scripts/rules/early-heartbeat.ts +2 -1
- package/scripts/rules/file-body.ts +7 -0
- package/scripts/rules/filing-cap.ts +8 -0
- package/scripts/rules/firing-point.ts +6 -5
- package/scripts/rules/git-argv.ts +72 -14
- package/scripts/rules/git-force.ts +12 -2
- package/scripts/rules/guard-remedy.ts +121 -0
- package/scripts/rules/implementation-cut-verdict.ts +1 -1
- package/scripts/rules/implementation-cut.ts +11 -3
- package/scripts/rules/index-guard.ts +8 -1
- package/scripts/rules/issue-comments.ts +76 -7
- package/scripts/rules/josh-git-bare.ts +7 -0
- package/scripts/rules/lane-background.ts +67 -25
- package/scripts/rules/lane-carry-conflict.ts +6 -0
- package/scripts/rules/lane-direct-tool.ts +74 -0
- package/scripts/rules/lane-interactive-ask.ts +9 -2
- package/scripts/rules/lane-park.ts +45 -23
- package/scripts/rules/lane-split-park.ts +10 -2
- package/scripts/rules/lane-switch-main.ts +7 -0
- package/scripts/rules/last-prompt.ts +50 -5
- package/scripts/rules/oracle-consulted.ts +10 -0
- package/scripts/rules/oracle-firing.ts +1 -0
- package/scripts/rules/oracle-list-cli.ts +7 -0
- package/scripts/rules/permission-guards.ts +3 -0
- package/scripts/rules/piped-verification.ts +4 -2
- package/scripts/rules/poll-loop.ts +7 -0
- package/scripts/rules/pr-merge.ts +123 -0
- package/scripts/rules/protected-files.ts +32 -5
- package/scripts/rules/raw-field-body.ts +6 -0
- package/scripts/rules/rule-body-guard.ts +8 -0
- package/scripts/rules/rule-list.ts +12 -28
- package/scripts/rules/rule-rewrite.ts +114 -0
- package/scripts/rules/rule-value-cache.ts +4 -9
- package/scripts/rules/rule-value-cli.ts +51 -32
- package/scripts/rules/rule-value.ts +8 -2
- package/scripts/rules/shell-segments.ts +50 -0
- package/scripts/rules/stop-decision.ts +77 -0
- package/scripts/rules/stop-rule-rows.ts +64 -0
- package/scripts/rules/stop-rules.ts +150 -51
- package/scripts/rules/tail-commands.ts +15 -1
- package/scripts/rules/test-declared-commit.ts +11 -1
- package/scripts/rules/third-party-write.ts +7 -0
- package/scripts/rules/timed-rerun.ts +69 -0
- package/scripts/rules/worktree-guard.ts +13 -3
- package/scripts/run/board/run-board-app-name.ts +23 -0
- package/scripts/run/board/run-board-cli.ts +65 -30
- package/scripts/run/board/run-board-closed.ts +8 -2
- package/scripts/run/board/run-board-earlier.ts +94 -0
- package/scripts/run/board/run-board-ending-reason.ts +67 -0
- package/scripts/run/board/run-board-estimate-schedule.ts +103 -0
- package/scripts/run/board/run-board-estimate.ts +98 -0
- package/scripts/run/board/run-board-fit.ts +153 -36
- package/scripts/run/board/run-board-fold.ts +123 -0
- package/scripts/run/board/run-board-fresh.ts +2 -2
- package/scripts/run/board/run-board-gather-live.ts +29 -0
- package/scripts/run/board/run-board-gather-thread.ts +189 -0
- package/scripts/run/board/run-board-gather-worker.ts +29 -0
- package/scripts/run/board/run-board-gather.ts +187 -0
- package/scripts/run/board/run-board-github.ts +119 -31
- package/scripts/run/board/run-board-header.ts +86 -21
- package/scripts/run/board/run-board-keys.ts +58 -0
- package/scripts/run/board/run-board-kind.ts +20 -6
- package/scripts/run/board/run-board-labels.ts +118 -71
- package/scripts/run/board/run-board-lane-state.ts +109 -0
- package/scripts/run/board/run-board-lane-time.ts +122 -0
- package/scripts/run/board/run-board-layout.ts +240 -61
- package/scripts/run/board/run-board-length.ts +52 -0
- package/scripts/run/board/run-board-machine.ts +8 -4
- package/scripts/run/board/run-board-main.ts +12 -0
- package/scripts/run/board/run-board-notes.ts +52 -31
- package/scripts/run/board/run-board-now.ts +1 -1
- package/scripts/run/board/run-board-operation.ts +15 -33
- package/scripts/run/board/run-board-phase.ts +1 -1
- package/scripts/run/board/run-board-plan-shared.ts +115 -0
- package/scripts/run/board/run-board-plan.ts +55 -3
- package/scripts/run/board/run-board-planning.ts +45 -0
- package/scripts/run/board/run-board-priority.ts +44 -0
- package/scripts/run/board/run-board-process-groups.ts +195 -0
- package/scripts/run/board/run-board-read.ts +153 -13
- package/scripts/run/board/run-board-reason.ts +238 -45
- package/scripts/run/board/run-board-released.ts +35 -0
- package/scripts/run/board/run-board-render-checks.ts +39 -5
- package/scripts/run/board/run-board-render-condition.ts +96 -0
- package/scripts/run/board/run-board-render-drawn.ts +67 -0
- package/scripts/run/board/run-board-render-foot.ts +59 -0
- package/scripts/run/board/run-board-render-icon.ts +35 -0
- package/scripts/run/board/run-board-render-lanes.ts +145 -0
- package/scripts/run/board/run-board-render-lead.ts +80 -0
- package/scripts/run/board/run-board-render-legend.ts +117 -47
- package/scripts/run/board/run-board-render-notes.ts +156 -29
- package/scripts/run/board/run-board-render-processes.ts +196 -0
- package/scripts/run/board/run-board-render-section.ts +119 -0
- package/scripts/run/board/run-board-render-slot.ts +3 -36
- package/scripts/run/board/run-board-render-tail.ts +115 -48
- package/scripts/run/board/run-board-render-time.ts +56 -0
- package/scripts/run/board/run-board-render-title.ts +117 -24
- package/scripts/run/board/run-board-render-waits.ts +125 -0
- package/scripts/run/board/run-board-render.ts +206 -259
- package/scripts/run/board/run-board-roots.ts +54 -0
- package/scripts/run/board/run-board-row-yield.ts +10 -4
- package/scripts/run/board/run-board-setup.ts +1 -12
- package/scripts/run/board/run-board-snapshot.ts +111 -0
- package/scripts/run/board/run-board-spin.ts +2 -2
- package/scripts/run/board/run-board-state.ts +23 -29
- package/scripts/run/board/run-board-status.ts +206 -79
- package/scripts/run/board/run-board-thanks-read.ts +2 -2
- package/scripts/run/board/run-board-tick.ts +123 -104
- package/scripts/run/board/run-board-usage-board.ts +78 -0
- package/scripts/run/board/run-board-usage-lanes.ts +113 -0
- package/scripts/run/board/run-board-usage-listing.ts +93 -0
- package/scripts/run/board/run-board-usage-read.ts +120 -150
- package/scripts/run/board/run-board-usage-rusage.ts +19 -7
- package/scripts/run/board/run-board-usage-text.ts +139 -51
- package/scripts/run/board/run-board-usage-top.ts +102 -0
- package/scripts/run/board/run-board-usage.ts +89 -72
- package/scripts/run/board/run-board-usual.ts +20 -9
- package/scripts/run/carry/run-carry-args.ts +4 -7
- package/scripts/run/carry/run-carry-conversation.ts +1 -1
- package/scripts/run/carry/run-carry.ts +9 -4
- package/scripts/run/cut/run-cut-cli.ts +3 -2
- package/scripts/run/cut/run-cut-handoff.ts +2 -2
- package/scripts/run/cut/run-cut-report.ts +16 -0
- package/scripts/run/detached-launch.ts +23 -4
- package/scripts/run/entry/run-entry-cli.ts +8 -1
- package/scripts/run/event/run-event-cli.ts +1 -5
- package/scripts/run/event/run-event-filed.ts +12 -6
- package/scripts/run/event/run-event-follow.ts +2 -3
- package/scripts/run/event/run-event-render.ts +7 -10
- package/scripts/run/event/run-event-scope.ts +20 -2
- package/scripts/run/event/run-event-stream-emit.ts +78 -11
- package/scripts/run/event/run-event-stream.ts +37 -7
- package/scripts/run/hold/run-hold-adopt.ts +65 -0
- package/scripts/run/hold/run-hold-cli.ts +93 -22
- package/scripts/run/hold/run-hold-main.ts +12 -0
- package/scripts/run/hold/run-hold-member.ts +37 -0
- package/scripts/run/hold/run-hold-session.ts +46 -0
- package/scripts/run/hold/run-hold.ts +7 -1
- package/scripts/run/hold/run-stop-notify.ts +183 -0
- package/scripts/run/launch-priority.ts +32 -0
- package/scripts/run/merge/run-merge-auth.ts +31 -0
- package/scripts/run/merge/run-merge-cli.ts +72 -107
- package/scripts/run/merge/run-merge-close.ts +74 -0
- package/scripts/run/merge/run-merge-collect.ts +6 -13
- package/scripts/run/merge/run-merge-driver.ts +71 -0
- package/scripts/run/merge/run-merge-main.ts +12 -0
- package/scripts/run/merge/run-merge-outcome.ts +23 -0
- package/scripts/run/merge/run-merge-restart.ts +39 -0
- package/scripts/run/merge/run-merge-ship.ts +20 -4
- package/scripts/run/merge/run-merge-signals.ts +123 -0
- package/scripts/run/merge/run-merge-steps.ts +128 -83
- package/scripts/run/merge/run-merge.ts +53 -40
- package/scripts/run/park/run-park-cli.ts +91 -0
- package/scripts/run/park/run-park.ts +88 -0
- package/scripts/run/park/run-stalled.ts +68 -0
- package/scripts/run/pause/run-pause-cli.ts +73 -0
- package/scripts/run/pause/run-pause.ts +251 -0
- package/scripts/run/progress/run-progress-cli.ts +4 -12
- package/scripts/run/progress/run-progress-clock.ts +1 -1
- package/scripts/run/progress/run-progress-config.ts +6 -14
- package/scripts/run/progress/run-progress-main.ts +12 -0
- package/scripts/run/progress/run-progress.ts +1 -4
- package/scripts/run/review/run-review.ts +2 -1
- package/scripts/run/run-ending.ts +1 -0
- package/scripts/run/run-invocation.ts +5 -6
- package/scripts/run/run-liveness-cli.ts +6 -8
- package/scripts/run/run-liveness.ts +61 -30
- package/scripts/run/run-next.ts +1 -1
- package/scripts/run/run-parent-cut-hook.ts +2 -2
- package/scripts/run/run-poll-hook.ts +157 -0
- package/scripts/run/run-preflight.ts +18 -3
- package/scripts/run/run-prep-cli.ts +1 -10
- package/scripts/run/run-prep-locate.ts +7 -50
- package/scripts/run/run-prep-main.ts +12 -0
- package/scripts/run/run-prep.ts +6 -0
- package/scripts/run/run-report-cli.ts +101 -13
- package/scripts/run/run-report-handoff.ts +114 -0
- package/scripts/run/run-step-cli.ts +22 -15
- package/scripts/run/run-step-section.ts +85 -0
- package/scripts/run/run-step.ts +1 -1
- package/scripts/run/run-stranded-detect.ts +13 -0
- package/scripts/run/run-watcher-guard-cli.ts +1 -1
- package/scripts/run/run-watcher-guard.ts +1 -1
- package/scripts/run/ship/run-ship-args.ts +121 -0
- package/scripts/run/ship/run-ship-body-draft.ts +110 -0
- package/scripts/run/ship/run-ship-cli.ts +67 -151
- package/scripts/run/ship/run-ship-detach.ts +27 -7
- package/scripts/run/ship/run-ship-infra-retry.ts +59 -0
- package/scripts/run/ship/run-ship-next.ts +27 -3
- package/scripts/run/ship/run-ship-overlap.ts +232 -0
- package/scripts/run/ship/run-ship-place.ts +96 -0
- package/scripts/run/ship/run-ship-pre-detach-timed.ts +43 -0
- package/scripts/run/ship/run-ship-pre-detach.ts +102 -27
- package/scripts/run/ship/run-ship-preflight.ts +161 -30
- package/scripts/run/ship/run-ship-probe.ts +11 -3
- package/scripts/run/ship/run-ship-relaunch-cap.ts +70 -0
- package/scripts/run/ship/run-ship-removed-rows.ts +61 -0
- package/scripts/run/ship/run-ship-return.ts +123 -15
- package/scripts/run/ship/run-ship-review-steps.ts +105 -149
- package/scripts/run/ship/run-ship-review.ts +73 -6
- package/scripts/run/ship/run-ship-reviewer.ts +207 -0
- package/scripts/run/ship/run-ship-stage.ts +55 -6
- package/scripts/run/ship/run-ship-steps.ts +46 -15
- package/scripts/run/ship/run-ship-stop-cause.ts +135 -0
- package/scripts/run/ship/run-ship-stop-context.ts +206 -0
- package/scripts/run/ship/run-ship-stop-text.ts +11 -6
- package/scripts/run/ship/run-ship-sync.ts +57 -12
- package/scripts/run/ship/run-ship.ts +30 -2
- package/scripts/run/tidy/run-tidy-cli.ts +0 -4
- package/scripts/run/tidy/run-tidy-lanes.ts +3 -0
- package/scripts/run/tidy/run-tidy-main.ts +8 -0
- package/scripts/run/wake/run-wake-cli.ts +119 -100
- package/scripts/run/wake/run-wake-code.ts +83 -0
- package/scripts/run/wake/run-wake-driver.ts +19 -8
- package/scripts/run/wake/run-wake-loop.ts +34 -3
- package/scripts/run/wake/run-wake-main.ts +13 -0
- package/scripts/run/wake/run-wake-ports.ts +90 -0
- package/scripts/run/wake/run-wake-takeover.ts +66 -0
- package/scripts/run/wake/run-wake.ts +2 -1
- package/scripts/safe-chain/pack-hook.ts +2 -2
- package/scripts/safe-chain/preinstall-command.ts +2 -1
- package/scripts/safe-chain/project-config.ts +3 -9
- package/scripts/security/security-audit-main.ts +8 -0
- package/scripts/security/security-audit-provision-logic.ts +0 -11
- package/scripts/security/security-audit-provision-main.ts +12 -0
- package/scripts/security/security-audit-provision.ts +11 -26
- package/scripts/security/security-audit.ts +6 -7
- package/scripts/self-sync-guard/self-sync-guard-logic.ts +6 -13
- package/scripts/split/split-assess-cli.ts +2 -2
- package/scripts/split/split-assess.ts +15 -0
- package/scripts/split/split-measure.ts +65 -0
- package/scripts/sync/claude-settings-merge.ts +8 -15
- package/scripts/sync/directory-copy-guard.ts +4 -9
- package/scripts/sync/file-content.ts +78 -8
- package/scripts/sync/sync-ai-files.ts +3 -5
- package/scripts/sync/sync-configs.ts +11 -23
- package/scripts/sync/sync-hook-safety.ts +4 -10
- package/scripts/sync/sync-main.ts +11 -0
- package/scripts/sync/sync.ts +25 -37
- package/scripts/test/test-declared-changed.ts +2 -2
- package/scripts/test/test-declared.ts +1 -1
- package/scripts/test/test-e2e-guard.ts +55 -6
- package/scripts/test/test-e2e-stamp.ts +38 -0
- package/scripts/test/test-pinned-logic.ts +145 -0
- package/scripts/test/test-pinned-main.ts +78 -0
- package/scripts/test/test-pinned.ts +100 -0
- package/scripts/test/test-read-map.ts +264 -0
- package/scripts/test/test-read-recording.ts +91 -0
- package/scripts/test/test-read-trace.ts +148 -0
- package/scripts/test/test-red-main.ts +12 -0
- package/scripts/test/test-red.ts +12 -30
- package/scripts/test/test-related-main.ts +18 -0
- package/scripts/test/test-related-record.ts +119 -0
- package/scripts/test/test-related-scope.ts +229 -43
- package/scripts/test/test-related.ts +300 -22
- package/scripts/test/test-unit-guard-main.ts +15 -0
- package/scripts/test/test-unit-guard.ts +54 -21
- package/scripts/test/unit-count-file.ts +37 -0
- package/scripts/test/unit-run-marker.ts +162 -0
- package/scripts/test/unit-setup-files.ts +51 -0
- package/scripts/test/unit-worker-share.ts +71 -137
- package/scripts/test/whole-suite-files.ts +63 -0
- package/scripts/time-runtime/time-background.ts +20 -2
- package/scripts/time-runtime/time-bundles.ts +4 -3
- package/scripts/time-runtime/time-density-hook.ts +8 -6
- package/scripts/time-runtime/time-followup-stage.ts +1 -3
- package/scripts/time-runtime/time-format.ts +5 -28
- package/scripts/time-runtime/time-markers.ts +10 -1
- package/scripts/time-runtime/time-shell.ts +126 -14
- package/scripts/time-runtime/time-spans.ts +1 -0
- package/scripts/time-runtime/time-tool-call.ts +7 -0
- package/scripts/time-runtime/time-transcript-line.ts +49 -62
- package/scripts/uninstall/uninstall.ts +1 -1
- package/scripts/version/bump-version-main.ts +12 -0
- package/scripts/version/bump-version.ts +25 -25
- package/scripts/version/effective-upstream.ts +6 -12
- package/scripts/version/latest-corepack.ts +17 -32
- package/scripts/version/latest-if-required-cli.ts +93 -0
- package/scripts/version/latest-lane-guard-main.ts +8 -0
- package/scripts/version/latest-lane-guard.ts +0 -4
- package/scripts/version/latest-scope-cli.ts +0 -9
- package/scripts/version/latest-scope-main.ts +12 -0
- package/scripts/version/latest-update.ts +5 -5
- package/scripts/version/npm-registry.ts +44 -6
- package/scripts/version/publishable-range-check.ts +5 -16
- package/scripts/version/release-age.ts +1 -1
- package/scripts/version/release-hold.ts +1 -1
- package/scripts/version/release-window.ts +38 -0
- package/scripts/version/running-binary.ts +1 -1
- package/scripts/version/safe-chain-version-update.ts +3 -8
- package/scripts/version/version-targets.ts +6 -28
- package/templates/dependabot.yml +29 -0
- package/templates/gitignore +10 -3
- package/templates/pnpm-workspace.basic.yaml +1 -1
- package/templates/sonar-project.properties +3 -2
- package/templates/workflows/ci.yml +12 -4
- package/templates/workflows/github-release.yml +4 -0
- package/tsconfig.sonar.json +1 -1
- package/.ncurc.json +0 -3
- package/dist/hooks/batch-guard.js +0 -29
- package/dist/hooks/chunk-43ZHT22P.js +0 -3495
- package/dist/hooks/chunk-CDY4NFQG.js +0 -15
- package/dist/hooks/chunk-EUMACUK2.js +0 -2038
- package/dist/hooks/chunk-H5HVWYXK.js +0 -359
- package/dist/hooks/chunk-IIGFYXKC.js +0 -7104
- package/dist/hooks/chunk-IX6TTTI6.js +0 -95
- package/dist/hooks/chunk-J47HU5H5.js +0 -237
- package/dist/hooks/chunk-K4EOONYM.js +0 -45
- package/dist/hooks/chunk-K4LMBQC2.js +0 -68
- package/dist/hooks/chunk-SHGPANFB.js +0 -56
- package/dist/hooks/chunk-YHBZAJSV.js +0 -79
- package/dist/hooks/chunk-YYPI7SJZ.js +0 -131
- package/dist/hooks/duplicate-read-guard.js +0 -30
- package/dist/hooks/investigation-guard.js +0 -32
- package/scripts/backlog/backlog-stalled-cli.ts +0 -30
- package/scripts/cost-runtime/cost-format.ts +0 -29
- package/scripts/init/basic-path-migration.ts +0 -24
- package/scripts/issue/issue-backlinks-cli.ts +0 -93
- package/scripts/josh/josh-commands-guard.ts +0 -38
- package/scripts/lint/cross-file-recheck.ts +0 -155
- package/scripts/registry-migration/migrate-logic.ts +0 -237
- package/scripts/registry-migration/migrate.ts +0 -292
- package/scripts/registry-migration/user-npmrc.ts +0 -15
- package/scripts/rules/rule-guard.ts +0 -23
- package/scripts/rules/rule-registry-rows.ts +0 -282
- package/scripts/rules/rule-registry.ts +0 -109
- package/scripts/run/run-stranded-cli.ts +0 -27
|
@@ -25,7 +25,7 @@ import type { CarryOwner, RunCarry } from './run-carry'
|
|
|
25
25
|
// How long after its last write a conversation whose process has gone still counts as continuing. It
|
|
26
26
|
// bridges a restart and a resume — measured at eighteen seconds — with room for a person reopening a
|
|
27
27
|
// window, and it is the order of the wake grace window, so a genuine crash is recovered no later than
|
|
28
|
-
// a lost wake would be retried.
|
|
28
|
+
// a lost wake would be retried. A headless owner is not given it (`run-carry.ts` → `is_owner_live`).
|
|
29
29
|
const CONVERSATION_QUIET_MS = 600_000
|
|
30
30
|
|
|
31
31
|
type Environment = Readonly<Record<string, string | undefined>>
|
|
@@ -323,11 +323,16 @@ function adopt_carry(
|
|
|
323
323
|
// A live pid with no readable start token is conservatively held rather than replaced. The command
|
|
324
324
|
// cannot prove its generation inside that sandbox, but a false `busy` stops for a person while a
|
|
325
325
|
// false `standing` can put two parents on one budget. A record with no pid still resolves false.
|
|
326
|
-
// A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`)
|
|
327
|
-
|
|
328
|
-
|
|
326
|
+
// A gone process whose conversation is still being continued is live (`run-carry-conversation.ts`);
|
|
327
|
+
// a headless owner is never resumed into a new process, so its gone process is a gone owner.
|
|
328
|
+
function is_owner_live(
|
|
329
|
+
carry: RunCarry,
|
|
330
|
+
now: Date = new Date(),
|
|
331
|
+
same_process: typeof process_identity.is_same_process = process_identity.is_same_process,
|
|
332
|
+
): boolean {
|
|
333
|
+
if (same_process(carry.owner_pid, carry.owner_start) !== false) return true
|
|
329
334
|
|
|
330
|
-
return run_carry_conversation.is_conversation_live(carry, now)
|
|
335
|
+
return carry.is_owner_headless !== true && run_carry_conversation.is_conversation_live(carry, now)
|
|
331
336
|
}
|
|
332
337
|
|
|
333
338
|
function is_owned_by(carry: RunCarry, owner: CarryOwner): boolean {
|
|
@@ -61,6 +61,7 @@ const {
|
|
|
61
61
|
report_held_cut,
|
|
62
62
|
report_incomplete,
|
|
63
63
|
report_over,
|
|
64
|
+
report_relaunched_cut,
|
|
64
65
|
report_reviewer,
|
|
65
66
|
report_stale,
|
|
66
67
|
report_under_threshold,
|
|
@@ -124,7 +125,7 @@ function relaunch(target: string, lane: LaneInfo, phase: string): number {
|
|
|
124
125
|
|
|
125
126
|
if (notes.length > 0) console.error(notes.join('\n'))
|
|
126
127
|
|
|
127
|
-
return
|
|
128
|
+
return report_relaunched_cut()
|
|
128
129
|
}
|
|
129
130
|
|
|
130
131
|
const { is_lane_branch } = run_cut_ready
|
|
@@ -199,7 +200,7 @@ async function finish_cut(target: string, lane: LaneInfo, request: CutRequest):
|
|
|
199
200
|
if (refused !== undefined) return refused
|
|
200
201
|
|
|
201
202
|
return lane_relaunch.is_openai_lane(lane)
|
|
202
|
-
?
|
|
203
|
+
? report_relaunched_cut()
|
|
203
204
|
: relaunch(target, lane, request.phase)
|
|
204
205
|
}
|
|
205
206
|
|
|
@@ -126,10 +126,10 @@ function describe_handoff(handoff: Handoff): string {
|
|
|
126
126
|
].join('\n\n')
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
// Where a handoff file is written: `.
|
|
129
|
+
// Where a handoff file is written: `.josh/tmp/` is ignored, so `josh git`, which stages every
|
|
130
130
|
// untracked non-ignored file, cannot commit the note with the code. A refusal that asked for "a file"
|
|
131
131
|
// and named no place got one written beside the code and committed (joshuafolkken/kit#3603).
|
|
132
|
-
const HANDOFF_PATH = '.
|
|
132
|
+
const HANDOFF_PATH = '.josh/tmp/handoff-<N>.json'
|
|
133
133
|
|
|
134
134
|
const run_cut_handoff = {
|
|
135
135
|
HANDOFF_FORMAT,
|
|
@@ -148,6 +148,20 @@ function report_held_cut(issue: string): number {
|
|
|
148
148
|
return report(CUT_VERDICT, SUCCESS_EXIT_CODE)
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
+
// **A cut that relaunched its successor says so on this session's own transcript** (joshuafolkken/kit#3936).
|
|
152
|
+
// The successor's `run:cut --resume` can clear the record before this session's turn ends, so the
|
|
153
|
+
// `Stop` hook cannot tell a cut stop by the record alone; it reads this line off the turn instead, a
|
|
154
|
+
// fact no other process can remove. The held cut never prints it — a person resumes that one. **A bare
|
|
155
|
+
// token line**, so it is read off the `run:cut` call's own result (`cost-run-cut.ts`), and a turn that
|
|
156
|
+
// merely quotes it is not read as a relaunch.
|
|
157
|
+
const RELAUNCHED_CUT_MARKER = 'cut-relaunched'
|
|
158
|
+
|
|
159
|
+
function report_relaunched_cut(): number {
|
|
160
|
+
console.error(RELAUNCHED_CUT_MARKER)
|
|
161
|
+
|
|
162
|
+
return report(CUT_VERDICT, SUCCESS_EXIT_CODE)
|
|
163
|
+
}
|
|
164
|
+
|
|
151
165
|
// **An implementation cut is never resumed by a session over the threshold**.
|
|
152
166
|
// The cut outside a lane leaves the session that took it open, so a person retyping `fullrun #N` there
|
|
153
167
|
// would be answered `resume-impl`, keep implementing over the threshold, and be cut again on the next
|
|
@@ -174,6 +188,7 @@ const run_cut_report = {
|
|
|
174
188
|
INCOMPLETE_VERDICT,
|
|
175
189
|
NOT_A_LANE_VERDICT,
|
|
176
190
|
OVER_VERDICT,
|
|
191
|
+
RELAUNCHED_CUT_MARKER,
|
|
177
192
|
RESUME_IMPL_VERDICT,
|
|
178
193
|
RESUME_VERDICT,
|
|
179
194
|
STALE_VERDICT,
|
|
@@ -191,6 +206,7 @@ const run_cut_report = {
|
|
|
191
206
|
report_held_cut,
|
|
192
207
|
report_incomplete,
|
|
193
208
|
report_over,
|
|
209
|
+
report_relaunched_cut,
|
|
194
210
|
report_reviewer,
|
|
195
211
|
report_stale,
|
|
196
212
|
report_under_threshold,
|
|
@@ -4,6 +4,7 @@ import { agent_launch_environment } from '#scripts/agent/agent-launch-environmen
|
|
|
4
4
|
import { agent_role_profile, type AgentProfile } from '#scripts/agent/agent-role-profile'
|
|
5
5
|
import { agent_session_environment } from '#scripts/josh/agent-session-environment'
|
|
6
6
|
import { stamp_file } from '#scripts/josh/stamp-file'
|
|
7
|
+
import { launch_priority } from '#scripts/run/launch-priority'
|
|
7
8
|
|
|
8
9
|
// Starting a process that outlives this one, and keeping what it writes.
|
|
9
10
|
//
|
|
@@ -34,13 +35,18 @@ const UNSAFE_NOTE =
|
|
|
34
35
|
//
|
|
35
36
|
// A NUL byte is what `execve` treats as the end of a string, so a value carrying one executes as a
|
|
36
37
|
// prefix of itself; the other control characters have no business in a command line and their presence
|
|
37
|
-
// means the value did not come from where it was supposed to.
|
|
38
|
+
// means the value did not come from where it was supposed to. **An agent's prompt is the one element a
|
|
39
|
+
// line break belongs in** — a ship-stop prompt carries the failed output's lines — so a vector marked
|
|
40
|
+
// `ends_with_prompt` lets it into its last element alone (joshuafolkken/kit#3964).
|
|
38
41
|
//
|
|
39
42
|
// The shared value validation lives with the role policy so environment overrides and argv elements
|
|
40
43
|
// cannot disagree about which control characters or lengths are safe.
|
|
41
44
|
interface LaunchArgv {
|
|
42
45
|
command: string
|
|
43
46
|
args: ReadonlyArray<string>
|
|
47
|
+
// Set by an agent argv builder, whose prompt is the last element: that one element may carry line
|
|
48
|
+
// breaks (`is_safe_prompt`), and every other element is checked as before.
|
|
49
|
+
ends_with_prompt?: boolean
|
|
44
50
|
}
|
|
45
51
|
|
|
46
52
|
type LaunchResult = { kind: 'launched'; pid: number } | { kind: 'failed'; note: string }
|
|
@@ -65,12 +71,23 @@ interface LaunchRequest {
|
|
|
65
71
|
profile?: AgentProfile | undefined
|
|
66
72
|
}
|
|
67
73
|
|
|
68
|
-
const { is_safe_value } = agent_role_profile
|
|
74
|
+
const { is_safe_prompt, is_safe_value } = agent_role_profile
|
|
75
|
+
const LAST = -1
|
|
76
|
+
|
|
77
|
+
// An agent vector's prompt, the last element, may break lines; every other element is a value.
|
|
78
|
+
function is_safe_element(argv: LaunchArgv, value: string, index: number): boolean {
|
|
79
|
+
const is_prompt = argv.ends_with_prompt === true && index === argv.args.length + LAST
|
|
80
|
+
|
|
81
|
+
return is_prompt ? is_safe_prompt(value) : is_safe_value(value)
|
|
82
|
+
}
|
|
69
83
|
|
|
70
84
|
// The single gate every argument vector passes before it reaches the operating system, whoever
|
|
71
85
|
// composed it.
|
|
72
86
|
function is_safe_argv(argv: LaunchArgv): boolean {
|
|
73
|
-
return
|
|
87
|
+
return (
|
|
88
|
+
is_safe_value(argv.command) &&
|
|
89
|
+
argv.args.every((value, index) => is_safe_element(argv, value, index))
|
|
90
|
+
)
|
|
74
91
|
}
|
|
75
92
|
|
|
76
93
|
function note_of(error: unknown): string {
|
|
@@ -251,6 +268,7 @@ async function attached_spawn(
|
|
|
251
268
|
child.once('exit', (exit_code) => {
|
|
252
269
|
resolve({ kind: 'completed', pid: child.pid ?? 0, exit_code })
|
|
253
270
|
})
|
|
271
|
+
launch_priority.lower(child.pid)
|
|
254
272
|
notify_spawn(child.pid, on_spawn, on_error)
|
|
255
273
|
})
|
|
256
274
|
}
|
|
@@ -287,6 +305,7 @@ function spawned(
|
|
|
287
305
|
on_error(note_of(error))
|
|
288
306
|
})
|
|
289
307
|
child.unref()
|
|
308
|
+
launch_priority.lower(child.pid)
|
|
290
309
|
|
|
291
310
|
return child.pid === undefined ? { kind: 'failed', note: NO_PID_NOTE } : launched(child.pid)
|
|
292
311
|
}
|
|
@@ -341,5 +360,5 @@ const detached_launch = {
|
|
|
341
360
|
note_of,
|
|
342
361
|
}
|
|
343
362
|
|
|
344
|
-
export type { LaunchArgv, LaunchRequest, LaunchResult }
|
|
363
|
+
export type { AttachedLaunchResult, LaunchArgv, LaunchRequest, LaunchResult }
|
|
345
364
|
export { detached_launch }
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
} from '#scripts/run/run-stage'
|
|
23
23
|
import { run_stage_read, type StageRead } from '#scripts/run/run-stage-read'
|
|
24
24
|
import { run_step } from '#scripts/run/run-step'
|
|
25
|
+
import { run_step_section } from '#scripts/run/run-step-section'
|
|
25
26
|
import { run_entry, type EntryParts } from './run-entry'
|
|
26
27
|
import { run_entry_stop } from './run-entry-stop'
|
|
27
28
|
|
|
@@ -259,7 +260,13 @@ async function proceed(issue_number: string, hold: string, cost: string): Promis
|
|
|
259
260
|
// update is measured against (`issue-watch.ts`).
|
|
260
261
|
await issue_watch.record_baseline_here(issue_number)
|
|
261
262
|
|
|
262
|
-
|
|
263
|
+
const code = emit({ issue_number, hold, cost, verdict: reads.verdict, report: reads.report })
|
|
264
|
+
|
|
265
|
+
// The entry's own read — the split assessment every run answers before its work — printed here so
|
|
266
|
+
// the reader does not spend a turn fetching it.
|
|
267
|
+
if (code !== SUCCESS_EXIT_CODE) return code
|
|
268
|
+
|
|
269
|
+
return run_step_section.print_section(run_step_section.ENTRY)
|
|
263
270
|
}
|
|
264
271
|
|
|
265
272
|
async function claim_run(
|
|
@@ -39,10 +39,6 @@ const TEXT_INDEX = 2
|
|
|
39
39
|
const USAGE =
|
|
40
40
|
'Usage: josh run:event --append <kind> <text> | --from <position> | --follow <position> | --watch [<position>] | --last'
|
|
41
41
|
|
|
42
|
-
function now_iso(): string {
|
|
43
|
-
return new Date().toISOString()
|
|
44
|
-
}
|
|
45
|
-
|
|
46
42
|
function report_usage(): number {
|
|
47
43
|
process.stderr.write(`${USAGE}\n`)
|
|
48
44
|
|
|
@@ -54,7 +50,7 @@ async function run_append(kind: string, text: string): Promise<number> {
|
|
|
54
50
|
|
|
55
51
|
if (target === undefined) return report_usage()
|
|
56
52
|
|
|
57
|
-
const result =
|
|
53
|
+
const result = await run_event_stream_emit.append_at(target, kind, text, new Date())
|
|
58
54
|
|
|
59
55
|
if (!result.appended) {
|
|
60
56
|
process.stderr.write(`not a session-facing event kind: ${kind}\n`)
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
has_label_name,
|
|
7
7
|
} from '#scripts/issue/issue-labels'
|
|
8
8
|
|
|
9
|
-
// The text of a `filed` event: the Issue a run filed, its kind, its title,
|
|
10
|
-
// turned it up. `issue:file` writes it and `run:board` reads it
|
|
11
|
-
// two never spell it differently.
|
|
9
|
+
// The text of a `filed` event: the Issue a run filed, its kind, its title, whether a run's own session
|
|
10
|
+
// filed it, and the child whose work turned it up. `issue:file` writes it and `run:board` reads it
|
|
11
|
+
// back, both through this module, so the two never spell it differently.
|
|
12
12
|
|
|
13
13
|
// The classification labels a filing's kind is read from, in precedence order: a breaking change is
|
|
14
14
|
// named as one whatever else it is.
|
|
@@ -25,13 +25,18 @@ interface Filed {
|
|
|
25
25
|
title: string
|
|
26
26
|
// The lane child that was working when the Issue was filed, when the filing came from one.
|
|
27
27
|
found_during: string | undefined
|
|
28
|
+
// A run's own session filed it — the parent holding the run's hold or a lane child — rather than one
|
|
29
|
+
// outside the run sharing the repository's stream (joshuafolkken/kit#4099). An event written before
|
|
30
|
+
// the mark was recorded reads as filed outside.
|
|
31
|
+
is_run?: boolean | undefined
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
// The kind slot is always written, `[<label>]` or `[]`, against the reference with no space: an event
|
|
31
35
|
// written before the kind always has the space there, so no title, whatever it opens with, reads as a
|
|
32
|
-
// kind.
|
|
36
|
+
// kind. The run's mark follows the kind slot, again with no space.
|
|
37
|
+
const RUN_MARK = '[run]'
|
|
33
38
|
const TEXT_PATTERN = new RegExp(
|
|
34
|
-
String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\])? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
|
|
39
|
+
String.raw`^(?<reference>\S*#\d+)(?:\[(?<kind>${KINDS.join('|')}|)\](?<run>\[run\])?)? (?<title>.*?)(?: \(found during #(?<during>\d+)\))?$`,
|
|
35
40
|
'u',
|
|
36
41
|
)
|
|
37
42
|
|
|
@@ -41,7 +46,7 @@ function kind_of(labels: ReadonlyArray<string>): FiledKind | undefined {
|
|
|
41
46
|
}
|
|
42
47
|
|
|
43
48
|
function text_of(filed: Filed): string {
|
|
44
|
-
const kind = `[${filed.kind ?? ''}]`
|
|
49
|
+
const kind = `[${filed.kind ?? ''}]${filed.is_run === true ? RUN_MARK : ''}`
|
|
45
50
|
const suffix =
|
|
46
51
|
filed.found_during === undefined
|
|
47
52
|
? ''
|
|
@@ -60,6 +65,7 @@ function parse(text: string): Filed | undefined {
|
|
|
60
65
|
kind: KINDS.find((kind) => kind === groups['kind']),
|
|
61
66
|
title: String(groups['title']),
|
|
62
67
|
found_during: groups['during'],
|
|
68
|
+
is_run: groups['run'] !== undefined,
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MS_PER_MINUTE, MS_PER_SECOND } from '#scripts/lib/timeouts'
|
|
1
2
|
import type { StreamRead } from './run-event-stream'
|
|
2
3
|
|
|
3
4
|
// The follow read behind `josh run:event --follow` and `--watch`. A reader
|
|
@@ -24,10 +25,8 @@ import type { StreamRead } from './run-event-stream'
|
|
|
24
25
|
// The follow's quiet-tick cadence and how promptly it notices an arrival. The interval only bounds a
|
|
25
26
|
// wait that found nothing — an arrival returns within a tick of landing — so it can be as long as the
|
|
26
27
|
// heartbeat without making an arrival late, and the tick is a cheap `stat` of one file.
|
|
27
|
-
const MS_PER_SECOND = 1000
|
|
28
|
-
const SECONDS_PER_MINUTE = 60
|
|
29
28
|
const FOLLOW_INTERVAL_MINUTES = 20
|
|
30
|
-
const FOLLOW_INTERVAL_MS = FOLLOW_INTERVAL_MINUTES *
|
|
29
|
+
const FOLLOW_INTERVAL_MS = FOLLOW_INTERVAL_MINUTES * MS_PER_MINUTE
|
|
31
30
|
const FOLLOW_TICK_MS = MS_PER_SECOND
|
|
32
31
|
|
|
33
32
|
interface FollowPorts {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { figure_format } from '#scripts/lib/figure-format'
|
|
1
2
|
import type { EventKind, RunEvent } from './run-event-stream'
|
|
2
3
|
|
|
3
4
|
// One run event as the line a person reads in the watch pane. The pane is a script, not a session, so
|
|
@@ -10,8 +11,6 @@ import type { EventKind, RunEvent } from './run-event-stream'
|
|
|
10
11
|
|
|
11
12
|
const JA = 'ja'
|
|
12
13
|
const FIELD_SEPARATOR = ' · '
|
|
13
|
-
const CLOCK_WIDTH = 2
|
|
14
|
-
const CLOCK_PAD = '0'
|
|
15
14
|
|
|
16
15
|
interface KindLabel {
|
|
17
16
|
ja: string
|
|
@@ -29,6 +28,7 @@ const KIND_LABELS: Readonly<Record<EventKind, KindLabel>> = {
|
|
|
29
28
|
cut: { ja: 'セッション交代', en: 'session cut' },
|
|
30
29
|
resume: { ja: '実装を再開', en: 'implementation resumed' },
|
|
31
30
|
restart: { ja: '止めて出し直し', en: 'restarted' },
|
|
31
|
+
withdraw: { ja: '取り下げ', en: 'withdrawn' },
|
|
32
32
|
drain: { ja: 'バックログが空', en: 'backlog drained' },
|
|
33
33
|
stop: { ja: '停止', en: 'stopped' },
|
|
34
34
|
'pr-opened': { ja: 'PR 作成', en: 'PR opened' },
|
|
@@ -47,6 +47,9 @@ const KIND_LABELS: Readonly<Record<EventKind, KindLabel>> = {
|
|
|
47
47
|
'lane-limit': { ja: 'レーン上限', en: 'lane limit' },
|
|
48
48
|
setup: { ja: '準備', en: 'setup' },
|
|
49
49
|
'pr-checks': { ja: 'PR のチェック', en: 'PR checks' },
|
|
50
|
+
'idle-notice': { ja: '待機の通知', en: 'idle notice' },
|
|
51
|
+
'lane-state': { ja: 'レーンの状態', en: 'lane state' },
|
|
52
|
+
'paused-notice': { ja: '一時停止の通知', en: 'paused notice' },
|
|
50
53
|
}
|
|
51
54
|
|
|
52
55
|
const LABELS_BY_KIND: ReadonlyMap<string, KindLabel> = new Map(Object.entries(KIND_LABELS))
|
|
@@ -59,18 +62,12 @@ function label_of(kind: string, lang: string): string {
|
|
|
59
62
|
return lang === JA ? label.ja : label.en
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
function two_digits(value: number): string {
|
|
63
|
-
return String(value).padStart(CLOCK_WIDTH, CLOCK_PAD)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
65
|
// The local wall-clock `HH:MM` of the event, the reading a person watching a pane compares with the clock
|
|
67
66
|
// on their screen; an unparseable stamp is shown as written rather than as `NaN:NaN`.
|
|
68
67
|
function clock_of(at: string): string {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
if (Number.isNaN(date.getTime())) return at
|
|
68
|
+
const ms = new Date(at).getTime()
|
|
72
69
|
|
|
73
|
-
return
|
|
70
|
+
return Number.isNaN(ms) ? at : figure_format.minute_of(ms)
|
|
74
71
|
}
|
|
75
72
|
|
|
76
73
|
function render(event: RunEvent, lang: string): string {
|
|
@@ -94,6 +94,7 @@ const KIND = run_event_stream.EVENT_KIND
|
|
|
94
94
|
const BATCH_RECORD_KINDS: ReadonlySet<string> = new Set([
|
|
95
95
|
KIND.CHILD_LAUNCH,
|
|
96
96
|
KIND.RESTART,
|
|
97
|
+
KIND.WITHDRAW,
|
|
97
98
|
KIND.PARK,
|
|
98
99
|
KIND.SPLIT,
|
|
99
100
|
KIND.RETROSPECTIVE,
|
|
@@ -113,7 +114,7 @@ function is_own_ship_event(event: RunEvent, issue: string): boolean {
|
|
|
113
114
|
}
|
|
114
115
|
|
|
115
116
|
// The issue an event's text names, the way every reader here — and `run:board` — keys an event to a child.
|
|
116
|
-
function issue_named(event: RunEvent): string | undefined {
|
|
117
|
+
function issue_named(event: Pick<RunEvent, 'text'>): string | undefined {
|
|
117
118
|
return ISSUE_REFERENCE.exec(event.text)?.[1]
|
|
118
119
|
}
|
|
119
120
|
|
|
@@ -167,12 +168,14 @@ function last_issue_event(
|
|
|
167
168
|
}
|
|
168
169
|
|
|
169
170
|
// A child's launch and the endings `run:merge` settles it with — the ones `run:board` stops drawing it
|
|
170
|
-
// running on. A park or a split already ran `run:merge`, so a child closed after one owes nothing
|
|
171
|
+
// running on. A park or a split already ran `run:merge`, so a child closed after one owes nothing; a
|
|
172
|
+
// withdrawal settles the child itself, its issue left open for the next run.
|
|
171
173
|
const LAUNCH_OR_SETTLE_KINDS: ReadonlySet<string> = new Set([
|
|
172
174
|
KIND.CHILD_LAUNCH,
|
|
173
175
|
KIND.MERGE,
|
|
174
176
|
KIND.PARK,
|
|
175
177
|
KIND.SPLIT,
|
|
178
|
+
KIND.WITHDRAW,
|
|
176
179
|
])
|
|
177
180
|
|
|
178
181
|
// Whether this invocation's newest launch of the issue has not yet been settled.
|
|
@@ -186,9 +189,24 @@ function is_merge_owed(events: ReadonlyArray<RunEvent>, scope: EventScope, issue
|
|
|
186
189
|
return newest?.kind === KIND.CHILD_LAUNCH
|
|
187
190
|
}
|
|
188
191
|
|
|
192
|
+
function is_launch_or_withdrawal(event: RunEvent, issue: string): boolean {
|
|
193
|
+
const is_kind = event.kind === KIND.CHILD_LAUNCH || event.kind === KIND.WITHDRAW
|
|
194
|
+
|
|
195
|
+
return is_kind && names_issue(event, issue)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Whether a person withdrew the issue's newest launch (`lane:withdraw`): its newest launch or withdrawal
|
|
199
|
+
// is a withdrawal. A launch after it is a fresh attempt, which the old withdrawal does not settle.
|
|
200
|
+
function is_withdrawn(events: ReadonlyArray<RunEvent>, issue: string): boolean {
|
|
201
|
+
const newest = events.findLast((event) => is_launch_or_withdrawal(event, issue))
|
|
202
|
+
|
|
203
|
+
return newest?.kind === KIND.WITHDRAW
|
|
204
|
+
}
|
|
205
|
+
|
|
189
206
|
const run_event_scope = {
|
|
190
207
|
UNKNOWN_EVENT_SCOPE,
|
|
191
208
|
is_merge_owed,
|
|
209
|
+
is_withdrawn,
|
|
192
210
|
issue_named,
|
|
193
211
|
last_issue_event,
|
|
194
212
|
last_scoped_event,
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { lane_state, type LaneStateRecord } from '#scripts/lane/lane-state'
|
|
1
2
|
import { error_text } from '#scripts/lib/error-message'
|
|
3
|
+
import { run_board_lane_time } from '#scripts/run/board/run-board-lane-time'
|
|
2
4
|
import { run_carry } from '#scripts/run/carry/run-carry'
|
|
3
5
|
import { run_event_scope } from './run-event-scope'
|
|
4
|
-
import { run_event_stream, type RunEvent } from './run-event-stream'
|
|
6
|
+
import { run_event_stream, type AppendResult, type RunEvent } from './run-event-stream'
|
|
5
7
|
|
|
6
8
|
// The write side of the run's event stream. It resolves the run's identity and
|
|
7
9
|
// appends, and it is where the "reporting must not break the work it reports on" contract is kept: every
|
|
@@ -27,17 +29,66 @@ async function stream_target(): Promise<string | undefined> {
|
|
|
27
29
|
return repository === undefined ? undefined : run_event_stream.target_of(repository)
|
|
28
30
|
}
|
|
29
31
|
|
|
32
|
+
// The child's lane record; an unreadable one reads as none, so the ending is still written.
|
|
33
|
+
async function lane_record(issue: string): Promise<LaneStateRecord | undefined> {
|
|
34
|
+
try {
|
|
35
|
+
return await lane_state.read_state(issue)
|
|
36
|
+
} catch (error) {
|
|
37
|
+
error_text.trace_swallowed('run_event_stream_emit.lane_record', error)
|
|
38
|
+
|
|
39
|
+
return undefined
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function ending_fields(
|
|
44
|
+
target: string,
|
|
45
|
+
event: Omit<RunEvent, 'pos'>,
|
|
46
|
+
): Promise<Pick<RunEvent, 'elapsed_ms'>> {
|
|
47
|
+
const issue = run_event_scope.issue_named(event)
|
|
48
|
+
|
|
49
|
+
if (issue === undefined || !run_board_lane_time.OFF_LANE_KINDS.has(event.kind)) return {}
|
|
50
|
+
|
|
51
|
+
const elapsed_ms = run_board_lane_time.ending_elapsed({
|
|
52
|
+
events: run_event_stream.read_events(target),
|
|
53
|
+
issue: Number(issue),
|
|
54
|
+
record: await lane_record(issue),
|
|
55
|
+
ended_ms: Date.parse(event.at),
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
return elapsed_ms === undefined ? {} : { elapsed_ms }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Append one event at `at`, an ending with its child's lane time (joshuafolkken/kit#4481). Every writer
|
|
63
|
+
* of an ending — `emit` and `run:event --append` — appends through here, so the time is computed once,
|
|
64
|
+
* as the ending is written, with the board's own count.
|
|
65
|
+
*/
|
|
66
|
+
async function append_at(
|
|
67
|
+
target: string,
|
|
68
|
+
kind: string,
|
|
69
|
+
text: string,
|
|
70
|
+
at: Date,
|
|
71
|
+
): Promise<AppendResult> {
|
|
72
|
+
const event = { kind, text, at: at.toISOString() }
|
|
73
|
+
|
|
74
|
+
return run_event_stream.append_event(target, {
|
|
75
|
+
...event,
|
|
76
|
+
...(await ending_fields(target, event)),
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
30
80
|
/**
|
|
31
81
|
* Append one session-facing event, best-effort. A kind outside the enumeration is refused by `append`;
|
|
32
82
|
* every error is swallowed, because the reporting path must never fail the work it reports on.
|
|
83
|
+
* `at` is the caller's instant where another record must carry the same one.
|
|
33
84
|
*/
|
|
34
|
-
async function emit(kind: string, text: string): Promise<void> {
|
|
85
|
+
async function emit(kind: string, text: string, at: Date = new Date()): Promise<void> {
|
|
35
86
|
try {
|
|
36
87
|
const target = await stream_target()
|
|
37
88
|
|
|
38
89
|
if (target === undefined) return
|
|
39
90
|
|
|
40
|
-
|
|
91
|
+
await append_at(target, kind, text, at)
|
|
41
92
|
} catch {
|
|
42
93
|
// Reporting is best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
43
94
|
}
|
|
@@ -85,37 +136,51 @@ function invocation_events(repository: string, target: string): ReadonlyArray<Ru
|
|
|
85
136
|
* Append one event unless this kind is already on the stream since the newest `reset_kind` — the
|
|
86
137
|
* episode marker for a condition that holds across other events. `emit_once`'s newest-event test would
|
|
87
138
|
* re-fire each time a parallel lane appended a merge or a park; this ends the episode only at
|
|
88
|
-
* `reset_kind`.
|
|
139
|
+
* `reset_kind`. The text is composed only once the episode is new, so a caller polled every pass whose
|
|
140
|
+
* text costs a network read pays it once. Returns the appended text, or `undefined` when nothing was.
|
|
89
141
|
*/
|
|
90
|
-
async function
|
|
142
|
+
async function emit_once_since_with(
|
|
143
|
+
kind: string,
|
|
144
|
+
reset_kind: string,
|
|
145
|
+
compose: () => Promise<string>,
|
|
146
|
+
): Promise<string | undefined> {
|
|
91
147
|
try {
|
|
92
148
|
const repository = await run_carry.repository_directory()
|
|
93
149
|
|
|
94
|
-
if (repository === undefined) return
|
|
150
|
+
if (repository === undefined) return undefined
|
|
95
151
|
|
|
96
152
|
const target = run_event_stream.target_of(repository)
|
|
97
153
|
|
|
98
154
|
if (run_event_stream.has_since(invocation_events(repository, target), kind, reset_kind)) {
|
|
99
|
-
return
|
|
155
|
+
return undefined
|
|
100
156
|
}
|
|
101
157
|
|
|
102
|
-
|
|
158
|
+
const text = await compose()
|
|
159
|
+
|
|
160
|
+
return run_event_stream.append(target, kind, text, now_iso()).appended ? text : undefined
|
|
103
161
|
} catch (error) {
|
|
104
162
|
// Best-effort: a failed append is dropped rather than raised into the caller's work.
|
|
105
163
|
error_text.trace_swallowed('run_event_stream_emit.emit_once_since', error)
|
|
106
164
|
|
|
107
|
-
return
|
|
165
|
+
return undefined
|
|
108
166
|
}
|
|
109
167
|
}
|
|
110
168
|
|
|
169
|
+
// `emit_once_since_with` for a text already in hand. Returns whether it appended, as `emit_once` does.
|
|
170
|
+
async function emit_once_since(kind: string, text: string, reset_kind: string): Promise<boolean> {
|
|
171
|
+
const appended = await emit_once_since_with(kind, reset_kind, async () => text)
|
|
172
|
+
|
|
173
|
+
return appended !== undefined
|
|
174
|
+
}
|
|
175
|
+
|
|
111
176
|
// One progress heartbeat line onto the stream, so a relay reaches it across a cut.
|
|
112
177
|
async function emit_heartbeat(line: string): Promise<void> {
|
|
113
178
|
await emit(run_event_stream.EVENT_KIND.HEARTBEAT, line)
|
|
114
179
|
}
|
|
115
180
|
|
|
116
181
|
// The events of the invocation now running, for a reader restoring the run from its stream
|
|
117
|
-
// (`backlog:drive`). Fail-quiet like the writers: no repository
|
|
118
|
-
// invocation.
|
|
182
|
+
// (`backlog:drive`). Fail-quiet like the writers: no repository, an unreadable stream or an
|
|
183
|
+
// undetermined scope is an empty invocation.
|
|
119
184
|
async function current_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
120
185
|
try {
|
|
121
186
|
const repository = await run_carry.repository_directory()
|
|
@@ -161,11 +226,13 @@ async function all_events(): Promise<ReadonlyArray<RunEvent>> {
|
|
|
161
226
|
|
|
162
227
|
const run_event_stream_emit = {
|
|
163
228
|
all_events,
|
|
229
|
+
append_at,
|
|
164
230
|
current_events,
|
|
165
231
|
emit,
|
|
166
232
|
emit_heartbeat,
|
|
167
233
|
emit_once,
|
|
168
234
|
emit_once_since,
|
|
235
|
+
emit_once_since_with,
|
|
169
236
|
invocation_or_all_events,
|
|
170
237
|
stream_target,
|
|
171
238
|
}
|
|
@@ -29,10 +29,11 @@ const EVENT_PREFIX = 'josh-run-events-'
|
|
|
29
29
|
// every reader — a person, an editor — that it is a line stream rather than a single document, the same
|
|
30
30
|
// distinction the ambient `.log` draws.
|
|
31
31
|
const EVENT_SUFFIX = '.jsonl'
|
|
32
|
-
// A run's
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
|
|
32
|
+
// A week of a busy run's events, so `josh lane:stats --period 7` reads the parks that end a stop's wait
|
|
33
|
+
// and `run:board` keeps every ship stage (joshuafolkken/kit#3997). A four-lane `backlogrun` wrote about
|
|
34
|
+
// 75 events an hour (1,877 in 25 hours), so fifteen thousand holds about eight days at that rate and
|
|
35
|
+
// still bounds the file to a few megabytes — past it the oldest events roll off.
|
|
36
|
+
const EVENT_CAP = 15_000
|
|
36
37
|
const FIRST_POSITION = 0
|
|
37
38
|
const POSITION_INCREMENT = 1
|
|
38
39
|
const LINE_SEPARATOR = '\n'
|
|
@@ -64,6 +65,10 @@ const EVENT_KIND = {
|
|
|
64
65
|
// (`lane:restart`). It follows the fresh dispatch's `CHILD_LAUNCH`, so it is a launch to the parent and
|
|
65
66
|
// the board, and — like that launch — a batch record a lane child never reads as its own position.
|
|
66
67
|
RESTART: 'restart',
|
|
68
|
+
// A person withdrew a lane child — stopped it and left its issue open for the next run (`lane:withdraw`).
|
|
69
|
+
// It is written before the stop, so `run:merge` settles the child as withdrawn whatever GitHub says
|
|
70
|
+
// by the time the parent collects it, and counts it as neither a merge, a failure nor an outage.
|
|
71
|
+
WITHDRAW: 'withdraw',
|
|
67
72
|
// The backlog emptied while nothing of the run's own was in flight — the drain. It marks the position
|
|
68
73
|
// at which the end-of-run retrospective is owed, *before* the idle watch opens, so `run:step` fires
|
|
69
74
|
// the retrospective at the drain rather than after the watch runs its course. It is not itself a
|
|
@@ -139,6 +144,19 @@ const EVENT_KIND = {
|
|
|
139
144
|
// in followup without asking GitHub (joshuafolkken/kit#3770). A trace: it says how the checks stand,
|
|
140
145
|
// not where the run is.
|
|
141
146
|
PR_CHECKS: 'pr-checks',
|
|
147
|
+
// `backlog:drive` reached a watch with no child running and nothing to dispatch — the point a person's
|
|
148
|
+
// hand is wanted. Emitted once per idle episode (`emit_once_since_with`, reset by `CHILD_LAUNCH`), it
|
|
149
|
+
// is the dedup marker for the one idle Telegram. A trace: a drain's retrospective is read off the
|
|
150
|
+
// position beneath it, so the marker must not stand over it.
|
|
151
|
+
IDLE_NOTICE: 'idle-notice',
|
|
152
|
+
// A person paused or resumed a lane child (`lane:pause` / `lane:resume`), so who halted a lane and
|
|
153
|
+
// when is on the stream rather than only in a shell history (joshuafolkken/kit#4268). A trace: it
|
|
154
|
+
// says what a lane's processes were told, not where the run is.
|
|
155
|
+
LANE_STATE: 'lane-state',
|
|
156
|
+
// `backlog:drive` found nothing of the run in flight and only paused lanes left, paused past the
|
|
157
|
+
// silent window (joshuafolkken/kit#4270). Emitted once per pause episode (`emit_once_since_with`,
|
|
158
|
+
// reset by `LANE_STATE`), it is the dedup marker for the one paused-lane Telegram. A trace.
|
|
159
|
+
PAUSED_NOTICE: 'paused-notice',
|
|
142
160
|
} as const
|
|
143
161
|
|
|
144
162
|
type EventKind = (typeof EVENT_KIND)[keyof typeof EVENT_KIND]
|
|
@@ -158,6 +176,9 @@ const TRACE_KINDS: ReadonlySet<string> = new Set([
|
|
|
158
176
|
EVENT_KIND.LANE_LIMIT,
|
|
159
177
|
EVENT_KIND.SETUP,
|
|
160
178
|
EVENT_KIND.PR_CHECKS,
|
|
179
|
+
EVENT_KIND.IDLE_NOTICE,
|
|
180
|
+
EVENT_KIND.LANE_STATE,
|
|
181
|
+
EVENT_KIND.PAUSED_NOTICE,
|
|
161
182
|
])
|
|
162
183
|
|
|
163
184
|
// The trace kinds that say only that the run was alive, so the bound rolls them off first. A `filed` or
|
|
@@ -177,6 +198,9 @@ const event_schema = z.object({
|
|
|
177
198
|
at: z.string(),
|
|
178
199
|
kind: z.string(),
|
|
179
200
|
text: z.string(),
|
|
201
|
+
// The child's time on a lane, recorded once by the writer of an ending (joshuafolkken/kit#4481), so a
|
|
202
|
+
// reader never has to find its launch again. An event written before it has none.
|
|
203
|
+
elapsed_ms: z.number().optional(),
|
|
180
204
|
})
|
|
181
205
|
|
|
182
206
|
type RunEvent = z.infer<typeof event_schema>
|
|
@@ -342,12 +366,12 @@ function append_held(target: string, event: Omit<RunEvent, 'pos'>): number {
|
|
|
342
366
|
* unlocked read-then-rewrite would lose one writer's event to another's. A lock still
|
|
343
367
|
* held after the wait is reported on stderr and thrown, which the best-effort emit side swallows.
|
|
344
368
|
*/
|
|
345
|
-
function
|
|
346
|
-
if (!is_event_kind(kind)) return { appended: false, position: FIRST_POSITION }
|
|
369
|
+
function append_event(target: string, event: Omit<RunEvent, 'pos'>): AppendResult {
|
|
370
|
+
if (!is_event_kind(event.kind)) return { appended: false, position: FIRST_POSITION }
|
|
347
371
|
|
|
348
372
|
const lock = `${target}${LOCK_SUFFIX}`
|
|
349
373
|
const position = repository_lock.with_lock_sync(
|
|
350
|
-
() => append_held(target,
|
|
374
|
+
() => append_held(target, event),
|
|
351
375
|
lock,
|
|
352
376
|
LOCK_WAIT_MS,
|
|
353
377
|
)
|
|
@@ -362,6 +386,11 @@ function append(target: string, kind: string, text: string, at: string): AppendR
|
|
|
362
386
|
return { appended: true, position }
|
|
363
387
|
}
|
|
364
388
|
|
|
389
|
+
// `append_event` for an event that records nothing beyond its kind, text and instant.
|
|
390
|
+
function append(target: string, kind: string, text: string, at: string): AppendResult {
|
|
391
|
+
return append_event(target, { at, kind, text })
|
|
392
|
+
}
|
|
393
|
+
|
|
365
394
|
/**
|
|
366
395
|
* Every event after `position`, in order, and the position a reader passes back next time.
|
|
367
396
|
*
|
|
@@ -411,6 +440,7 @@ const run_event_stream = {
|
|
|
411
440
|
EVENT_KINDS,
|
|
412
441
|
TRACE_KINDS,
|
|
413
442
|
append,
|
|
443
|
+
append_event,
|
|
414
444
|
format_event,
|
|
415
445
|
has_since,
|
|
416
446
|
is_stage_start,
|