@joshuafolkken/kit 1.921.0 → 1.929.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 (44) hide show
  1. package/.claude/skills/workflow-commands/backlogrun-progress.md +13 -12
  2. package/.claude/skills/workflow-commands/backlogrun-steps.md +2 -1
  3. package/README.md +2 -1
  4. package/dist/hooks/batch-guard.js +6 -6
  5. package/dist/hooks/{chunk-UULARQ5Q.js → chunk-2PGRQ62K.js} +2 -9
  6. package/dist/hooks/{chunk-3HZ5MJIW.js → chunk-7XQ6TK3R.js} +2 -2
  7. package/dist/hooks/{chunk-UANRLZV7.js → chunk-BNFG2IFK.js} +4 -4
  8. package/dist/hooks/{chunk-LC765SUA.js → chunk-GQ3EVWHY.js} +8 -3
  9. package/dist/hooks/{chunk-XMR3BS35.js → chunk-I3JP3D4A.js} +3 -3
  10. package/dist/hooks/{chunk-OLTAGGHH.js → chunk-LCJZE42I.js} +1 -1
  11. package/dist/hooks/{chunk-NWD47MW3.js → chunk-NJZSO7BK.js} +3 -3
  12. package/dist/hooks/{chunk-SSX23SJ2.js → chunk-RKUAD3I6.js} +1 -0
  13. package/dist/hooks/{chunk-77RLKZ5V.js → chunk-ROULPSQC.js} +2 -2
  14. package/dist/hooks/{chunk-OYU6KPRA.js → chunk-SXPTRFPG.js} +2 -2
  15. package/dist/hooks/{chunk-FXAKJKTB.js → chunk-WPALEIRX.js} +1 -1
  16. package/dist/hooks/{chunk-O2FBZPSW.js → chunk-YO43HEPY.js} +23 -8
  17. package/dist/hooks/codex-hook-adapter.js +12 -12
  18. package/dist/hooks/duplicate-read-guard.js +7 -7
  19. package/dist/hooks/format-edited.js +3 -3
  20. package/dist/hooks/investigation-guard.js +7 -7
  21. package/dist/hooks/pretool-guard.js +11 -11
  22. package/dist/hooks/session-lang.js +2 -2
  23. package/dist/hooks/stop-guard.js +5 -5
  24. package/dist/josh.js +1 -8
  25. package/eslint/base.js +4 -1
  26. package/package.json +9 -6
  27. package/playwright.config.ts +9 -17
  28. package/ports/index.d.ts +1 -0
  29. package/ports/index.js +1 -0
  30. package/ports/web-server.d.ts +5 -0
  31. package/ports/web-server.js +73 -0
  32. package/scripts/agent/agent-role-profile.ts +11 -0
  33. package/scripts/gate/project-checks.ts +24 -0
  34. package/scripts/init/init-ai-copy.ts +8 -5
  35. package/scripts/init/init-logic-workspace.ts +38 -5
  36. package/scripts/init/init-logic.ts +1 -0
  37. package/scripts/init/init-static.ts +4 -1
  38. package/scripts/init/project-profile.ts +14 -5
  39. package/scripts/josh/josh-commands-development.ts +2 -15
  40. package/scripts/lint/format.ts +68 -0
  41. package/scripts/lint/lint-parallel.ts +4 -18
  42. package/scripts/run/run-step-cli.ts +11 -1
  43. package/scripts/run/run-step.ts +36 -8
  44. package/templates/pnpm-workspace.static.yaml +4 -0
@@ -213,7 +213,7 @@ single non-numeric line as the verdict.
213
213
  `lane:await` watches local process presence and exits when any named child confirms-complete,
214
214
  waking the parent at the actual completion rather than at the next heartbeat interval. **The
215
215
  re-confirm delay and poll interval are the command's, not the agent's** — pass only the issue
216
- numbers.
216
+ numbers. Without that wake (Codex), hand off instead — "A parent without a completion callback".
217
217
 
218
218
  **A `lane:await` wake is a confirmed-gone process, so classify the ending at once — do not wait out
