@joshuafolkken/kit 1.978.0 → 1.998.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.
Files changed (138) hide show
  1. package/.claude/skills/epic-commands/SKILL.md +6 -5
  2. package/.claude/skills/workflow-commands/SKILL.md +9 -9
  3. package/.claude/skills/workflow-commands/background-commands.md +1 -1
  4. package/.claude/skills/workflow-commands/backlogrun-child.md +1 -1
  5. package/.claude/skills/workflow-commands/backlogrun-steps.md +1 -1
  6. package/.claude/skills/workflow-commands/fullrun-steps.md +8 -8
  7. package/.claude/skills/workflow-commands/halfrun.md +4 -5
  8. package/.claude/skills/workflow-commands/issue-comments.md +1 -1
  9. package/.claude/skills/workflow-commands/issue-scout.md +21 -22
  10. package/.claude/skills/workflow-commands/kickoff.md +8 -9
  11. package/.claude/skills/workflow-commands/observation-filing.md +9 -10
  12. package/.claude/skills/workflow-commands/prerequisite.md +7 -6
  13. package/.claude/skills/workflow-commands/retrospective.md +5 -5
  14. package/.claude/skills/workflow-commands/rule-residency.md +2 -2
  15. package/.claude/skills/workflow-commands/split-assessment.md +4 -3
  16. package/.claude/skills/workflow-commands/target-repository.md +7 -6
  17. package/.github/workflows/sonar-qube.yml +12 -2
  18. package/CLAUDE.md +2 -2
  19. package/README.md +30 -21
  20. package/dist/CLAUDE.md +2 -2
  21. package/dist/hooks/batch-guard.js +4 -4
  22. package/dist/hooks/{chunk-ZYYSBNR6.js → chunk-4GDR2YTV.js} +4 -4
  23. package/dist/hooks/{chunk-2K52BRWV.js → chunk-56LGMJJV.js} +2 -2
  24. package/dist/hooks/{chunk-BNGGEY3Z.js → chunk-762BDXDU.js} +266 -327
  25. package/dist/hooks/{chunk-Q7LE77CO.js → chunk-7WAOP42A.js} +34 -30
  26. package/dist/hooks/{chunk-NXL3SBXY.js → chunk-A2H5I2VD.js} +2 -2
  27. package/dist/hooks/{chunk-CRGJTD6E.js → chunk-AWTFKKFW.js} +1 -1
  28. package/dist/hooks/{chunk-KQG4776P.js → chunk-GBJUERYK.js} +1 -1
  29. package/dist/hooks/{chunk-BVMSPG3M.js → chunk-KPZN42RT.js} +3 -3
  30. package/dist/hooks/{chunk-ZPLXLJ7O.js → chunk-PAXMLGSS.js} +42 -8
  31. package/dist/hooks/{chunk-F6OM6SIG.js → chunk-WMIR5SNX.js} +12 -12
  32. package/dist/hooks/codex-hook-adapter.js +10 -10
  33. package/dist/hooks/duplicate-read-guard.js +5 -5
  34. package/dist/hooks/format-edited.js +2 -2
  35. package/dist/hooks/investigation-guard.js +5 -5
  36. package/dist/hooks/pretool-guard.js +9 -9
  37. package/dist/hooks/stop-guard.js +99 -27
  38. package/dist/josh.js +21 -6
  39. package/package.json +5 -1
  40. package/prettier/basic.d.ts +3 -0
  41. package/prettier/basic.js +10 -0
  42. package/prettier/index.js +2 -2
  43. package/prettier/static.js +3 -10
  44. package/prompts/collaboration-workflow/epic-bundle.md +8 -8
  45. package/prompts/collaboration-workflow/issue-template.md +5 -5
  46. package/prompts/collaboration-workflow/rule-delivery.md +43 -30
  47. package/prompts/collaboration-workflow/upstream-interrupt.md +1 -1
  48. package/prompts/collaboration-workflow/wip-cap.md +3 -3
  49. package/prompts/review.md +11 -9
  50. package/prompts/sonar-hotspot-handling.md +6 -0
  51. package/prompts/testing-guide.md +1 -1
  52. package/scripts/agent/agent-diagnostics.ts +1 -0
  53. package/scripts/agent/agent-role-profile.ts +1 -1
  54. package/scripts/behavior/behavior-rules.ts +8 -1
  55. package/scripts/build/build-claude-md.ts +13 -4
  56. package/scripts/delegation/delegation-policy.ts +9 -9
  57. package/scripts/document/document-byte-budget.ts +1 -1
  58. package/scripts/gate/gate-steps.ts +1 -1
  59. package/scripts/gate/project-checks.ts +12 -11
  60. package/scripts/gate/type-check-command.ts +1 -1
  61. package/scripts/git/git-branch.ts +14 -3
  62. package/scripts/git/git-issue.ts +13 -5
  63. package/scripts/git/git-pr.ts +16 -10
  64. package/scripts/git/git-preflight.ts +138 -0
  65. package/scripts/git/telegram-notify.ts +21 -0
  66. package/scripts/hooks/stop-guard.ts +2 -0
  67. package/scripts/init/basic-path-migration.ts +24 -0
  68. package/scripts/init/distributed-paths.ts +22 -0
  69. package/scripts/init/init-actions.ts +27 -19
  70. package/scripts/init/init-ai-copy.ts +86 -28
  71. package/scripts/init/{init-static.ts → init-basic.ts} +6 -6
  72. package/scripts/init/init-bootstrap.ts +4 -3
  73. package/scripts/init/init-install.ts +1 -1
  74. package/scripts/init/init-logic-templates.ts +1 -1
  75. package/scripts/init/init-logic.ts +1 -1
  76. package/scripts/init/init.ts +41 -19
  77. package/scripts/init/kit-setup-state.ts +30 -0
  78. package/scripts/init/kit-written-paths.ts +33 -0
  79. package/scripts/init/project-profile-cli.ts +15 -1
  80. package/scripts/init/project-profile.ts +41 -12
  81. package/scripts/init/session-language-environment.ts +83 -0
  82. package/scripts/init/start-exec.ts +28 -0
  83. package/scripts/init/start-plan.ts +35 -13
  84. package/scripts/init/start-prompt.ts +22 -8
  85. package/scripts/init/start-setup-pr.ts +138 -0
  86. package/scripts/init/start-steps.ts +30 -30
  87. package/scripts/init/start.ts +7 -3
  88. package/scripts/issue/issue-file-cli.ts +188 -0
  89. package/scripts/issue/issue-file.ts +192 -0
  90. package/scripts/issue/issue-lint-cli.ts +1 -1
  91. package/scripts/issue/issue-scout-cli.ts +41 -97
  92. package/scripts/issue/issue-scout-closed.ts +102 -0
  93. package/scripts/josh/__snapshots__/josh-command-map.test.ts.snap +12 -4
  94. package/scripts/josh/josh-command-map.ts +1 -0
  95. package/scripts/josh/josh-commands-development.ts +3 -3
  96. package/scripts/josh/josh-commands-issue.ts +11 -0
  97. package/scripts/josh/josh-commands-project.ts +7 -3
  98. package/scripts/lint/cspell-cached.ts +3 -3
  99. package/scripts/lint/format.ts +1 -1
  100. package/scripts/lint/lint-parallel.ts +2 -2
  101. package/scripts/propagate/propagate-run.ts +1 -0
  102. package/scripts/propagate/propagate-select.ts +72 -0
  103. package/scripts/propagate/propagate-targets.ts +5 -3
  104. package/scripts/propagate/propagate.ts +86 -24
  105. package/scripts/rules/bash-triggers.ts +19 -6
  106. package/scripts/rules/delivered-rules.ts +28 -32
  107. package/scripts/rules/direct-filing.ts +38 -0
  108. package/scripts/rules/filing-cap.ts +12 -8
  109. package/scripts/rules/issue-citation.ts +30 -1
  110. package/scripts/rules/issue-fold.ts +4 -4
  111. package/scripts/rules/last-prompt.ts +79 -0
  112. package/scripts/rules/oracle-consulted.ts +4 -4
  113. package/scripts/rules/oracle-firing.ts +13 -16
  114. package/scripts/rules/rule-body-guard.ts +6 -9
  115. package/scripts/rules/stop-rules.ts +8 -5
  116. package/scripts/safe-chain/ci-installer-pin.ts +19 -12
  117. package/scripts/safe-chain/project-config.ts +1 -1
  118. package/scripts/sync/sync-ai-files.ts +204 -0
  119. package/scripts/sync/sync.ts +48 -184
  120. package/scripts/test/josh-harness-environment.ts +1 -1
  121. package/scripts/test/pilot-files.ts +0 -2
  122. package/scripts/test/test-declared-changed.ts +1 -1
  123. package/scripts/test/test-declared-logic.ts +55 -14
  124. package/scripts/test/test-declared.ts +23 -11
  125. package/scripts/test/test-unit-guard.ts +6 -6
  126. package/scripts/time-runtime/time-shell.ts +36 -2
  127. package/scripts/version/fresh-metadata-cache.ts +36 -0
  128. package/scripts/version/latest-update.ts +2 -1
  129. package/scripts-ai/git-workflow.ts +10 -0
  130. package/templates/CLAUDE.basic.md +8 -0
  131. package/templates/workflows/ci.yml +27 -0
  132. package/scripts/rules/issue-bug-label.ts +0 -85
  133. package/scripts/rules/issue-filing-args.ts +0 -50
  134. package/scripts/rules/issue-scout.ts +0 -64
  135. /package/{templates/CLAUDE.static.md → dist/CLAUDE.basic.md} +0 -0
  136. /package/templates/{cursorrules.static → cursorrules.basic} +0 -0
  137. /package/templates/{pnpm-workspace.static.yaml → pnpm-workspace.basic.yaml} +0 -0
  138. /package/templates/{prettierignore.static → prettierignore.basic} +0 -0
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  lane_child_marker,
3
3
  run_issue_number
