@aion0/forge 0.5.43 → 0.5.44

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 (62) hide show
  1. package/RELEASE_NOTES.md +14 -5
  2. package/components/Dashboard.tsx +14 -0
  3. package/intellij-plugin/README.md +53 -0
  4. package/intellij-plugin/build.gradle.kts +60 -0
  5. package/intellij-plugin/gradle/gradle-daemon-jvm.properties +12 -0
  6. package/intellij-plugin/gradle.properties +9 -0
  7. package/intellij-plugin/publish.sh +78 -0
  8. package/intellij-plugin/settings.gradle.kts +7 -0
  9. package/intellij-plugin/src/main/kotlin/com/aion0/forge/action/LoginAction.kt +49 -0
  10. package/intellij-plugin/src/main/kotlin/com/aion0/forge/action/LogoutAction.kt +18 -0
  11. package/intellij-plugin/src/main/kotlin/com/aion0/forge/action/OpenWebUIAction.kt +13 -0
  12. package/intellij-plugin/src/main/kotlin/com/aion0/forge/action/SwitchConnectionAction.kt +26 -0
  13. package/intellij-plugin/src/main/kotlin/com/aion0/forge/api/ForgeClient.kt +115 -0
  14. package/intellij-plugin/src/main/kotlin/com/aion0/forge/auth/Auth.kt +31 -0
  15. package/intellij-plugin/src/main/kotlin/com/aion0/forge/connection/ConnectionManager.kt +95 -0
  16. package/intellij-plugin/src/main/kotlin/com/aion0/forge/settings/ForgeConfigurable.kt +81 -0
  17. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/DocsView.kt +99 -0
  18. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/ForgeStatusBarWidgetFactory.kt +94 -0
  19. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/ForgeToolWindowFactory.kt +27 -0
  20. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/ForgeTreeView.kt +176 -0
  21. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/Helpers.kt +48 -0
  22. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/PipelinesView.kt +226 -0
  23. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/TerminalsView.kt +309 -0
  24. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/TreeNodeData.kt +33 -0
  25. package/intellij-plugin/src/main/kotlin/com/aion0/forge/ui/toolwindow/WorkspacesView.kt +166 -0
  26. package/intellij-plugin/src/main/resources/META-INF/plugin.xml +88 -0
  27. package/intellij-plugin/src/main/resources/icons/forge.svg +3 -0
  28. package/lib/agents/index.ts +1 -1
  29. package/lib/help-docs/00-overview.md +1 -0
  30. package/lib/help-docs/13-ide-plugins.md +90 -0
  31. package/lib/help-docs/CLAUDE.md +3 -0
  32. package/package.json +1 -1
  33. package/vscode-extension/.vscodeignore +11 -0
  34. package/vscode-extension/README.md +48 -0
  35. package/vscode-extension/media/icon.png +0 -0
  36. package/vscode-extension/media/icon.svg +3 -0
  37. package/vscode-extension/package-lock.json +4046 -0
  38. package/vscode-extension/package.json +514 -0
  39. package/vscode-extension/publish.sh +49 -0
  40. package/vscode-extension/src/api/client.ts +217 -0
  41. package/vscode-extension/src/auth/auth.ts +32 -0
  42. package/vscode-extension/src/commands/auth.ts +44 -0
  43. package/vscode-extension/src/commands/connection.ts +113 -0
  44. package/vscode-extension/src/commands/docs.ts +40 -0
  45. package/vscode-extension/src/commands/pipeline.ts +103 -0
  46. package/vscode-extension/src/commands/server.ts +50 -0
  47. package/vscode-extension/src/commands/smith.ts +112 -0
  48. package/vscode-extension/src/commands/task.ts +43 -0
  49. package/vscode-extension/src/commands/terminal.ts +279 -0
  50. package/vscode-extension/src/commands/workspace.ts +138 -0
  51. package/vscode-extension/src/connection/manager.ts +80 -0
  52. package/vscode-extension/src/docs/fs-provider.ts +94 -0
  53. package/vscode-extension/src/docs/result-provider.ts +33 -0
  54. package/vscode-extension/src/docs/transport.ts +22 -0
  55. package/vscode-extension/src/extension.ts +314 -0
  56. package/vscode-extension/src/statusbar.ts +70 -0
  57. package/vscode-extension/src/terminal/pseudoterm.ts +123 -0
  58. package/vscode-extension/src/views/docs.ts +145 -0
  59. package/vscode-extension/src/views/pipelines.ts +222 -0
  60. package/vscode-extension/src/views/terminals.ts +91 -0
  61. package/vscode-extension/src/views/workspaces.ts +243 -0
  62. package/vscode-extension/tsconfig.json +16 -0
