cli-jaw 2.2.0 → 2.2.1

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 (123) hide show
  1. package/README.ko.md +1 -1
  2. package/README.md +22 -3
  3. package/README.zh-CN.md +1 -1
  4. package/dist/bin/cli-jaw.js +5 -1
  5. package/dist/bin/cli-jaw.js.map +1 -1
  6. package/dist/bin/commands/bgtask.js +2 -1
  7. package/dist/bin/commands/bgtask.js.map +1 -1
  8. package/dist/bin/commands/dispatch-batch-summary.js +38 -0
  9. package/dist/bin/commands/dispatch-batch-summary.js.map +1 -0
  10. package/dist/bin/commands/dispatch.js +91 -52
  11. package/dist/bin/commands/dispatch.js.map +1 -1
  12. package/dist/bin/commands/jwc.js +237 -0
  13. package/dist/bin/commands/jwc.js.map +1 -0
  14. package/dist/bin/commands/skill.js +17 -4
  15. package/dist/bin/commands/skill.js.map +1 -1
  16. package/dist/bin/commands/worker.js +162 -4
  17. package/dist/bin/commands/worker.js.map +1 -1
  18. package/dist/lib/mcp/skills-distribution.js +17 -19
  19. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  20. package/dist/server.js +2 -1
  21. package/dist/server.js.map +1 -1
  22. package/dist/src/agent/jwc-runtime.js +12 -3
  23. package/dist/src/agent/jwc-runtime.js.map +1 -1
  24. package/dist/src/bgtask/registry.js +12 -2
  25. package/dist/src/bgtask/registry.js.map +1 -1
  26. package/dist/src/browser/adaptive-fetch/browser-escalation.js +122 -0
  27. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
  28. package/dist/src/browser/adaptive-fetch/browser-flow.js +57 -0
  29. package/dist/src/browser/adaptive-fetch/browser-flow.js.map +1 -0
  30. package/dist/src/browser/adaptive-fetch/candidate-discovery.js +116 -0
  31. package/dist/src/browser/adaptive-fetch/candidate-discovery.js.map +1 -0
  32. package/dist/src/browser/adaptive-fetch/feed-parser.js +152 -0
  33. package/dist/src/browser/adaptive-fetch/feed-parser.js.map +1 -0
  34. package/dist/src/browser/adaptive-fetch/index.js +9 -59
  35. package/dist/src/browser/adaptive-fetch/index.js.map +1 -1
  36. package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js +43 -0
  37. package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js.map +1 -0
  38. package/dist/src/browser/adaptive-fetch/metadata.js +74 -5
  39. package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -1
  40. package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js +414 -0
  41. package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js.map +1 -0
  42. package/dist/src/browser/adaptive-fetch/reader-adapters.js +36 -0
  43. package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -1
  44. package/dist/src/cli/commands.js +2 -0
  45. package/dist/src/cli/commands.js.map +1 -1
  46. package/dist/src/cli/handlers-search.js +28 -0
  47. package/dist/src/cli/handlers-search.js.map +1 -0
  48. package/dist/src/cli/handlers.js +12 -1
  49. package/dist/src/cli/handlers.js.map +1 -1
  50. package/dist/src/code-mode/acp-host.js +1 -8
  51. package/dist/src/code-mode/acp-host.js.map +1 -1
  52. package/dist/src/orchestrator/pipeline.js +2 -4
  53. package/dist/src/orchestrator/pipeline.js.map +1 -1
  54. package/dist/src/orchestrator/worker-output-store.js +64 -0
  55. package/dist/src/orchestrator/worker-output-store.js.map +1 -0
  56. package/dist/src/orchestrator/worker-progress.js.map +1 -1
  57. package/dist/src/orchestrator/worker-registry.js +91 -10
  58. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  59. package/dist/src/orchestrator/worker-replay-notice.js +28 -0
  60. package/dist/src/orchestrator/worker-replay-notice.js.map +1 -0
  61. package/dist/src/orchestrator/worker-run-store.js +142 -0
  62. package/dist/src/orchestrator/worker-run-store.js.map +1 -0
  63. package/dist/src/routes/bgtask.js +13 -4
  64. package/dist/src/routes/bgtask.js.map +1 -1
  65. package/dist/src/routes/orchestrate.js +53 -4
  66. package/dist/src/routes/orchestrate.js.map +1 -1
  67. package/dist/src/shared/runtime-observability.js +20 -0
  68. package/dist/src/shared/runtime-observability.js.map +1 -0
  69. package/dist/src/workflows/search.js +34 -0
  70. package/dist/src/workflows/search.js.map +1 -0
  71. package/package.json +6 -7
  72. package/public/dist/assets/{app-BsVpXeLC.js → app-BbBXyLe3.js} +4 -4
  73. package/public/dist/assets/{bgtask-badge-DqMU3pM3.js → bgtask-badge-BioRIkPz.js} +1 -1
  74. package/public/dist/assets/bgtask-badge-BwMVGFG_.js +1 -0
  75. package/public/dist/assets/{employees-BhkR2-xi.js → employees-B8cUYBRx.js} +1 -1
  76. package/public/dist/assets/manager-Ceg2x8D0.js +13 -0
  77. package/public/dist/assets/{manager-U147AWWu.css → manager-CwAlpgV7.css} +1 -1
  78. package/public/dist/assets/{memory-DERWDVjI.js → memory-3J4rzlxy.js} +1 -1
  79. package/public/dist/assets/memory-B5CQnDFI.js +1 -0
  80. package/public/dist/assets/message-history-BYswFI5p.js +1 -0
  81. package/public/dist/assets/{message-history-CK0ah3pB.js → message-history-Vv3aIRWS.js} +2 -2
  82. package/public/dist/assets/{render-CqzsW5KN.js → render-BVZ1xMEu.js} +1 -1
  83. package/public/dist/assets/{settings-DdwmhI5a.js → settings-C5FVzFpn.js} +1 -1
  84. package/public/dist/assets/settings-DZ4wz5SY.js +1 -0
  85. package/public/dist/assets/{settings-core-AiF7o3Ns.js → settings-core-5lL6lIyu.js} +1 -1
  86. package/public/dist/assets/settings-core-DYnePZHe.js +1 -0
  87. package/public/dist/assets/{sidebar-Bhtk2fPc.js → sidebar-jRPFidCd.js} +3 -3
  88. package/public/dist/assets/{skills-Cs8byPIx.js → skills-BjOjT5sG.js} +1 -1
  89. package/public/dist/assets/skills-CH0wHfkw.js +1 -0
  90. package/public/dist/assets/{slash-commands-C5erv0KS.js → slash-commands-B2oqpz-B.js} +1 -1
  91. package/public/dist/assets/slash-commands-C_9y_-8B.js +1 -0
  92. package/public/dist/assets/{trace-drawer-CtmD6jwj.js → trace-drawer-BQIdKFZx.js} +1 -1
  93. package/public/dist/assets/{ui-DaFl446W.js → ui-B9KmU-Qr.js} +1 -1
  94. package/public/dist/assets/ui-BCJ4lcQ4.js +1 -0
  95. package/public/dist/index.html +1 -1
  96. package/public/dist/manager/index.html +2 -2
  97. package/public/js/features/command-info.ts +1 -0
  98. package/public/locales/en.json +2 -0
  99. package/public/locales/ja.json +2 -0
  100. package/public/locales/ko.json +2 -0
  101. package/public/locales/zh.json +2 -0
  102. package/public/manager/src/SidebarRailRouter.tsx +7 -3
  103. package/public/manager/src/background-tasks/background-task-client.ts +21 -1
  104. package/public/manager/src/main.tsx +2 -0
  105. package/public/manager/src/workers/WorkerProgressMonitorPanel.tsx +2 -0
  106. package/public/manager/src/workers/WorkerRunsPanel.tsx +152 -0
  107. package/public/manager/src/workers/useWorkerRuns.ts +138 -0
  108. package/public/manager/src/workers/worker-runs-client.ts +112 -0
  109. package/public/manager/src/workers/worker-runs.css +208 -0
  110. package/scripts/bundle-sidecar.sh +2 -64
  111. package/scripts/check-electron-sidecar-no-jwc.cjs +57 -0
  112. package/scripts/install-risk-gate.mjs +3 -2
  113. package/scripts/jwc-no-global-smoke.mjs +14 -22
  114. package/public/dist/assets/bgtask-badge-YR8SMYrp.js +0 -1
  115. package/public/dist/assets/manager-ycX0r7uL.js +0 -13
  116. package/public/dist/assets/memory-CfeG2ViL.js +0 -1
  117. package/public/dist/assets/message-history-BaI36ciH.js +0 -1
  118. package/public/dist/assets/settings-VeoQiKpd.js +0 -1
  119. package/public/dist/assets/settings-core-DlfGtuWD.js +0 -1
  120. package/public/dist/assets/skills-Z0rMlwnf.js +0 -1
  121. package/public/dist/assets/slash-commands-CZKlw4A6.js +0 -1
  122. package/public/dist/assets/ui-WRcA4tUT.js +0 -1
  123. package/scripts/check-electron-sidecar-jwc.cjs +0 -117