219
219
  the silent-unit window** (joshuafolkken/kit#2277). `lane:await` exits only after the child's process
@@ -375,6 +375,11 @@ the check could not answer, and take `over`'s branch at that child.
375
375
  only moment where **this** child's work is all written down: the PR is merged, the working tree is clean
376
376
  on the default branch, and the epic's state on GitHub is complete.
377
377
 
378
+ ### A parent without a completion callback hands off at its first dispatch
379
+
380
+ **A finished command never re-invokes a Codex parent, so after a dispatch `run:step` prints the `--cut`
381
+ below the cut cap, `wait` at it** (joshuafolkken/kit#2653): dispatch the wave, run it, end the turn.
382
+
378
383
  ### The lane child reuses this measurement mid-implementation
379
384
 
380
385
  **The same `pnpm josh cost --over` measurement bounds a lane child's context _during_ implementation, not
@@ -534,20 +539,16 @@ to untangle**: `epic:next` detects it and exits with an error.
534
539
  ### The parent keeps no clock of its own — the watcher's exit is the wake
535
540
 
536
541
  **After hand-off, the supervisor's driver owns the mechanical clock.** `backlog:drive` polls lane
537
- completion and the backlog inside the detached process, without waking an AI parent. The historical
538
- parent-turn instructions below apply only while an AI session is handling a returned judgment branch;
539
- they do not schedule the supervisor's normal loop. `run:progress --wait` remains the source of human
540
- heartbeat lines, and `run:report` remains the final report source.
542
+ completion and the backlog inside the detached process, without waking an AI parent; the parent-turn
543
+ instructions below apply only to a returned judgment branch. `run:progress --wait` stays the heartbeat
544
+ source and `run:report` the final report.
541
545
 
542
- **The numbers above are floors between asks, not a timer the parent sets.** A parent that sets one spends
543
- a turn per tick at the point its context is largest — the exact cost `run:progress` was built to remove.
544
- The watcher took the *reporting* out of the parent; the parent must not go on keeping the clock anyway,
545
- or the two run side by side and the run pays for both.
546
+ **The numbers above are floors between asks, not a timer the parent sets** — one tick per turn, at the
547
+ largest context, is the cost `run:progress` removed.
546
548
 
547
549
  The driver checks lane completion every five seconds and makes a new backlog offer no sooner than one
548
- minute after the previous offer, except after collecting a child. These waits cost no AI turns.
549
- The progress watcher keeps reporting on its own interval; a judgment session may still receive its
550
- exit as a prompt to act. The bounds above continue to apply to both processes.
550
+ minute after the previous offer, except after collecting a child — waits that cost no AI turns. The
551
+ watcher reports on its own interval, and a judgment session may take its exit as a prompt to act.
551
552
 
552
553
  #### The wake exists only while something is in flight
553
554
 
@@ -535,7 +535,8 @@ ordinary way.
535
535
  **So every cut is taken at a merge, which is what lets a resumed session state its own `--active`**: a
536
536
  woken session picks the run up seconds after the merge the cut was taken at. The one shape that puts a
537
537
  cut inside a watch — the backlog answering `exhausted` while this run's own children are still
538
- merging — is the same, because the woken session has just merged a child.
538
+ merging — is the same, because the woken session has just merged a child. A Codex parent's cut is the one
539
+ taken at a dispatch instead (`backlogrun-progress.md` → "A parent without a completion callback").
539
540
 
540
541
  **The 8-hour whole-run bound is untouched and still outranks all of this** — it is measured from the
541
542
  record's `started_at` across every cut, so a run cannot watch its way past it in 30-minute pieces.
package/README.md CHANGED
@@ -7,7 +7,7 @@ Shared toolchain config and CLI for TypeScript projects — ESLint, Prettier, Ty
7
7
 
8
8
  ## Prerequisites
9
9
 
10
- - [Node.js](https://nodejs.org/) with [pnpm](https://pnpm.io/)
10
+ - [Node.js](https://nodejs.org/) 22.19.0 or later with [pnpm](https://pnpm.io/) — [getting-started.md](./docs/getting-started.md) covers installing both
11
11
  - [gh CLI](https://cli.github.com/) for `josh version` and existing GitHub Packages consumers. It is not required to install kit from public npm; see [authentication.md](./docs/authentication.md) for setup when needed.
12
12
 
13
13
  ## Quick start
@@ -24,6 +24,7 @@ Using the kit inside a project? See [docs/package.md](./docs/package.md).
24
24
  | Guide | What it covers |
25
25
  | ----------------------------------------------- | -------------------------------------------------------------------------------- |
26
26
  | [why.md](./docs/why.md) | Why kit exists — the AI-development problems it solves, for practitioners |
27
+ | [getting-started.md](./docs/getting-started.md) | First install for an `index.html` site or a non-Node project, without Git |
27
28
  | [authentication.md](./docs/authentication.md) | GitHub Packages auth for existing projects |
28
29
  | [cli.md](./docs/cli.md) | Install and use the global `josh` CLI |
29
30
  | [package.md](./docs/package.md) | Use the kit as a project devDependency — configs, prompts, scripts, `josh init` |
@@ -9,12 +9,12 @@ import {
9
9
  load_environment_file,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-77RLKZ5V.js";
13
- import "./chunk-3HZ5MJIW.js";
14
- import "./chunk-OYU6KPRA.js";
15
- import "./chunk-UULARQ5Q.js";
16
- import "./chunk-FXAKJKTB.js";
17
- import "./chunk-SSX23SJ2.js";
12
+ } from "./chunk-ROULPSQC.js";
13
+ import "./chunk-7XQ6TK3R.js";
14
+ import "./chunk-SXPTRFPG.js";
15
+ import "./chunk-2PGRQ62K.js";
16
+ import "./chunk-WPALEIRX.js";
17
+ import "./chunk-RKUAD3I6.js";
18
18
  export {
19
19
  DISABLED_VALUES,
20
20
  SWITCH_ENV_KEY,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ENV_FILE_NAME
3
- } from "./chunk-SSX23SJ2.js";
3
+ } from "./chunk-RKUAD3I6.js";
4
4
 
5
5
  // scripts/lib/json-value.ts
6
6
  function parse_or_undefined(text) {
@@ -733,14 +733,7 @@ var DEV_COMMANDS = {
733
733
  reference: ["", "developer", ["none"]]
734
734
  },
735
735
  format: {
736
- // prettier first here, unlike `format:edited`, and deliberately: `eslint --fix` exits 1
737
- // whenever a non-autofixable error remains, so putting it first behind `&&` would mean one
738
- // unused variable anywhere in the tree stops prettier from running at all.
739
- shell: [
740
- "sh",
741
- "-c",
742
- `pnpm exec prettier --write . && pnpm exec eslint . --fix ${ESLINT_CACHE_FLAGS.join(" ")}`
743
- ],
736
+ script: "scripts/lint/format.ts",
744
737
  description: "Format code with prettier and eslint",
745
738
  category: "Development",
746
739
  reference: ["", "developer", ["files", "processes"]]
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  lane_child_marker
3
- } from "./chunk-OYU6KPRA.js";
3
+ } from "./chunk-SXPTRFPG.js";
4
4
  import {
5
5
  time_bundle_call,
6
6
  time_format,
7
7
  time_round_trips,
8
8
  time_spans,
9
9
  time_transcript_line
10
- } from "./chunk-UULARQ5Q.js";
10
+ } from "./chunk-2PGRQ62K.js";
11
11
 
12
12
  // scripts/lane/lane-guard-policy.ts
13
13
  var DEFAULT_MODE = "refuse";
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  investigation_reads
3
- } from "./chunk-XMR3BS35.js";
3
+ } from "./chunk-I3JP3D4A.js";
4
4
  import {
5
5
  lane_guard_policy
6
- } from "./chunk-3HZ5MJIW.js";
6
+ } from "./chunk-7XQ6TK3R.js";
7
7
  import {
8
8
  hook_decision
9
- } from "./chunk-OYU6KPRA.js";
9
+ } from "./chunk-SXPTRFPG.js";
10
10
  import {
11
11
  json_value,
12
12
  time_spans
13
- } from "./chunk-UULARQ5Q.js";
13
+ } from "./chunk-2PGRQ62K.js";
14
14
 