@@ -0,0 +1,514 @@
1
+ {
2
+ "name": "forge-vibecoding",
3
+ "displayName": "Forge — Vibe Coding",
4
+ "description": "Native VSCode integration for Forge — workspace, smiths, and terminals.",
5
+ "version": "0.2.8",
6
+ "publisher": "aion0",
7
+ "engines": {
8
+ "vscode": "^1.80.0"
9
+ },
10
+ "categories": [
11
+ "Other"
12
+ ],
13
+ "keywords": [
14
+ "forge",
15
+ "ai",
16
+ "claude",
17
+ "agent",
18
+ "terminal"
19
+ ],
20
+ "main": "./out/extension.js",
21
+ "icon": "media/icon.png",
22
+ "activationEvents": [
23
+ "onStartupFinished"
24
+ ],
25
+ "contributes": {
26
+ "viewsContainers": {
27
+ "activitybar": [
28
+ {
29
+ "id": "forge",
30
+ "title": "Forge",
31
+ "icon": "media/icon.svg"
32
+ }
33
+ ]
34
+ },
35
+ "views": {
36
+ "forge": [
37
+ {
38
+ "id": "forge.workspaces",
39
+ "name": "Workspaces"
40
+ },
41
+ {
42
+ "id": "forge.terminals",
43
+ "name": "Terminals"
44
+ },
45
+ {
46
+ "id": "forge.pipelines",
47
+ "name": "Pipelines"
48
+ },
49
+ {
50
+ "id": "forge.docs",
51
+ "name": "Docs"
52
+ }
53
+ ]
54
+ },
55
+ "commands": [
56
+ {
57
+ "command": "forge.login",
58
+ "title": "Forge: Login",
59
+ "category": "Forge"
60
+ },
61
+ {
62
+ "command": "forge.logout",
63
+ "title": "Forge: Logout",
64
+ "category": "Forge"
65
+ },
66
+ {
67
+ "command": "forge.startServer",
68
+ "title": "Forge: Start Server",
69
+ "category": "Forge"
70
+ },
71
+ {
72
+ "command": "forge.stopServer",
73
+ "title": "Forge: Stop Server",
74
+ "category": "Forge"
75
+ },
76
+ {
77
+ "command": "forge.openWebUI",
78
+ "title": "Forge: Open Web UI",
79
+ "category": "Forge"
80
+ },
81
+ {
82
+ "command": "forge.openTerminal",
83
+ "title": "Forge: Open Terminal",
84
+ "category": "Forge"
85
+ },
86
+ {
87
+ "command": "forge.sendSelection",
88
+ "title": "Forge: Send Selection to Terminal",
89
+ "category": "Forge"
90
+ },
91
+ {
92
+ "command": "forge.newTask",
93
+ "title": "Forge: New Task",
94
+ "category": "Forge"
95
+ },
96
+ {
97
+ "command": "forge.refresh",
98
+ "title": "Forge: Refresh",
99
+ "category": "Forge",
100
+ "icon": "$(refresh)"
101
+ },
102
+ {
103
+ "command": "forge.attachTerminal",
104
+ "title": "Forge: Attach to Terminal",
105
+ "category": "Forge"
106
+ },
107
+ {
108
+ "command": "forge.openSession",
109
+ "title": "Forge: Open Session",
110
+ "category": "Forge",
111
+ "icon": "$(add)"
112
+ },
113
+ {
114
+ "command": "forge.openWorkspaceForFolder",
115
+ "title": "Forge: Open Workspace for Current Folder",
116
+ "category": "Forge",
117
+ "icon": "$(folder-opened)"
118
+ },
119
+ {
120
+ "command": "forge.openWorkspace",
121
+ "title": "Forge: Open Workspace…",
122
+ "category": "Forge"
123
+ },
124
+ {
125
+ "command": "forge.startDaemon",
126
+ "title": "Start Daemon",
127
+ "category": "Forge",
128
+ "icon": "$(play)"
129
+ },
130
+ {
131
+ "command": "forge.stopDaemon",
132
+ "title": "Stop Daemon",
133
+ "category": "Forge",
134
+ "icon": "$(stop)"
135
+ },
136
+ {
137
+ "command": "forge.restartDaemon",
138
+ "title": "Restart Daemon",
139
+ "category": "Forge",
140
+ "icon": "$(refresh)"
141
+ },
142
+ {
143
+ "command": "forge.smithOpenTerminal",
144
+ "title": "Open Smith Terminal",
145
+ "category": "Forge",
146
+ "icon": "$(terminal)"
147
+ },
148
+ {
149
+ "command": "forge.smithPause",
150
+ "title": "Pause Smith",
151
+ "category": "Forge",
152
+ "icon": "$(debug-pause)"
153
+ },
154
+ {
155
+ "command": "forge.smithResume",
156
+ "title": "Resume Smith",
157
+ "category": "Forge",
158
+ "icon": "$(debug-start)"
159
+ },
160
+ {
161
+ "command": "forge.smithMarkDone",
162
+ "title": "Mark Done",
163
+ "category": "Forge"
164
+ },
165
+ {
166
+ "command": "forge.smithMarkFailed",
167
+ "title": "Mark Failed",
168
+ "category": "Forge"
169
+ },
170
+ {
171
+ "command": "forge.smithMarkIdle",
172
+ "title": "Mark Idle",
173
+ "category": "Forge"
174
+ },
175
+ {
176
+ "command": "forge.smithRetry",
177
+ "title": "Retry",
178
+ "category": "Forge",
179
+ "icon": "$(refresh)"
180
+ },
181
+ {
182
+ "command": "forge.smithSendMessage",
183
+ "title": "Send Message",
184
+ "category": "Forge",
185
+ "icon": "$(comment)"
186
+ },
187
+ {
188
+ "command": "forge.openDoc",
189
+ "title": "Forge: Open Doc",
190
+ "category": "Forge",
191
+ "icon": "$(book)"
192
+ },
193
+ {
194
+ "command": "forge.openDocsTerminal",
195
+ "title": "Forge: Open Docs Terminal",
196
+ "category": "Forge",
197
+ "icon": "$(terminal)"
198
+ },
199
+ {
200
+ "command": "forge.switchConnection",
201
+ "title": "Forge: Switch Connection",
202
+ "category": "Forge",
203
+ "icon": "$(plug)"
204
+ },
205
+ {
206
+ "command": "forge.addConnection",
207
+ "title": "Forge: Add Connection…",
208
+ "category": "Forge"
209
+ },
210
+ {
211
+ "command": "forge.removeConnection",
212
+ "title": "Forge: Remove Connection…",
213
+ "category": "Forge"
214
+ },
215
+ {
216
+ "command": "forge.editConnections",
217
+ "title": "Forge: Edit Connections (settings.json)",
218
+ "category": "Forge"
219
+ },
220
+ {
221
+ "command": "forge.addPipeline",
222
+ "title": "Add Pipeline…",
223
+ "category": "Forge",
224
+ "icon": "$(add)"
225
+ },
226
+ {
227
+ "command": "forge.triggerPipeline",
228
+ "title": "Trigger Pipeline",
229
+ "category": "Forge",
230
+ "icon": "$(play)"
231
+ },
232
+ {
233
+ "command": "forge.togglePipeline",
234
+ "title": "Enable / Disable Pipeline",
235
+ "category": "Forge",
236
+ "icon": "$(circle-slash)"
237
+ },
238
+ {
239
+ "command": "forge.removePipeline",
240
+ "title": "Remove Pipeline",
241
+ "category": "Forge",
242
+ "icon": "$(trash)"
243
+ },
244
+ {
245
+ "command": "forge.showPipelineNodeError",
246
+ "title": "Show Node Error",
247
+ "category": "Forge"
248
+ },
249
+ {
250
+ "command": "forge.showPipelineNodeResult",
251
+ "title": "Show Node Result",
252
+ "category": "Forge",
253
+ "icon": "$(eye)"
254
+ },
255
+ {
256
+ "command": "forge.openItemInWebUI",
257
+ "title": "Open in Forge Web UI",
258
+ "category": "Forge",
259
+ "icon": "$(globe)"
260
+ }
261
+ ],
262
+ "menus": {
263
+ "view/title": [
264
+ {
265
+ "command": "forge.openWorkspaceForFolder",
266
+ "when": "view == forge.workspaces",
267
+ "group": "navigation@1"
268
+ },
269
+ {
270
+ "command": "forge.refresh",
271
+ "when": "view == forge.workspaces",
272
+ "group": "navigation@2"
273
+ },
274
+ {
275
+ "command": "forge.openSession",
276
+ "when": "view == forge.terminals",
277
+ "group": "navigation@1"
278
+ },
279
+ {
280
+ "command": "forge.refresh",
281
+ "when": "view == forge.terminals",
282
+ "group": "navigation@2"
283
+ },
284
+ {
285
+ "command": "forge.addPipeline",
286
+ "when": "view == forge.pipelines",
287
+ "group": "navigation@1"
288
+ },
289
+ {
290
+ "command": "forge.refresh",
291
+ "when": "view == forge.pipelines",
292
+ "group": "navigation@2"
293
+ },
294
+ {
295
+ "command": "forge.refresh",
296
+ "when": "view == forge.docs",
297
+ "group": "navigation"
298
+ }
299
+ ],
300
+ "view/item/context": [
301
+ {
302
+ "command": "forge.attachTerminal",
303
+ "when": "view == forge.terminals && viewItem == forge.terminal",
304
+ "group": "inline"
305
+ },
306
+ {
307
+ "command": "forge.startDaemon",
308
+ "when": "view == forge.workspaces && viewItem == forge.workspace.inactive",
309
+ "group": "inline@1"
310
+ },
311
+ {
312
+ "command": "forge.stopDaemon",
313
+ "when": "view == forge.workspaces && viewItem == forge.workspace.active",
314
+ "group": "inline@1"
315
+ },
316
+ {
317
+ "command": "forge.restartDaemon",
318
+ "when": "view == forge.workspaces && viewItem == forge.workspace.active",
319
+ "group": "inline@2"
320
+ },
321
+ {
322
+ "command": "forge.smithOpenTerminal",
323
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\..+/",
324
+ "group": "inline@1"
325
+ },
326
+ {
327
+ "command": "forge.smithSendMessage",
328
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\..+/",
329
+ "group": "inline@2"
330
+ },
331
+ {
332
+ "command": "forge.smithPause",
333
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\.(?!.*paused)/",
334
+ "group": "smith@1"
335
+ },
336
+ {
337
+ "command": "forge.smithResume",
338
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\..+\\.paused/",
339
+ "group": "smith@1"
340
+ },
341
+ {
342
+ "command": "forge.smithRetry",
343
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\.failed/",
344
+ "group": "smith@2"
345
+ },
346
+ {
347
+ "command": "forge.smithMarkDone",
348
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\.running/",
349
+ "group": "smith@3"
350
+ },
351
+ {
352
+ "command": "forge.smithMarkFailed",
353
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\.running/",
354
+ "group": "smith@4"
355
+ },
356
+ {
357
+ "command": "forge.smithMarkIdle",
358
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\.running/",
359
+ "group": "smith@5"
360
+ },
361
+ {
362
+ "command": "forge.openDocsTerminal",
363
+ "when": "view == forge.docs && viewItem == forge.docRoot",
364
+ "group": "inline"
365
+ },
366
+ {
367
+ "command": "forge.openDocsTerminal",
368
+ "when": "view == forge.docs && viewItem == forge.docDir",
369
+ "group": "inline"
370
+ },
371
+ {
372
+ "command": "forge.addPipeline",
373
+ "when": "view == forge.pipelines && viewItem == forge.pipelineProject",
374
+ "group": "inline"
375
+ },
376
+ {
377
+ "command": "forge.triggerPipeline",
378
+ "when": "view == forge.pipelines && viewItem =~ /forge\\.pipelineBinding/",
379
+ "group": "inline@1"
380
+ },
381
+ {
382
+ "command": "forge.togglePipeline",
383
+ "when": "view == forge.pipelines && viewItem =~ /forge\\.pipelineBinding/",
384
+ "group": "pipeline@1"
385
+ },
386
+ {
387
+ "command": "forge.removePipeline",
388
+ "when": "view == forge.pipelines && viewItem =~ /forge\\.pipelineBinding/",
389
+ "group": "pipeline@2"
390
+ },
391
+ {
392
+ "command": "forge.openItemInWebUI",
393
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.workspace\\./",
394
+ "group": "inline@9"
395
+ },
396
+ {
397
+ "command": "forge.openItemInWebUI",
398
+ "when": "view == forge.workspaces && viewItem =~ /forge\\.smith\\..+/",
399
+ "group": "inline@9"
400
+ },
401
+ {
402
+ "command": "forge.openItemInWebUI",
403
+ "when": "view == forge.pipelines && viewItem == forge.pipelineProject",
404
+ "group": "inline@9"
405
+ },
406
+ {
407
+ "command": "forge.openItemInWebUI",
408
+ "when": "view == forge.pipelines && viewItem == forge.pipelineRun",
409
+ "group": "inline@9"
410
+ },
411
+ {
412
+ "command": "forge.openItemInWebUI",
413
+ "when": "view == forge.docs && viewItem == forge.docRoot",
414
+ "group": "inline@9"
415
+ }
416
+ ],
417
+ "editor/context": [
418
+ {
419
+ "command": "forge.sendSelection",
420
+ "when": "editorHasSelection",
421
+ "group": "forge"
422
+ }
423
+ ]
424
+ },
425
+ "configuration": {
426
+ "title": "Forge",
427
+ "properties": {
428
+ "forge.connections": {
429
+ "type": "array",
430
+ "default": [],
431
+ "markdownDescription": "Saved Forge connections. If empty, the extension synthesizes a single \"Local\" entry from `forge.serverUrl` / `forge.terminalUrl` (backwards compat). Use `Forge: Switch Connection` (status bar or command palette) to swap.",
432
+ "items": {
433
+ "type": "object",
434
+ "required": [
435
+ "name",
436
+ "serverUrl",
437
+ "terminalUrl"
438
+ ],
439
+ "properties": {
440
+ "name": {
441
+ "type": "string",
442
+ "description": "Display name (e.g. Local, Office, Cloud)"
443
+ },
444
+ "serverUrl": {
445
+ "type": "string",
446
+ "description": "Forge HTTP URL (http://host:port)"
447
+ },
448
+ "terminalUrl": {
449
+ "type": "string",
450
+ "description": "Forge terminal WebSocket URL (ws://host:port)"
451
+ }
452
+ }
453
+ }
454
+ },
455
+ "forge.activeConnection": {
456
+ "type": "string",
457
+ "default": "",
458
+ "description": "Name of the currently active connection (one of forge.connections[].name)."
459
+ },
460
+ "forge.serverUrl": {
461
+ "type": "string",
462
+ "default": "http://localhost:8403",
463
+ "description": "[Legacy] Single Forge HTTP server URL — used when forge.connections is empty."
464
+ },
465
+ "forge.terminalUrl": {
466
+ "type": "string",
467
+ "default": "ws://localhost:8404",
468
+ "description": "[Legacy] Single Forge terminal WebSocket URL — used when forge.connections is empty."
469
+ },
470
+ "forge.autoStart": {
471
+ "type": "boolean",
472
+ "default": false,
473
+ "description": "Run `forge server start` on extension activation if no Forge server is reachable."
474
+ },
475
+ "forge.notifications.enabled": {
476
+ "type": "boolean",
477
+ "default": true,
478
+ "description": "Show VSCode notifications for smith bell events."
479
+ },
480
+ "forge.refreshInterval": {
481
+ "type": "number",
482
+ "default": 5,
483
+ "description": "Tree-view refresh interval in seconds."
484
+ },
485
+ "forge.docs.transport": {
486
+ "type": "string",
487
+ "enum": [
488
+ "auto",
489
+ "local",
490
+ "http"
491
+ ],
492
+ "default": "auto",
493
+ "markdownDescription": "How to read/write doc files.\n- `auto` (default): use local file paths when forge is on localhost, fall back to HTTP otherwise.\n- `local`: always use VSCode's native filesystem (only works when forge is on the same machine).\n- `http`: always go through forge's `/api/docs` endpoint (works for remote forge over a tunnel)."
494
+ }
495
+ }
496
+ }
497
+ },
498
+ "scripts": {
499
+ "vscode:prepublish": "npm run compile",
500
+ "compile": "tsc -p ./",
501
+ "watch": "tsc -watch -p ./",
502
+ "package": "vsce package --out forge-vscode.vsix"
503
+ },
504
+ "dependencies": {
505
+ "ws": "^8.18.0"
506
+ },
507
+ "devDependencies": {
508
+ "@types/node": "^20.0.0",
509
+ "@types/vscode": "^1.80.0",
510
+ "@types/ws": "^8.5.0",
511
+ "@vscode/vsce": "^3.0.0",
512
+ "typescript": "^5.4.0"
513
+ }
514
+ }
@@ -0,0 +1,49 @@
1
+ #!/bin/bash
2
+ # Publish the Forge VSCode extension to the Marketplace.
3
+ #
4
+ # Usage:
5
+ # ./publish.sh # bump patch (0.2.6 → 0.2.7) + publish (default)
6
+ # ./publish.sh minor # bump minor (0.2.x → 0.3.0) + publish
7
+ # ./publish.sh major # bump major (0.x.x → 1.0.0) + publish
8
+ # ./publish.sh 0.5.0 # publish exact version
9
+ # ./publish.sh --no-bump # publish current package.json version unchanged
10
+ #
11
+ # Auth (one-time): `npx vsce login aion0` (credentials cached in ~/.vsce/),
12
+ # OR set $VSCE_PAT in the environment before invoking.
13
+ #
14
+ # vsce will create a `git commit` + `git tag v<x.y.z>` for version bumps —
15
+ # push them with `git push --follow-tags` afterwards.
16
+
17
+ set -euo pipefail
18
+ cd "$(dirname "$0")"
19
+
20
+ ARG="${1:-patch}"
21
+
22
+ PUBLISH_ARGS=()
23
+ case "$ARG" in
24
+ --no-bump)
25
+ ;;
26
+ patch|minor|major)
27
+ PUBLISH_ARGS+=("$ARG")
28
+ ;;
29
+ *)
30
+ if [[ "$ARG" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
31
+ PUBLISH_ARGS+=("$ARG")
32
+ else
33
+ echo "Unknown argument: $ARG" >&2
34
+ echo "Usage: $0 [patch|minor|major|x.y.z|--no-bump]" >&2
35
+ exit 1
36
+ fi
37
+ ;;
38
+ esac
39
+
40
+ if [[ -n "${VSCE_PAT:-}" ]]; then
41
+ PUBLISH_ARGS+=(-p "$VSCE_PAT")
42
+ fi
43
+
44
+ echo "→ npx vsce publish ${PUBLISH_ARGS[*]:-}"
45
+ npx vsce publish "${PUBLISH_ARGS[@]}"
46
+
47
+ VERSION=$(node -p "require('./package.json').version")
48
+ echo "✓ Published aion0.forge-vibecoding v$VERSION"
49
+ echo "→ https://marketplace.visualstudio.com/items?itemName=aion0.forge-vibecoding"