@joshuafolkken/kit 1.1453.0 → 1.1455.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 (38) hide show
  1. package/.claude/skills/workflow-commands/backlogrun-handoff-report.md +1 -1
  2. package/.claude/skills/workflow-commands/halfrun.md +2 -1
  3. package/.claude/skills/workflow-commands/prrun.md +2 -1
  4. package/CLAUDE.md +1 -1
  5. package/README.md +2 -9
  6. package/dist/CLAUDE.md +1 -1
  7. package/dist/hooks/batch-guard.js +3 -3
  8. package/dist/hooks/{chunk-EF5GQ6WS.js → chunk-5H4SSDSD.js} +2 -2
  9. package/dist/hooks/{chunk-Y3GKIKGW.js → chunk-7WQBPLUN.js} +1 -1
  10. package/dist/hooks/{chunk-LBFYEOXJ.js → chunk-D5QBTOCZ.js} +2 -2
  11. package/dist/hooks/{chunk-W5ZKGTSY.js → chunk-GPLGZ6IC.js} +1 -1
  12. package/dist/hooks/{chunk-SHYUQOIS.js → chunk-HFGWYGUV.js} +3 -3
  13. package/dist/hooks/{chunk-5C7L6FRC.js → chunk-HHI6FO3R.js} +8 -8
  14. package/dist/hooks/{chunk-MBJYQPEK.js → chunk-LIAFCXL7.js} +1 -1
  15. package/dist/hooks/{chunk-D3NJXN5M.js → chunk-TBJFTSUY.js} +1 -1
  16. package/dist/hooks/{chunk-NO4AALP5.js → chunk-WNLVGT7E.js} +2 -2
  17. package/dist/hooks/codex-hook-adapter.js +9 -9
  18. package/dist/hooks/duplicate-read-guard.js +4 -4
  19. package/dist/hooks/format-edited.js +2 -2
  20. package/dist/hooks/inputs.json +232 -230
  21. package/dist/hooks/investigation-guard.js +4 -4
  22. package/dist/hooks/pretool-guard.js +8 -8
  23. package/dist/hooks/stop-guard.js +61 -8
  24. package/dist/josh.js +1 -1
  25. package/package.json +1 -1
  26. package/prompts/collaboration-workflow/shell-body.md +1 -1
  27. package/scripts/gh/git-pr-ai-review.ts +12 -1
  28. package/scripts/gh/git-pr-confirmation.ts +11 -7
  29. package/scripts/josh/josh-commands-workflow.ts +1 -1
  30. package/scripts/notify/confirmation-options.ts +59 -0
  31. package/scripts/notify/notify-opt-in.ts +33 -0
  32. package/scripts/notify/telegram-notify.ts +25 -8
  33. package/scripts/notify/telegram-test-logic.ts +33 -1
  34. package/scripts/notify/telegram-test.ts +4 -2
  35. package/scripts/rules/shell-body-trigger.ts +3 -2
  36. package/scripts/rules/stop-rules.ts +2 -1
  37. package/scripts/run/entry/run-entry-stop.ts +6 -3
  38. package/scripts/run/run-stop-notify.ts +2 -0
@@ -24,6 +24,6 @@ structure and the label translations are `prompts/collaboration-workflow/report-
24
24
  - One sentence per line, no internal identifiers, every child named by number. **Never omit
25
25
  `Remaining`** — it is the one line that tells this report from a completion report
26
26
  - Telegram uses the same format and is **sent with `--task-type confirmation`** (`completion` would
27
- announce an unfinished epic as done)
27
+ announce an unfinished epic as done), `--recommended` naming the resume command
28
28
  - **Write it only when the run stops.** While a run carries on past the threshold it writes none; the
29
29
  epic progress comment is the record
@@ -35,7 +35,8 @@ the gate. The direct commands follow for shipping without an agent:
35
35
  `pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'halfrun ready for manual
