@equinor/fusion-framework-cli-plugin-copilot 2.0.2 → 2.0.4
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/CHANGELOG.md +16 -0
- package/dist/esm/commands/app/{session-logger.js → attach-session-logger.js} +16 -2
- package/dist/esm/commands/app/attach-session-logger.js.map +1 -0
- package/dist/esm/commands/app/{command.js → copilot-command.js} +22 -11
- package/dist/esm/commands/app/copilot-command.js.map +1 -0
- package/dist/esm/commands/app/{eval.js → create-session.js} +7 -5
- package/dist/esm/commands/app/create-session.js.map +1 -0
- package/dist/esm/commands/app/format-plan.js +24 -0
- package/dist/esm/commands/app/format-plan.js.map +1 -0
- package/dist/esm/commands/app/format-step-result.js +14 -0
- package/dist/esm/commands/app/format-step-result.js.map +1 -0
- package/dist/esm/commands/app/format-verdict.js +38 -0
- package/dist/esm/commands/app/format-verdict.js.map +1 -0
- package/dist/esm/commands/app/prompts/{system.dev-server.prompt.js → create-dev-server-context.js} +1 -1
- package/dist/esm/commands/app/prompts/create-dev-server-context.js.map +1 -0
- package/dist/esm/commands/app/prompts/{execute-step.prompt.js → create-execute-step-prompt.js} +1 -1
- package/dist/esm/commands/app/prompts/create-execute-step-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{judge.prompt.js → create-judge-prompt.js} +5 -1
- package/dist/esm/commands/app/prompts/create-judge-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{plan.prompt.js → create-plan-prompt.js} +1 -1
- package/dist/esm/commands/app/prompts/create-plan-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{step.prompt.js → create-step-prompt.js} +3 -2
- package/dist/esm/commands/app/prompts/create-step-prompt.js.map +1 -0
- package/dist/esm/commands/app/prompts/{system.prompt.js → create-system-prompt.js} +1 -1
- package/dist/esm/commands/app/prompts/create-system-prompt.js.map +1 -0
- package/dist/esm/commands/app/{login.js → run-login.js} +5 -1
- package/dist/esm/commands/app/run-login.js.map +1 -0
- package/dist/esm/commands/app/{server.js → start-app-server.js} +7 -1
- package/dist/esm/commands/app/start-app-server.js.map +1 -0
- package/dist/esm/commands/app/status-icon.js +18 -0
- package/dist/esm/commands/app/status-icon.js.map +1 -0
- package/dist/esm/commands/app/tools/{registry.js → AgentBrowserToolRegistry.js} +1 -1
- package/dist/esm/commands/app/tools/AgentBrowserToolRegistry.js.map +1 -0
- package/dist/esm/commands/app/tools/{write-file.js → create-append-file-tool.js} +5 -38
- package/dist/esm/commands/app/tools/create-append-file-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{click.js → create-click-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-click-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{errors.js → create-errors-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-errors-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{eval-js.js → create-eval-js-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-eval-js-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{fill.js → create-fill-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-fill-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{find.js → create-find-tool.js} +4 -1
- package/dist/esm/commands/app/tools/create-find-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{get-styles.js → create-get-styles-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-get-styles-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{get-url.js → create-get-url-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-get-url-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{go-back.js → create-go-back-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-go-back-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{hover.js → create-hover-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-hover-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{navigate.js → create-navigate-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-navigate-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{press-key.js → create-press-key-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-press-key-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{read-file.js → create-read-file-tool.js} +4 -2
- package/dist/esm/commands/app/tools/create-read-file-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{reload.js → create-reload-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-reload-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{screenshot.js → create-screenshot-tool.js} +7 -1
- package/dist/esm/commands/app/tools/create-screenshot-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{scroll.js → create-scroll-tool.js} +3 -1
- package/dist/esm/commands/app/tools/create-scroll-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{select.js → create-select-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-select-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{snapshot.js → create-snapshot-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-snapshot-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{type-text.js → create-type-text-tool.js} +1 -1
- package/dist/esm/commands/app/tools/create-type-text-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/{wait.js → create-wait-tool.js} +5 -1
- package/dist/esm/commands/app/tools/create-wait-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/create-write-file-tool.js +65 -0
- package/dist/esm/commands/app/tools/create-write-file-tool.js.map +1 -0
- package/dist/esm/commands/app/tools/index.js +19 -19
- package/dist/esm/commands/app/tools/index.js.map +1 -1
- package/dist/esm/commands/app/truncate.js +11 -0
- package/dist/esm/commands/app/truncate.js.map +1 -0
- package/dist/esm/commands/app/try-format-message.js +39 -0
- package/dist/esm/commands/app/try-format-message.js.map +1 -0
- package/dist/esm/exit-with-resolution-error.js +16 -0
- package/dist/esm/exit-with-resolution-error.js.map +1 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resolve-eval-command-input.js +37 -0
- package/dist/esm/resolve-eval-command-input.js.map +1 -0
- package/dist/esm/resolve-eval-files.js +49 -0
- package/dist/esm/resolve-eval-files.js.map +1 -0
- package/dist/esm/utils/ab-error-message.js +34 -0
- package/dist/esm/utils/ab-error-message.js.map +1 -0
- package/dist/esm/utils/{agent-browser.js → ab.js} +3 -32
- package/dist/esm/utils/ab.js.map +1 -0
- package/dist/esm/utils/create-run-dir.js +24 -0
- package/dist/esm/utils/create-run-dir.js.map +1 -0
- package/dist/esm/utils/{process.js → helpers.js} +28 -11
- package/dist/esm/utils/helpers.js.map +1 -0
- package/dist/esm/utils/index.js +8 -5
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/{browser-poll.js → poll-console.js} +5 -3
- package/dist/esm/utils/poll-console.js.map +1 -0
- package/dist/esm/utils/{daemon.js → reset-daemon.js} +5 -14
- package/dist/esm/utils/reset-daemon.js.map +1 -0
- package/dist/esm/utils/resolve-app-key.js +20 -0
- package/dist/esm/utils/resolve-app-key.js.map +1 -0
- package/dist/esm/utils/wait-for-server.js +26 -0
- package/dist/esm/utils/wait-for-server.js.map +1 -0
- package/dist/esm/version.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/commands/app/format-plan.d.ts +8 -0
- package/dist/types/commands/app/format-step-result.d.ts +8 -0
- package/dist/types/commands/app/format-verdict.d.ts +8 -0
- package/dist/types/commands/app/prompts/{step.prompt.d.ts → create-step-prompt.d.ts} +1 -1
- package/dist/types/commands/app/status-icon.d.ts +8 -0
- package/dist/types/commands/app/tools/create-append-file-tool.d.ts +10 -0
- package/dist/types/commands/app/tools/{write-file.d.ts → create-write-file-tool.d.ts} +0 -9
- package/dist/types/commands/app/truncate.d.ts +8 -0
- package/dist/types/commands/app/try-format-message.d.ts +10 -0
- package/dist/types/exit-with-resolution-error.d.ts +8 -0
- package/dist/types/{eval-resolve.d.ts → resolve-eval-command-input.d.ts} +0 -8
- package/dist/types/resolve-eval-files.d.ts +8 -0
- package/dist/types/utils/ab-error-message.d.ts +11 -0
- package/dist/types/utils/{agent-browser.d.ts → ab.d.ts} +0 -13
- package/dist/types/utils/create-run-dir.d.ts +8 -0
- package/dist/types/utils/{process.d.ts → helpers.d.ts} +13 -6
- package/dist/types/utils/index.d.ts +8 -5
- package/dist/types/utils/{daemon.d.ts → reset-daemon.d.ts} +0 -5
- package/dist/types/utils/resolve-app-key.d.ts +9 -0
- package/dist/types/utils/wait-for-server.d.ts +9 -0
- package/dist/types/version.d.ts +1 -1
- package/package.json +5 -5
- package/src/commands/app/{session-logger.ts → attach-session-logger.ts} +15 -1
- package/src/commands/app/{command.ts → copilot-command.ts} +21 -12
- package/src/commands/app/{eval.ts → create-session.ts} +6 -4
- package/src/commands/app/format-plan.ts +26 -0
- package/src/commands/app/format-step-result.ts +16 -0
- package/src/commands/app/format-verdict.ts +43 -0
- package/src/commands/app/prompts/{judge.prompt.ts → create-judge-prompt.ts} +4 -0
- package/src/commands/app/prompts/{step.prompt.ts → create-step-prompt.ts} +2 -1
- package/src/commands/app/{login.ts → run-login.ts} +4 -0
- package/src/commands/app/{server.ts → start-app-server.ts} +6 -0
- package/src/commands/app/status-icon.ts +16 -0
- package/src/commands/app/tools/{write-file.ts → create-append-file-tool.ts} +4 -39
- package/src/commands/app/tools/{find.ts → create-find-tool.ts} +3 -0
- package/src/commands/app/tools/{read-file.ts → create-read-file-tool.ts} +3 -1
- package/src/commands/app/tools/{screenshot.ts → create-screenshot-tool.ts} +6 -0
- package/src/commands/app/tools/{scroll.ts → create-scroll-tool.ts} +2 -0
- package/src/commands/app/tools/{wait.ts → create-wait-tool.ts} +4 -0
- package/src/commands/app/tools/create-write-file-tool.ts +69 -0
- package/src/commands/app/tools/index.ts +19 -19
- package/src/commands/app/truncate.ts +10 -0
- package/src/commands/app/try-format-message.ts +42 -0
- package/src/exit-with-resolution-error.ts +15 -0
- package/src/index.ts +1 -1
- package/src/resolve-eval-command-input.ts +59 -0
- package/src/resolve-eval-files.ts +57 -0
- package/src/utils/ab-error-message.ts +31 -0
- package/src/utils/{agent-browser.ts → ab.ts} +2 -30
- package/src/utils/create-run-dir.ts +24 -0
- package/src/utils/{process.ts → helpers.ts} +28 -10
- package/src/utils/index.ts +8 -5
- package/src/utils/{browser-poll.ts → poll-console.ts} +4 -2
- package/src/utils/{daemon.ts → reset-daemon.ts} +4 -13
- package/src/utils/resolve-app-key.ts +20 -0
- package/src/utils/wait-for-server.ts +24 -0
- package/src/version.ts +1 -1
- package/dist/esm/commands/app/command.js.map +0 -1
- package/dist/esm/commands/app/eval.js.map +0 -1
- package/dist/esm/commands/app/format.js +0 -93
- package/dist/esm/commands/app/format.js.map +0 -1
- package/dist/esm/commands/app/login.js.map +0 -1
- package/dist/esm/commands/app/prompts/execute-step.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/judge.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/plan.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/step.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/system.dev-server.prompt.js.map +0 -1
- package/dist/esm/commands/app/prompts/system.prompt.js.map +0 -1
- package/dist/esm/commands/app/server.js.map +0 -1
- package/dist/esm/commands/app/session-logger.js.map +0 -1
- package/dist/esm/commands/app/tools/click.js.map +0 -1
- package/dist/esm/commands/app/tools/errors.js.map +0 -1
- package/dist/esm/commands/app/tools/eval-js.js.map +0 -1
- package/dist/esm/commands/app/tools/fill.js.map +0 -1
- package/dist/esm/commands/app/tools/find.js.map +0 -1
- package/dist/esm/commands/app/tools/get-styles.js.map +0 -1
- package/dist/esm/commands/app/tools/get-url.js.map +0 -1
- package/dist/esm/commands/app/tools/go-back.js.map +0 -1
- package/dist/esm/commands/app/tools/hover.js.map +0 -1
- package/dist/esm/commands/app/tools/navigate.js.map +0 -1
- package/dist/esm/commands/app/tools/press-key.js.map +0 -1
- package/dist/esm/commands/app/tools/read-file.js.map +0 -1
- package/dist/esm/commands/app/tools/registry.js.map +0 -1
- package/dist/esm/commands/app/tools/reload.js.map +0 -1
- package/dist/esm/commands/app/tools/screenshot.js.map +0 -1
- package/dist/esm/commands/app/tools/scroll.js.map +0 -1
- package/dist/esm/commands/app/tools/select.js.map +0 -1
- package/dist/esm/commands/app/tools/snapshot.js.map +0 -1
- package/dist/esm/commands/app/tools/type-text.js.map +0 -1
- package/dist/esm/commands/app/tools/wait.js.map +0 -1
- package/dist/esm/commands/app/tools/write-file.js.map +0 -1
- package/dist/esm/eval-resolve.js +0 -83
- package/dist/esm/eval-resolve.js.map +0 -1
- package/dist/esm/utils/agent-browser.js.map +0 -1
- package/dist/esm/utils/browser-poll.js.map +0 -1
- package/dist/esm/utils/daemon.js.map +0 -1
- package/dist/esm/utils/process.js.map +0 -1
- package/dist/esm/utils/server.js +0 -65
- package/dist/esm/utils/server.js.map +0 -1
- package/dist/types/commands/app/format.d.ts +0 -14
- package/dist/types/utils/server.d.ts +0 -26
- package/src/commands/app/format.ts +0 -110
- package/src/eval-resolve.ts +0 -113
- package/src/utils/server.ts +0 -66
- /package/dist/types/commands/app/{session-logger.d.ts → attach-session-logger.d.ts} +0 -0
- /package/dist/types/commands/app/{command.d.ts → copilot-command.d.ts} +0 -0
- /package/dist/types/commands/app/{eval.d.ts → create-session.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{system.dev-server.prompt.d.ts → create-dev-server-context.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{execute-step.prompt.d.ts → create-execute-step-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{judge.prompt.d.ts → create-judge-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{plan.prompt.d.ts → create-plan-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/prompts/{system.prompt.d.ts → create-system-prompt.d.ts} +0 -0
- /package/dist/types/commands/app/{login.d.ts → run-login.d.ts} +0 -0
- /package/dist/types/commands/app/{server.d.ts → start-app-server.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{registry.d.ts → AgentBrowserToolRegistry.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{click.d.ts → create-click-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{errors.d.ts → create-errors-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{eval-js.d.ts → create-eval-js-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{fill.d.ts → create-fill-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{find.d.ts → create-find-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{get-styles.d.ts → create-get-styles-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{get-url.d.ts → create-get-url-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{go-back.d.ts → create-go-back-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{hover.d.ts → create-hover-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{navigate.d.ts → create-navigate-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{press-key.d.ts → create-press-key-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{read-file.d.ts → create-read-file-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{reload.d.ts → create-reload-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{screenshot.d.ts → create-screenshot-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{scroll.d.ts → create-scroll-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{select.d.ts → create-select-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{snapshot.d.ts → create-snapshot-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{type-text.d.ts → create-type-text-tool.d.ts} +0 -0
- /package/dist/types/commands/app/tools/{wait.d.ts → create-wait-tool.d.ts} +0 -0
- /package/dist/types/utils/{browser-poll.d.ts → poll-console.d.ts} +0 -0
- /package/src/commands/app/prompts/{system.dev-server.prompt.ts → create-dev-server-context.ts} +0 -0
- /package/src/commands/app/prompts/{execute-step.prompt.ts → create-execute-step-prompt.ts} +0 -0
- /package/src/commands/app/prompts/{plan.prompt.ts → create-plan-prompt.ts} +0 -0
- /package/src/commands/app/prompts/{system.prompt.ts → create-system-prompt.ts} +0 -0
- /package/src/commands/app/tools/{registry.ts → AgentBrowserToolRegistry.ts} +0 -0
- /package/src/commands/app/tools/{click.ts → create-click-tool.ts} +0 -0
- /package/src/commands/app/tools/{errors.ts → create-errors-tool.ts} +0 -0
- /package/src/commands/app/tools/{eval-js.ts → create-eval-js-tool.ts} +0 -0
- /package/src/commands/app/tools/{fill.ts → create-fill-tool.ts} +0 -0
- /package/src/commands/app/tools/{get-styles.ts → create-get-styles-tool.ts} +0 -0
- /package/src/commands/app/tools/{get-url.ts → create-get-url-tool.ts} +0 -0
- /package/src/commands/app/tools/{go-back.ts → create-go-back-tool.ts} +0 -0
- /package/src/commands/app/tools/{hover.ts → create-hover-tool.ts} +0 -0
- /package/src/commands/app/tools/{navigate.ts → create-navigate-tool.ts} +0 -0
- /package/src/commands/app/tools/{press-key.ts → create-press-key-tool.ts} +0 -0
- /package/src/commands/app/tools/{reload.ts → create-reload-tool.ts} +0 -0
- /package/src/commands/app/tools/{select.ts → create-select-tool.ts} +0 -0
- /package/src/commands/app/tools/{snapshot.ts → create-snapshot-tool.ts} +0 -0
- /package/src/commands/app/tools/{type-text.ts → create-type-text-tool.ts} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# @equinor/fusion-framework-cli-plugin-copilot
|
|
2
2
|
|
|
3
|
+
## 2.0.4
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 3dcaae6: Internal: bump `chalk` from `5.6.2` to `6.0.0`. No API changes affect this repo's usage; chalk 6 raises its own Node.js requirement to `>=22`, already satisfied by this repo's `>=24` engines requirement.
|
|
8
|
+
|
|
9
|
+
## 2.0.3
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 80c3e4a: Internal: Consolidate five single-export utility files under `src/utils/` into `helpers.ts` to reduce file fragmentation. No change to the public API.
|
|
14
|
+
- 80c3e4a: Internal: added a missing intent comment for array-spread logic; no public API changes.
|
|
15
|
+
- 80c3e4a: Internal: add clarifying intent comments and split `eval-resolve.ts`, `utils/agent-browser.ts`, `utils/process.ts`, `utils/server.ts`, `utils/daemon.ts`, and `commands/app/format.ts` into single-export modules re-exported from the existing barrels; no public API or behavior changes.
|
|
16
|
+
- 80c3e4a: Internal: add clarifying intent comments throughout `commands/app/**` and split `tools/write-file.ts`'s `createAppendFileTool` into its own `tools/append-file.ts` module; no public API or behavior changes.
|
|
17
|
+
- 80c3e4a: Internal: renamed 53 source files across `ai-base`, `ai-chat`, `ai-index`, and `copilot` to comply with the `filename-convention` lint rule (e.g. `config.ts` → `load-fusion-ai-config.ts`, `tools/write-file.ts` → `tools/create-write-file-tool.ts`, `prompts/plan.prompt.ts` → `prompts/create-plan-prompt.ts`). No public API changes.
|
|
18
|
+
|
|
3
19
|
## 2.0.2
|
|
4
20
|
|
|
5
21
|
### Patch Changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import ora from 'ora';
|
|
3
|
-
import { tryFormatMessage } from './format.js';
|
|
3
|
+
import { tryFormatMessage } from './try-format-message.js';
|
|
4
4
|
const TOOL_ICONS = {
|
|
5
5
|
browser_screenshot: '📷',
|
|
6
6
|
browser_navigate: '🌐',
|
|
@@ -22,7 +22,9 @@ export function attachSessionLogger(session, options) {
|
|
|
22
22
|
const pendingTools = new Map();
|
|
23
23
|
let spinner = null;
|
|
24
24
|
function syncSpinner() {
|
|
25
|
+
// No pending tools means the spinner has nothing left to show
|
|
25
26
|
if (pendingTools.size === 0) {
|
|
27
|
+
// Stop the spinner only if one was actually running
|
|
26
28
|
if (spinner) {
|
|
27
29
|
spinner.stop();
|
|
28
30
|
spinner = null;
|
|
@@ -30,6 +32,7 @@ export function attachSessionLogger(session, options) {
|
|
|
30
32
|
return;
|
|
31
33
|
}
|
|
32
34
|
const text = [...pendingTools.values()].join(chalk.dim(' | '));
|
|
35
|
+
// Reuse the existing spinner instance rather than starting a second one
|
|
33
36
|
if (spinner) {
|
|
34
37
|
spinner.text = text;
|
|
35
38
|
}
|
|
@@ -38,6 +41,7 @@ export function attachSessionLogger(session, options) {
|
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
function pauseSpinner() {
|
|
44
|
+
// Only stop the spinner if one is actually running
|
|
41
45
|
if (spinner) {
|
|
42
46
|
spinner.stop();
|
|
43
47
|
spinner = null;
|
|
@@ -50,6 +54,7 @@ export function attachSessionLogger(session, options) {
|
|
|
50
54
|
syncSpinner();
|
|
51
55
|
}
|
|
52
56
|
session.on((event) => {
|
|
57
|
+
// Dispatch on the Copilot SDK session event type to render the right log line
|
|
53
58
|
switch (event.type) {
|
|
54
59
|
case 'tool.execution_start': {
|
|
55
60
|
const { toolCallId, toolName, arguments: args } = event.data;
|
|
@@ -62,6 +67,7 @@ export function attachSessionLogger(session, options) {
|
|
|
62
67
|
}
|
|
63
68
|
case 'tool.execution_complete': {
|
|
64
69
|
const label = pendingTools.get(event.data.toolCallId);
|
|
70
|
+
// Only log completion for tools we actually tracked the start of
|
|
65
71
|
if (label) {
|
|
66
72
|
pendingTools.delete(event.data.toolCallId);
|
|
67
73
|
logCompletion(label, event.data.success);
|
|
@@ -70,6 +76,7 @@ export function attachSessionLogger(session, options) {
|
|
|
70
76
|
}
|
|
71
77
|
case 'external_tool.completed': {
|
|
72
78
|
const label = pendingTools.get(event.data.requestId);
|
|
79
|
+
// Only log completion for tools we actually tracked the start of
|
|
73
80
|
if (label) {
|
|
74
81
|
pendingTools.delete(event.data.requestId);
|
|
75
82
|
logCompletion(label, true);
|
|
@@ -83,9 +90,11 @@ export function attachSessionLogger(session, options) {
|
|
|
83
90
|
break;
|
|
84
91
|
}
|
|
85
92
|
case 'assistant.message': {
|
|
93
|
+
// Skip empty assistant messages (e.g. tool-only turns)
|
|
86
94
|
if (event.data.content) {
|
|
87
95
|
pauseSpinner();
|
|
88
96
|
const formatted = tryFormatMessage(event.data.content);
|
|
97
|
+
// Prefer the structured plan/verdict/step-result rendering when recognised
|
|
89
98
|
if (formatted) {
|
|
90
99
|
console.log(formatted);
|
|
91
100
|
}
|
|
@@ -107,6 +116,7 @@ export function attachSessionLogger(session, options) {
|
|
|
107
116
|
}
|
|
108
117
|
case 'permission.completed': {
|
|
109
118
|
const label = pendingTools.get(event.data.requestId);
|
|
119
|
+
// Only log completion for permissions we actually tracked the request of
|
|
110
120
|
if (label) {
|
|
111
121
|
const approved = event.data.result?.kind === 'approved';
|
|
112
122
|
pendingTools.delete(event.data.requestId);
|
|
@@ -116,8 +126,10 @@ export function attachSessionLogger(session, options) {
|
|
|
116
126
|
}
|
|
117
127
|
case 'session.tools_updated': {
|
|
118
128
|
const negotiatedModel = event.data.model;
|
|
129
|
+
// Only log tooling info once the server has actually negotiated a model
|
|
119
130
|
if (negotiatedModel) {
|
|
120
131
|
console.log(chalk.dim(`💾 ${negotiatedModel}`));
|
|
132
|
+
// Warn the user when the server picked a different model than requested
|
|
121
133
|
if (options?.requestedModel && negotiatedModel !== options.requestedModel) {
|
|
122
134
|
console.log(chalk.yellow(`⚠️ Requested model "${options.requestedModel}" but server negotiated "${negotiatedModel}"`));
|
|
123
135
|
}
|
|
@@ -141,6 +153,7 @@ export function attachSessionLogger(session, options) {
|
|
|
141
153
|
}
|
|
142
154
|
case 'session.info': {
|
|
143
155
|
const { message } = event.data;
|
|
156
|
+
// Skip empty info events
|
|
144
157
|
if (message) {
|
|
145
158
|
pauseSpinner();
|
|
146
159
|
console.log(chalk.dim(`ℹ️ ${message}`));
|
|
@@ -150,6 +163,7 @@ export function attachSessionLogger(session, options) {
|
|
|
150
163
|
}
|
|
151
164
|
case 'assistant.intent': {
|
|
152
165
|
const { intent } = event.data;
|
|
166
|
+
// Skip empty intent events
|
|
153
167
|
if (intent) {
|
|
154
168
|
pauseSpinner();
|
|
155
169
|
console.log(chalk.yellow(`🎯 ${intent}`));
|
|
@@ -166,4 +180,4 @@ export function attachSessionLogger(session, options) {
|
|
|
166
180
|
stop: () => pauseSpinner(),
|
|
167
181
|
};
|
|
168
182
|
}
|
|
169
|
-
//# sourceMappingURL=session-logger.js.map
|
|
183
|
+
//# sourceMappingURL=attach-session-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach-session-logger.js","sourceRoot":"","sources":["../../../../src/commands/app/attach-session-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { createCommand } from 'commander';
|
|
2
2
|
import { basename } from 'node:path';
|
|
3
3
|
import { resetDaemon, cleanup, createRunDir } from '../../utils/index.js';
|
|
4
|
-
import { runLogin } from './login.js';
|
|
5
|
-
import { resolveEvalCommandInput
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
4
|
+
import { runLogin } from './run-login.js';
|
|
5
|
+
import { resolveEvalCommandInput } from '../../resolve-eval-command-input.js';
|
|
6
|
+
import { resolveEvalFiles } from '../../resolve-eval-files.js';
|
|
7
|
+
import { createSession } from './create-session.js';
|
|
8
|
+
import { startAppServer } from './start-app-server.js';
|
|
9
|
+
import { attachSessionLogger } from './attach-session-logger.js';
|
|
10
|
+
import { formatVerdict } from './format-verdict.js';
|
|
10
11
|
import { existsSync, readFileSync } from 'node:fs';
|
|
11
|
-
import { createPlanPrompt } from './prompts/plan
|
|
12
|
-
import { createStepPrompt } from './prompts/step
|
|
13
|
-
import { createJudgePrompt } from './prompts/judge
|
|
12
|
+
import { createPlanPrompt } from './prompts/create-plan-prompt.js';
|
|
13
|
+
import { createStepPrompt } from './prompts/create-step-prompt.js';
|
|
14
|
+
import { createJudgePrompt } from './prompts/create-judge-prompt.js';
|
|
14
15
|
import chalk from 'chalk';
|
|
15
16
|
/**
|
|
16
17
|
* CLI command: `copilot app eval <path-or-eval>`
|
|
@@ -51,6 +52,7 @@ const _appEvalCommand = createCommand('eval')
|
|
|
51
52
|
const absAppPath = resolvedInput.appPath;
|
|
52
53
|
const port = parseInt(options.port, 10);
|
|
53
54
|
const verbose = options.verbose;
|
|
55
|
+
// Reject ambiguous input that selects an eval two different ways
|
|
54
56
|
if (resolvedInput.evalFile && options.eval) {
|
|
55
57
|
console.error('❌ Do not combine a positional eval markdown file with --eval');
|
|
56
58
|
process.exit(1);
|
|
@@ -64,7 +66,9 @@ const _appEvalCommand = createCommand('eval')
|
|
|
64
66
|
const evalFiles = resolvedInput.evalFile
|
|
65
67
|
? [resolvedInput.evalFile]
|
|
66
68
|
: resolveEvalFiles(absAppPath, options.eval);
|
|
67
|
-
|
|
69
|
+
// Summarize which eval files were discovered before the run starts
|
|
70
|
+
const evalFileNames = evalFiles.map((f) => basename(f)).join(', ');
|
|
71
|
+
console.log(`📋 Found ${evalFiles.length} eval(s): ${evalFileNames}`);
|
|
68
72
|
// Start the app dev server (unless --url provides an already-running URL)
|
|
69
73
|
const { serverProcess, appUrl } = await startAppServer(absAppPath, {
|
|
70
74
|
port,
|
|
@@ -87,6 +91,7 @@ const _appEvalCommand = createCommand('eval')
|
|
|
87
91
|
});
|
|
88
92
|
let failures = 0;
|
|
89
93
|
try {
|
|
94
|
+
// Run every resolved eval file sequentially so output stays readable
|
|
90
95
|
for (const evalFilePath of evalFiles) {
|
|
91
96
|
const evalName = basename(evalFilePath, '.md');
|
|
92
97
|
const query = readFileSync(evalFilePath, 'utf-8').trim();
|
|
@@ -107,11 +112,13 @@ const _appEvalCommand = createCommand('eval')
|
|
|
107
112
|
// ── Phase 1: Plan ──────────────────────────────────────────
|
|
108
113
|
await session.sendAndWait({ prompt: createPlanPrompt(query, ctx) }, 300_000);
|
|
109
114
|
const planPath = `${runDir}/plan.json`;
|
|
115
|
+
// Bail out of this eval when the planning phase produced no plan file
|
|
110
116
|
if (!existsSync(planPath)) {
|
|
111
117
|
console.error(chalk.red(`❌ Agent did not produce ${planPath}. The planning phase may have failed silently.`));
|
|
112
118
|
session.disconnect();
|
|
113
119
|
logger.stop();
|
|
114
120
|
failures++;
|
|
121
|
+
// Skip execution/judging phases; this eval already failed at planning
|
|
115
122
|
continue;
|
|
116
123
|
}
|
|
117
124
|
const plan = JSON.parse(readFileSync(planPath, 'utf-8'));
|
|
@@ -119,6 +126,7 @@ const _appEvalCommand = createCommand('eval')
|
|
|
119
126
|
// ── Phase 2: Execute + Evaluate each step ──────────────────
|
|
120
127
|
for (const step of plan.steps) {
|
|
121
128
|
console.log(chalk.cyan(`\n── Scenario: ${step.scenario}`));
|
|
129
|
+
// Print each acceptance criterion the agent will be judged against
|
|
122
130
|
for (const c of step.criteria) {
|
|
123
131
|
console.log(chalk.dim(` • ${c}`));
|
|
124
132
|
}
|
|
@@ -131,9 +139,11 @@ const _appEvalCommand = createCommand('eval')
|
|
|
131
139
|
logger.stop();
|
|
132
140
|
// Print the verdict
|
|
133
141
|
const verdictPath = `${runDir}/verdict.json`;
|
|
142
|
+
// Only report a verdict when the judge phase actually produced one
|
|
134
143
|
if (existsSync(verdictPath)) {
|
|
135
144
|
const verdict = JSON.parse(readFileSync(verdictPath, 'utf-8'));
|
|
136
145
|
console.log(formatVerdict(verdict));
|
|
146
|
+
// A failing verdict counts toward the overall exit-code failure total
|
|
137
147
|
if (!verdict.pass)
|
|
138
148
|
failures++;
|
|
139
149
|
}
|
|
@@ -146,6 +156,7 @@ const _appEvalCommand = createCommand('eval')
|
|
|
146
156
|
logger?.stop();
|
|
147
157
|
const msg = err instanceof Error ? err.message : String(err);
|
|
148
158
|
console.error(chalk.red(`\n❌ Eval "${evalName}" failed: ${msg}`));
|
|
159
|
+
// Print the stack trace too when one is available for debugging
|
|
149
160
|
if (err instanceof Error && err.stack) {
|
|
150
161
|
console.error(chalk.dim(err.stack));
|
|
151
162
|
}
|
|
@@ -173,4 +184,4 @@ const _appCommand = createCommand('app')
|
|
|
173
184
|
export const copilotCommand = createCommand('copilot')
|
|
174
185
|
.description('GitHub Copilot SDK powered commands')
|
|
175
186
|
.addCommand(_appCommand);
|
|
176
|
-
//# sourceMappingURL=command.js.map
|
|
187
|
+
//# sourceMappingURL=copilot-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot-command.js","sourceRoot":"","sources":["../../../../src/commands/app/copilot-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,11 @@ import { mkdirSync } from 'node:fs';
|
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { ab, abErrorMessage } from '../../utils/index.js';
|
|
4
4
|
import { createAgentBrowserTools } from './tools/index.js';
|
|
5
|
-
import { createWriteFileTool
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
5
|
+
import { createWriteFileTool } from './tools/create-write-file-tool.js';
|
|
6
|
+
import { createAppendFileTool } from './tools/create-append-file-tool.js';
|
|
7
|
+
import { createReadFileTool } from './tools/create-read-file-tool.js';
|
|
8
|
+
import { createSystemPrompt } from './prompts/create-system-prompt.js';
|
|
9
|
+
import { createDevServerContext } from './prompts/create-dev-server-context.js';
|
|
9
10
|
/**
|
|
10
11
|
* Lazily imports the Copilot SDK to avoid module resolution errors at CLI startup.
|
|
11
12
|
*
|
|
@@ -27,6 +28,7 @@ export const createSession = async (options) => {
|
|
|
27
28
|
createWriteFileTool(ctx.outDir, defineTool),
|
|
28
29
|
createAppendFileTool(ctx.outDir, defineTool),
|
|
29
30
|
];
|
|
31
|
+
// Combine built-in browser and file tools with any caller-supplied tools
|
|
30
32
|
const tools = [
|
|
31
33
|
...createBrowserTools(defineTool, {
|
|
32
34
|
cwd: ctx.outDir,
|
|
@@ -89,4 +91,4 @@ function createBrowserTools(defineTool, options) {
|
|
|
89
91
|
};
|
|
90
92
|
return createAgentBrowserTools({ outDir, invoke }, defineTool);
|
|
91
93
|
}
|
|
92
|
-
//# sourceMappingURL=
|
|
94
|
+
//# sourceMappingURL=create-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../../src/commands/app/create-session.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { truncate } from './truncate.js';
|
|
3
|
+
/**
|
|
4
|
+
* Renders a structured plan as a human-readable summary.
|
|
5
|
+
*
|
|
6
|
+
* @param plan - The plan to render, containing a summary and ordered steps.
|
|
7
|
+
* @returns A multi-line string suitable for console output.
|
|
8
|
+
*/
|
|
9
|
+
export function formatPlan(plan) {
|
|
10
|
+
const lines = [
|
|
11
|
+
'',
|
|
12
|
+
chalk.bold(`📋 ${plan.summary}`),
|
|
13
|
+
'',
|
|
14
|
+
...plan.steps.flatMap((s, si) => [
|
|
15
|
+
` ${chalk.dim(`${si + 1}.`)} ${s.scenario}`,
|
|
16
|
+
...s.criteria
|
|
17
|
+
// Truncate each criterion so long descriptions don't wrap the terminal
|
|
18
|
+
.map((c) => chalk.dim(` • ${truncate(c, 70)}`)),
|
|
19
|
+
]),
|
|
20
|
+
'',
|
|
21
|
+
];
|
|
22
|
+
return lines.join('\n');
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=format-plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-plan.js","sourceRoot":"","sources":["../../../../src/commands/app/format-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,EAAE;QACF,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC;YAC/B,KAAK,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAC5C,GAAG,CAAC,CAAC,QAAQ;gBACX,uEAAuE;iBACtE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;SACtD,CAAC;QACF,EAAE;KACH,CAAC;IACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { statusIcon } from './status-icon.js';
|
|
3
|
+
/**
|
|
4
|
+
* Renders a single step execution result.
|
|
5
|
+
*
|
|
6
|
+
* @param result - The step result to render, including its outcome, note, and evidence.
|
|
7
|
+
* @returns A formatted two-line string describing the step outcome.
|
|
8
|
+
*/
|
|
9
|
+
export function formatStepResult(result) {
|
|
10
|
+
const icon = statusIcon(result.ok);
|
|
11
|
+
const files = result.evidence.length ? chalk.dim(` [${result.evidence.join(', ')}]`) : '';
|
|
12
|
+
return ` ${icon} ${result.criterion}\n${chalk.dim(` ${result.note}`)}${files}`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=format-step-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-step-result.js","sourceRoot":"","sources":["../../../../src/commands/app/format-step-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,OAAO,KAAK,IAAI,KAAK,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;AACvF,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { statusIcon } from './status-icon.js';
|
|
3
|
+
/**
|
|
4
|
+
* Renders the final verdict as a full-width coloured report.
|
|
5
|
+
*
|
|
6
|
+
* @param verdict - The verdict to render, including per-step results, reasoning, and UX feedback.
|
|
7
|
+
* @returns A multi-line string suitable for console output.
|
|
8
|
+
*/
|
|
9
|
+
export function formatVerdict(verdict) {
|
|
10
|
+
const bar = '═'.repeat(60);
|
|
11
|
+
const banner = verdict.pass
|
|
12
|
+
? chalk.bgGreen.black.bold(' ✅ PASS ')
|
|
13
|
+
: chalk.bgRed.white.bold(' ❌ FAIL ');
|
|
14
|
+
const lines = [
|
|
15
|
+
'',
|
|
16
|
+
bar,
|
|
17
|
+
` ${banner}`,
|
|
18
|
+
bar,
|
|
19
|
+
'',
|
|
20
|
+
...verdict.steps
|
|
21
|
+
// Render each step's outcome as a status glyph, criterion, and note
|
|
22
|
+
.map((s) => ` ${statusIcon(s.ok)} ${s.criterion}\n${chalk.dim(` ${s.note}`)}`),
|
|
23
|
+
'',
|
|
24
|
+
chalk.dim(` ${verdict.reasoning}`),
|
|
25
|
+
'',
|
|
26
|
+
];
|
|
27
|
+
// Append optional UX feedback only when the judge actually provided any
|
|
28
|
+
if (verdict.ux && verdict.ux.length > 0) {
|
|
29
|
+
lines.push(chalk.bold(' 💡 UX Feedback'), '');
|
|
30
|
+
// List every UX hint as its own bullet line
|
|
31
|
+
for (const hint of verdict.ux) {
|
|
32
|
+
lines.push(chalk.yellow(` • ${hint}`));
|
|
33
|
+
}
|
|
34
|
+
lines.push('');
|
|
35
|
+
}
|
|
36
|
+
return lines.join('\n');
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=format-verdict.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-verdict.js","sourceRoot":"","sources":["../../../../src/commands/app/format-verdict.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI;QACzB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvC,MAAM,KAAK,GAAG;QACZ,EAAE;QACF,GAAG;QACH,KAAK,MAAM,EAAE;QACb,GAAG;QACH,EAAE;QACF,GAAG,OAAO,CAAC,KAAK;YACd,oEAAoE;aACnE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACtF,EAAE;QACF,KAAK,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC;QACnC,EAAE;KACH,CAAC;IAEF,wEAAwE;IACxE,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,4CAA4C;QAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-dev-server-context.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-dev-server-context.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,GAA4B,EAAU,EAAE;IAC7E,OAAO;;;;;;kCAMyB,GAAG,CAAC,GAAG;GACtC,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
|
package/dist/esm/commands/app/prompts/{execute-step.prompt.js → create-execute-step-prompt.js}
RENAMED
|
@@ -41,4 +41,4 @@ When done, your work will be evaluated against the step's passEvidence and failE
|
|
|
41
41
|
Do NOT output markdown or explanations — only use browser tool calls and collect evidence.
|
|
42
42
|
`.trim();
|
|
43
43
|
};
|
|
44
|
-
//# sourceMappingURL=execute-step
|
|
44
|
+
//# sourceMappingURL=create-execute-step-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-execute-step-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-execute-step-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACrC,OAAiB,EACjB,GAA4B,EACpB,EAAE;IACV,OAAO;;;WAGE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;mBAExB,GAAG,CAAC,GAAG;sBACJ,GAAG,CAAC,MAAM;;;;;;;;;;;;;;;;;;;;;;;GAuB7B,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -15,6 +15,7 @@ function collectEvidence(outDir) {
|
|
|
15
15
|
const parts = [];
|
|
16
16
|
// ── executions.jsonl ──
|
|
17
17
|
const execPath = join(outDir, 'executions.jsonl');
|
|
18
|
+
// Fall back to a placeholder note when the executions log is missing
|
|
18
19
|
if (existsSync(execPath)) {
|
|
19
20
|
parts.push('### executions.jsonl', readFileSync(execPath, 'utf-8').trim());
|
|
20
21
|
}
|
|
@@ -23,10 +24,13 @@ function collectEvidence(outDir) {
|
|
|
23
24
|
}
|
|
24
25
|
// ── evidence/ directory ──
|
|
25
26
|
const evidenceDir = join(outDir, 'evidence');
|
|
27
|
+
// Only scan for evidence files when the directory actually exists
|
|
26
28
|
if (existsSync(evidenceDir)) {
|
|
27
29
|
const files = readdirSync(evidenceDir).sort();
|
|
30
|
+
// Inline readable text evidence; list binary evidence by name only
|
|
28
31
|
for (const file of files) {
|
|
29
32
|
const ext = extname(file).toLowerCase();
|
|
33
|
+
// Inline the content of readable text extensions; list other files by name only
|
|
30
34
|
if (TEXT_EXTENSIONS.has(ext)) {
|
|
31
35
|
const content = readFileSync(join(evidenceDir, file), 'utf-8').trim();
|
|
32
36
|
parts.push(`### evidence/${file}`, content);
|
|
@@ -113,4 +117,4 @@ Only include genuine observations from the evidence. Skip "ux" if nothing stands
|
|
|
113
117
|
If evidence for a criterion is missing or ambiguous, fail it.
|
|
114
118
|
`.trim();
|
|
115
119
|
};
|
|
116
|
-
//# sourceMappingURL=judge
|
|
120
|
+
//# sourceMappingURL=create-judge-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-judge-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-judge-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAG1C,iEAAiE;AACjE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtF;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,MAAc;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,yBAAyB;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAClD,qEAAqE;IACrE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,kBAAkB,CAAC,CAAC;IACzD,CAAC;IAED,4BAA4B;IAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7C,kEAAkE;IAClE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,mEAAmE;QACnE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,gFAAgF;YAChF,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;gBACtE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,kBAAkB,GAAG,cAAc,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAA4B,EAAU,EAAE;IACxE,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE7C,OAAO;;;;;;EAMP,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDP,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-plan-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-plan-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAE,GAA4B,EAAU,EAAE;IACtF,OAAO;;;EAGP,KAAK;;mBAEY,GAAG,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BvB,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
* @param ctx - Runtime context with output directory and app URL
|
|
9
9
|
* @returns The fully interpolated prompt string
|
|
10
10
|
*/
|
|
11
|
-
export const createStepPrompt = (step,
|
|
11
|
+
export const createStepPrompt = (step, _ctx) => {
|
|
12
12
|
const slug = slugify(step.scenario);
|
|
13
|
+
// Render each criterion with its expected pass/fail evidence for the prompt
|
|
13
14
|
const criteriaBlock = step.criteria
|
|
14
15
|
.map((c, i) => `${i + 1}. ${c}\n Pass: ${step.pass[i] ?? ''}\n Fail: ${step.fail[i] ?? ''}`)
|
|
15
16
|
.join('\n');
|
|
@@ -39,4 +40,4 @@ function slugify(text) {
|
|
|
39
40
|
.replace(/^-|-$/g, '')
|
|
40
41
|
.slice(0, 60);
|
|
41
42
|
}
|
|
42
|
-
//# sourceMappingURL=step
|
|
43
|
+
//# sourceMappingURL=create-step-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-step-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-step-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAc,EAAE,IAA6B,EAAU,EAAE;IACxF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,4EAA4E;IAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;SAC/F,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;YACG,IAAI,CAAC,QAAQ;;;EAGvB,aAAa;;;2CAG4B,IAAI;;;kGAGmD,IAAI;GACnG,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC;AAEF;;;;;GAKG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-system-prompt.js","sourceRoot":"","sources":["../../../../../src/commands/app/prompts/create-system-prompt.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAA4B,EAAU,EAAE;IACzE,OAAO;;;;0BAIiB,GAAG,CAAC,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2D9B,CAAC,IAAI,EAAE,CAAC;AACX,CAAC,CAAC"}
|
|
@@ -17,11 +17,13 @@ import { ab, resolveAppKey, cleanup, resetDaemon, sleep, stripAnsi, waitForServe
|
|
|
17
17
|
*/
|
|
18
18
|
export async function runLogin(absAppPath, port, host) {
|
|
19
19
|
const pkgJsonPath = join(absAppPath, 'package.json');
|
|
20
|
+
// Login needs a valid Fusion app directory; bail out clearly if this isn't one
|
|
20
21
|
if (!existsSync(pkgJsonPath)) {
|
|
21
22
|
console.error(`❌ No package.json found at ${absAppPath}`);
|
|
22
23
|
process.exit(1);
|
|
23
24
|
}
|
|
24
25
|
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
26
|
+
// The app name is required to resolve the appKey later
|
|
25
27
|
if (!pkgJson.name) {
|
|
26
28
|
console.error(`❌ package.json at ${absAppPath} has no "name" field`);
|
|
27
29
|
process.exit(1);
|
|
@@ -37,6 +39,7 @@ export async function runLogin(absAppPath, port, host) {
|
|
|
37
39
|
});
|
|
38
40
|
const serverUrl = `http://localhost:${port}`;
|
|
39
41
|
const ready = await waitForServer(serverUrl, 60);
|
|
42
|
+
// Abort login when the dev server never comes up within the timeout
|
|
40
43
|
if (!ready) {
|
|
41
44
|
console.error('❌ Server failed to start within 60s');
|
|
42
45
|
cleanup(serverProcess);
|
|
@@ -57,6 +60,7 @@ export async function runLogin(absAppPath, port, host) {
|
|
|
57
60
|
// Wait for the Fusion app to initialise (browser console emits "✓ Done" after auth)
|
|
58
61
|
console.log('⏳ Waiting for app to initialize after login... (Ctrl+C to finish early)');
|
|
59
62
|
const initialized = await pollConsole((logs) => stripAnsi(logs).includes('Done'), 300_000);
|
|
63
|
+
// Report success or a soft timeout without failing the login flow
|
|
60
64
|
if (initialized) {
|
|
61
65
|
await sleep(2000);
|
|
62
66
|
console.log('✅ Login complete — session saved.');
|
|
@@ -68,4 +72,4 @@ export async function runLogin(absAppPath, port, host) {
|
|
|
68
72
|
console.log('🌐 Browser still open. Press Ctrl+C to exit.');
|
|
69
73
|
await new Promise(() => { }); // block until SIGINT
|
|
70
74
|
}
|
|
71
|
-
//# sourceMappingURL=login.js.map
|
|
75
|
+
//# sourceMappingURL=run-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-login.js","sourceRoot":"","sources":["../../../../src/commands/app/run-login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,EAAE,EACF,aAAa,EACb,OAAO,EACP,WAAW,EACX,KAAK,EACL,SAAS,EACT,aAAa,EACb,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,UAAkB,EAAE,IAAY,EAAE,IAAY;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACrD,+EAA+E;IAC/E,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,8BAA8B,UAAU,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAsB,CAAC;IACpF,uDAAuD;IACvD,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,qBAAqB,UAAU,sBAAsB,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,aAAuC,CAAC;IAE5C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,0BAA0B,MAAM,KAAK,CAAC,CAAC;IACnD,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;QACnF,GAAG,EAAE,UAAU;QACf,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,oBAAoB,IAAI,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACjD,oEAAoE;IACpE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACrD,OAAO,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,SAAS,SAAS,MAAM,EAAE,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAE/E,+EAA+E;IAC/E,WAAW,EAAE,CAAC;IACd,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAEzC,iEAAiE;IACjE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,aAAa,CAAC,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,oFAAoF;IACpF,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;IACvF,MAAM,WAAW,GAAG,MAAM,WAAW,CACnC,CAAC,IAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAClD,OAAO,CACR,CAAC;IAEF,kEAAkE;IAClE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC/E,CAAC;IAED,0EAA0E;IAC1E,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,qBAAqB;AACpD,CAAC"}
|
|
@@ -12,10 +12,12 @@ import { resolveAppKey, cleanup, waitForServer } from '../../utils/index.js';
|
|
|
12
12
|
*/
|
|
13
13
|
function freePort(port) {
|
|
14
14
|
try {
|
|
15
|
+
// Drop the empty string lsof emits when no matching process was found
|
|
15
16
|
const pids = execSync(`lsof -ti tcp:${port}`, { encoding: 'utf-8' })
|
|
16
17
|
.trim()
|
|
17
18
|
.split('\n')
|
|
18
19
|
.filter(Boolean);
|
|
20
|
+
// Terminate each stale process bound to the port
|
|
19
21
|
for (const pid of pids) {
|
|
20
22
|
try {
|
|
21
23
|
process.kill(parseInt(pid, 10), 'SIGTERM');
|
|
@@ -24,6 +26,7 @@ function freePort(port) {
|
|
|
24
26
|
// already dead
|
|
25
27
|
}
|
|
26
28
|
}
|
|
29
|
+
// Only log when we actually killed something
|
|
27
30
|
if (pids.length) {
|
|
28
31
|
console.log(`🔄 Killed stale process(es) on port ${port}: ${pids.join(', ')}`);
|
|
29
32
|
}
|
|
@@ -50,11 +53,13 @@ export async function startAppServer(absAppPath, options) {
|
|
|
50
53
|
return { serverProcess: undefined, appUrl: options.url };
|
|
51
54
|
}
|
|
52
55
|
const pkgJsonPath = join(absAppPath, 'package.json');
|
|
56
|
+
// Startup needs a valid Fusion app directory; bail out clearly if this isn't one
|
|
53
57
|
if (!existsSync(pkgJsonPath)) {
|
|
54
58
|
console.error(`❌ No package.json found at ${absAppPath}`);
|
|
55
59
|
process.exit(1);
|
|
56
60
|
}
|
|
57
61
|
const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));
|
|
62
|
+
// The app name is required to resolve the appKey later
|
|
58
63
|
if (!pkgJson.name) {
|
|
59
64
|
console.error(`❌ package.json at ${absAppPath} has no "name" field`);
|
|
60
65
|
process.exit(1);
|
|
@@ -71,6 +76,7 @@ export async function startAppServer(absAppPath, options) {
|
|
|
71
76
|
});
|
|
72
77
|
const serverUrl = `http://localhost:${options.port}`;
|
|
73
78
|
const ready = await waitForServer(serverUrl, 60);
|
|
79
|
+
// Abort startup when the dev server never comes up within the timeout
|
|
74
80
|
if (!ready) {
|
|
75
81
|
console.error('❌ Server failed to start within 60s');
|
|
76
82
|
cleanup(serverProcess);
|
|
@@ -80,4 +86,4 @@ export async function startAppServer(absAppPath, options) {
|
|
|
80
86
|
console.log(`✅ Server ready at ${appUrl}`);
|
|
81
87
|
return { serverProcess, appUrl };
|
|
82
88
|
}
|
|
83
|
-
//# sourceMappingURL=server.js.map
|
|
89
|
+
//# sourceMappingURL=start-app-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-app-server.js","sourceRoot":"","sources":["../../../../src/commands/app/start-app-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* Renders a status glyph for a step or verdict outcome.
|
|
4
|
+
*
|
|
5
|
+
* @param ok - Outcome value: `true` (pass), `false` (fail), or a string label
|
|
6
|
+
* such as `'blocked'` or `'flaky'` for anything in between.
|
|
7
|
+
* @returns A single coloured glyph representing the outcome.
|
|
8
|
+
*/
|
|
9
|
+
export function statusIcon(ok) {
|
|
10
|
+
// A literal boolean outcome maps directly to pass/fail glyphs
|
|
11
|
+
if (ok === true)
|
|
12
|
+
return chalk.green('✔');
|
|
13
|
+
// An explicit failure gets its own glyph, distinct from unknown/other states
|
|
14
|
+
if (ok === false)
|
|
15
|
+
return chalk.red('✖');
|
|
16
|
+
return chalk.yellow('⚠'); // "blocked", "flaky", etc.
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=status-icon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status-icon.js","sourceRoot":"","sources":["../../../../src/commands/app/status-icon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,EAAoB;IAC7C,8DAA8D;IAC9D,IAAI,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzC,6EAA6E;IAC7E,IAAI,EAAE,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,2BAA2B;AACvD,CAAC"}
|