15
15
  // scripts/delegation/duplicate-read-guard.ts
16
16
  import { statSync } from "node:fs";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  lane_child_marker,
3
3
  run_issue_number
4
- } from "./chunk-OYU6KPRA.js";
4
+ } from "./chunk-SXPTRFPG.js";
5
5
  import {
6
6
  PLATFORM_TEMP_ROOT,
7
7
  cost_blocks,
@@ -11,13 +11,13 @@ import {
11
11
  time_density_hook,
12
12
  time_shell,
13
13
  time_transcript_line
14
- } from "./chunk-UULARQ5Q.js";
14
+ } from "./chunk-2PGRQ62K.js";
15
15
  import {
16
16
  ENV_FILE_NAME,
17
17
  LANE_SEAT_KEY,
18
18
  PORT_SEED_KEY,
19
19
  ports
20
- } from "./chunk-SSX23SJ2.js";
20
+ } from "./chunk-RKUAD3I6.js";
21
21
 
22
22
  // scripts/rules/bash-triggers.ts
23
23
  function on_bash_command(is_match) {
@@ -852,6 +852,10 @@ function detected_provider(environment) {
852
852
  function resolve_provider(environment = process.env) {
853
853
  return detected_provider(environment) ?? handed_provider(environment);
854
854
  }
855
+ function has_completion_callback(environment = process.env) {
856
+ const selected = resolve_provider(environment);
857
+ return selected.kind !== "provider" || selected.provider !== OPENAI_PROVIDER;
858
+ }
855
859
  function handoff_environment(environment = process.env) {
856
860
  const selected = resolve_provider(environment);
857
861
  return selected.kind === "provider" ? { [HANDED_PROVIDER_KEY]: selected.provider } : {};
@@ -916,6 +920,7 @@ var agent_role_profile = {
916
920
  WORKER,
917
921
  describe,
918
922
  handoff_environment,
923
+ has_completion_callback,
919
924
  is_safe_value,
920
925
  parse,
921
926
  phase_effort,
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  time_batch_guard
3
- } from "./chunk-3HZ5MJIW.js";
3
+ } from "./chunk-7XQ6TK3R.js";
4
4
  import {
5
5
  hook_decision
6
- } from "./chunk-OYU6KPRA.js";
6
+ } from "./chunk-SXPTRFPG.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-UULARQ5Q.js";
13
+ } from "./chunk-2PGRQ62K.js";
14
14
 