36
36
  verification\nNext: prrun #<N> | fullrun #<N>\nWithout an agent: pnpm josh git -y "<title> #<N>" && pnpm josh
37
37
  followup "<title> #<N>" --notify-message "Implemented <title>\\nCause: ...\\nFix: ...\\nResult:
38
- ...\\n\\nDetails:\\n- <change1>"'`. The stop report names the same two, in the same order.
38
+ ...\\n\\nDetails:\\n- <change1>"' --recommended "Verify by hand, then prrun #<N>" --alternative "fullrun
39
+ #<N>"`. The stop report names the same two, in the same order.
39
40
  **Invoking `halfrun` is _not_ authorization to commit, push, or merge** — do not run `pnpm josh git -y` or `pnpm josh followup` yourself. If the user comes
40
41
  back with fixes, treat each as a new round: implement, re-run `pnpm josh gate`, send another
41
42
  `confirmation` Telegram, stop again.
@@ -27,7 +27,8 @@ Where `fullrun` runs `pnpm josh followup` and merges, `prrun` does three things
27
27
  follows for finishing without an agent:
28
28
  `pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'prrun ready to
29
29
  merge: <pr-url>\nNext: fullrun #<N>\nAfter a manual merge, without an agent: pnpm josh followup
30
- "<title> #<N>"'`. The stop report names the same two, in the same order.
30
+ "<title> #<N>"' --recommended "fullrun #<N>" --alternative "Merge by hand, then pnpm josh
31
+ followup"`. The stop report names the same two, in the same order.
31
32
 
32
33
  **Invoking `prrun` is _not_ authorization to merge** — never run `pnpm josh followup` without
33
34
  `--no-merge` in a `prrun`. After a person merges by hand, the same `pnpm josh followup "<title> #<N>"`
package/CLAUDE.md CHANGED
@@ -82,5 +82,5 @@ Never start a `kickoff` / `halfrun` / `prrun` / `fullrun` / `backlogrun` workflo
82
82
  Before pausing **any** run for the user — a command's stop, an upstream-Issue interrupt, a Tier C confirmation — send once per stop (skip when the user asked for the stop this turn):
83
83
 
84
84
  ```bash
85
- pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'<one-line reason>\n<what is needed from the user>'
85
+ pnpm josh notify --task-type confirmation --issue-url "<url>" --body=$'<reason>' --recommended "<choice>" --alternative "<other>"
86
86
  ```
package/README.md CHANGED
@@ -39,7 +39,7 @@ Next: [tutorial](./docs/tutorial.md)
39
39
 
40
40
  #### Your first backlogrun
41
41
 
42
- Tell the agent the change you want, then type `kickoff new` to it. The Issue gets the `auto-ok` label when it needs no judgement from you (or add the label to an existing Issue).
42
+ File Issues with `kickoff new`, then run:
43
43
 
44
44
  ```bash
45
45
  pnpm josh backlogrun
@@ -59,14 +59,7 @@ Next: [tutorial](./docs/tutorial.md#without-github-one-change-checked-locally)
59
59
 
60
60
  ### Adding kit to an existing project
61
61
 
62
- - **Files written:** settings per profile, including Prettier — always on `full`, and on `basic` only when the project has web files and no formatter of its own ([per profile](./docs/init.md#project-profiles)); `--dry-run` previews them.
63
- - **Overwritten by `josh sync`:** the managed files, such as `.github/workflows/ci.yml` and `AGENTS.md` ([the list](./docs/sync.md#ai-files-overwritten)).
64
- - **Permissions:** the Claude Code settings kit writes (with `josh start`, or on `full`) set `bypassPermissions` with `Bash(*)`, guarded by a deny list and a hook ([how to opt out](./docs/init.md#claude-code-permission-mode)).
65
- - **On GitHub:** `josh start` adds labels, and on an existing `main` an Issue and a setup PR that you merge yourself ([the steps](./docs/init.md#josh-init-or-josh-start)).
66
-
67
- ## Claude Code in a fresh-machine run
68
-
69
- A `josh fresh:run` scenario that runs Claude Code needs a sign-in saved once with `pnpm josh auth:setup` ([steps](./docs/maintainers/fresh-machine.md#claude-code)).
62
+ Check first: [what kit changes in your project](./docs/how-to/add-kit.md#what-kit-changes-in-your-project)
70
63
 
71
64
  ## Docs
72
65
 
package/dist/CLAUDE.md CHANGED
@@ -82,5 +82,5 @@ Never start a `kickoff` / `halfrun` / `prrun` / `fullrun` / `backlogrun` workflo
82
82
  Before pausing **any** run for the user — a command's stop, an upstream-Issue interrupt, a Tier C confirmation — send once per stop (skip when the user asked for the stop this turn):
83
83
 
84
84
  ```bash
