@shepai/cli 1.68.1 → 1.70.0
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/tools/list-tools.use-case.d.ts +1 -1
- package/dist/packages/core/src/application/use-cases/tools/list-tools.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +17 -2
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/CLAUDE.md +45 -18
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/iterm2.json +17 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/kitty.json +18 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/tmux.json +27 -0
- package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +17 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +32 -0
- package/dist/src/presentation/web/components/features/tools/tool-card.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/tools/tool-card.js +1 -0
- package/dist/src/presentation/web/components/features/tools/tools-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/tools/tools-page-client.js +2 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +7 -2
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts +3 -3
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +36 -11
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts +26 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/sidebar-features-context.js +34 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- 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/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.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- 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 +1 -1
- 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.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__09413611._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_68b5e0de._.js +6 -0
- package/web/.next/server/chunks/ssr/_68b5e0de._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
- package/web/.next/server/chunks/ssr/_690ea95f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/server/chunks/ssr/_725584e5._.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/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +18 -18
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_68b5e0de._.js +6 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +44 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tool-card.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/features/tools/tools-page-client.tsx +5 -1
- package/web/.next/standalone/src/presentation/web/components/layouts/app-shell/app-shell.tsx +18 -2
- package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx +36 -11
- package/web/.next/standalone/src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx +7 -4
- package/web/.next/standalone/src/presentation/web/hooks/sidebar-features-context.tsx +69 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{491ae2bbae40857c.js → 505c6a9e4c5d0808.js} +1 -1
- package/web/.next/static/chunks/{caa2e7e1618e2179.js → 51c94a563ecc565d.js} +1 -1
- package/web/.next/static/chunks/6d7d233d07d9a026.js +1 -0
- package/web/.next/static/chunks/{ac9971b036d46eca.js → 86b38e36afcd19f3.js} +1 -1
- package/web/.next/static/chunks/{7b56cca1fa91c197.js → 94562d62bf8e4bf7.js} +1 -1
- package/web/.next/static/chunks/{babbd238fc276df2.js → fdfd68aacc4727cf.js} +2 -2
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/_23c92688._.js +0 -6
- package/web/.next/server/chunks/ssr/_23c92688._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_23c92688._.js +0 -6
- package/web/.next/static/chunks/eaf9699a447461e1.js +0 -1
- /package/web/.next/static/{VcKnu_EsfkBbSZnJoevS7 → 6pJLWKt-ohZJ_2kGrHG_m}/_buildManifest.js +0 -0
- /package/web/.next/static/{VcKnu_EsfkBbSZnJoevS7 → 6pJLWKt-ohZJ_2kGrHG_m}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{VcKnu_EsfkBbSZnJoevS7 → 6pJLWKt-ohZJ_2kGrHG_m}/_ssgManifest.js +0 -0
|
@@ -13,7 +13,7 @@ export interface ToolItem {
|
|
|
13
13
|
name: string;
|
|
14
14
|
summary: string;
|
|
15
15
|
description: string;
|
|
16
|
-
tags: ('ide' | 'cli-agent' | 'vcs')[];
|
|
16
|
+
tags: ('ide' | 'cli-agent' | 'vcs' | 'terminal')[];
|
|
17
17
|
iconUrl: string | undefined;
|
|
18
18
|
autoInstall: boolean;
|
|
19
19
|
required: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tools.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/tools/list-tools.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAGlF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"list-tools.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/tools/list-tools.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAGlF,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IACnD,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,MAAM,eAAe,GAAG,QAAQ,EAAE,CAAC;AAWzC,qBACa,gBAAgB;IAGzB,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAApB,oBAAoB,EAAE,qBAAqB;IAGxD,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;CAgC1C"}
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts
CHANGED
|
@@ -15,7 +15,8 @@ import type { IToolInstallerService } from '../../../application/ports/output/se
|
|
|
15
15
|
import type { ToolInstallationStatus, ToolInstallCommand } from '../../../domain/generated/output.js';
|
|
16
16
|
export declare class ToolInstallerServiceImpl implements IToolInstallerService {
|
|
17
17
|
/**
|
|
18
|
-
* Check if a tool binary is available on the system (PATH check
|
|
18
|
+
* Check if a tool binary is available on the system (PATH check,
|
|
19
|
+
* with verifyCommand fallback for GUI apps).
|
|
19
20
|
*/
|
|
20
21
|
checkAvailability(toolName: string): Promise<ToolInstallationStatus>;
|
|
21
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AAsD7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAuElC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js
CHANGED
|
@@ -18,7 +18,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
18
18
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
19
|
};
|
|
20
20
|
import { injectable } from 'tsyringe';
|
|
21
|
-
import { execFile, spawn } from 'node:child_process';
|
|
21
|
+
import { exec, execFile, spawn } from 'node:child_process';
|
|
22
22
|
import { platform } from 'node:os';
|
|
23
23
|
import { createAvailableStatus, createMissingStatus, createErrorStatus, } from '../../../domain/value-objects/tool-installation-status.js';
|
|
24
24
|
import { TOOL_METADATA } from './tool-metadata.js';
|
|
@@ -55,9 +55,17 @@ const checkBinaryExists = (binary) => {
|
|
|
55
55
|
});
|
|
56
56
|
});
|
|
57
57
|
};
|
|
58
|
+
/**
|
|
59
|
+
* Run a shell command and resolve true when it exits 0, false otherwise.
|
|
60
|
+
* Used as a fallback for GUI apps whose binary isn't in PATH (e.g. Warp, iTerm2).
|
|
61
|
+
*/
|
|
62
|
+
const runVerifyCommand = (command) => new Promise((resolve) => {
|
|
63
|
+
exec(command, (err) => resolve(!err));
|
|
64
|
+
});
|
|
58
65
|
let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
|
|
59
66
|
/**
|
|
60
|
-
* Check if a tool binary is available on the system (PATH check
|
|
67
|
+
* Check if a tool binary is available on the system (PATH check,
|
|
68
|
+
* with verifyCommand fallback for GUI apps).
|
|
61
69
|
*/
|
|
62
70
|
async checkAvailability(toolName) {
|
|
63
71
|
const metadata = TOOL_METADATA[toolName];
|
|
@@ -69,6 +77,13 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
|
|
|
69
77
|
if (result.found) {
|
|
70
78
|
return createAvailableStatus(toolName);
|
|
71
79
|
}
|
|
80
|
+
// Binary not in PATH — try verifyCommand as fallback (handles GUI .app bundles)
|
|
81
|
+
if (result.notInPath && metadata.verifyCommand) {
|
|
82
|
+
const verified = await runVerifyCommand(metadata.verifyCommand);
|
|
83
|
+
if (verified) {
|
|
84
|
+
return createAvailableStatus(toolName);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
72
87
|
if (result.notInPath) {
|
|
73
88
|
const suggestions = this.createInstallationSuggestions(metadata);
|
|
74
89
|
return createMissingStatus(toolName, suggestions);
|
|
@@ -15,7 +15,7 @@ export interface ToolMetadata {
|
|
|
15
15
|
/** Detailed description */
|
|
16
16
|
description: string;
|
|
17
17
|
/** Tool tags for grouping in listings. A tool can belong to multiple categories. */
|
|
18
|
-
tags: ('ide' | 'cli-agent' | 'vcs')[];
|
|
18
|
+
tags: ('ide' | 'cli-agent' | 'vcs' | 'terminal')[];
|
|
19
19
|
/** URL to the tool's icon/logo image */
|
|
20
20
|
iconUrl?: string;
|
|
21
21
|
/** Binary name to check with 'which' command (string or per-platform map) */
|
package/dist/packages/core/src/infrastructure/services/tool-installer/tool-metadata.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-metadata.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-metadata.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;IAEhB,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IAEpB,oFAAoF;IACpF,IAAI,EAAE,CAAC,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;IAEnD,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IAEvB,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAEhB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;IAEzB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IAEtB,uEAAuE;IACvE,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kFAAkF;IAClF,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB;;yGAEqG;IACrG,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEhD;;iGAE6F;IAC7F,YAAY,CAAC,EAAE;QACb,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;QACtC,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IAEF;;;;wEAIoE;IACpE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnD;AA8CD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAsB,CAAC;AAE9E;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,CAExD"}
|
|
@@ -5,24 +5,24 @@ Files are loaded dynamically by `tool-metadata.ts` — the filename (minus `.jso
|
|
|
5
5
|
|
|
6
6
|
## Schema
|
|
7
7
|
|
|
8
|
-
| Field | Type
|
|
9
|
-
| ------------------ |
|
|
10
|
-
| `name` | `string`
|
|
11
|
-
| `summary` | `string`
|
|
12
|
-
| `description` | `string`
|
|
13
|
-
| `tags` | `("ide"\|"cli-agent"\|"vcs")[]`
|
|
14
|
-
| `iconUrl` | `string`
|
|
15
|
-
| `binary` | `string \| Record<string,string>`
|
|
16
|
-
| `packageManager` | `string`
|
|
17
|
-
| `commands` | `Record<string,string>`
|
|
18
|
-
| `timeout` | `number`
|
|
19
|
-
| `documentationUrl` | `string`
|
|
20
|
-
| `verifyCommand` | `string`
|
|
21
|
-
| `autoInstall` | `boolean`
|
|
22
|
-
| `required` | `boolean`
|
|
23
|
-
| `openDirectory` | `string \| Record<string,string>`
|
|
24
|
-
| `spawnOptions` | `object`
|
|
25
|
-
| `terminalCommand` | `string \| Record<string,string>`
|
|
8
|
+
| Field | Type | Required | Description |
|
|
9
|
+
| ------------------ | ------------------------------------------- | -------- | ------------------------------------------------------------------------ |
|
|
10
|
+
| `name` | `string` | Yes | Human-readable display name |
|
|
11
|
+
| `summary` | `string` | Yes | One-line description |
|
|
12
|
+
| `description` | `string` | Yes | Detailed description |
|
|
13
|
+
| `tags` | `("ide"\|"cli-agent"\|"vcs"\|"terminal")[]` | Yes | Categories for filtering in UI and CLI |
|
|
14
|
+
| `iconUrl` | `string` | No | URL to SVG/PNG icon (use cdn.simpleicons.org when possible) |
|
|
15
|
+
| `binary` | `string \| Record<string,string>` | Yes | Binary name for `which` check. Per-platform map if differs |
|
|
16
|
+
| `packageManager` | `string` | Yes | Install method label (apt, brew, curl, manual, download) |
|
|
17
|
+
| `commands` | `Record<string,string>` | Yes | Platform-keyed install commands (`linux`, `darwin`) |
|
|
18
|
+
| `timeout` | `number` | Yes | Install timeout in ms (typically 300000) |
|
|
19
|
+
| `documentationUrl` | `string` | Yes | Official docs URL |
|
|
20
|
+
| `verifyCommand` | `string` | Yes | Command to verify installation (e.g. `git --version`) |
|
|
21
|
+
| `autoInstall` | `boolean` | No | `true` (default) = run commands automatically. `false` = manual download |
|
|
22
|
+
| `required` | `boolean` | No | `true` = tool is required for platform to function |
|
|
23
|
+
| `openDirectory` | `string \| Record<string,string>` | No | Command to open a directory. Use `{dir}` placeholder |
|
|
24
|
+
| `spawnOptions` | `object` | No | Override spawn behavior (see below) |
|
|
25
|
+
| `terminalCommand` | `string \| Record<string,string>` | No | Command to open tool in a **new terminal window** from web UI |
|
|
26
26
|
|
|
27
27
|
## Spawn Options
|
|
28
28
|
|
|
@@ -59,5 +59,32 @@ The launcher auto-detects TTY: CLI launch uses `openDirectory`, web launch uses
|
|
|
59
59
|
| `ide` | GUI code editor | VS Code, Cursor, Zed |
|
|
60
60
|
| `cli-agent` | Terminal-based AI coding agent | Claude Code, Cursor CLI |
|
|
61
61
|
| `vcs` | Version control tool | Git, GitHub CLI |
|
|
62
|
+
| `terminal` | Terminal emulator/multiplexer | tmux, Kitty, Alacritty |
|
|
62
63
|
|
|
63
64
|
Tools can have multiple tags. A tool appears in all matching filter tabs in the UI.
|
|
65
|
+
|
|
66
|
+
### Terminal Tools
|
|
67
|
+
|
|
68
|
+
Terminal tools use the `terminal` tag. GUI terminals (Kitty, Alacritty) use `brew install --cask` on macOS.
|
|
69
|
+
CLI tools like tmux use `brew install` (formula). Terminals with `--working-directory` flags can include
|
|
70
|
+
`openDirectory` for launch support. tmux requires `spawnOptions` with `shell: true` and `stdio: "inherit"`
|
|
71
|
+
since it runs inside the current terminal session.
|
|
72
|
+
|
|
73
|
+
Example (tmux):
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"name": "tmux",
|
|
78
|
+
"summary": "Terminal multiplexer for session management",
|
|
79
|
+
"tags": ["terminal"],
|
|
80
|
+
"binary": "tmux",
|
|
81
|
+
"packageManager": "brew",
|
|
82
|
+
"commands": { "darwin": "brew install tmux", "linux": "apt install -y tmux" },
|
|
83
|
+
"timeout": 300000,
|
|
84
|
+
"documentationUrl": "https://github.com/tmux/tmux/wiki",
|
|
85
|
+
"verifyCommand": "tmux -V",
|
|
86
|
+
"autoInstall": true,
|
|
87
|
+
"openDirectory": "tmux new-session -c {dir}",
|
|
88
|
+
"spawnOptions": { "shell": true, "stdio": "inherit", "detached": false }
|
|
89
|
+
}
|
|
90
|
+
```
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Alacritty",
|
|
3
|
+
"summary": "GPU-accelerated terminal emulator",
|
|
4
|
+
"description": "Alacritty is a modern, GPU-accelerated terminal emulator focused on simplicity and performance. Cross-platform (macOS and Linux). On older Linux distributions, you may need to add a PPA before installing via apt.",
|
|
5
|
+
"tags": ["terminal"],
|
|
6
|
+
"iconUrl": "https://cdn.simpleicons.org/alacritty",
|
|
7
|
+
"binary": "alacritty",
|
|
8
|
+
"packageManager": "brew",
|
|
9
|
+
"commands": {
|
|
10
|
+
"darwin": "brew install --cask alacritty",
|
|
11
|
+
"linux": "apt install -y alacritty"
|
|
12
|
+
},
|
|
13
|
+
"timeout": 300000,
|
|
14
|
+
"documentationUrl": "https://alacritty.org/",
|
|
15
|
+
"verifyCommand": "alacritty --version",
|
|
16
|
+
"autoInstall": false,
|
|
17
|
+
"openDirectory": "alacritty --working-directory {dir}"
|
|
18
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "iTerm2",
|
|
3
|
+
"summary": "macOS terminal replacement",
|
|
4
|
+
"description": "iTerm2 is a feature-rich replacement for the default macOS Terminal.app with split panes, search, autocomplete, and extensive customization. macOS only. Verified by checking for the iTerm.app bundle in /Applications.",
|
|
5
|
+
"tags": ["terminal"],
|
|
6
|
+
"iconUrl": "https://cdn.simpleicons.org/iterm2",
|
|
7
|
+
"binary": "iterm2",
|
|
8
|
+
"packageManager": "brew",
|
|
9
|
+
"commands": {
|
|
10
|
+
"darwin": "brew install --cask iterm2"
|
|
11
|
+
},
|
|
12
|
+
"timeout": 300000,
|
|
13
|
+
"documentationUrl": "https://iterm2.com/documentation.html",
|
|
14
|
+
"verifyCommand": "test -d /Applications/iTerm.app",
|
|
15
|
+
"autoInstall": false,
|
|
16
|
+
"openDirectory": "open -a iTerm {dir}"
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Kitty",
|
|
3
|
+
"summary": "Fast, GPU-based terminal emulator",
|
|
4
|
+
"description": "Kitty is a fast, feature-rich, GPU-based terminal emulator with advanced graphics support, extensibility via kittens, and modern rendering. Cross-platform (macOS and Linux).",
|
|
5
|
+
"tags": ["terminal"],
|
|
6
|
+
"iconUrl": "https://raw.githubusercontent.com/kovidgoyal/kitty/master/logo/kitty.svg",
|
|
7
|
+
"binary": "kitty",
|
|
8
|
+
"packageManager": "brew",
|
|
9
|
+
"commands": {
|
|
10
|
+
"darwin": "brew install --cask kitty",
|
|
11
|
+
"linux": "apt install -y kitty"
|
|
12
|
+
},
|
|
13
|
+
"timeout": 300000,
|
|
14
|
+
"documentationUrl": "https://sw.kovidgoyal.net/kitty/",
|
|
15
|
+
"verifyCommand": "kitty --version",
|
|
16
|
+
"autoInstall": false,
|
|
17
|
+
"openDirectory": "kitty --working-directory {dir}"
|
|
18
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tmux",
|
|
3
|
+
"summary": "Terminal multiplexer for session management",
|
|
4
|
+
"description": "tmux is a terminal multiplexer that lets you create, manage, and switch between multiple terminal sessions. Ideal for remote development, persistent sessions, and multi-pane workflows. Cross-platform (macOS and Linux).",
|
|
5
|
+
"tags": ["terminal"],
|
|
6
|
+
"iconUrl": "https://cdn.simpleicons.org/tmux",
|
|
7
|
+
"binary": "tmux",
|
|
8
|
+
"packageManager": "brew",
|
|
9
|
+
"commands": {
|
|
10
|
+
"darwin": "brew install tmux",
|
|
11
|
+
"linux": "apt install -y tmux"
|
|
12
|
+
},
|
|
13
|
+
"timeout": 300000,
|
|
14
|
+
"documentationUrl": "https://github.com/tmux/tmux/wiki",
|
|
15
|
+
"verifyCommand": "tmux -V",
|
|
16
|
+
"autoInstall": true,
|
|
17
|
+
"openDirectory": "tmux new-session -c {dir}",
|
|
18
|
+
"terminalCommand": {
|
|
19
|
+
"darwin": "osascript -e 'tell application \"Terminal\" to do script \"tmux new-session -c {dir}\"' -e 'tell application \"Terminal\" to activate'",
|
|
20
|
+
"linux": "x-terminal-emulator -e tmux new-session -c {dir}"
|
|
21
|
+
},
|
|
22
|
+
"spawnOptions": {
|
|
23
|
+
"shell": true,
|
|
24
|
+
"stdio": "inherit",
|
|
25
|
+
"detached": false
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Warp",
|
|
3
|
+
"summary": "Modern terminal with AI features",
|
|
4
|
+
"description": "Warp is a modern terminal with AI-powered features, intelligent command suggestions, and a collaborative workflow. macOS only — Linux users can install manually via AppImage from https://www.warp.dev/.",
|
|
5
|
+
"tags": ["terminal"],
|
|
6
|
+
"iconUrl": "https://cdn.simpleicons.org/warp",
|
|
7
|
+
"binary": "warp",
|
|
8
|
+
"packageManager": "brew",
|
|
9
|
+
"commands": {
|
|
10
|
+
"darwin": "brew install --cask warp"
|
|
11
|
+
},
|
|
12
|
+
"timeout": 300000,
|
|
13
|
+
"documentationUrl": "https://docs.warp.dev/",
|
|
14
|
+
"verifyCommand": "test -d /Applications/Warp.app",
|
|
15
|
+
"autoInstall": false,
|
|
16
|
+
"openDirectory": "open -a Warp {dir}"
|
|
17
|
+
}
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface FeatureNodeData {
|
|
|
22
22
|
branch: string;
|
|
23
23
|
/** Absolute path to the specs folder on disk */
|
|
24
24
|
specPath?: string;
|
|
25
|
+
/** Epoch ms when the current agent run started (for elapsed-time in sidebar) */
|
|
26
|
+
startedAt?: number;
|
|
25
27
|
/** Human-readable runtime for done state (e.g. "2h 15m") */
|
|
26
28
|
runtime?: string;
|
|
27
29
|
/** Feature name this node is blocked by */
|
package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,SAAS,GACT,iBAAiB,GACjB,MAAM,GACN,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOxE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,+DAA+D;IAC/D,EAAE,CAAC,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CA6DnF,CAAC"}
|
|
1
|
+
{"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,SAAS,GACT,iBAAiB,GACjB,MAAM,GACN,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOxE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,+DAA+D;IAC/D,EAAE,CAAC,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CA6DnF,CAAC"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;
|
|
1
|
+
{"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAc5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAiMzF"}
|
package/dist/src/presentation/web/components/features/control-center/control-center-inner.js
CHANGED
|
@@ -5,10 +5,42 @@ import { FeaturesCanvas } from '../../features/features-canvas/index.js';
|
|
|
5
5
|
import { ControlCenterDrawer, computeDrawerView } from '../../common/control-center-drawer/index.js';
|
|
6
6
|
import { NotificationPermissionBanner } from '../../common/notification-permission-banner/index.js';
|
|
7
7
|
import { getWorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
|
|
8
|
+
import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../../hooks/sidebar-features-context.js';
|
|
8
9
|
import { ControlCenterEmptyState } from './control-center-empty-state.js';
|
|
9
10
|
import { useControlCenterState } from './use-control-center-state.js';
|
|
10
11
|
export function ControlCenterInner({ initialNodes, initialEdges }) {
|
|
11
12
|
const { nodes, edges, selectedNode, isCreateDrawerOpen, isDeleting, pendingRepositoryPath, onNodesChange, handleConnect, handleAddFeature, handleAddFeatureToRepo, handleAddFeatureToFeature, handleAddRepository, handleNodeClick, clearSelection, handleCreateFeatureSubmit, handleDeleteFeature, handleDeleteRepository, closeCreateDrawer, selectFeatureById, pendingParentFeatureId, } = useControlCenterState(initialNodes, initialEdges);
|
|
13
|
+
// Publish sidebar features to context whenever feature node data changes
|
|
14
|
+
const { setFeatures: setSidebarFeatures } = useSidebarFeaturesContext();
|
|
15
|
+
const sidebarKey = useMemo(() => {
|
|
16
|
+
return nodes
|
|
17
|
+
.filter((n) => n.type === 'featureNode')
|
|
18
|
+
.map((n) => {
|
|
19
|
+
const d = n.data;
|
|
20
|
+
return `${d.featureId}:${d.state}:${d.runtime ?? ''}:${d.startedAt ?? ''}`;
|
|
21
|
+
})
|
|
22
|
+
.sort()
|
|
23
|
+
.join(',');
|
|
24
|
+
}, [nodes]);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const sidebarItems = nodes
|
|
27
|
+
.filter((n) => n.type === 'featureNode')
|
|
28
|
+
.map((n) => {
|
|
29
|
+
const d = n.data;
|
|
30
|
+
const status = mapNodeStateToSidebarStatus(d.state);
|
|
31
|
+
if (!status)
|
|
32
|
+
return null;
|
|
33
|
+
return {
|
|
34
|
+
featureId: d.featureId,
|
|
35
|
+
name: d.name,
|
|
36
|
+
status,
|
|
37
|
+
...(d.startedAt != null && { startedAt: d.startedAt }),
|
|
38
|
+
...(d.runtime != null && { duration: d.runtime }),
|
|
39
|
+
};
|
|
40
|
+
})
|
|
41
|
+
.filter(Boolean);
|
|
42
|
+
setSidebarFeatures(sidebarItems);
|
|
43
|
+
}, [sidebarKey, nodes, setSidebarFeatures]);
|
|
12
44
|
// Feature list for the parent selector in the create drawer
|
|
13
45
|
const featureOptions = useMemo(() => nodes
|
|
14
46
|
.filter((n) => n.type === 'featureNode')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-card.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tool-card.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"tool-card.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tool-card.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,aAAa,2CA2JrE"}
|
|
@@ -9,6 +9,7 @@ const TAG_CONFIG = {
|
|
|
9
9
|
ide: { label: 'IDE', icon: Monitor },
|
|
10
10
|
'cli-agent': { label: 'CLI Agent', icon: Terminal },
|
|
11
11
|
vcs: { label: 'VCS', icon: GitBranch },
|
|
12
|
+
terminal: { label: 'Terminal', icon: Terminal },
|
|
12
13
|
};
|
|
13
14
|
export function ToolCard({ tool, onRefresh, className }) {
|
|
14
15
|
const [installDrawerOpen, setInstallDrawerOpen] = useState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"tools-page-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/tools/tools-page-client.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8DAA8D,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CA+EvF"}
|
|
@@ -10,6 +10,7 @@ const TAB_FILTER = {
|
|
|
10
10
|
ide: (tool) => tool.tags.includes('ide'),
|
|
11
11
|
'cli-agent': (tool) => tool.tags.includes('cli-agent'),
|
|
12
12
|
vcs: (tool) => tool.tags.includes('vcs'),
|
|
13
|
+
terminal: (tool) => tool.tags.includes('terminal'),
|
|
13
14
|
};
|
|
14
15
|
export function ToolsPageClient({ tools: initialTools, className }) {
|
|
15
16
|
const [tools, setTools] = useState(initialTools);
|
|
@@ -27,5 +28,5 @@ export function ToolsPageClient({ tools: initialTools, className }) {
|
|
|
27
28
|
}
|
|
28
29
|
}
|
|
29
30
|
const filtered = tools.filter(TAB_FILTER[activeTab]);
|
|
30
|
-
return (_jsxs("div", { "data-testid": "tools-page-client", className: cn('space-y-4', className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Wrench, { className: "text-muted-foreground h-4 w-4" }), _jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Tools" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: [tools.filter((t) => t.status.status === 'available').length, "/", tools.length, " installed"] })] }), _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), "data-testid": "tools-page-tabs", children: [_jsxs(TabsList, { className: "h-7", children: [_jsx(TabsTrigger, { value: "all", "data-testid": "tools-tab-all", className: "px-2.5 text-xs", children: "All" }), _jsx(TabsTrigger, { value: "ide", "data-testid": "tools-tab-ide", className: "px-2.5 text-xs", children: "IDEs" }), _jsx(TabsTrigger, { value: "cli-agent", "data-testid": "tools-tab-cli-agent", className: "px-2.5 text-xs", children: "CLI Agents" }), _jsx(TabsTrigger, { value: "vcs", "data-testid": "tools-tab-vcs", className: "px-2.5 text-xs", children: "Version Control" })] }), _jsx(TabsContent, { value: activeTab, className: "mt-3", children: filtered.length === 0 ? (_jsxs("div", { "data-testid": "tools-page-empty", className: "text-muted-foreground flex flex-col items-center justify-center py-12 text-center", children: [_jsx(Wrench, { className: "mb-2 h-6 w-6 opacity-20" }), _jsx("p", { className: "text-xs", children: "No tools in this category." })] })) : (_jsx("div", { "data-testid": "tools-page-grid", className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: filtered.map((tool) => (_jsx(ToolCard, { tool: tool, onRefresh: refreshTools }, tool.id))) })) })] })] }));
|
|
31
|
+
return (_jsxs("div", { "data-testid": "tools-page-client", className: cn('space-y-4', className), children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Wrench, { className: "text-muted-foreground h-4 w-4" }), _jsx("h1", { className: "text-sm font-bold tracking-tight", children: "Tools" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: [tools.filter((t) => t.status.status === 'available').length, "/", tools.length, " installed"] })] }), _jsxs(Tabs, { value: activeTab, onValueChange: (value) => setActiveTab(value), "data-testid": "tools-page-tabs", children: [_jsxs(TabsList, { className: "h-7", children: [_jsx(TabsTrigger, { value: "all", "data-testid": "tools-tab-all", className: "px-2.5 text-xs", children: "All" }), _jsx(TabsTrigger, { value: "ide", "data-testid": "tools-tab-ide", className: "px-2.5 text-xs", children: "IDEs" }), _jsx(TabsTrigger, { value: "cli-agent", "data-testid": "tools-tab-cli-agent", className: "px-2.5 text-xs", children: "CLI Agents" }), _jsx(TabsTrigger, { value: "vcs", "data-testid": "tools-tab-vcs", className: "px-2.5 text-xs", children: "Version Control" }), _jsx(TabsTrigger, { value: "terminal", "data-testid": "tools-tab-terminal", className: "px-2.5 text-xs", children: "Terminals" })] }), _jsx(TabsContent, { value: activeTab, className: "mt-3", children: filtered.length === 0 ? (_jsxs("div", { "data-testid": "tools-page-empty", className: "text-muted-foreground flex flex-col items-center justify-center py-12 text-center", children: [_jsx(Wrench, { className: "mb-2 h-6 w-6 opacity-20" }), _jsx("p", { className: "text-xs", children: "No tools in this category." })] })) : (_jsx("div", { "data-testid": "tools-page-grid", className: "grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4", children: filtered.map((tool) => (_jsx(ToolCard, { tool: tool, onRefresh: refreshTools }, tool.id))) })) })] })] }));
|
|
31
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAapD,UAAU,aAAa;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AA0CD,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAQnD"}
|
|
@@ -7,19 +7,24 @@ import { AddRepositoryButton } from '../../common/add-repository-node/index.js';
|
|
|
7
7
|
import { ThemeToggle } from '../../common/theme-toggle/index.js';
|
|
8
8
|
import { SoundToggle } from '../../common/sound-toggle/index.js';
|
|
9
9
|
import { AgentEventsProvider } from '../../../hooks/agent-events-provider.js';
|
|
10
|
+
import { SidebarFeaturesProvider, useSidebarFeaturesContext, } from '../../../hooks/sidebar-features-context.js';
|
|
10
11
|
import { useNotifications } from '../../../hooks/use-notifications.js';
|
|
11
12
|
/** Inner shell that consumes the agent-events context for notifications. */
|
|
12
13
|
function AppShellInner({ children }) {
|
|
13
14
|
// Subscribe to agent lifecycle events and dispatch toast/browser notifications
|
|
14
15
|
useNotifications();
|
|
16
|
+
const { features } = useSidebarFeaturesContext();
|
|
15
17
|
const handleNewFeature = useCallback(() => {
|
|
16
18
|
window.dispatchEvent(new CustomEvent('shep:open-create-drawer'));
|
|
17
19
|
}, []);
|
|
20
|
+
const handleFeatureClick = useCallback((featureId) => {
|
|
21
|
+
window.dispatchEvent(new CustomEvent('shep:select-feature', { detail: { featureId } }));
|
|
22
|
+
}, []);
|
|
18
23
|
const handleRepositorySelect = useCallback((path) => {
|
|
19
24
|
window.dispatchEvent(new CustomEvent('shep:add-repository', { detail: { path } }));
|
|
20
25
|
}, []);
|
|
21
|
-
return (_jsxs(SidebarProvider, { children: [_jsx(AppSidebar, { features:
|
|
26
|
+
return (_jsxs(SidebarProvider, { children: [_jsx(AppSidebar, { features: features, onNewFeature: handleNewFeature, onFeatureClick: handleFeatureClick }), _jsx(SidebarInset, { children: _jsxs("div", { className: "relative h-full", children: [_jsxs("div", { className: "absolute top-3 right-3 z-50 flex gap-1", children: [_jsx(AddRepositoryButton, { onSelect: handleRepositorySelect }), _jsx(SoundToggle, {}), _jsx(ThemeToggle, {})] }), _jsx("main", { className: "h-full", children: children })] }) })] }));
|
|
22
27
|
}
|
|
23
28
|
export function AppShell({ children }) {
|
|
24
|
-
return (_jsx(AgentEventsProvider, { children: _jsx(AppShellInner, { children: children }) }));
|
|
29
|
+
return (_jsx(AgentEventsProvider, { children: _jsx(SidebarFeaturesProvider, { children: _jsx(AppShellInner, { children: children }) }) }));
|
|
25
30
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { FeatureStatus } from '../../common/feature-status-config.js';
|
|
2
|
-
interface FeatureItem {
|
|
2
|
+
export interface FeatureItem {
|
|
3
|
+
featureId: string;
|
|
3
4
|
name: string;
|
|
4
5
|
status: FeatureStatus;
|
|
5
6
|
startedAt?: number;
|
|
@@ -8,10 +9,9 @@ interface FeatureItem {
|
|
|
8
9
|
export interface AppSidebarProps {
|
|
9
10
|
features: FeatureItem[];
|
|
10
11
|
onNewFeature?: () => void;
|
|
11
|
-
onFeatureClick?: (
|
|
12
|
+
onFeatureClick?: (featureId: string) => void;
|
|
12
13
|
onFeaturesFolderClick?: () => void;
|
|
13
14
|
onFeaturesMenuClick?: () => void;
|
|
14
15
|
}
|
|
15
16
|
export declare function AppSidebar({ features, onNewFeature, onFeatureClick, onFeaturesFolderClick, onFeaturesMenuClick, }: AppSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
-
export {};
|
|
17
17
|
//# sourceMappingURL=app-sidebar.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,
|
|
1
|
+
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,EAAE,eAAe,2CAyGjB"}
|
|
@@ -31,5 +31,5 @@ export function AppSidebar({ features, onNewFeature, onFeatureClick, onFeaturesF
|
|
|
31
31
|
'min-w-0 overflow-hidden transition-opacity duration-200 ease-out',
|
|
32
32
|
'[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
|
|
33
33
|
expandedVisible ? 'opacity-100' : 'opacity-0',
|
|
34
|
-
].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features", onFolderClick: onFeaturesFolderClick, onMenuClick: onFeaturesMenuClick }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, onClick: onFeatureClick ? () => onFeatureClick(feature.
|
|
34
|
+
].join(' '), children: [_jsx(SidebarSectionHeader, { label: "Features", onFolderClick: onFeaturesFolderClick, onMenuClick: onFeaturesMenuClick }), _jsx(ScrollArea, { children: grouped.map(({ key, label, items }) => items.length > 0 ? (_jsx(FeatureStatusGroup, { label: label, count: items.length, children: items.map((feature) => (_jsx(FeatureListItem, { name: feature.name, status: feature.status, startedAt: feature.startedAt, duration: feature.duration, onClick: onFeatureClick ? () => onFeatureClick(feature.featureId) : undefined }, feature.featureId))) }, key)) : null) })] })) : null }), _jsx(SidebarFooter, { children: _jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(SidebarMenuButton, { onClick: onNewFeature, tooltip: "New feature", children: [_jsx(Plus, {}), _jsx("span", { children: "New feature" })] }) }) }) }), _jsx(SidebarRail, {})] }));
|
|
35
35
|
}
|
package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAsBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"app-sidebar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,UAAU,CAsBjC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0BnC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAOvB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAiB3B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAQrB,CAAC"}
|
|
@@ -17,12 +17,27 @@ const meta = {
|
|
|
17
17
|
};
|
|
18
18
|
export default meta;
|
|
19
19
|
const mockFeatures = [
|
|
20
|
-
{ name: 'Auth Module', status: 'action-needed' },
|
|
21
|
-
{ name: 'Payment Flow', status: 'action-needed' },
|
|
22
|
-
{
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
{ featureId: 'feat-auth-001', name: 'Auth Module', status: 'action-needed' },
|
|
21
|
+
{ featureId: 'feat-payment-002', name: 'Payment Flow', status: 'action-needed' },
|
|
22
|
+
{
|
|
23
|
+
featureId: 'feat-dashboard-003',
|
|
24
|
+
name: 'Dashboard',
|
|
25
|
+
status: 'in-progress',
|
|
26
|
+
startedAt: Date.now() - 330_000,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
featureId: 'feat-api-004',
|
|
30
|
+
name: 'API Gateway',
|
|
31
|
+
status: 'in-progress',
|
|
32
|
+
startedAt: Date.now() - 60_000,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
featureId: 'feat-settings-005',
|
|
36
|
+
name: 'Settings Page',
|
|
37
|
+
status: 'done',
|
|
38
|
+
duration: '2h',
|
|
39
|
+
},
|
|
40
|
+
{ featureId: 'feat-profile-006', name: 'User Profile', status: 'done', duration: '1h' },
|
|
26
41
|
];
|
|
27
42
|
export const Default = {
|
|
28
43
|
args: {
|
|
@@ -45,17 +60,27 @@ export const Empty = {
|
|
|
45
60
|
export const AllInProgress = {
|
|
46
61
|
args: {
|
|
47
62
|
features: [
|
|
48
|
-
{
|
|
49
|
-
|
|
63
|
+
{
|
|
64
|
+
featureId: 'feat-a-001',
|
|
65
|
+
name: 'Feature A',
|
|
66
|
+
status: 'in-progress',
|
|
67
|
+
startedAt: Date.now() - 120_000,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
featureId: 'feat-b-002',
|
|
71
|
+
name: 'Feature B',
|
|
72
|
+
status: 'in-progress',
|
|
73
|
+
startedAt: Date.now() - 600_000,
|
|
74
|
+
},
|
|
50
75
|
],
|
|
51
76
|
},
|
|
52
77
|
};
|
|
53
78
|
export const AllDone = {
|
|
54
79
|
args: {
|
|
55
80
|
features: [
|
|
56
|
-
{ name: 'Feature A', status: 'done', duration: '30m' },
|
|
57
|
-
{ name: 'Feature B', status: 'done', duration: '1h' },
|
|
58
|
-
{ name: 'Feature C', status: 'done', duration: '3h' },
|
|
81
|
+
{ featureId: 'feat-a-001', name: 'Feature A', status: 'done', duration: '30m' },
|
|
82
|
+
{ featureId: 'feat-b-002', name: 'Feature B', status: 'done', duration: '1h' },
|
|
83
|
+
{ featureId: 'feat-c-003', name: 'Feature C', status: 'done', duration: '3h' },
|
|
59
84
|
],
|
|
60
85
|
},
|
|
61
86
|
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { FeatureNodeState } from '../components/common/feature-node/feature-node-state-config.js';
|
|
3
|
+
import type { FeatureStatus } from '../components/common/feature-status-config.js';
|
|
4
|
+
export interface SidebarFeatureItem {
|
|
5
|
+
name: string;
|
|
6
|
+
status: FeatureStatus;
|
|
7
|
+
featureId: string;
|
|
8
|
+
startedAt?: number;
|
|
9
|
+
duration?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Maps a canvas FeatureNodeState to the sidebar's 3-state FeatureStatus.
|
|
13
|
+
* Returns `null` for `creating` (optimistic UI) — these should be excluded from the sidebar.
|
|
14
|
+
*/
|
|
15
|
+
export declare function mapNodeStateToSidebarStatus(state: FeatureNodeState): FeatureStatus | null;
|
|
16
|
+
interface SidebarFeaturesContextValue {
|
|
17
|
+
features: SidebarFeatureItem[];
|
|
18
|
+
setFeatures: (features: SidebarFeatureItem[]) => void;
|
|
19
|
+
}
|
|
20
|
+
interface SidebarFeaturesProviderProps {
|
|
21
|
+
children: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
export declare function SidebarFeaturesProvider({ children }: SidebarFeaturesProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
export declare function useSidebarFeaturesContext(): SidebarFeaturesContextValue;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=sidebar-features-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar-features-context.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/hooks/sidebar-features-context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAgD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACrF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4DAA4D,CAAC;AACnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAeD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,gBAAgB,GAAG,aAAa,GAAG,IAAI,CAEzF;AAMD,UAAU,2BAA2B;IACnC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;CACvD;AAID,UAAU,4BAA4B;IACpC,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,uBAAuB,CAAC,EAAE,QAAQ,EAAE,EAAE,4BAA4B,2CAQjF;AAED,wBAAgB,yBAAyB,IAAI,2BAA2B,CAMvE"}
|