15
15
  // scripts/delegation/investigation-reads.ts
16
16
  import path from "node:path";
@@ -5,7 +5,7 @@ import {
5
5
  import {
6
6
  ESLINT_EDIT_CACHE_FLAGS,
7
7
  time_density_hook
8
- } from "./chunk-UULARQ5Q.js";
8
+ } from "./chunk-2PGRQ62K.js";
9
9
 
10
10
  // scripts/hooks/format-edited-file.ts
11
11
  import { existsSync as existsSync2 } from "node:fs";
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  investigation_reads
3
- } from "./chunk-XMR3BS35.js";
3
+ } from "./chunk-I3JP3D4A.js";
4
4
  import {
5
5
  lane_guard_policy
6
- } from "./chunk-3HZ5MJIW.js";
6
+ } from "./chunk-7XQ6TK3R.js";
7
7
  import {
8
8
  hook_decision
9
- } from "./chunk-OYU6KPRA.js";
9
+ } from "./chunk-SXPTRFPG.js";
10
10
 
11
11
  // scripts/delegation/investigation-guard.ts
12
12
  import { text } from "node:stream/consumers";
@@ -75,6 +75,7 @@ function load_environment_file(directory = process.cwd()) {
75
75
  }
76
76
  var ports = {
77
77
  load_environment_file,
78
+ resolve_project_directory,
78
79
  resolve_seed,
79
80
  resolve_lane,
80
81
  resolve_development_port,
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  lane_guard_policy,
3
3
  time_batch_guard
4
- } from "./chunk-3HZ5MJIW.js";
4
+ } from "./chunk-7XQ6TK3R.js";
5
5
  import {
6
6
  hook_decision
7
- } from "./chunk-OYU6KPRA.js";
7
+ } from "./chunk-SXPTRFPG.js";
8
8
 
9
9
  // scripts/hooks/batch-guard.ts
10
10
  import { text } from "node:stream/consumers";