85
- pnpm josh notify --task-type confirmation --issue-url "<issue-url>" --body=$'<one-line reason>\n<what is needed from the user>'
85
+ pnpm josh notify --task-type confirmation --issue-url "<url>" --body=$'<reason>' --recommended "<choice>" --alternative "<other>"
86
86
  ```
@@ -9,10 +9,10 @@ import {
9
9
  load_environment_file,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-EF5GQ6WS.js";
12
+ } from "./chunk-5H4SSDSD.js";
13
13
  import "./chunk-UT7YC3N2.js";
14
- import "./chunk-W5ZKGTSY.js";
15
- import "./chunk-MBJYQPEK.js";
14
+ import "./chunk-GPLGZ6IC.js";
15
+ import "./chunk-LIAFCXL7.js";
16
16
  import "./chunk-OLMO72ON.js";
17
17
  import "./chunk-3C4XRYG6.js";
18
18
  import "./chunk-DGT54IH5.js";
@@ -3,10 +3,10 @@ import {
3
3
  } from "./chunk-UT7YC3N2.js";
4
4
  import {
5
5
  hook_decision
6
- } from "./chunk-W5ZKGTSY.js";
6
+ } from "./chunk-GPLGZ6IC.js";
7
7
  import {
8
8
  time_batch_guard
9
- } from "./chunk-MBJYQPEK.js";
9
+ } from "./chunk-LIAFCXL7.js";
10
10
 
11
11
  // scripts/hooks/batch-guard.ts
12
12
  import { text } from "node:stream/consumers";
@@ -30,7 +30,7 @@ import {
30
30
  time_density_hook,
31
31
  time_shell,
32
32
  time_transcript_line
33
- } from "./chunk-MBJYQPEK.js";
33
+ } from "./chunk-LIAFCXL7.js";
34
34
  import {
35
35
  lane_child_marker
36
36
  } from "./chunk-OLMO72ON.js";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  investigation_reads
3
- } from "./chunk-NO4AALP5.js";
3
+ } from "./chunk-WNLVGT7E.js";
4
4
  import {
5
5
  lane_guard_policy
6
6
  } from "./chunk-UT7YC3N2.js";
7
7
  import {
8
8
  hook_decision
9
- } from "./chunk-W5ZKGTSY.js";
9
+ } from "./chunk-GPLGZ6IC.js";
10
10
 
11
11
  // scripts/delegation/investigation-guard.ts
12
12
  import { text } from "node:stream/consumers";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  time_density_hook,
3
3
  time_hook_transcript
4
- } from "./chunk-MBJYQPEK.js";
4
+ } from "./chunk-LIAFCXL7.js";
5
5
  import {
6
6
  josh_environment_file
7
7
  } from "./chunk-OLMO72ON.js";
@@ -1,15 +1,15 @@
1
1
  import {
2
2
  investigation_reads
3
- } from "./chunk-NO4AALP5.js";
3
+ } from "./chunk-WNLVGT7E.js";
4
4
  import {
5
5
  lane_guard_policy
6
6
  } from "./chunk-UT7YC3N2.js";
7
7
  import {
8
8
  hook_decision
9
- } from "./chunk-W5ZKGTSY.js";
9
+ } from "./chunk-GPLGZ6IC.js";
10
10
  import {
11
11
  time_spans
12
- } from "./chunk-MBJYQPEK.js";
12
+ } from "./chunk-LIAFCXL7.js";
13
13
  import {
14
14
  json_value
15
15
  } from "./chunk-3C4XRYG6.js";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  duplicate_read_outcome
3
- } from "./chunk-SHYUQOIS.js";
3
+ } from "./chunk-HFGWYGUV.js";
4
4
  import {
5
5
  ALREADY_DONE_LABEL,
6
6
  CONTEXT_CUT_THRESHOLD,
@@ -29,7 +29,7 @@ import {
29
29
  session_cite,
30
30
  shell_segments,
31
31
  tail_commands
32
- } from "./chunk-Y3GKIKGW.js";
32
+ } from "./chunk-7WQBPLUN.js";
33
33
  import {
34
34
  ancestor_directories,
35
35
  find_local_bin_upwards,
@@ -56,19 +56,19 @@ import {
56
56
  } from "./chunk-CDY4NFQG.js";
57
57
  import {
58
58
  batch_outcome
59
- } from "./chunk-EF5GQ6WS.js";
59
+ } from "./chunk-5H4SSDSD.js";
60
60
  import {
61
61
  investigation_refusal
62
- } from "./chunk-LBFYEOXJ.js";
62
+ } from "./chunk-D5QBTOCZ.js";
63
63
  import {
64
64
  investigation_reads
65
- } from "./chunk-NO4AALP5.js";
65
+ } from "./chunk-WNLVGT7E.js";
66
66
  import {
67
67
  lane_guard_policy
68
68
  } from "./chunk-UT7YC3N2.js";
69
69
  import {
70
70
  hook_decision
71
- } from "./chunk-W5ZKGTSY.js";
71
+ } from "./chunk-GPLGZ6IC.js";
72
72
  import {
73
73
  cost_attribute,
74
74
  cost_blocks,
@@ -76,7 +76,7 @@ import {
76
76
  time_batch_guard,
77
77
  time_density_hook,
78
78
  time_shell
79
- } from "./chunk-MBJYQPEK.js";
79
+ } from "./chunk-LIAFCXL7.js";
80
80
  import {
81
81
  lane_child_marker
82
82
  } from "./chunk-OLMO72ON.js";
@@ -3190,7 +3190,7 @@ var rule_body_guard = {
3190
3190
 
3191
3191
  // scripts/rules/shell-body-trigger.ts
3192
3192
  var FIELD_FLAGS = "(?:-f|-F|--field|--raw-field)";
3193
- var MESSAGE_FLAGS = "(?:--body|--notify-message)";
3193
+ var MESSAGE_FLAGS = "(?:--body|--notify-message|--recommended|--alternative)";
3194
3194
  var FIELD_OPENING = String.raw`${FIELD_FLAGS}[\s=]*(?:'?body="|"body=)`;
3195
3195
  var MESSAGE_OPENING = String.raw`${MESSAGE_FLAGS}[\s=]+"`;
3196
3196
  var NESTED_SUBSTITUTION = String.raw`\$\([^()]*\)`;
@@ -2136,7 +2136,7 @@ var WORKFLOW_COMMANDS = {
2136
2136
  description: "Send Telegram notification",
2137
2137
  category: "Workflow",
2138
2138
  reference: [
2139
- "[--task-type <type>] [--body <text> | --body-file <path>] [--issue-url <url>] [--pr-url <url>] [--issue-title <text>] [--repo-name <name>]",
2139
+ "[--task-type <type>] [--body <text> | --body-file <path>] [--issue-url <url>] [--pr-url <url>] [--issue-title <text>] [--repo-name <name>] [--recommended <text>] [--alternative <text>]...",
2140
2140
  "automation",
2141
2141
  ["notifications"]
2142
2142
  ],
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  ESLINT_EDIT_CACHE_FLAGS,
7
7
  time_density_hook
8
- } from "./chunk-MBJYQPEK.js";
8
+ } from "./chunk-LIAFCXL7.js";
9
9
  import {
10
10
  file_reader,
11
11
  json_value
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  hook_decision
3
- } from "./chunk-W5ZKGTSY.js";
3
+ } from "./chunk-GPLGZ6IC.js";
4
4
  import {
5
5
  cost_blocks,
6
6
  time_batch_guard,
7
7
  time_bundle_call,
8
8
  time_shell,
9
9
  time_spans
10
- } from "./chunk-MBJYQPEK.js";
10
+ } from "./chunk-LIAFCXL7.js";
11
11
  import {
12
12
  cost_transcript
13
13
  } from "./chunk-3C4XRYG6.js";