@@ -0,0 +1,208 @@
1
+ .code-worker-runs {
2
+ border-top: 1px solid var(--border-default);
3
+ background: color-mix(in srgb, var(--bg-panel) 90%, var(--bg-base));
4
+ }
5
+
6
+ .code-worker-runs-header {
7
+ display: grid;
8
+ grid-template-columns: minmax(120px, 1fr) auto auto;
9
+ gap: 8px;
10
+ align-items: center;
11
+ padding: 8px 10px;
12
+ border-bottom: 1px solid color-mix(in srgb, var(--border-default) 82%, transparent);
13
+ }
14
+
15
+ .code-worker-runs-header > div:first-child {
16
+ display: grid;
17
+ gap: 1px;
18
+ min-width: 0;
19
+ }
20
+
21
+ .code-worker-runs-header strong {
22
+ color: var(--text-primary);
23
+ font-size: 12px;
24
+ font-weight: 700;
25
+ }
26
+
27
+ .code-worker-runs-summary {
28
+ display: flex;
29
+ flex-wrap: wrap;
30
+ gap: 4px;
31
+ justify-content: flex-end;
32
+ }
33
+
34
+ .code-worker-runs-summary span {
35
+ padding: 2px 6px;
36
+ border: 1px solid var(--border-default);
37
+ border-radius: 999px;
38
+ color: var(--text-tertiary);
39
+ font-size: 10px;
40
+ font-weight: 700;
41
+ white-space: nowrap;
42
+ }
43
+
44
+ .code-worker-runs-summary span.is-active {
45
+ border-color: color-mix(in srgb, var(--accent-default) 46%, var(--border-default));
46
+ color: var(--accent-default);
47
+ background: var(--accent-subtle);
48
+ }
49
+
50
+ .code-worker-runs-summary span.is-attention {
51
+ border-color: color-mix(in srgb, var(--status-error) 38%, var(--border-default));
52
+ color: var(--status-error);
53
+ background: color-mix(in srgb, var(--status-error) 9%, var(--bg-panel));
54
+ }
55
+
56
+ .code-worker-run-list {
57
+ display: grid;
58
+ gap: 1px;
59
+ max-height: min(34vh, 340px);
60
+ margin: 0;
61
+ padding: 0;
62
+ list-style: none;
63
+ overflow-y: auto;
64
+ }
65
+
66
+ .code-worker-run-item {
67
+ display: grid;
68
+ gap: 6px;
69
+ padding: 7px 10px;
70
+ border-bottom: 1px solid color-mix(in srgb, var(--border-default) 76%, transparent);
71
+ }
72
+
73
+ .code-worker-run-item:last-child {
74
+ border-bottom: 0;
75
+ }
76
+
77
+ .code-worker-run-main {
78
+ display: grid;
79
+ grid-template-columns: auto minmax(0, 1fr);
80
+ gap: 3px 8px;
81
+ min-width: 0;
82
+ min-height: auto;
83
+ padding: 0;
84
+ border: 0;
85
+ background: transparent;
86
+ color: inherit;
87
+ text-align: left;
88
+ cursor: pointer;
89
+ }
90
+
91
+ .code-worker-run-task {
92
+ grid-column: 1 / -1;
93
+ overflow: hidden;
94
+ text-overflow: ellipsis;
95
+ white-space: nowrap;
96
+ color: var(--text-secondary);
97
+ font-size: 10px;
98
+ }
99
+
100
+ .code-worker-run-detail {
101
+ display: grid;
102
+ gap: 7px;
103
+ padding: 8px;
104
+ border: 1px solid var(--border-default);
105
+ border-radius: 6px;
106
+ background: var(--bg-base);
107
+ }
108
+
109
+ .code-worker-run-events {
110
+ display: grid;
111
+ gap: 4px;
112
+ max-height: 160px;
113
+ margin: 0;
114
+ padding: 0;
115
+ list-style: none;
116
+ overflow-y: auto;
117
+ }
118
+
119
+ .code-worker-run-events li {
120
+ display: grid;
121
+ grid-template-columns: 86px 64px minmax(0, 1fr);
122
+ gap: 6px;
123
+ align-items: baseline;
124
+ padding-left: 10px;
125
+ border-left: 2px solid var(--border-default);
126
+ color: var(--text-secondary);
127
+ font-size: 10px;
128
+ }
129
+
130
+ .code-worker-run-events b,
131
+ .code-worker-run-events code,
132
+ .code-worker-run-task {
133
+ overflow: hidden;
134
+ text-overflow: ellipsis;
135
+ white-space: nowrap;
136
+ }
137
+
138
+ .code-worker-run-events b {
139
+ color: var(--text-tertiary);
140
+ font-weight: 700;
141
+ }
142
+
143
+ .code-worker-run-events span {
144
+ color: var(--text-tertiary);
145
+ }
146
+
147
+ .code-worker-run-events code {
148
+ color: var(--text-secondary);
149
+ font-family: 'Berkeley Mono', 'JetBrains Mono', monospace;
150
+ font-size: 10px;
151
+ }
152
+
153
+ .code-worker-output-action {
154
+ justify-self: flex-start;
155
+ min-height: 24px;
156
+ padding: 0 8px;
157
+ border: 1px solid var(--border-default);
158
+ border-radius: 6px;
159
+ background: var(--bg-panel);
160
+ color: var(--text-primary);
161
+ font: inherit;
162
+ font-size: 11px;
163
+ font-weight: 650;
164
+ cursor: pointer;
165
+ }
166
+
167
+ .code-worker-output-action:disabled {
168
+ opacity: 0.45;
169
+ cursor: not-allowed;
170
+ }
171
+
172
+ .code-worker-output {
173
+ display: grid;
174
+ gap: 6px;
175
+ }
176
+
177
+ .code-worker-output > div {
178
+ display: flex;
179
+ align-items: center;
180
+ justify-content: space-between;
181
+ gap: 8px;
182
+ color: var(--text-tertiary);
183
+ font-size: 10px;
184
+ }
185
+
186
+ .code-worker-output pre {
187
+ max-height: 180px;
188
+ margin: 0;
189
+ padding: 7px 8px;
190
+ border: 1px solid var(--border-default);
191
+ border-radius: 6px;
192
+ overflow: auto;
193
+ background: color-mix(in srgb, var(--bg-panel) 72%, var(--bg-base));
194
+ color: var(--text-secondary);
195
+ font-family: 'Berkeley Mono', 'JetBrains Mono', monospace;
196
+ font-size: 10px;
197
+ line-height: 1.45;
198
+ white-space: pre-wrap;
199
+ }
200
+
201
+ @media (max-width: 760px) {
202
+ .code-worker-runs-header {
203
+ grid-template-columns: minmax(0, 1fr);
204
+ }
205
+ .code-worker-runs-summary {
206
+ justify-content: flex-start;
207
+ }
208
+ }
@@ -7,7 +7,6 @@ NODE_VERSION="24.17.0"
7
7
 