@@ -3,10 +3,10 @@ import {
3
3
  stamp_file,
4
4
  time_density_hook,
5
5
  time_hook_transcript
6
- } from "./chunk-UULARQ5Q.js";
6
+ } from "./chunk-2PGRQ62K.js";
7
7
  import {
8
8
  josh_environment_file
9
- } from "./chunk-FXAKJKTB.js";
9
+ } from "./chunk-WPALEIRX.js";
10
10
 
11
11
  // scripts/josh/hook-decision.ts
12
12
  import { z } from "zod";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  ENV_FILE_NAME
3
- } from "./chunk-SSX23SJ2.js";
3
+ } from "./chunk-RKUAD3I6.js";
4
4
 
5
5
  // scripts/josh/josh-environment-file.ts
6
6
  function load_environment_file() {
@@ -33,31 +33,31 @@ import {
33
33
  run_watcher_guard,
34
34
  shell_segments,
35
35
  tail_commands
36
- } from "./chunk-LC765SUA.js";
36
+ } from "./chunk-GQ3EVWHY.js";
37
37
  import {
38
38
  find_local_bin_upwards
39
39
  } from "./chunk-3V37IID6.js";
40
40
  import {
41
41
  batch_outcome
42
- } from "./chunk-77RLKZ5V.js";
42
+ } from "./chunk-ROULPSQC.js";
43
43
  import {
44
44
  investigation_refusal
45
- } from "./chunk-NWD47MW3.js";
45
+ } from "./chunk-NJZSO7BK.js";
46
46
  import {
47
47
  duplicate_read_outcome
48
- } from "./chunk-UANRLZV7.js";
48
+ } from "./chunk-BNFG2IFK.js";
49
49
  import {
50
50
  investigation_reads
51
- } from "./chunk-XMR3BS35.js";
51
+ } from "./chunk-I3JP3D4A.js";
52
52
  import {
53
53
  lane_guard_policy,
54
54
  time_batch_guard
55
- } from "./chunk-3HZ5MJIW.js";
55
+ } from "./chunk-7XQ6TK3R.js";
56
56
  import {
57
57
  hook_decision,
58
58
  lane_child_marker,
59
59
  run_issue_number
60
- } from "./chunk-OYU6KPRA.js";
60
+ } from "./chunk-SXPTRFPG.js";
61
61
  import {
62
62
  PLATFORM_TEMP_ROOT,
63
63
  cost_attribute,
@@ -69,7 +69,7 @@ import {
69
69
  stamp_file,
70
70
  time_density_hook,
71
71
  time_shell
72
- } from "./chunk-UULARQ5Q.js";
72
+ } from "./chunk-2PGRQ62K.js";
73
73
 
74
74
  // scripts/hooks/pretool-guard.ts
75
75
  import { text } from "node:stream/consumers";
@@ -2337,6 +2337,19 @@ function type_check_skip_reason(directory) {
2337
2337
  if (!has_bin(directory, "tsc")) return "typescript is not installed";
2338
2338
  return void 0;
2339
2339
  }
2340
+ function prettier_skip_reason(directory) {
2341
+ if (!is_static(directory)) return void 0;
2342
+ if (!has_files(directory, WEB_FILES)) return "no HTML, CSS or JavaScript files were found";
2343
+ if (!has_bin(directory, "prettier")) return "prettier is not installed";
2344
+ return void 0;
2345
+ }
2346
+ function eslint_skip_reason(directory) {
2347
+ if (!is_static(directory)) return void 0;
2348
+ if (!has_files(directory, SCRIPT_FILES)) return "no JavaScript or TypeScript files were found";
2349
+ if (!has_config(directory, ESLINT_CONFIGS)) return "no ESLint configuration was found";
2350
+ if (!has_bin(directory, "eslint")) return "eslint is not installed";
2351
+ return void 0;
2352
+ }
2340
2353
  var project_checks = {
2341
2354
  CSPELL_CONFIGS,
2342
2355
  ESLINT_CONFIGS,
@@ -2344,10 +2357,12 @@ var project_checks = {
2344
2357
  TYPE_CONFIGS,
2345
2358
  TYPE_FILES,
2346
2359
  WEB_FILES,
2360
+ eslint_skip_reason,
2347
2361
  has_bin,
2348
2362
  has_config,
2349
2363
  has_files,
2350
2364
  is_static,
2365
+ prettier_skip_reason,
2351
2366
  project_root,
2352
2367
  skip_notice,
2353
2368
  type_check_skip_reason
@@ -1,27 +1,27 @@
1
1
  #!/usr/bin/env tsx
2
2
  import {
3
3
  pretool_guard
4
- } from "./chunk-O2FBZPSW.js";
5
- import "./chunk-LC765SUA.js";
4
+ } from "./chunk-YO43HEPY.js";
5
+ import "./chunk-GQ3EVWHY.js";
6
6
  import {
7
7
  build_envelope,
8
8
  compose_context,
9
9
  format_edited_payload
10
- } from "./chunk-OLTAGGHH.js";
10
+ } from "./chunk-LCJZE42I.js";
11
11
  import "./chunk-3V37IID6.js";