4
- } from "./chunk-KQG4776P.js";
4
+ } from "./chunk-GBJUERYK.js";
5
5
  import {
6
6
  PLATFORM_TEMP_ROOT,
7
7
  cost_blocks,
@@ -12,7 +12,7 @@ import {
12
12
  time_density_hook,
13
13
  time_shell,
14
14
  time_transcript_line
15
- } from "./chunk-ZPLXLJ7O.js";
15
+ } from "./chunk-PAXMLGSS.js";
16
16
  import {
17
17
  ENV_FILE_NAME,
18
18
  LANE_SEAT_KEY,
@@ -20,6 +20,22 @@ import {
20
20
  ports
21
21
  } from "./chunk-RKUAD3I6.js";
22
22
 
23
+ // scripts/rules/shell-segments.ts
24
+ var SEGMENT_SEPARATOR = /&&|\|\||;|\n/u;
25
+ function segments_of(command) {
26
+ return command.split(SEGMENT_SEPARATOR).map((segment) => segment.trim());
27
+ }
28
+ function is_josh_command(segment, names) {
29
+ const named = time_shell.josh_command_of(segment);
30
+ if (!named.startsWith(time_shell.JOSH_PREFIX)) return false;
31
+ return names.has(named.slice(time_shell.JOSH_PREFIX.length));
32
+ }
33
+ var shell_segments = {
34
+ SEGMENT_SEPARATOR,
35
+ is_josh_command,
36
+ segments_of
37
+ };
38
+
23
39
  // scripts/rules/bash-triggers.ts
24
40
  function on_bash_command(is_match) {
25
41
  return function is_trigger(call) {
@@ -30,11 +46,15 @@ function on_bash_command(is_match) {
30
46
  var ISSUE_CREATE_COMMAND = /\bgh\s+(?:\S+\s+)*?issue\s+create\b/u;
31
47
  var ISSUES_ENDPOINT = /repos\/[^\s'"]*\/issues(?=$|["'\s])/u;
32
48
  var TITLE_FIELD = /(?:-f|-F|--field|--raw-field)\s*'?title=/u;
33
- function is_issue_filing(command) {
49
+ function is_direct_filing(command) {
34
50
  if (ISSUE_CREATE_COMMAND.test(command)) return true;
35
51
  return ISSUES_ENDPOINT.test(command) && TITLE_FIELD.test(command);
36
52
  }
37
- var bash_triggers = { is_issue_filing, on_bash_command };
53
+ var FILING_NAMES = /* @__PURE__ */ new Set(["issue:file"]);
54
+ function is_issue_filing(command) {
55
+ return shell_segments.segments_of(command).some((segment) => shell_segments.is_josh_command(segment, FILING_NAMES));
56
+ }
57
+ var bash_triggers = { is_direct_filing, is_issue_filing, on_bash_command };
38
58
 
39
59
  // scripts/rules/tail-commands.ts
40
60
  function is_bash_use(block) {
@@ -58,7 +78,7 @@ function is_filing_use(block) {
58
78
  return bash_triggers.is_issue_filing(time_shell.bash_command(block.input));
59
79
  }
60
80
  function collect_block(block, found) {
61
- if (block.result_id !== "") found.refusals.set(block.result_id, block.refusal_guard);
81
+ if (block.result_id !== "" && block.is_error === true) found.failures.add(block.result_id);
62
82
  if (is_filing_use(block)) found.filing_ids.push(block.id);
63
83
  }
64
84
  function collect_line(line, found) {
@@ -67,13 +87,13 @@ function collect_line(line, found) {
67
87
  for (const block of parsed.blocks) collect_block(block, found);
68
88
  }
69
89
  function scan_tail(tail) {
70
- const found = { filing_ids: [], refusals: /* @__PURE__ */ new Map() };
90
+ const found = { filing_ids: [], failures: /* @__PURE__ */ new Set() };
71
91
  for (const line of tail.split("\n")) collect_line(line, found);
72
92
  return found;
73
93
  }
74
94
  function prior_filing_count(tail) {
75
- const { filing_ids, refusals } = scan_tail(tail);
76
- return filing_ids.filter((id) => (refusals.get(id) ?? "") === "").length;
95
+ const { filing_ids, failures } = scan_tail(tail);
96
+ return filing_ids.filter((id) => !failures.has(id)).length;
77
97
  }
78
98
  function is_prompt_line(line) {
79
99
  const parsed = time_transcript_line.parse_line(line);
@@ -104,6 +124,7 @@ var filing_cap = {
104
124
  ROW,
105
125
  current_turn,
106
126
  decide,
127
+ is_prompt_line,
107
128
  prior_filing_count,
108
129
  turn_filing_count
109
130
  };
@@ -770,7 +791,7 @@ var IMPLEMENTATION_PHASE = "implementation";
770
791
  var PRE_GATE_PHASE = "pre-gate";
771
792
  var ANTHROPIC_PROVIDER = "anthropic";
772
793
  var OPENAI_PROVIDER = "openai";
773
- var OPENAI_MODEL = "gpt-6-sol";
794
+ var OPENAI_MODEL = "gpt-6.1-sol";
774
795
  var ANTHROPIC_MODEL = "claude-opus-5-5";
775
796
  var CODEX_SESSION_KEY = "CODEX_THREAD_ID";
776
797
  var DEFAULT_PROFILES = {
@@ -1542,22 +1563,6 @@ var run_cut = {
1542
1563
  worktree_git_directory_sync
1543
1564
  };
1544
1565
 
1545
- // scripts/rules/shell-segments.ts
1546
- var SEGMENT_SEPARATOR = /&&|\|\||;|\n/u;
1547
- function segments_of(command) {
1548
- return command.split(SEGMENT_SEPARATOR).map((segment) => segment.trim());
1549
- }
1550
- function is_josh_command(segment, names) {
1551
- const named = time_shell.josh_command_of(segment);
1552
- if (!named.startsWith(time_shell.JOSH_PREFIX)) return false;
1553
- return names.has(named.slice(time_shell.JOSH_PREFIX.length));
1554
- }
1555
- var shell_segments = {
1556
- SEGMENT_SEPARATOR,
1557
- is_josh_command,
1558
- segments_of
1559
- };
1560
-
1561
1566
  // scripts/rules/run-tail.ts
1562
1567
  var SEGMENT_PREFIX = String.raw`(?:\(\s*)?(?:[A-Za-z_][A-Za-z0-9_]*=\S*\s+)*(?:npx\s+|pnpm\s+(?:exec\s+|run\s+)?)?`;
1563
1568
  var WORD_END = String.raw`(?=\s|$|\))`;
@@ -1658,7 +1663,6 @@ var lane_background = {
1658
1663
 
1659
1664
  // scripts/git/issue-labels.ts
1660
1665
  var EPIC_LABEL = "epic";
1661
- var BUG_LABEL = "bug";
1662
1666
  var ENHANCEMENT_LABEL = "enhancement";
1663
1667
  var BREAKING_CHANGE_LABEL = "breaking-change";
1664
1668
  var IN_PROGRESS_LABEL = "in-progress";
@@ -3628,9 +3632,9 @@ var git_gh_exec = {
3628
3632
  };
3629
3633
 
3630
3634
  export {
3635
+ shell_segments,
3631
3636
  bash_triggers,
3632
3637
  run_progress_clock,
3633
- shell_segments,
3634
3638
  tail_commands,
3635
3639
  filing_cap,
3636
3640
  CONTEXT_CUT_THRESHOLD,
@@ -3642,7 +3646,8 @@ export {
3642
3646
  lane_child_invocation,
3643
3647
  run_hold,
3644
3648
  run_cut,
3645
- BUG_LABEL,
3649
+ run_tail,
3650
+ lane_background,
3646
3651
  ENHANCEMENT_LABEL,
3647
3652
  BREAKING_CHANGE_LABEL,
3648
3653
  IN_PROGRESS_LABEL,
@@ -3655,9 +3660,8 @@ export {
3655
3660
  RELEASE_CLASSIFICATION_NAMES,
3656
3661
  has_any_label,
3657
3662
  has_label_name,
3658
- run_tail,
3659
- lane_background,
3660
3663
  lane_park,
3664
+ repo_origin,
3661
3665
  repo_party,
3662
3666
  FULL_PAGE_QUERY,
3663
3667
  git_gh_api_path,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  lane_guard_policy,
3
3
  time_batch_guard
4
- } from "./chunk-2K52BRWV.js";
4
+ } from "./chunk-56LGMJJV.js";
5
5
  import {
6
6
  hook_decision
7
- } from "./chunk-KQG4776P.js";
7
+ } from "./chunk-GBJUERYK.js";
8
8
 
9
9
  // scripts/hooks/batch-guard.ts
10
10
  import { text } from "node:stream/consumers";
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  ESLINT_EDIT_CACHE_FLAGS,
7
7
  time_density_hook
8
- } from "./chunk-ZPLXLJ7O.js";
8
+ } from "./chunk-PAXMLGSS.js";
9
9
 
10
10
  // scripts/hooks/format-edited-file.ts
11
11
  import { existsSync as existsSync2 } from "node:fs";
@@ -3,7 +3,7 @@ import {
3
3
  stamp_file,
4
4
  time_density_hook,
5
5
  time_hook_transcript
6
- } from "./chunk-ZPLXLJ7O.js";
6
+ } from "./chunk-PAXMLGSS.js";
7
7
  import {
8
8
  josh_environment_file
9
9
  } from "./chunk-WPALEIRX.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  investigation_reads
3
- } from "./chunk-F6OM6SIG.js";
3
+ } from "./chunk-WMIR5SNX.js";
4
4
  import {
5
5
  lane_guard_policy
6
- } from "./chunk-2K52BRWV.js";
6
+ } from "./chunk-56LGMJJV.js";
7
7
  import {
8
8
  hook_decision
9
- } from "./chunk-KQG4776P.js";
9
+ } from "./chunk-GBJUERYK.js";
10
10
 
11
11
  // scripts/delegation/investigation-guard.ts
12
12
  import { text } from "node:stream/consumers";
@@ -290,6 +290,16 @@ var ISSUE_COMMANDS = {
290
290
  description: "Post one comment to an issue from a file, so no shell expands the body",
291
291
  category: "AI tools",
292
292
  reference: ["<issue> --body <text> | --body-file <path>", "automation", ["network"]]
293
+ },
294
+ "issue:file": {
295
+ script: "scripts/issue/issue-file-cli.ts",
296
+ description: "File an Issue with every filing step: lint, Origin, duplicate scout, labels, then epic:bundle",
297
+ category: "AI tools",
298
+ reference: [
299
+ "<title> --body-file <path> --depth <0|1|2> [--route <route>] [--label <name>] [--repo <owner/repo>] [--distinct <N,\u2026>]",
300
+ "automation",
301
+ ["network"]
302
+ ]
293
303
  }
294
304
  };
295
305
 
@@ -702,7 +712,7 @@ var DEV_COMMANDS = {
702
712
  },
703
713
  lint: {
704
714
  script: "scripts/lint/lint-parallel.ts",
705
- description: "Check code with prettier and eslint (skips a tool a static project lacks)",
715
+ description: "Check code with prettier and eslint (skips a tool a basic project lacks)",
706
716
  category: "Development",
707
717
  reference: ["", "developer", ["processes"]]
708
718
  },
@@ -738,7 +748,7 @@ var DEV_COMMANDS = {
738
748
  },
739
749
  format: {
740
750
  script: "scripts/lint/format.ts",
741
- description: "Format code with prettier and eslint (skips a tool a static project lacks)",
751
+ description: "Format code with prettier and eslint (skips a tool a basic project lacks)",
742
752
  category: "Development",
743
753
  reference: ["", "developer", ["files", "processes"]]
744
754
  },
@@ -851,7 +861,7 @@ var DEV_COMMANDS = {
851
861
  },
852
862
  check: {
853
863
  script: "scripts/gate/type-check-command.ts",
854
- description: "Type-check with tsc (skips a static project with no TypeScript to check)",
864
+ description: "Type-check with tsc (skips a basic project with no TypeScript to check)",
855
865
  category: "Development",
856
866
  reference: ["[arguments...]", "developer", ["processes"]]
857
867
  },
@@ -1006,7 +1016,7 @@ var MAINTENANCE_COMMANDS = {
1006
1016
  };
1007
1017
 
1008
1018
  // scripts/josh/josh-commands-project.ts
1009
- var PROFILE_ARGUMENTS = "[--profile static|node]";
1019
+ var PROFILE_ARGUMENTS = "[--profile basic|full]";
1010
1020
  var PROJECT_COMMANDS = {
1011
1021
  profile: {
1012
1022
  script: "scripts/init/project-profile-cli.ts",
@@ -1016,7 +1026,7 @@ var PROJECT_COMMANDS = {
1016
1026
  },
1017
1027
  start: {
1018
1028
  script: "scripts/init/start.ts",
1019
- description: "Create a new project for the GitHub Issue workflow, from git init to labels",
1029
+ description: "Set a project up for the GitHub Issue workflow, from git init to the setup PR",
1020
1030
  category: "Project",
1021
1031
  reference: [
1022
1032
  `${PROFILE_ARGUMENTS} [--yes] [--github] [--public]`,
@@ -1068,7 +1078,11 @@ var PROJECT_COMMANDS = {
1068
1078
  script: "scripts/propagate/propagate.ts",
1069
1079
  description: "Carry the published release into every consumer repository next to this one",
1070
1080
  category: "Project",
1071
- reference: ["[--dry-run] [--skip-publish-wait]", "maintainer", ["files", "network"]]
1081
+ reference: [
1082
+ "[--dry-run] [--skip-publish-wait] [--target <repo>]",
1083
+ "maintainer",
1084
+ ["files", "network"]
1085
+ ]
1072
1086
  },
1073
1087
  adopt: {
1074
1088
  script: "scripts/adopt/adopt.ts",
@@ -1306,6 +1320,7 @@ var ALIASES = {
1306
1320
  ird: "issue:read",
1307
1321
  ist: "issue:state",
1308
1322
  isc: "issue:scout",
1323
+ ifl: "issue:file",
1309
1324
  isf: "issue:fold",
1310
1325
  isfe: "issue:fold-existing",
1311
1326
  dfr: "defect:rate",
@@ -1402,7 +1417,10 @@ var WHITESPACE_PATTERN = /\s+/u;
1402
1417
  var SEGMENT_PATTERN = /&&|\|\||;|\|/u;
1403
1418
  var PIPE_PATTERN = /(?<!\|)\|(?!\|)/u;
1404
1419
  var CHAIN_PATTERN = /&&|\|\||;/u;
1405
- var QUOTED_SPAN_PATTERN = /'[^']*'|"[^"]*"/gu;
1420
+ var QUOTED_SPAN_PATTERN = /\\[\s\S]|'[^']*'|"(?:\\[\s\S]|[^"\\])*"/gu;
1421
+ var HEREDOC_MARKER = /(?<!<)<<-?\s*(['"]?)(\w+)\1/u;
1422
+ var HEREDOC_DELIMITER_GROUP = 2;
1423
+ var LINE_BREAK = "\n";
1406
1424
  var PIPEFAIL_PATTERN = /\bset\s+-[a-z]*o\s+pipefail\b/u;
1407
1425
  var COMMAND_WORD_PATTERN = /^[\w./@:+][\w./@:+-]*$/u;
1408
1426
  var ASSIGNMENT_PATTERN = /^\w+=/u;
@@ -1438,8 +1456,23 @@ function command_segment(command) {
1438
1456
  function leading_word(command) {
1439
1457
  return segment_command(command_segment(command));
1440
1458
  }
1459
+ function open_heredoc(line, kept) {
1460
+ kept.push(line.replace(HEREDOC_MARKER, " "));
1461
+ return HEREDOC_MARKER.exec(line)?.[HEREDOC_DELIMITER_GROUP];
1462
+ }
1463
+ function close_heredoc(line, delimiter) {
1464
+ return line.trim() === delimiter ? void 0 : delimiter;
1465
+ }
1466
+ function without_heredoc_bodies(command) {
1467
+ const kept = [];
1468
+ const body = {};
1469
+ for (const line of command.split(LINE_BREAK)) {
1470
+ body.delimiter = body.delimiter === void 0 ? open_heredoc(line, kept) : close_heredoc(line, body.delimiter);
1471
+ }
1472
+ return kept.join(LINE_BREAK);
1473
+ }
1441
1474
  function unquoted(command) {
1442
- return command.replaceAll(QUOTED_SPAN_PATTERN, " ");
1475
+ return without_heredoc_bodies(command).replaceAll(QUOTED_SPAN_PATTERN, " ");
1443
1476
  }
1444
1477
  function discarded_commands(command) {
1445
1478
  const plain = unquoted(command);
@@ -3490,6 +3523,7 @@ export {
3490
3523
  time_bundle_call,
3491
3524
  time_format,
3492
3525
  cost_attribute,
3526
+ time_reported_failure,
3493
3527
  time_transcript_line,
3494
3528
  time_spans,
3495
3529
  time_round_trips,
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  time_batch_guard
3
- } from "./chunk-2K52BRWV.js";
3
+ } from "./chunk-56LGMJJV.js";
4
4
  import {
5
5
  hook_decision
6
- } from "./chunk-KQG4776P.js";
6
+ } from "./chunk-GBJUERYK.js";
7
7
  import {
8
8
  cost_blocks,
9
9
  cost_transcript,
10
10
  time_bundle_call,
11
11
  time_shell,
12
12
  time_spans
13
- } from "./chunk-ZPLXLJ7O.js";
13
+ } from "./chunk-PAXMLGSS.js";
14
14
 
15
15
  // scripts/delegation/investigation-reads.ts
16
16
  import path from "node:path";
@@ -36,15 +36,15 @@ var DELEGATABLE_STEPS = [
36
36
  },
37
37
  {
38
38
  name: "followup-filing",
39
- // The late-run follow-up filing chain — issue:scout → file the Issue → epic:bundle → epic --add
40
- // — is a dependency chain `batch:guard` correctly keeps one call per step, and what makes it
41
- // expensive is the ~340k context it runs in at the tail of a run, not the step count
42
- // (joshuafolkken/kit#1892). A fresh unit runs the same chain at a small context, and the review
43
- // round cap already composed the finding text, so what the unit is handed is mechanical: run the
44
- // four commands and act on their deterministic answers. This is not `batch:guard`'s business —
45
- // the chain stays one call per step; delegation only moves it to a cheaper context.
46
- does: "run the late-run follow-up filing chain in an isolated unit \u2014 issue:scout, file the Issue, epic:bundle, epic --add \u2014 given the finding text the parent already composed, and return the new Issue number and the epic:bundle answer",
47
- verifier: "the parent reads the filed Issue from GitHub with `pnpm josh issue:state <new>`, not the unit's summary; a follow-up reported filed but not created is still absent, the way `epic-child`'s reported-done-but-not-merged child is still open. The finding text came from the parent and `issue:scout` / `epic:bundle` are deterministic, so the unit's work is the mechanical execution `issue:state` confirms"
39
+ // The late-run follow-up filing chain — `issue:file` (which scouts, lints, labels and runs
40
+ // epic:bundle itself, joshuafolkken/kit#2808) → epic --add — is a dependency chain `batch:guard`
41
+ // correctly keeps one call per step, and what makes it expensive is the ~340k context it runs in
42
+ // at the tail of a run, not the step count (joshuafolkken/kit#1892). A fresh unit runs the same
43
+ // chain at a small context, and the review round cap already composed the finding text, so what
44
+ // the unit is handed is mechanical: run the commands and act on their deterministic answers. This
45
+ // is not `batch:guard`'s business — delegation only moves the chain to a cheaper context.
46
+ does: "run the late-run follow-up filing chain in an isolated unit \u2014 issue:file (scout, lint, labels, epic:bundle), then epic --add \u2014 given the finding text the parent already composed, and return the new Issue number and the epic:bundle answer",
47
+ verifier: "the parent reads the filed Issue from GitHub with `pnpm josh issue:state <new>`, not the unit's summary; a follow-up reported filed but not created is still absent, the way `epic-child`'s reported-done-but-not-merged child is still open. The finding text came from the parent and `issue:file`'s steps are deterministic, so the unit's work is the mechanical execution `issue:state` confirms"
48
48
  },
49
49
  {
50
50
  name: "implementation-unit",
@@ -1,25 +1,25 @@
1
1
  #!/usr/bin/env tsx
2
2
  import {
3
3
  pretool_guard
4
- } from "./chunk-BNGGEY3Z.js";
5
- import "./chunk-Q7LE77CO.js";
4
+ } from "./chunk-762BDXDU.js";
5
+ import "./chunk-7WAOP42A.js";
6
6
  import {
7
7
  build_envelope,
8
8
  compose_context,
9
9
  format_edited_payload
10
- } from "./chunk-CRGJTD6E.js";
10
+ } from "./chunk-AWTFKKFW.js";
11
11
  import "./chunk-3V37IID6.js";
12
- import "./chunk-NXL3SBXY.js";
13
- import "./chunk-BVMSPG3M.js";
14
- import "./chunk-ZYYSBNR6.js";
15
- import "./chunk-F6OM6SIG.js";
16
- import "./chunk-2K52BRWV.js";
12
+ import "./chunk-A2H5I2VD.js";
13
+ import "./chunk-KPZN42RT.js";
14
+ import "./chunk-4GDR2YTV.js";
15
+ import "./chunk-WMIR5SNX.js";
16
+ import "./chunk-56LGMJJV.js";
17
17
  import {
18
18
  hook_decision
19
- } from "./chunk-KQG4776P.js";
19
+ } from "./chunk-GBJUERYK.js";
20
20
  import {
21
21
  time_density_hook
22
- } from "./chunk-ZPLXLJ7O.js";
22
+ } from "./chunk-PAXMLGSS.js";
23
23
  import "./chunk-WPALEIRX.js";
24
24
  import "./chunk-RKUAD3I6.js";
25
25
 
@@ -9,11 +9,11 @@ import {
9
9
  is_enabled,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-ZYYSBNR6.js";
13
- import "./chunk-F6OM6SIG.js";
14
- import "./chunk-2K52BRWV.js";
15
- import "./chunk-KQG4776P.js";
16
- import "./chunk-ZPLXLJ7O.js";
12
+ } from "./chunk-4GDR2YTV.js";
13
+ import "./chunk-WMIR5SNX.js";
14
+ import "./chunk-56LGMJJV.js";
15
+ import "./chunk-GBJUERYK.js";
16
+ import "./chunk-PAXMLGSS.js";
17
17
  import "./chunk-WPALEIRX.js";
18
18
  import "./chunk-RKUAD3I6.js";
19
19
  export {
@@ -15,9 +15,9 @@ import {
15
15
  relative_to_root,
16
16
  resolve_invocations,
17
17
  select_invocation
18
- } from "./chunk-CRGJTD6E.js";
18
+ } from "./chunk-AWTFKKFW.js";
19
19
  import "./chunk-3V37IID6.js";
20
- import "./chunk-ZPLXLJ7O.js";
20
+ import "./chunk-PAXMLGSS.js";
21
21
  import "./chunk-RKUAD3I6.js";
22
22
  export {
23
23
  ESLINT_DAEMON,
@@ -10,11 +10,11 @@ import {
10
10
  is_enabled,
11
11
  load_environment_file,
12
12
  refusal_path
13
- } from "./chunk-BVMSPG3M.js";
14
- import "./chunk-F6OM6SIG.js";
15
- import "./chunk-2K52BRWV.js";
16
- import "./chunk-KQG4776P.js";
17
- import "./chunk-ZPLXLJ7O.js";
13
+ } from "./chunk-KPZN42RT.js";
14
+ import "./chunk-WMIR5SNX.js";
15
+ import "./chunk-56LGMJJV.js";
16
+ import "./chunk-GBJUERYK.js";
17
+ import "./chunk-PAXMLGSS.js";
18
18
  import "./chunk-WPALEIRX.js";
19
19
  import "./chunk-RKUAD3I6.js";
20
20
  export {
@@ -3,16 +3,16 @@ import {
3
3
  pretool_guard,
4
4
  pretool_outcome,
5
5
  pretool_outcome_async
6
- } from "./chunk-BNGGEY3Z.js";
7
- import "./chunk-Q7LE77CO.js";
6
+ } from "./chunk-762BDXDU.js";
7
+ import "./chunk-7WAOP42A.js";
8
8
  import "./chunk-3V37IID6.js";
9
- import "./chunk-NXL3SBXY.js";
10
- import "./chunk-BVMSPG3M.js";
11
- import "./chunk-ZYYSBNR6.js";
12
- import "./chunk-F6OM6SIG.js";
13
- import "./chunk-2K52BRWV.js";
14
- import "./chunk-KQG4776P.js";
15
- import "./chunk-ZPLXLJ7O.js";
9
+ import "./chunk-A2H5I2VD.js";
10
+ import "./chunk-KPZN42RT.js";
11
+ import "./chunk-4GDR2YTV.js";
12
+ import "./chunk-WMIR5SNX.js";
13
+ import "./chunk-56LGMJJV.js";
14
+ import "./chunk-GBJUERYK.js";
15
+ import "./chunk-PAXMLGSS.js";
16
16
  import "./chunk-WPALEIRX.js";
17
17
  import "./chunk-RKUAD3I6.js";
18
18
  export {