@shepai/cli 1.103.1-pr297.1d67d7d → 1.103.1-pr309.f0bca17
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/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts +27 -0
- package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/upgrade/upgrade-cli.use-case.js +128 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/src/presentation/cli/ui/symbols.d.ts +1 -1
- package/dist/src/presentation/web/app/api/cli-upgrade/route.d.ts +3 -0
- package/dist/src/presentation/web/app/api/cli-upgrade/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/cli-upgrade/route.js +31 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.d.ts +5 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.js +113 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.d.ts +18 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/event-log-viewer.stories.js +88 -0
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +10 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts +5 -3
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.js +92 -9
- package/dist/src/presentation/web/components/common/version-badge/version-badge.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/version-badge/version-badge.js +6 -2
- package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts +2 -2
- package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.js +20 -3
- package/dist/src/presentation/web/hooks/use-cli-upgrade.d.ts +11 -0
- package/dist/src/presentation/web/hooks/use-cli-upgrade.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-cli-upgrade.js +73 -0
- package/dist/src/presentation/web/lib/parse-log-line.d.ts +49 -0
- package/dist/src/presentation/web/lib/parse-log-line.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/parse-log-line.js +126 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +25 -25
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/cli-upgrade/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/cli-upgrade/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/cli-upgrade/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/cli-upgrade/route.js +6 -0
- package/web/.next/server/app/api/cli-upgrade/route.js.map +5 -0
- package/web/.next/server/app/api/cli-upgrade/route.js.nft.json +1 -0
- package/web/.next/server/app/api/cli-upgrade/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_cli-upgrade_route_actions_dc509b52.js +3 -0
- package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_cli-upgrade_route_actions_dc509b52.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__d2c18946._.js +11 -0
- package/web/.next/server/chunks/[root-of-the-server]__d2c18946._.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b1e68e34._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__d91fdd51._.js.map → [root-of-the-server]__b1e68e34._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_80fc856a._.js → _299324d0._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_80fc856a._.js.map → _299324d0._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_7129cff0._.js → _601a084c._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_7129cff0._.js.map → _601a084c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_2381749d._.js → _c205e198._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2381749d._.js.map → _c205e198._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_7275ce5d._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_7275ce5d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_758dfa10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_758dfa10._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +30 -30
- package/web/.next/static/chunks/{deb64031250a421f.js → 09fe794bed5a0077.js} +1 -1
- package/web/.next/static/chunks/{e1199a4481977a1d.js → 20f5682099fbb10c.js} +1 -1
- package/web/.next/static/chunks/{074f5910ba53b9a9.js → 2a63561f9716d615.js} +1 -1
- package/web/.next/static/chunks/3bb35e0689e8b6b7.js +1 -0
- package/web/.next/static/chunks/3bba99704fc1d30c.js +1 -0
- package/web/.next/static/chunks/3fa3006034a0add8.css +1 -0
- package/web/.next/static/chunks/{f2d47cc7f90ea785.js → 47387a05a4f0f22b.js} +1 -1
- package/web/.next/static/chunks/{03dca61cab65a6d6.js → 4873b5f96cfdffb9.js} +1 -1
- package/web/.next/static/chunks/{dbf1dbf895bb3b2b.js → 8c4731c87b599597.js} +1 -1
- package/web/.next/static/chunks/{77a6011b9ecff04e.js → 994e46e475fb78f9.js} +2 -2
- package/web/.next/static/chunks/a8eceddc883b57bb.js +1 -0
- package/web/.next/static/chunks/b1f3c0e8e9872ef8.js +1 -0
- package/web/.next/static/chunks/{3df97cf6d9bb267d.js → e7abc4f19da20094.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d91fdd51._.js +0 -3
- package/web/.next/static/chunks/07b853e29af1e5f2.js +0 -1
- package/web/.next/static/chunks/2a6f05312c4f37ce.js +0 -1
- package/web/.next/static/chunks/93058c22968e2fef.css +0 -1
- package/web/.next/static/chunks/c38c8ef1091abf1b.js +0 -1
- package/web/.next/static/chunks/d6d49d0239bf3f10.js +0 -1
- /package/web/.next/static/{8bFxxZyznRJ9YrunDv0xj → vSr396p_Rdr92qmX9fzqd}/_buildManifest.js +0 -0
- /package/web/.next/static/{8bFxxZyznRJ9YrunDv0xj → vSr396p_Rdr92qmX9fzqd}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{8bFxxZyznRJ9YrunDv0xj → vSr396p_Rdr92qmX9fzqd}/_ssgManifest.js +0 -0
|
@@ -8,14 +8,61 @@ const meta = {
|
|
|
8
8
|
layout: 'fullscreen',
|
|
9
9
|
},
|
|
10
10
|
decorators: [
|
|
11
|
-
(Story) => (_jsx("div", { style: { height: '600px', width: '
|
|
11
|
+
(Story) => (_jsx("div", { style: { height: '600px', width: '480px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
|
|
12
12
|
],
|
|
13
13
|
};
|
|
14
14
|
export default meta;
|
|
15
15
|
/* ---------------------------------------------------------------------------
|
|
16
16
|
* Data fixtures
|
|
17
17
|
* ------------------------------------------------------------------------- */
|
|
18
|
-
const
|
|
18
|
+
const structuredLogContent = `[2026-03-08T10:00:01.000Z] [claude-code|claude-sonnet-4-6] [WORKER] Starting worker — full command:
|
|
19
|
+
[2026-03-08T10:00:01.001Z] [claude-code|claude-sonnet-4-6] [WORKER] feature-agent-worker --feature-id auth-module --run-id run-123 --repo /home/user/myproject --agent-type claude-code --model claude-sonnet-4-6
|
|
20
|
+
[2026-03-08T10:00:01.010Z] [claude-code|claude-sonnet-4-6] [WORKER] Initializing container...
|
|
21
|
+
[2026-03-08T10:00:01.050Z] [claude-code|claude-sonnet-4-6] [WORKER] Creating executor from pinned agent type: claude-code
|
|
22
|
+
[2026-03-08T10:00:01.100Z] [claude-code|claude-sonnet-4-6] [WORKER] Updating status to running (PID 54321)...
|
|
23
|
+
[2026-03-08T10:00:01.110Z] [claude-code|claude-sonnet-4-6] [WORKER] Starting graph invocation...
|
|
24
|
+
[2026-03-08T10:00:05.000Z] [requirements] [claude-code|claude-sonnet-4-6] Starting...
|
|
25
|
+
[2026-03-08T10:00:05.010Z] [requirements] [claude-code|claude-sonnet-4-6] Executing agent at cwd=/home/user/myproject
|
|
26
|
+
[2026-03-08T10:00:05.020Z] [requirements] [claude-code|claude-sonnet-4-6] Prompt length: 2847 chars
|
|
27
|
+
[2026-03-08T10:00:05.100Z] [requirements] [claude-code|claude-sonnet-4-6] Spawning: claude -p "Analyze this project..." --output-format stream-json --verbose
|
|
28
|
+
[2026-03-08T10:00:05.102Z] [requirements] [claude-code|claude-sonnet-4-6] Subprocess PID: 54322
|
|
29
|
+
[2026-03-08T10:00:08.234Z] [requirements] [claude-code|claude-sonnet-4-6] [tool] Read {"file_path": "src/main.ts"}
|
|
30
|
+
[2026-03-08T10:00:10.345Z] [requirements] [claude-code|claude-sonnet-4-6] [text] Analyzing the codebase structure and identifying key entry points for the authentication module
|
|
31
|
+
[2026-03-08T10:00:12.567Z] [requirements] [claude-code|claude-sonnet-4-6] [tool] Glob {"pattern": "src/**/*.ts"}
|
|
32
|
+
[2026-03-08T10:00:14.789Z] [requirements] [claude-code|claude-sonnet-4-6] [tool] Read {"file_path": "src/auth/providers.ts"}
|
|
33
|
+
[2026-03-08T10:00:16.012Z] [requirements] [claude-code|claude-sonnet-4-6] [tool] Grep {"pattern": "interface.*Auth", "path": "src/"}
|
|
34
|
+
[2026-03-08T10:00:18.234Z] [requirements] [claude-code|claude-sonnet-4-6] [text] The project uses a clean architecture pattern with dependency injection. I can see the auth interfaces are defined in the domain layer
|
|
35
|
+
[2026-03-08T10:00:20.456Z] [requirements] [claude-code|claude-sonnet-4-6] [tool] Bash {"command": "find src -name '*.test.ts' | wc -l"}
|
|
36
|
+
[2026-03-08T10:00:45.789Z] [requirements] [claude-code|claude-sonnet-4-6] [result] 8920 chars, session=sess-abc123def456
|
|
37
|
+
[2026-03-08T10:00:45.790Z] [requirements] [claude-code|claude-sonnet-4-6] [tokens] 2450 in / 4560 out
|
|
38
|
+
[2026-03-08T10:00:45.791Z] [requirements] [claude-code|claude-sonnet-4-6] Process closed with code 0, result=8920 chars
|
|
39
|
+
[2026-03-08T10:00:45.800Z] [requirements] [claude-code|claude-sonnet-4-6] Complete (8920 chars, 40.8s)
|
|
40
|
+
[2026-03-08T10:00:45.900Z] [requirements] [claude-code|claude-sonnet-4-6] Interrupting for human approval
|
|
41
|
+
[2026-03-08T10:02:30.000Z] [requirements] [claude-code|claude-sonnet-4-6] Phase approved, skipping re-execution
|
|
42
|
+
[2026-03-08T10:02:30.100Z] [plan] [claude-code|claude-sonnet-4-6] Starting...
|
|
43
|
+
[2026-03-08T10:02:30.110Z] [plan] [claude-code|claude-sonnet-4-6] Executing agent at cwd=/home/user/myproject
|
|
44
|
+
[2026-03-08T10:02:30.120Z] [plan] [claude-code|claude-sonnet-4-6] Prompt length: 15234 chars
|
|
45
|
+
[2026-03-08T10:02:35.100Z] [plan] [claude-code|claude-sonnet-4-6] [tool] Read {"file_path": "CLAUDE.md"}
|
|
46
|
+
[2026-03-08T10:02:38.200Z] [plan] [claude-code|claude-sonnet-4-6] [text] Creating implementation plan with TDD approach as required by project conventions
|
|
47
|
+
[2026-03-08T10:02:42.300Z] [plan] [claude-code|claude-sonnet-4-6] [tool] Write {"file_path": "specs/001-auth/plan.yaml"}
|
|
48
|
+
[2026-03-08T10:02:45.400Z] [plan] [claude-code|claude-sonnet-4-6] [text] Plan includes 3 phases: scaffold auth module, implement OAuth2 providers, add tests and documentation
|
|
49
|
+
[2026-03-08T10:03:15.234Z] [plan] [claude-code|claude-sonnet-4-6] [result] 12345 chars, session=sess-abc123def456
|
|
50
|
+
[2026-03-08T10:03:15.235Z] [plan] [claude-code|claude-sonnet-4-6] [tokens] 8900 in / 3456 out
|
|
51
|
+
[2026-03-08T10:03:15.300Z] [plan] [claude-code|claude-sonnet-4-6] Complete (12345 chars, 45.1s)
|
|
52
|
+
[2026-03-08T10:05:00.000Z] [implement] [claude-code|claude-sonnet-4-6] Starting...
|
|
53
|
+
[2026-03-08T10:05:01.000Z] [implement] [claude-code|claude-sonnet-4-6] [tool] Write {"file_path": "src/auth/oauth-provider.ts"}
|
|
54
|
+
[2026-03-08T10:05:03.000Z] [implement] [claude-code|claude-sonnet-4-6] [tool] Write {"file_path": "src/auth/token-manager.ts"}
|
|
55
|
+
[2026-03-08T10:05:05.000Z] [implement] [claude-code|claude-sonnet-4-6] [tool] Edit {"file_path": "src/auth/index.ts"}
|
|
56
|
+
[2026-03-08T10:05:07.000Z] [implement] [claude-code|claude-sonnet-4-6] [tool] Bash {"command": "pnpm test:unit"}
|
|
57
|
+
[2026-03-08T10:05:30.000Z] [implement] [claude-code|claude-sonnet-4-6] [text] All 14 unit tests passing. Moving to integration tests
|
|
58
|
+
[2026-03-08T10:05:35.000Z] [implement] [claude-code|claude-sonnet-4-6] [tool] Bash {"command": "pnpm test:int"}
|
|
59
|
+
[2026-03-08T10:05:55.000Z] [implement] [claude-code|claude-sonnet-4-6] [result] 24560 chars, session=sess-abc123def456
|
|
60
|
+
[2026-03-08T10:05:55.001Z] [implement] [claude-code|claude-sonnet-4-6] [tokens] 15200 in / 9360 out
|
|
61
|
+
[2026-03-08T10:05:55.100Z] [implement] [claude-code|claude-sonnet-4-6] Complete (24560 chars, 54.1s)
|
|
62
|
+
[2026-03-08T10:06:00.000Z] [claude-code|claude-sonnet-4-6] [WORKER] Graph invocation completed. Error: none
|
|
63
|
+
[2026-03-08T10:06:00.100Z] [claude-code|claude-sonnet-4-6] [WORKER] Run marked as completed
|
|
64
|
+
[2026-03-08T10:06:00.200Z] [claude-code|claude-sonnet-4-6] [WORKER] Worker completed successfully, exiting.`;
|
|
65
|
+
const rawLogContent = `[2026-03-08T10:00:01.123Z] Starting agent run for feature "auth-module"
|
|
19
66
|
[2026-03-08T10:00:02.789Z] Agent started — analyzing codebase
|
|
20
67
|
[2026-03-08T10:00:03.456Z] Scanning repository structure...
|
|
21
68
|
[2026-03-08T10:00:04.012Z] Found 127 source files across 14 packages
|
|
@@ -35,22 +82,58 @@ const typicalLogContent = `[2026-03-08T10:00:01.123Z] Starting agent run for fea
|
|
|
35
82
|
[2026-03-08T10:00:24.789Z] Phase 3: add tests and documentation
|
|
36
83
|
[2026-03-08T10:00:26.456Z] Generating test suite...
|
|
37
84
|
[2026-03-08T10:00:28.012Z] All phases complete — feature "auth-module" ready for review`;
|
|
38
|
-
const
|
|
85
|
+
const longStructuredContent = Array.from({ length: 100 }, (_, i) => {
|
|
86
|
+
const min = String(Math.floor(i / 60)).padStart(2, '0');
|
|
87
|
+
const sec = String(i % 60).padStart(2, '0');
|
|
88
|
+
const ms = String((i * 7) % 1000).padStart(3, '0');
|
|
89
|
+
const ts = `2026-03-08T10:${min}:${sec}.${ms}Z`;
|
|
90
|
+
const phase = ['requirements', 'research', 'plan', 'implement'][i % 4];
|
|
91
|
+
const tags = ['[tool]', '[text]', '[tool]', '[text]', '[result]', '[tokens]'];
|
|
92
|
+
const tag = tags[i % tags.length];
|
|
93
|
+
const messages = {
|
|
94
|
+
'[tool]': [
|
|
95
|
+
'Read {"file_path": "src/components/button.tsx"}',
|
|
96
|
+
'Bash {"command": "pnpm test:unit"}',
|
|
97
|
+
'Grep {"pattern": "export function", "path": "src/"}',
|
|
98
|
+
'Write {"file_path": "src/new-file.ts"}',
|
|
99
|
+
'Glob {"pattern": "**/*.test.ts"}',
|
|
100
|
+
],
|
|
101
|
+
'[text]': [
|
|
102
|
+
'Analyzing the component structure for potential improvements',
|
|
103
|
+
'The test suite is comprehensive with good coverage',
|
|
104
|
+
'Implementing the authentication flow with OAuth2 providers',
|
|
105
|
+
'Refactoring to use dependency injection pattern',
|
|
106
|
+
],
|
|
107
|
+
'[result]': ['4520 chars, session=sess-xyz789'],
|
|
108
|
+
'[tokens]': ['3200 in / 1800 out'],
|
|
109
|
+
};
|
|
110
|
+
const msgList = messages[tag] ?? messages['[text]'];
|
|
111
|
+
const msg = msgList[i % msgList.length];
|
|
112
|
+
return `[${ts}] [${phase}] [claude-code|claude-sonnet-4-6] ${tag} ${msg}`;
|
|
113
|
+
}).join('\n');
|
|
39
114
|
/* ---------------------------------------------------------------------------
|
|
40
115
|
* Stories
|
|
41
116
|
* ------------------------------------------------------------------------- */
|
|
42
|
-
/** Default —
|
|
117
|
+
/** Default — structured agent log output with live connection (claude-code). */
|
|
43
118
|
export const Default = {
|
|
44
119
|
args: {
|
|
45
|
-
content:
|
|
120
|
+
content: structuredLogContent,
|
|
46
121
|
isConnected: true,
|
|
47
122
|
error: null,
|
|
48
123
|
},
|
|
49
124
|
};
|
|
50
|
-
/**
|
|
51
|
-
export const
|
|
125
|
+
/** LongStructured — 100 structured events to test scrolling behavior. */
|
|
126
|
+
export const LongStructured = {
|
|
52
127
|
args: {
|
|
53
|
-
content:
|
|
128
|
+
content: longStructuredContent,
|
|
129
|
+
isConnected: true,
|
|
130
|
+
error: null,
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
/** RawFallback — unstructured log content falls back gracefully. */
|
|
134
|
+
export const RawFallback = {
|
|
135
|
+
args: {
|
|
136
|
+
content: rawLogContent,
|
|
54
137
|
isConnected: true,
|
|
55
138
|
error: null,
|
|
56
139
|
},
|
|
@@ -58,7 +141,7 @@ export const LongLog = {
|
|
|
58
141
|
/** Disconnected — log content present but connection is lost. */
|
|
59
142
|
export const Disconnected = {
|
|
60
143
|
args: {
|
|
61
|
-
content:
|
|
144
|
+
content: structuredLogContent,
|
|
62
145
|
isConnected: false,
|
|
63
146
|
error: null,
|
|
64
147
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-badge.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"version-badge.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EACN,UAAU,EACV,KAAa,EACb,WAA2B,EAC3B,WAAW,EACX,YAAY,GACb,EAAE,iBAAiB,2CA2EnB"}
|
|
@@ -2,13 +2,17 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
|
|
4
4
|
import { useNpmVersionCheck } from '../../../hooks/use-npm-version-check.js';
|
|
5
|
+
import { useCliUpgrade } from '../../../hooks/use-cli-upgrade.js';
|
|
5
6
|
export function VersionBadge({ version, branch, commitHash, isDev = false, packageName = '@shepai/cli', description, instancePath, }) {
|
|
6
7
|
const shortHash = commitHash?.slice(0, 7);
|
|
7
8
|
const { latest, updateAvailable } = useNpmVersionCheck(version);
|
|
9
|
+
const { status: upgradeStatus, startUpgrade } = useCliUpgrade();
|
|
8
10
|
// In dev mode show "1.92.2-dev", in production show "v1.92.2"
|
|
9
11
|
const displayVersion = isDev ? `${version}-dev` : `v${version}`;
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
+
const isUpgrading = upgradeStatus === 'upgrading';
|
|
13
|
+
const didUpgrade = upgradeStatus === 'upgraded';
|
|
14
|
+
const upgradeError = upgradeStatus === 'error';
|
|
15
|
+
return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { className: "text-muted-foreground/80 hover:text-muted-foreground relative cursor-default text-[11px] leading-tight transition-colors", "data-testid": "version-label", children: [displayVersion, updateAvailable && !didUpgrade ? (_jsx("span", { className: "absolute -top-0.5 -right-1.5 size-1.5 rounded-full bg-emerald-400", "data-testid": "update-dot" })) : null] }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-[280px] space-y-1 p-3 text-left", children: [_jsx("div", { className: "mb-1.5 text-xs font-semibold", children: packageName }), description ? (_jsx("div", { className: "text-[10px] leading-snug opacity-70", children: description })) : null, _jsxs("div", { className: "border-t border-white/10 pt-1.5", children: [_jsx(Row, { label: "Version", value: displayVersion }), isDev && branch ? _jsx(Row, { label: "Branch", value: branch }) : null, isDev && shortHash ? _jsx(Row, { label: "Commit", value: shortHash, mono: true }) : null, isDev && instancePath ? _jsx(Row, { label: "Path", value: instancePath, mono: true }) : null, latest ? (_jsx(Row, { label: "Latest", value: `v${latest}`, highlight: updateAvailable })) : null] }), didUpgrade ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("span", { className: "text-[10px] font-medium text-emerald-400", "data-testid": "upgrade-success", children: "Upgraded successfully \u2014 restart to apply" }) })) : upgradeError ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("span", { className: "text-[10px] font-medium text-red-400", "data-testid": "upgrade-error", children: "Upgrade failed" }) })) : updateAvailable ? (_jsx("div", { className: "border-t border-white/10 pt-1.5", children: _jsx("button", { type: "button", onClick: startUpgrade, disabled: isUpgrading, className: "inline-flex items-center gap-1 text-[10px] font-medium text-emerald-400 transition-colors hover:text-emerald-300 disabled:opacity-50", "data-testid": "upgrade-button", children: isUpgrading ? 'Upgrading...' : `Upgrade to v${latest}` }) })) : null] })] }) }));
|
|
12
16
|
}
|
|
13
17
|
function Row({ label, value, highlight, mono, }) {
|
|
14
18
|
return (_jsxs("div", { className: "flex items-center justify-between gap-4 text-[10px]", children: [_jsx("span", { className: "opacity-60", children: label }), _jsx("span", { className: [
|
package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts
CHANGED
|
@@ -11,9 +11,9 @@ export declare const Development: Story;
|
|
|
11
11
|
export declare const LongBranch: Story;
|
|
12
12
|
/** Minimal info — no optional fields. */
|
|
13
13
|
export declare const Minimal: Story;
|
|
14
|
-
/** Update available — green dot appears, tooltip shows "Upgrade to v2.0.0"
|
|
14
|
+
/** Update available — green dot appears, tooltip shows "Upgrade to v2.0.0" button. */
|
|
15
15
|
export declare const UpdateAvailable: Story;
|
|
16
|
-
/** Update available in dev mode — green dot + upgrade
|
|
16
|
+
/** Update available in dev mode — green dot + upgrade button alongside dev info. */
|
|
17
17
|
export declare const UpdateAvailableDev: Story;
|
|
18
18
|
/** Fetch error — no update info shown, badge behaves normally. */
|
|
19
19
|
export declare const FetchError: Story;
|
package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"version-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAa,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAwD/C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAOnC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AAE3C,mFAAmF;AACnF,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC;AAEF,wFAAwF;AACxF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,UAAU,EAAE,KAWxB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,eAAe,EAAE,KAO7B,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,KAWhC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,UAAU,EAAE,KAOxB,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { VersionBadge } from './version-badge.js';
|
|
3
3
|
/**
|
|
4
|
-
* Decorator that mocks the /api/npm-version endpoint to return a specific latest version
|
|
4
|
+
* Decorator that mocks the /api/npm-version endpoint to return a specific latest version
|
|
5
|
+
* and the /api/cli-upgrade endpoint to simulate an upgrade.
|
|
5
6
|
*/
|
|
6
7
|
function withNpmVersion(latest) {
|
|
7
8
|
return (Story) => {
|
|
@@ -14,6 +15,22 @@ function withNpmVersion(latest) {
|
|
|
14
15
|
headers: { 'Content-Type': 'application/json' },
|
|
15
16
|
});
|
|
16
17
|
}
|
|
18
|
+
if (url.includes('/api/cli-upgrade')) {
|
|
19
|
+
const encoder = new TextEncoder();
|
|
20
|
+
const stream = new ReadableStream({
|
|
21
|
+
start(controller) {
|
|
22
|
+
controller.enqueue(encoder.encode(`data: Upgrading to v${latest}...\n\n`));
|
|
23
|
+
setTimeout(() => {
|
|
24
|
+
controller.enqueue(encoder.encode(`event: done\ndata: ${JSON.stringify({ status: 'upgraded', currentVersion: '1.90.0', latestVersion: latest })}\n\n`));
|
|
25
|
+
controller.close();
|
|
26
|
+
}, 1000);
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
return new Response(stream, {
|
|
30
|
+
status: 200,
|
|
31
|
+
headers: { 'Content-Type': 'text/event-stream' },
|
|
32
|
+
});
|
|
33
|
+
}
|
|
17
34
|
return originalFetch(input, init);
|
|
18
35
|
});
|
|
19
36
|
return _jsx(Story, {});
|
|
@@ -82,7 +99,7 @@ export const Minimal = {
|
|
|
82
99
|
version: '1.0.0',
|
|
83
100
|
},
|
|
84
101
|
};
|
|
85
|
-
/** Update available — green dot appears, tooltip shows "Upgrade to v2.0.0"
|
|
102
|
+
/** Update available — green dot appears, tooltip shows "Upgrade to v2.0.0" button. */
|
|
86
103
|
export const UpdateAvailable = {
|
|
87
104
|
decorators: [withNpmVersion('2.0.0')],
|
|
88
105
|
args: {
|
|
@@ -91,7 +108,7 @@ export const UpdateAvailable = {
|
|
|
91
108
|
description: 'Autonomous AI Native SDLC Platform',
|
|
92
109
|
},
|
|
93
110
|
};
|
|
94
|
-
/** Update available in dev mode — green dot + upgrade
|
|
111
|
+
/** Update available in dev mode — green dot + upgrade button alongside dev info. */
|
|
95
112
|
export const UpdateAvailableDev = {
|
|
96
113
|
decorators: [withNpmVersion('2.0.0')],
|
|
97
114
|
args: {
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type UpgradeStatus = 'idle' | 'upgrading' | 'upgraded' | 'up-to-date' | 'error';
|
|
2
|
+
export interface CliUpgradeState {
|
|
3
|
+
status: UpgradeStatus;
|
|
4
|
+
output: string;
|
|
5
|
+
errorMessage?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CliUpgradeActions {
|
|
8
|
+
startUpgrade: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function useCliUpgrade(): CliUpgradeState & CliUpgradeActions;
|
|
11
|
+
//# sourceMappingURL=use-cli-upgrade.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-cli-upgrade.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/use-cli-upgrade.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;AAEvF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,wBAAgB,aAAa,IAAI,eAAe,GAAG,iBAAiB,CA6EnE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useCallback, useRef, useState } from 'react';
|
|
3
|
+
export function useCliUpgrade() {
|
|
4
|
+
const [status, setStatus] = useState('idle');
|
|
5
|
+
const [output, setOutput] = useState('');
|
|
6
|
+
const [errorMessage, setErrorMessage] = useState();
|
|
7
|
+
const abortRef = useRef(null);
|
|
8
|
+
const startUpgrade = useCallback(() => {
|
|
9
|
+
if (status === 'upgrading')
|
|
10
|
+
return;
|
|
11
|
+
setStatus('upgrading');
|
|
12
|
+
setOutput('');
|
|
13
|
+
setErrorMessage(undefined);
|
|
14
|
+
const controller = new AbortController();
|
|
15
|
+
abortRef.current = controller;
|
|
16
|
+
fetch('/api/cli-upgrade', { method: 'POST', signal: controller.signal })
|
|
17
|
+
.then(async (response) => {
|
|
18
|
+
if (!response.ok || !response.body) {
|
|
19
|
+
setStatus('error');
|
|
20
|
+
setErrorMessage(`Server returned ${response.status}`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const reader = response.body.getReader();
|
|
24
|
+
const decoder = new TextDecoder();
|
|
25
|
+
let buffer = '';
|
|
26
|
+
while (true) {
|
|
27
|
+
const { done, value } = await reader.read();
|
|
28
|
+
if (done)
|
|
29
|
+
break;
|
|
30
|
+
buffer += decoder.decode(value, { stream: true });
|
|
31
|
+
const lines = buffer.split('\n');
|
|
32
|
+
buffer = lines.pop() ?? '';
|
|
33
|
+
for (const line of lines) {
|
|
34
|
+
if (line.startsWith('event: done')) {
|
|
35
|
+
// Next data line contains the final result
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (line.startsWith('data: ')) {
|
|
39
|
+
const payload = line.slice(6);
|
|
40
|
+
// Try to parse as final JSON result
|
|
41
|
+
try {
|
|
42
|
+
const result = JSON.parse(payload);
|
|
43
|
+
if (result.status === 'upgraded') {
|
|
44
|
+
setStatus('upgraded');
|
|
45
|
+
}
|
|
46
|
+
else if (result.status === 'up-to-date') {
|
|
47
|
+
setStatus('up-to-date');
|
|
48
|
+
}
|
|
49
|
+
else if (result.status === 'error') {
|
|
50
|
+
setStatus('error');
|
|
51
|
+
setErrorMessage(result.errorMessage);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Regular output line
|
|
56
|
+
setOutput((prev) => prev + payload);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
.catch((err) => {
|
|
63
|
+
if (err instanceof DOMException && err.name === 'AbortError')
|
|
64
|
+
return;
|
|
65
|
+
setStatus('error');
|
|
66
|
+
setErrorMessage(err instanceof Error ? err.message : 'Upgrade failed');
|
|
67
|
+
});
|
|
68
|
+
return () => {
|
|
69
|
+
controller.abort();
|
|
70
|
+
};
|
|
71
|
+
}, [status]);
|
|
72
|
+
return { status, output, errorMessage, startUpgrade };
|
|
73
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses structured log lines from the feature agent worker process.
|
|
3
|
+
*
|
|
4
|
+
* Log format: [timestamp] [phase] [agent|model] [tag] message
|
|
5
|
+
* Worker format: [timestamp] [agent|model] [WORKER] message
|
|
6
|
+
* Fallback: raw string lines
|
|
7
|
+
*/
|
|
8
|
+
export type LogEventTag = 'tool' | 'text' | 'result' | 'tokens' | 'raw' | 'worker' | 'info';
|
|
9
|
+
export interface ParsedLogLine {
|
|
10
|
+
/** ISO timestamp */
|
|
11
|
+
timestamp: string | null;
|
|
12
|
+
/** Phase name (e.g. "requirements", "implement") */
|
|
13
|
+
phase: string | null;
|
|
14
|
+
/** Agent type (e.g. "claude-code") */
|
|
15
|
+
agent: string | null;
|
|
16
|
+
/** Model name (e.g. "claude-haiku-4-5") */
|
|
17
|
+
model: string | null;
|
|
18
|
+
/** Event tag */
|
|
19
|
+
tag: LogEventTag;
|
|
20
|
+
/** The message content after tags */
|
|
21
|
+
message: string;
|
|
22
|
+
/** Original raw line */
|
|
23
|
+
raw: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function parseLogLine(raw: string): ParsedLogLine;
|
|
26
|
+
/** Tool call info extracted from [tool] messages */
|
|
27
|
+
export interface ToolCallInfo {
|
|
28
|
+
toolName: string;
|
|
29
|
+
args: string;
|
|
30
|
+
}
|
|
31
|
+
/** Parse a [tool] message into tool name and args */
|
|
32
|
+
export declare function parseToolCall(message: string): ToolCallInfo;
|
|
33
|
+
/** Result info extracted from [result] messages */
|
|
34
|
+
export interface ResultInfo {
|
|
35
|
+
chars: number;
|
|
36
|
+
sessionId: string | null;
|
|
37
|
+
}
|
|
38
|
+
/** Parse a [result] message */
|
|
39
|
+
export declare function parseResultMessage(message: string): ResultInfo;
|
|
40
|
+
/** Token info extracted from [tokens] messages */
|
|
41
|
+
export interface TokenInfo {
|
|
42
|
+
inputTokens: number;
|
|
43
|
+
outputTokens: number;
|
|
44
|
+
}
|
|
45
|
+
/** Parse a [tokens] message */
|
|
46
|
+
export declare function parseTokensMessage(message: string): TokenInfo;
|
|
47
|
+
/** Parse all lines from raw content string */
|
|
48
|
+
export declare function parseLogContent(content: string): ParsedLogLine[];
|
|
49
|
+
//# sourceMappingURL=parse-log-line.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-log-line.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/parse-log-line.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5F,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oDAAoD;IACpD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,sCAAsC;IACtC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB;IAChB,GAAG,EAAE,WAAW,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,GAAG,EAAE,MAAM,CAAC;CACb;AAgBD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAwEvD;AAED,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qDAAqD;AACrD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAS3D;AAED,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,+BAA+B;AAC/B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAO9D;AAED,kDAAkD;AAClD,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,+BAA+B;AAC/B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAO7D;AAED,8CAA8C;AAC9C,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,EAAE,CAMhE"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parses structured log lines from the feature agent worker process.
|
|
3
|
+
*
|
|
4
|
+
* Log format: [timestamp] [phase] [agent|model] [tag] message
|
|
5
|
+
* Worker format: [timestamp] [agent|model] [WORKER] message
|
|
6
|
+
* Fallback: raw string lines
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Regex to match structured log lines.
|
|
10
|
+
* Captures: timestamp, optional phase, optional agent|model, rest of message
|
|
11
|
+
*
|
|
12
|
+
* Examples:
|
|
13
|
+
* [2026-03-08T10:00:01.123Z] [requirements] [claude-code|claude-haiku-4-5] [tool] Read {"path":"f.ts"}
|
|
14
|
+
* [2026-03-08T10:00:01.123Z] [claude-code|claude-haiku-4-5] [WORKER] Starting worker
|
|
15
|
+
* [2026-03-08T10:00:01.123Z] [requirements] [claude-code|claude-haiku-4-5] Starting...
|
|
16
|
+
*/
|
|
17
|
+
const LOG_LINE_REGEX = /^\[(\d{4}-\d{2}-\d{2}T[\d:.]+Z?)\]\s+(?:\[([^\]]+)\]\s+)?(?:\[([^\]|]+)(?:\|([^\]]+))?\]\s+)?(.*)$/;
|
|
18
|
+
const TAG_REGEX = /^\[(tool|text|result|tokens|raw|WORKER)\]\s*(.*)/;
|
|
19
|
+
export function parseLogLine(raw) {
|
|
20
|
+
const match = raw.match(LOG_LINE_REGEX);
|
|
21
|
+
if (!match) {
|
|
22
|
+
return {
|
|
23
|
+
timestamp: null,
|
|
24
|
+
phase: null,
|
|
25
|
+
agent: null,
|
|
26
|
+
model: null,
|
|
27
|
+
tag: 'raw',
|
|
28
|
+
message: raw,
|
|
29
|
+
raw,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const [, timestamp, group1, group2, group3, rest] = match;
|
|
33
|
+
// Determine phase, agent, model from the captured groups.
|
|
34
|
+
// The log format can be:
|
|
35
|
+
// [ts] [phase] [agent|model] message → group1=phase, group2=agent, group3=model
|
|
36
|
+
// [ts] [agent|model] [WORKER] message → group1="agent|model", group2=WORKER
|
|
37
|
+
// [ts] [phase] [agent] message → group1=phase, group2=agent
|
|
38
|
+
// [ts] [phase] message → group1=phase only
|
|
39
|
+
let phase = null;
|
|
40
|
+
let agent = null;
|
|
41
|
+
let model = null;
|
|
42
|
+
let message = rest ?? '';
|
|
43
|
+
if (group2 != null && group1 != null) {
|
|
44
|
+
// Two bracket groups captured
|
|
45
|
+
if (group1.includes('|')) {
|
|
46
|
+
// group1 is [agent|model], group2 is next tag (e.g. WORKER)
|
|
47
|
+
const [agentPart, modelPart] = group1.split('|');
|
|
48
|
+
agent = agentPart;
|
|
49
|
+
model = modelPart ?? null;
|
|
50
|
+
// group2 becomes part of the message to be parsed as a tag
|
|
51
|
+
message = `[${group2}] ${rest ?? ''}`;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// group1 is [phase], group2|group3 is [agent|model]
|
|
55
|
+
phase = group1;
|
|
56
|
+
agent = group2;
|
|
57
|
+
model = group3 ?? null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else if (group1 != null) {
|
|
61
|
+
// Only one bracket group
|
|
62
|
+
if (group1.includes('|')) {
|
|
63
|
+
const [agentPart, modelPart] = group1.split('|');
|
|
64
|
+
agent = agentPart;
|
|
65
|
+
model = modelPart ?? null;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
phase = group1;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Parse tag from message
|
|
72
|
+
const tagMatch = message.match(TAG_REGEX);
|
|
73
|
+
let tag = 'info';
|
|
74
|
+
if (tagMatch) {
|
|
75
|
+
tag = tagMatch[1].toLowerCase();
|
|
76
|
+
message = tagMatch[2];
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
timestamp: timestamp ?? null,
|
|
80
|
+
phase,
|
|
81
|
+
agent,
|
|
82
|
+
model,
|
|
83
|
+
tag,
|
|
84
|
+
message: message.trim(),
|
|
85
|
+
raw,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Parse a [tool] message into tool name and args */
|
|
89
|
+
export function parseToolCall(message) {
|
|
90
|
+
const spaceIdx = message.indexOf(' ');
|
|
91
|
+
if (spaceIdx === -1) {
|
|
92
|
+
return { toolName: message, args: '' };
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
toolName: message.slice(0, spaceIdx),
|
|
96
|
+
args: message.slice(spaceIdx + 1),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/** Parse a [result] message */
|
|
100
|
+
export function parseResultMessage(message) {
|
|
101
|
+
const charsMatch = message.match(/^(\d+)\s+chars/);
|
|
102
|
+
const sessionMatch = message.match(/session=(\S+)/);
|
|
103
|
+
return {
|
|
104
|
+
chars: charsMatch ? parseInt(charsMatch[1], 10) : 0,
|
|
105
|
+
sessionId: sessionMatch ? sessionMatch[1] : null,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
/** Parse a [tokens] message */
|
|
109
|
+
export function parseTokensMessage(message) {
|
|
110
|
+
const match = message.match(/^(\d+)\s+in\s*\/\s*(\d+)\s+out/);
|
|
111
|
+
if (!match)
|
|
112
|
+
return { inputTokens: 0, outputTokens: 0 };
|
|
113
|
+
return {
|
|
114
|
+
inputTokens: parseInt(match[1], 10),
|
|
115
|
+
outputTokens: parseInt(match[2], 10),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/** Parse all lines from raw content string */
|
|
119
|
+
export function parseLogContent(content) {
|
|
120
|
+
if (!content)
|
|
121
|
+
return [];
|
|
122
|
+
return content
|
|
123
|
+
.split('\n')
|
|
124
|
+
.filter((line) => line.trim().length > 0)
|
|
125
|
+
.map(parseLogLine);
|
|
126
|
+
}
|