12
- import "./chunk-77RLKZ5V.js";
13
- import "./chunk-NWD47MW3.js";
14
- import "./chunk-UANRLZV7.js";
15
- import "./chunk-XMR3BS35.js";
16
- import "./chunk-3HZ5MJIW.js";
12
+ import "./chunk-ROULPSQC.js";
13
+ import "./chunk-NJZSO7BK.js";
14
+ import "./chunk-BNFG2IFK.js";
15
+ import "./chunk-I3JP3D4A.js";
16
+ import "./chunk-7XQ6TK3R.js";
17
17
  import {
18
18
  hook_decision
19
- } from "./chunk-OYU6KPRA.js";
19
+ } from "./chunk-SXPTRFPG.js";
20
20
  import {
21
21
  time_density_hook
22
- } from "./chunk-UULARQ5Q.js";
23
- import "./chunk-FXAKJKTB.js";
24
- import "./chunk-SSX23SJ2.js";
22
+ } from "./chunk-2PGRQ62K.js";
23
+ import "./chunk-WPALEIRX.js";
24
+ import "./chunk-RKUAD3I6.js";
25
25
 
26
26
  // scripts/hooks/codex-hook-adapter.ts
27
27
  import { text } from "node:stream/consumers";
@@ -9,13 +9,13 @@ import {
9
9
  is_enabled,
10
10
  notice_refusal_path,
11
11
  refusal_path
12
- } from "./chunk-UANRLZV7.js";
13
- import "./chunk-XMR3BS35.js";
14
- import "./chunk-3HZ5MJIW.js";
15
- import "./chunk-OYU6KPRA.js";
16
- import "./chunk-UULARQ5Q.js";
17
- import "./chunk-FXAKJKTB.js";
18
- import "./chunk-SSX23SJ2.js";
12
+ } from "./chunk-BNFG2IFK.js";
13
+ import "./chunk-I3JP3D4A.js";
14
+ import "./chunk-7XQ6TK3R.js";
15
+ import "./chunk-SXPTRFPG.js";
16
+ import "./chunk-2PGRQ62K.js";
17
+ import "./chunk-WPALEIRX.js";
18
+ import "./chunk-RKUAD3I6.js";
19
19
  export {
20
20
  DISABLED_VALUES,
21
21
  SWITCH_ENV_KEY,
@@ -15,10 +15,10 @@ import {
15
15
  relative_to_root,
16
16
  resolve_invocations,
17
17
  select_invocation
18
- } from "./chunk-OLTAGGHH.js";
18
+ } from "./chunk-LCJZE42I.js";
19
19
  import "./chunk-3V37IID6.js";
