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.
- package/README.ko.md +1 -1
- package/README.md +22 -3
- package/README.zh-CN.md +1 -1
- package/dist/bin/cli-jaw.js +5 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/bgtask.js +2 -1
- package/dist/bin/commands/bgtask.js.map +1 -1
- package/dist/bin/commands/dispatch-batch-summary.js +38 -0
- package/dist/bin/commands/dispatch-batch-summary.js.map +1 -0
- package/dist/bin/commands/dispatch.js +91 -52
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/jwc.js +237 -0
- package/dist/bin/commands/jwc.js.map +1 -0
- package/dist/bin/commands/skill.js +17 -4
- package/dist/bin/commands/skill.js.map +1 -1
- package/dist/bin/commands/worker.js +162 -4
- package/dist/bin/commands/worker.js.map +1 -1
- package/dist/lib/mcp/skills-distribution.js +17 -19
- package/dist/lib/mcp/skills-distribution.js.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/src/agent/jwc-runtime.js +12 -3
- package/dist/src/agent/jwc-runtime.js.map +1 -1
- package/dist/src/bgtask/registry.js +12 -2
- package/dist/src/bgtask/registry.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-escalation.js +122 -0
- package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/browser-flow.js +57 -0
- package/dist/src/browser/adaptive-fetch/browser-flow.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/candidate-discovery.js +116 -0
- package/dist/src/browser/adaptive-fetch/candidate-discovery.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/feed-parser.js +152 -0
- package/dist/src/browser/adaptive-fetch/feed-parser.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/index.js +9 -59
- package/dist/src/browser/adaptive-fetch/index.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js +43 -0
- package/dist/src/browser/adaptive-fetch/live-smoke-manifest.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/metadata.js +74 -5
- package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -1
- package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js +414 -0
- package/dist/src/browser/adaptive-fetch/public-endpoint-normalizers.js.map +1 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js +36 -0
- package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -1
- package/dist/src/cli/commands.js +2 -0
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers-search.js +28 -0
- package/dist/src/cli/handlers-search.js.map +1 -0
- package/dist/src/cli/handlers.js +12 -1
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/code-mode/acp-host.js +1 -8
- package/dist/src/code-mode/acp-host.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +2 -4
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/worker-output-store.js +64 -0
- package/dist/src/orchestrator/worker-output-store.js.map +1 -0
- package/dist/src/orchestrator/worker-progress.js.map +1 -1
- package/dist/src/orchestrator/worker-registry.js +91 -10
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/orchestrator/worker-replay-notice.js +28 -0
- package/dist/src/orchestrator/worker-replay-notice.js.map +1 -0
- package/dist/src/orchestrator/worker-run-store.js +142 -0
- package/dist/src/orchestrator/worker-run-store.js.map +1 -0
- package/dist/src/routes/bgtask.js +13 -4
- package/dist/src/routes/bgtask.js.map +1 -1
- package/dist/src/routes/orchestrate.js +53 -4
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/shared/runtime-observability.js +20 -0
- package/dist/src/shared/runtime-observability.js.map +1 -0
- package/dist/src/workflows/search.js +34 -0
- package/dist/src/workflows/search.js.map +1 -0
- package/package.json +6 -7
- package/public/dist/assets/{app-BsVpXeLC.js → app-BbBXyLe3.js} +4 -4
- package/public/dist/assets/{bgtask-badge-DqMU3pM3.js → bgtask-badge-BioRIkPz.js} +1 -1
- package/public/dist/assets/bgtask-badge-BwMVGFG_.js +1 -0
- package/public/dist/assets/{employees-BhkR2-xi.js → employees-B8cUYBRx.js} +1 -1
- package/public/dist/assets/manager-Ceg2x8D0.js +13 -0
- package/public/dist/assets/{manager-U147AWWu.css → manager-CwAlpgV7.css} +1 -1
- package/public/dist/assets/{memory-DERWDVjI.js → memory-3J4rzlxy.js} +1 -1
- package/public/dist/assets/memory-B5CQnDFI.js +1 -0
- package/public/dist/assets/message-history-BYswFI5p.js +1 -0
- package/public/dist/assets/{message-history-CK0ah3pB.js → message-history-Vv3aIRWS.js} +2 -2
- package/public/dist/assets/{render-CqzsW5KN.js → render-BVZ1xMEu.js} +1 -1
- package/public/dist/assets/{settings-DdwmhI5a.js → settings-C5FVzFpn.js} +1 -1
- package/public/dist/assets/settings-DZ4wz5SY.js +1 -0
- package/public/dist/assets/{settings-core-AiF7o3Ns.js → settings-core-5lL6lIyu.js} +1 -1
- package/public/dist/assets/settings-core-DYnePZHe.js +1 -0
- package/public/dist/assets/{sidebar-Bhtk2fPc.js → sidebar-jRPFidCd.js} +3 -3
- package/public/dist/assets/{skills-Cs8byPIx.js → skills-BjOjT5sG.js} +1 -1
- package/public/dist/assets/skills-CH0wHfkw.js +1 -0
- package/public/dist/assets/{slash-commands-C5erv0KS.js → slash-commands-B2oqpz-B.js} +1 -1
- package/public/dist/assets/slash-commands-C_9y_-8B.js +1 -0
- package/public/dist/assets/{trace-drawer-CtmD6jwj.js → trace-drawer-BQIdKFZx.js} +1 -1
- package/public/dist/assets/{ui-DaFl446W.js → ui-B9KmU-Qr.js} +1 -1
- package/public/dist/assets/ui-BCJ4lcQ4.js +1 -0
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +2 -2
- package/public/js/features/command-info.ts +1 -0
- package/public/locales/en.json +2 -0
- package/public/locales/ja.json +2 -0
- package/public/locales/ko.json +2 -0
- package/public/locales/zh.json +2 -0
- package/public/manager/src/SidebarRailRouter.tsx +7 -3
- package/public/manager/src/background-tasks/background-task-client.ts +21 -1
- package/public/manager/src/main.tsx +2 -0
- package/public/manager/src/workers/WorkerProgressMonitorPanel.tsx +2 -0
- package/public/manager/src/workers/WorkerRunsPanel.tsx +152 -0
- package/public/manager/src/workers/useWorkerRuns.ts +138 -0
- package/public/manager/src/workers/worker-runs-client.ts +112 -0
- package/public/manager/src/workers/worker-runs.css +208 -0
- package/scripts/bundle-sidecar.sh +2 -64
- package/scripts/check-electron-sidecar-no-jwc.cjs +57 -0
- package/scripts/install-risk-gate.mjs +3 -2
- package/scripts/jwc-no-global-smoke.mjs +14 -22
- package/public/dist/assets/bgtask-badge-YR8SMYrp.js +0 -1
- package/public/dist/assets/manager-ycX0r7uL.js +0 -13
- package/public/dist/assets/memory-CfeG2ViL.js +0 -1
- package/public/dist/assets/message-history-BaI36ciH.js +0 -1
- package/public/dist/assets/settings-VeoQiKpd.js +0 -1
- package/public/dist/assets/settings-core-DlfGtuWD.js +0 -1
- package/public/dist/assets/skills-Z0rMlwnf.js +0 -1
- package/public/dist/assets/slash-commands-CZKlw4A6.js +0 -1
- package/public/dist/assets/ui-WRcA4tUT.js +0 -1
- 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/
|
|
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
|
|
9
|
-
const
|
|
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', ['-
|
|
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
|
-
|
|
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};
|