8
8
  PROJECT_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
9
9
  SIDECAR_DIR="$PROJECT_ROOT/electron/sidecar/server"
10
- JAWCODE_SRC="${CLI_JAW_LOCAL_JAWCODE:-}"
11
10
 
12
11
  install_locked_production_dependencies() {
13
12
  if [ -f package-lock.json ]; then
@@ -55,43 +54,7 @@ cp package-lock.json "$SIDECAR_DIR/package-lock.json" 2>/dev/null || true
55
54
 
56
55
  echo "Installing production dependencies..."
57
56
  cd "$SIDECAR_DIR"
58
-
59
- if [ -n "$JAWCODE_SRC" ]; then
60
- if [ ! -f "$JAWCODE_SRC/package.json" ]; then
61
- echo "ERROR: CLI_JAW_LOCAL_JAWCODE must point to a jawcode package directory with package.json" >&2
62
- echo " got: $JAWCODE_SRC" >&2
63
- exit 1
64
- fi
65
- JAWCODE_SRC="$(cd "$JAWCODE_SRC" && pwd)"
66
-
67
- BUN_BIN="${BUN_BIN:-bun}"
68
- if ! command -v "$BUN_BIN" >/dev/null 2>&1; then
69
- echo "ERROR: bun is required when CLI_JAW_LOCAL_JAWCODE is set" >&2
70
- exit 1
71
- fi
72
-
73
- echo "Using local jawcode override: $JAWCODE_SRC"
74
- echo "Building jawcode Node SDK..."
75
- (cd "$JAWCODE_SRC" && "$BUN_BIN" run build:node)
76
-
77
- echo "Packing jawcode local dependency..."
78
- JAWCODE_TARBALL="$(basename "$(npm pack "$JAWCODE_SRC" --pack-destination "$SIDECAR_DIR" --silent)")"
79
-
80
- node "$PROJECT_ROOT/scripts/prepare-sidecar-package-json.cjs" \
81
- --package-json "$SIDECAR_DIR/package.json" \
82
- --remove-dependency jawcode
83
- npm install --omit=dev --ignore-scripts
84
- npm install --omit=dev --ignore-scripts "./$JAWCODE_TARBALL"
85
- rm -f "$SIDECAR_DIR/$JAWCODE_TARBALL"
86
- else
87
- echo "Using package-lock pinned jawcode dependency."
88
- install_locked_production_dependencies
89
- fi
90
-
91
- if [ ! -f "$SIDECAR_DIR/node_modules/jawcode/package.json" ]; then
92
- echo "ERROR: jawcode dependency did not resolve inside sidecar" >&2
93
- exit 1
94
- fi
57
+ install_locked_production_dependencies
95
58
 
96
59
  echo "Pruning frontend-only dependencies..."
97
60
  PRUNE_PKGS=(
@@ -155,20 +118,6 @@ echo "Verifying better-sqlite3 opens with bundled Node..."
155
118
  exit 1
156
119
  }
157
120
 
158
- echo "Verifying jawcode SDK import with bundled Node..."
159
- if "$NODE_BIN" --input-type=module <<'NODE'
160
- const sdk = await import("jawcode/sdk");
161
- if (typeof sdk.createAgentSession !== "function") {
162
- throw new Error("missing createAgentSession");
163
- }
164
- NODE
165
- then
166
- echo " jawcode SDK OK"
167
- else
168
- echo "ERROR: jawcode SDK failed to import with bundled Node"
169
- exit 1
170
- fi
171
-
172
121
  echo "Cleaning up Node extract..."
173
122
  rm -rf "/tmp/${NODE_PKG}" /tmp/node-sidecar.zip 2>/dev/null || true
174
123
 
@@ -187,11 +136,6 @@ if [[ "$PLATFORM" == "win32" ]]; then
187
136
  @echo off
188
137
  set "DIR=%~dp0.."
189
138
  "%DIR%\node.exe" "%DIR%\dist\bin\cli-jaw.js" %*
190
- SHIM
191
- cat > "$SIDECAR_DIR/bin/jwc.cmd" << 'SHIM'
192
- @echo off
193
- set "DIR=%~dp0.."
194
- "%DIR%\node.exe" "%DIR%\node_modules\jawcode\bin\jwc.js" %*
195
139
  SHIM
196
140
  else
197
141
  cat > "$SIDECAR_DIR/bin/jaw" << 'SHIM'
@@ -200,15 +144,9 @@ DIR="$(cd "$(dirname "$0")/.." && pwd)"
200
144
  exec "$DIR/node" "$DIR/dist/bin/cli-jaw.js" "$@"
201
145
  SHIM
202
146
  chmod +x "$SIDECAR_DIR/bin/jaw"
203
- cat > "$SIDECAR_DIR/bin/jwc" << 'SHIM'
204
- #!/bin/sh
205
- DIR="$(cd "$(dirname "$0")/.." && pwd)"
206
- exec "$DIR/node" "$DIR/node_modules/jawcode/bin/jwc.js" "$@"
207
- SHIM
208
- chmod +x "$SIDECAR_DIR/bin/jwc"
209
147
  fi
210
148
 
211
- node "$PROJECT_ROOT/scripts/check-electron-sidecar-jwc.cjs" --server-root "$SIDECAR_DIR"
149
+ node "$PROJECT_ROOT/scripts/check-electron-sidecar-no-jwc.cjs" --server-root "$SIDECAR_DIR"
212
150
 
213
151
  echo "=== Sidecar ready ==="
214
152
  du -sh "$SIDECAR_DIR"
@@ -0,0 +1,57 @@
1
+ #!/usr/bin/env node
2
+ const { existsSync } = require('node:fs');
3
+ const { join, resolve } = require('node:path');
4
+
5
+ function parseArg(name) {
6
+ const index = process.argv.indexOf(name);
7
+ if (index === -1) return null;
8
+ return process.argv[index + 1] || null;
9
+ }
10
+
11
+ function fail(message) {
12
+ console.error(`ERROR: ${message}`);
13
+ process.exit(1);
14
+ }
15
+
16
+ function checkFile(filePath, label) {
17
+ if (!existsSync(filePath)) {
18
+ fail(`${label} missing: ${filePath}`);
19
+ }
20
+ }
21
+
22
+ function checkAbsent(filePath, label) {
23
+ if (existsSync(filePath)) {
24
+ fail(`${label} must not be bundled: ${filePath}`);
25
+ }
26
+ }
27
+
28
+ function findNodeBin(serverRoot) {
29
+ const candidates = [join(serverRoot, 'node'), join(serverRoot, 'node.exe')];
30
+ return candidates.find(existsSync) || candidates[0];
31
+ }
32
+
33
+ function shimPath(serverRoot, name) {
34
+ const candidates = [join(serverRoot, 'bin', name), join(serverRoot, 'bin', `${name}.cmd`)];
35
+ return candidates.find(existsSync) || candidates[0];
36
+ }
37
+
38
+ const unknown = process.argv.slice(2).filter((arg, index, args) => {
39
+ if (arg === '--server-root') return false;
40
+ if (args[index - 1] === '--server-root') return false;
41
+ return arg.startsWith('-');
42
+ });
43
+ if (unknown.length > 0) {
44
+ fail(`unknown argument: ${unknown.join(', ')}`);
45
+ }
46
+
47
+ const serverRoot = resolve(parseArg('--server-root') || 'electron/sidecar/server');
48
+
49
+ checkFile(findNodeBin(serverRoot), 'bundled Node');
50
+ checkFile(shimPath(serverRoot, 'jaw'), 'jaw shim');
51
+ checkAbsent(shimPath(serverRoot, 'jwc'), 'jwc shim');
52
+ checkAbsent(join(serverRoot, 'node_modules', 'jawcode'), 'jawcode package');
53
+ checkAbsent(join(serverRoot, 'node_modules', '@jawcode-dev'), '@jawcode-dev scope');
54
+ checkAbsent(join(serverRoot, 'node_modules', '@oven'), '@oven scope');
55
+ checkAbsent(join(serverRoot, 'node_modules', 'bun'), 'bun package');
56
+
57
+ console.log(`[electron-sidecar-no-jwc] OK ${serverRoot}`);
@@ -124,6 +124,7 @@ checks.push(() => run('node syntax: scripts/audit-fresh-install-evidence.mjs', p
124
124
  checks.push(() => run('node syntax: scripts/verify-release-evidence.mjs', process.execPath, ['--check', 'scripts/verify-release-evidence.mjs']));
125
125
  checks.push(() => run('node syntax: scripts/require-release-evidence.mjs', process.execPath, ['--check', 'scripts/require-release-evidence.mjs']));
126
126
  checks.push(() => run('node syntax: scripts/check-cli-bin-links.cjs', process.execPath, ['--check', 'scripts/check-cli-bin-links.cjs']));
127
+ checks.push(() => run('jwc default npm install exclusion smoke', npm, ['run', 'smoke:jwc:no-global']));
127
128
 
128
129
  checks.push(() => run('installer risk tests', npx, [
129
130
  'tsx',
@@ -145,8 +146,8 @@ checks.push(runPackageContentsCheck);
145
146
  checks.push(() => run('cli bin link contract', process.execPath, ['scripts/check-cli-bin-links.cjs'], {
146
147
  skip: existsSync('dist/bin/cli-jaw.js') ? '' : 'dist build output not available',
147
148
  }));
148
- checks.push(() => run('electron staged sidecar JWC contract', npm, ['run', 'check:electron-sidecar-jwc'], {
149
- skip: existsSync('electron/sidecar/server/node_modules/jawcode/package.json') ? '' : 'staged sidecar not bundled',
149
+ checks.push(() => run('electron staged sidecar no-JWC contract', npm, ['run', 'check:electron-sidecar-no-jwc'], {
150
+ skip: existsSync('electron/sidecar/server/package.json') ? '' : 'staged sidecar not bundled',
150
151
  }));
151
152
  checks.push(() => run('app icon asset contract', npm, ['run', 'check:app-icons']));
152
153
 
@@ -5,36 +5,28 @@ import { readFileSync } from 'node:fs';
5
5
  import { fileURLToPath } from 'node:url';
6
6
 
7
7
  const repoRoot = dirname(fileURLToPath(new URL('../package.json', import.meta.url)));
8
- const nodeDir = dirname(process.execPath);
9
- const safePath = [nodeDir, '/usr/bin', '/bin'].join(':');
8
+ const packageJson = JSON.parse(readFileSync(join(repoRoot, 'package.json'), 'utf8'));
9
+ const packageLock = JSON.parse(readFileSync(join(repoRoot, 'package-lock.json'), 'utf8'));
10
+ const safePath = ['/usr/bin', '/bin'].join(':');
10
11
  const env = { ...process.env, PATH: safePath };
11
12
 
12
- const globalJwc = spawnSync('sh', ['-lc', 'command -v jwc'], {
13
+ const globalJwc = spawnSync('sh', ['-c', 'command -v jwc'], {
13
14
  encoding: 'utf8',
14
15
  env,
15
16
  });
16
17
  assert.notEqual(globalJwc.status, 0, `expected no global jwc in smoke PATH, got ${globalJwc.stdout.trim()}`);
17
18
 
18
19
  const runtimeSource = readFileSync(join(repoRoot, 'src/agent/jwc-runtime.ts'), 'utf8');
20
+ assert.equal(packageJson.dependencies?.jawcode, undefined, 'cli-jaw npm installs must not pull jawcode by default');
21
+ assert.equal(packageJson.optionalDependencies?.jawcode, undefined, 'jawcode must not be an npm optional dependency because optional deps install by default');
22
+ assert.equal(packageLock.packages?.['']?.dependencies?.jawcode, undefined, 'package-lock root must not pull jawcode by default');
23
+ assert.equal(packageLock.packages?.['']?.optionalDependencies?.jawcode, undefined, 'package-lock root must not pull optional jawcode by default');
24
+ assert.equal(packageLock.packages?.['node_modules/jawcode'], undefined, 'package-lock must not include jawcode in the default install tree');
25
+ assert.equal(packageLock.packages?.['node_modules/@jawcode-dev/natives'], undefined, 'package-lock must not include @jawcode-dev/natives in the default install tree');
26
+ assert.equal(packageLock.packages?.['node_modules/bun'], undefined, 'package-lock must not include bun from JWC in the default install tree');
19
27
  assert.ok(runtimeSource.includes("'jawcode/sdk'"), 'jwc runtime must default to jawcode/sdk');
20
28
  assert.ok(!runtimeSource.includes("'jwc/sdk'"), 'jwc runtime must not default to jwc/sdk');
29
+ assert.ok(runtimeSource.includes('does not bundle JWC'), 'jwc runtime must explain that JWC is not bundled');
30
+ assert.ok(runtimeSource.includes('JWC_SDK_PATH=/absolute/path/to/jawcode/packages/jwc/dist-node/sdk.js'), 'jwc runtime must show the install path env override');
21
31
 
22
- const importer = [
23
- "const sdk = await import('jawcode/sdk');",
24
- "if (typeof sdk.createAgentSession !== 'function') throw new Error('missing createAgentSession');",
25
- "console.log(`[jwc no-global] jawcode/sdk import OK — ${Object.keys(sdk).length} exports`);",
26
- ].join('\n');
27
-
28
- const result = spawnSync(process.execPath, ['--input-type=module', '-e', importer], {
29
- cwd: repoRoot,
30
- encoding: 'utf8',
31
- env,
32
- });
33
-
34
- if (result.status !== 0) {
35
- process.stderr.write(result.stderr || result.stdout);
36
- process.exit(result.status ?? 1);
37
- }
38
-
39
- process.stdout.write(result.stdout);
40
- process.stdout.write('[jwc no-global] global jwc absent; embedded package import path OK\n');
32
+ process.stdout.write('[jwc no-global] global jwc absent; cli-jaw excludes bundled JWC and runtime guidance is present\n');
@@ -1 +0,0 @@
1
- import{r as e,t}from"./bgtask-badge-DqMU3pM3.js";export{t as applyBgtaskUpdate,e as refreshBgtaskBadge};