20
- import "./chunk-UULARQ5Q.js";
21
- import "./chunk-SSX23SJ2.js";
20
+ import "./chunk-2PGRQ62K.js";
21
+ import "./chunk-RKUAD3I6.js";
22
22
  export {
23
23
  ESLINT_DAEMON,
24
24
  MAX_DIAGNOSTIC_CHARS,
@@ -10,13 +10,13 @@ import {
10
10
  is_enabled,
11
11
  load_environment_file,
12
12
  refusal_path
13
- } from "./chunk-NWD47MW3.js";
14
- import "./chunk-XMR3BS35.js";
15
- import "./chunk-3HZ5MJIW.js";
16
- import "./chunk-OYU6KPRA.js";
17
- import "./chunk-UULARQ5Q.js";
18
- import "./chunk-FXAKJKTB.js";
19
- import "./chunk-SSX23SJ2.js";
13
+ } from "./chunk-NJZSO7BK.js";
14
+ import "./chunk-I3JP3D4A.js";
15
+ import "./chunk-7XQ6TK3R.js";
16
+ import "./chunk-SXPTRFPG.js";
17
+ import "./chunk-2PGRQ62K.js";
18
+ import "./chunk-WPALEIRX.js";
19
+ import "./chunk-RKUAD3I6.js";
20
20
  export {
21
21
  DISABLED_VALUES,
22
22
  NOTICE,
@@ -3,18 +3,18 @@ import {
3
3
  pretool_guard,
4
4
  pretool_outcome,
5
5
  pretool_outcome_async
6
- } from "./chunk-O2FBZPSW.js";
7
- import "./chunk-LC765SUA.js";
6
+ } from "./chunk-YO43HEPY.js";
7
+ import "./chunk-GQ3EVWHY.js";
8
8
  import "./chunk-3V37IID6.js";
9
- import "./chunk-77RLKZ5V.js";
10
- import "./chunk-NWD47MW3.js";
11
- import "./chunk-UANRLZV7.js";
12
- import "./chunk-XMR3BS35.js";
13
- import "./chunk-3HZ5MJIW.js";
14
- import "./chunk-OYU6KPRA.js";
15
- import "./chunk-UULARQ5Q.js";
16
- import "./chunk-FXAKJKTB.js";
17
- import "./chunk-SSX23SJ2.js";
9
+ import "./chunk-ROULPSQC.js";
10
+ import "./chunk-NJZSO7BK.js";
11
+ import "./chunk-BNFG2IFK.js";
12
+ import "./chunk-I3JP3D4A.js";
13
+ import "./chunk-7XQ6TK3R.js";
14
+ import "./chunk-SXPTRFPG.js";
15
+ import "./chunk-2PGRQ62K.js";
16
+ import "./chunk-WPALEIRX.js";
17
+ import "./chunk-RKUAD3I6.js";
18
18
  export {
19
19
  pretool_guard,
20
20
  pretool_outcome,
@@ -4,8 +4,8 @@ import {
4
4
  } from "./chunk-6V5OPIUU.js";
5
5
  import {
6
6
  josh_environment_file
7
- } from "./chunk-FXAKJKTB.js";
8
- import "./chunk-SSX23SJ2.js";
7
+ } from "./chunk-WPALEIRX.js";
8
+ import "./chunk-RKUAD3I6.js";
9
9
 
10
10
  // scripts/josh/session-language-cli.ts
11
11
  import { fileURLToPath } from "node:url";
@@ -15,22 +15,22 @@ import {
15
15
  run_hold,
16
16
  run_invocation,
17
17
  run_watcher_guard
18
- } from "./chunk-LC765SUA.js";
18
+ } from "./chunk-GQ3EVWHY.js";
19
19
  import {
20
20
  session_language
21
21
  } from "./chunk-6V5OPIUU.js";
22
22
  import {
23
23
  hook_decision,
24
24
  lane_child_marker
25
- } from "./chunk-OYU6KPRA.js";
25
+ } from "./chunk-SXPTRFPG.js";
26
26
  import {
27
27
  PROJECT_ROOT,
28
28
  stamp_file,
29
29
  time_density_hook,
30
30
  time_hook_transcript
31
- } from "./chunk-UULARQ5Q.js";
32
- import "./chunk-FXAKJKTB.js";
33
- import "./chunk-SSX23SJ2.js";
31
+ } from "./chunk-2PGRQ62K.js";
32
+ import "./chunk-WPALEIRX.js";
33
+ import "./chunk-RKUAD3I6.js";
34
34
 
35
35
  // scripts/hooks/stop-guard.ts
36
36
  import { text } from "node:stream/consumers";
package/dist/josh.js CHANGED
@@ -890,14 +890,7 @@ var DEV_COMMANDS = {
890
890
  reference: ["", "developer", ["none"]]
891
891
  },