@@ -1,29 +1,29 @@
1
1
  #!/usr/bin/env tsx
2
2
  import {
3
3
  pretool_guard
4
- } from "./chunk-5C7L6FRC.js";
5
- import "./chunk-SHYUQOIS.js";
4
+ } from "./chunk-HHI6FO3R.js";
5
+ import "./chunk-HFGWYGUV.js";
6
6
  import {
7
7
  bounded_pool
8
- } from "./chunk-Y3GKIKGW.js";
8
+ } from "./chunk-7WQBPLUN.js";
9
9
  import {
10
10
  build_envelope,
11
11
  compose_context,
12
12
  format_edited_payload
13
- } from "./chunk-D3NJXN5M.js";
13
+ } from "./chunk-TBJFTSUY.js";
14
14
  import "./chunk-IX6TTTI6.js";
15
15
  import "./chunk-Z4XI7CZS.js";
16
16
  import "./chunk-CDY4NFQG.js";
17
- import "./chunk-EF5GQ6WS.js";
18
- import "./chunk-LBFYEOXJ.js";
19
- import "./chunk-NO4AALP5.js";
17
+ import "./chunk-5H4SSDSD.js";
18
+ import "./chunk-D5QBTOCZ.js";
19
+ import "./chunk-WNLVGT7E.js";
20
20
  import "./chunk-UT7YC3N2.js";