892
892
  format: {
893
- // prettier first here, unlike `format:edited`, and deliberately: `eslint --fix` exits 1
894
- // whenever a non-autofixable error remains, so putting it first behind `&&` would mean one
895
- // unused variable anywhere in the tree stops prettier from running at all.
896
- shell: [
897
- "sh",
898
- "-c",
899
- `pnpm exec prettier --write . && pnpm exec eslint . --fix ${ESLINT_CACHE_FLAGS.join(" ")}`
900
- ],
893
+ script: "scripts/lint/format.ts",
901
894
  description: "Format code with prettier and eslint",
902
895
  category: "Development",
903
896
  reference: ["", "developer", ["files", "processes"]]
package/eslint/base.js CHANGED
@@ -203,7 +203,10 @@ export function create_base_config({ gitignore_path, tsconfig_root_dir }) {
203
203
  },
204
204
  },
205
205
  {
206
- files: ['**/*.js'],
206
+ // `.mjs` / `.cjs` too (joshuafolkken/kit#2693): the typed parser options above reach only
207
+ // TypeScript files, so a hand-authored module in either extension crashed the whole run on
208
+ // the first type-aware rule instead of being linted as JavaScript.
209
+ files: ['**/*.{js,mjs,cjs}'],
207
210
  ...ts.configs.disableTypeChecked,
208
211
  rules: {
209
212
  ...ts.configs.disableTypeChecked.rules,
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.921.0",
2
+ "version": "1.929.0",
3
3
  "name": "@joshuafolkken/kit",
4
4
  "type": "module",
5
5
  "license": "MIT",
@@ -78,6 +78,10 @@
78
78
  "types": "./ports/index.d.ts",
79
79
  "default": "./ports/index.js"
80
80
  },
81
+ "./web-server": {
82
+ "types": "./ports/web-server.d.ts",
83
+ "default": "./ports/web-server.js"
84
+ },
81
85
  "./prettier": {
82
86
  "types": "./prettier/index.d.ts",
83
87
  "default": "./prettier/index.js"
@@ -109,9 +113,9 @@
109
113
  }
110
114
  },
111
115
  "peerDependencies": {
112
- "@playwright/test": ">=1.0.0",
113
116
  "@eslint/compat": "^2.1.1",
114
117
  "@eslint/js": "^10.0.1",
118
+ "@playwright/test": ">=1.0.0",
115
119
  "@stylistic/eslint-plugin": "^5.10.0",
116
120
  "eslint": "^10.0.0",
117
121
  "eslint-config-prettier": "^10.1.8",
@@ -177,7 +181,7 @@
177
181
  "@stylistic/eslint-plugin": "^5.10.0",
178
182
  "@types/node": "^26.6.3",
179
183
  "@types/semver": "^7.8.0",
180
- "cspell": "^10.3.4",
184
+ "cspell": "^10.3.5",
181
185
  "esbuild": "^0.28.2",
182
186
  "eslint": "^10.11.0",
183
187
  "eslint-config-prettier": "^10.1.8",
@@ -196,8 +200,8 @@
196
200
  "rollup-plugin-dts": "^6.5.1",
197
201
  "secretlint": "^13.0.6",
198
202
  "typescript": "^6.0.3",
199
- "vitest": "^5.0.2",
200
- "typescript-eslint": "^8.70.1"
203
+ "typescript-eslint": "^8.70.1",
204
+ "vitest": "^5.0.2"
201
205
  },
202
206
  "dependencies": {
203
207
  "execa": "^10.0.1",
@@ -217,7 +221,6 @@
217
221
  }
218
222
  },
219
223
  "scripts": {
220
- "preinstall": "pnpm dlx @aikidosec/safe-chain@1.5.20 setup-ci",
221
224
  "build": "tsx scripts/build/build-bin.ts && tsx scripts/build/build-hooks.ts && tsx scripts/build/build-version.ts && tsx scripts/build/build-config-merge.ts && tsx scripts/build/build-managed-marker.ts && tsx scripts/build/build-self-sync-guard.ts && tsx scripts/build/build-claude-md.ts",
222
225
  "josh": "tsx scripts/josh/josh.ts"
223
226
  }