21
21
  import {
22
22
  hook_decision
23
- } from "./chunk-W5ZKGTSY.js";
23
+ } from "./chunk-GPLGZ6IC.js";
24
24
  import {
25
25
  time_density_hook
26
- } from "./chunk-MBJYQPEK.js";
26
+ } from "./chunk-LIAFCXL7.js";
27
27
  import "./chunk-OLMO72ON.js";
28
28
  import {
29
29
  json_value
@@ -9,11 +9,11 @@ import {
9
9
  is_enabled,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-SHYUQOIS.js";
13
- import "./chunk-NO4AALP5.js";
12
+ } from "./chunk-HFGWYGUV.js";
13
+ import "./chunk-WNLVGT7E.js";
14
14
  import "./chunk-UT7YC3N2.js";
15
- import "./chunk-W5ZKGTSY.js";
16
- import "./chunk-MBJYQPEK.js";
15
+ import "./chunk-GPLGZ6IC.js";
16
+ import "./chunk-LIAFCXL7.js";
17
17
  import "./chunk-OLMO72ON.js";
18
18
  import "./chunk-3C4XRYG6.js";
19
19
  import "./chunk-DGT54IH5.js";
@@ -2,9 +2,9 @@
2
2
  import {
3
3
  report_no_payload,
4
4
  run_hook
5
- } from "./chunk-D3NJXN5M.js";
5
+ } from "./chunk-TBJFTSUY.js";
6
6
  import "./chunk-IX6TTTI6.js";
7
- import "./chunk-MBJYQPEK.js";
7
+ import "./chunk-LIAFCXL7.js";
8
8
  import "./chunk-3C4XRYG6.js";
9
9
  import "./chunk-DGT54IH5.js";
10
10