@posthog/wizard 2.7.0 → 2.9.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/README.md +11 -0
- package/dist/bin.js +289 -162
- package/dist/bin.js.map +1 -1
- package/dist/src/__tests__/cli.test.js +92 -59
- package/dist/src/__tests__/cli.test.js.map +1 -1
- package/dist/src/__tests__/wizard-abort.test.js +34 -13
- package/dist/src/__tests__/wizard-abort.test.js.map +1 -1
- package/dist/src/frameworks/android/android-wizard-agent.js +2 -2
- package/dist/src/frameworks/android/android-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/angular/angular-wizard-agent.js +2 -2
- package/dist/src/frameworks/angular/angular-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/astro/astro-wizard-agent.js +2 -2
- package/dist/src/frameworks/astro/astro-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/django/django-wizard-agent.js +2 -2
- package/dist/src/frameworks/django/django-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js +2 -2
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/flask/flask-wizard-agent.js +2 -2
- package/dist/src/frameworks/flask/flask-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +2 -2
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js +2 -2
- package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/laravel/laravel-wizard-agent.js +2 -2
- package/dist/src/frameworks/laravel/laravel-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js +2 -2
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js +2 -2
- package/dist/src/frameworks/nuxt/nuxt-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/python/python-wizard-agent.js +2 -2
- package/dist/src/frameworks/python/python-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/rails/rails-wizard-agent.js +2 -2
- package/dist/src/frameworks/rails/rails-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/react-native/react-native-wizard-agent.js +2 -2
- package/dist/src/frameworks/react-native/react-native-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js +2 -2
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/ruby/ruby-wizard-agent.js +2 -2
- package/dist/src/frameworks/ruby/ruby-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/svelte/svelte-wizard-agent.js +2 -2
- package/dist/src/frameworks/svelte/svelte-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/swift/swift-wizard-agent.js +2 -2
- package/dist/src/frameworks/swift/swift-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js +2 -2
- package/dist/src/frameworks/tanstack-router/tanstack-router-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js +2 -2
- package/dist/src/frameworks/tanstack-start/tanstack-start-wizard-agent.js.map +1 -1
- package/dist/src/frameworks/vue/vue-wizard-agent.js +2 -2
- package/dist/src/frameworks/vue/vue-wizard-agent.js.map +1 -1
- package/dist/src/lib/__tests__/agent-interface.test.js +29 -1
- package/dist/src/lib/__tests__/agent-interface.test.js.map +1 -1
- package/dist/src/lib/agent/__tests__/agent-prompt.test.js +57 -0
- package/dist/src/lib/agent/__tests__/agent-prompt.test.js.map +1 -0
- package/dist/src/lib/{agent-interface.d.ts → agent/agent-interface.d.ts} +18 -6
- package/dist/src/lib/{agent-interface.js → agent/agent-interface.js} +63 -13
- package/dist/src/lib/agent/agent-interface.js.map +1 -0
- package/dist/src/lib/agent/agent-prompt.d.ts +23 -0
- package/dist/src/lib/agent/agent-prompt.js +47 -0
- package/dist/src/lib/agent/agent-prompt.js.map +1 -0
- package/dist/src/lib/agent/agent-runner.d.ts +78 -0
- package/dist/src/lib/agent/agent-runner.js +323 -0
- package/dist/src/lib/agent/agent-runner.js.map +1 -0
- package/dist/src/lib/agent/commandments.js.map +1 -0
- package/dist/src/lib/constants.d.ts +10 -1
- package/dist/src/lib/constants.js +13 -1
- package/dist/src/lib/constants.js.map +1 -1
- package/dist/src/lib/detection/__tests__/context.test.js +72 -0
- package/dist/src/lib/detection/__tests__/context.test.js.map +1 -0
- package/dist/src/lib/detection/__tests__/features.test.d.ts +1 -0
- package/dist/src/lib/detection/__tests__/features.test.js +75 -0
- package/dist/src/lib/detection/__tests__/features.test.js.map +1 -0
- package/dist/src/lib/detection/__tests__/package-manager.test.d.ts +1 -0
- package/dist/src/lib/{__tests__/package-manager-detection.test.js → detection/__tests__/package-manager.test.js} +25 -25
- package/dist/src/lib/detection/__tests__/package-manager.test.js.map +1 -0
- package/dist/src/lib/detection/context.d.ts +31 -0
- package/dist/src/lib/detection/context.js +92 -0
- package/dist/src/lib/detection/context.js.map +1 -0
- package/dist/src/lib/detection/features.d.ts +16 -0
- package/dist/src/lib/detection/features.js +56 -0
- package/dist/src/lib/detection/features.js.map +1 -0
- package/dist/src/lib/detection/framework.d.ts +14 -0
- package/dist/src/lib/detection/framework.js +35 -0
- package/dist/src/lib/detection/framework.js.map +1 -0
- package/dist/src/lib/detection/index.d.ts +3 -0
- package/dist/src/lib/detection/index.js +11 -0
- package/dist/src/lib/detection/index.js.map +1 -0
- package/dist/src/lib/{package-manager-detection.js → detection/package-manager.js} +3 -3
- package/dist/src/lib/detection/package-manager.js.map +1 -0
- package/dist/src/lib/framework-config.d.ts +1 -1
- package/dist/src/lib/framework-config.js.map +1 -1
- package/dist/src/lib/health-checks/endpoints.js +2 -1
- package/dist/src/lib/health-checks/endpoints.js.map +1 -1
- package/dist/src/lib/middleware/benchmark.js +1 -1
- package/dist/src/lib/middleware/benchmark.js.map +1 -1
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +1 -1
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.js.map +1 -1
- package/dist/src/lib/middleware/benchmarks/json-writer.js +1 -1
- package/dist/src/lib/middleware/benchmarks/json-writer.js.map +1 -1
- package/dist/src/lib/middleware/benchmarks/summary.js +1 -1
- package/dist/src/lib/middleware/benchmarks/summary.js.map +1 -1
- package/dist/src/lib/middleware/config.js +1 -1
- package/dist/src/lib/middleware/config.js.map +1 -1
- package/dist/src/lib/version.d.ts +1 -1
- package/dist/src/lib/version.js +1 -1
- package/dist/src/lib/version.js.map +1 -1
- package/dist/src/lib/wizard-session.d.ts +20 -7
- package/dist/src/lib/wizard-session.js +4 -0
- package/dist/src/lib/wizard-session.js.map +1 -1
- package/dist/src/lib/wizard-tools.d.ts +28 -1
- package/dist/src/lib/wizard-tools.js +24 -0
- package/dist/src/lib/wizard-tools.js.map +1 -1
- package/dist/src/lib/workflows/__tests__/agent-skill.test.d.ts +1 -0
- package/dist/src/lib/workflows/__tests__/agent-skill.test.js +66 -0
- package/dist/src/lib/workflows/__tests__/agent-skill.test.js.map +1 -0
- package/dist/src/lib/workflows/__tests__/revenue-analytics-detect.test.d.ts +1 -0
- package/dist/src/lib/workflows/__tests__/revenue-analytics-detect.test.js +101 -0
- package/dist/src/lib/workflows/__tests__/revenue-analytics-detect.test.js.map +1 -0
- package/dist/src/lib/workflows/__tests__/workflow-registry.test.d.ts +1 -0
- package/dist/src/lib/workflows/__tests__/workflow-registry.test.js +32 -0
- package/dist/src/lib/workflows/__tests__/workflow-registry.test.js.map +1 -0
- package/dist/src/lib/workflows/__tests__/workflow-step.test.d.ts +1 -0
- package/dist/src/lib/workflows/__tests__/workflow-step.test.js +54 -0
- package/dist/src/lib/workflows/__tests__/workflow-step.test.js.map +1 -0
- package/dist/src/lib/workflows/agent-skill/index.d.ts +44 -0
- package/dist/src/lib/workflows/agent-skill/index.js +47 -0
- package/dist/src/lib/workflows/agent-skill/index.js.map +1 -0
- package/dist/src/lib/workflows/agent-skill/steps.d.ts +8 -0
- package/dist/src/lib/workflows/agent-skill/steps.js +32 -0
- package/dist/src/lib/workflows/agent-skill/steps.js.map +1 -0
- package/dist/src/lib/workflows/posthog-integration/detect.d.ts +12 -0
- package/dist/src/lib/workflows/posthog-integration/detect.js +57 -0
- package/dist/src/lib/workflows/posthog-integration/detect.js.map +1 -0
- package/dist/src/lib/workflows/posthog-integration/index.d.ts +3 -0
- package/dist/src/lib/workflows/posthog-integration/index.js +152 -0
- package/dist/src/lib/workflows/posthog-integration/index.js.map +1 -0
- package/dist/src/lib/workflows/posthog-integration/steps.d.ts +9 -0
- package/dist/src/lib/workflows/posthog-integration/steps.js +100 -0
- package/dist/src/lib/workflows/posthog-integration/steps.js.map +1 -0
- package/dist/src/lib/workflows/revenue-analytics/detect.d.ts +40 -0
- package/dist/src/lib/workflows/revenue-analytics/detect.js +156 -0
- package/dist/src/lib/workflows/revenue-analytics/detect.js.map +1 -0
- package/dist/src/lib/workflows/revenue-analytics/index.d.ts +4 -0
- package/dist/src/lib/workflows/revenue-analytics/index.js +30 -0
- package/dist/src/lib/workflows/revenue-analytics/index.js.map +1 -0
- package/dist/src/lib/workflows/revenue-analytics/steps.d.ts +8 -0
- package/dist/src/lib/workflows/revenue-analytics/steps.js +48 -0
- package/dist/src/lib/workflows/revenue-analytics/steps.js.map +1 -0
- package/dist/src/lib/workflows/workflow-registry.d.ts +18 -0
- package/dist/src/lib/workflows/workflow-registry.js +32 -0
- package/dist/src/lib/workflows/workflow-registry.js.map +1 -0
- package/dist/src/lib/workflows/workflow-step.d.ts +126 -0
- package/dist/src/lib/workflows/workflow-step.js +28 -0
- package/dist/src/lib/workflows/workflow-step.js.map +1 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +2 -1
- package/dist/src/steps/add-mcp-server-to-clients/index.js.map +1 -1
- package/dist/src/ui/logging-ui.d.ts +6 -3
- package/dist/src/ui/logging-ui.js +7 -0
- package/dist/src/ui/logging-ui.js.map +1 -1
- package/dist/src/ui/tui/__tests__/flows.test.d.ts +1 -0
- package/dist/src/ui/tui/__tests__/flows.test.js +115 -0
- package/dist/src/ui/tui/__tests__/flows.test.js.map +1 -0
- package/dist/src/ui/tui/__tests__/router.test.d.ts +1 -0
- package/dist/src/ui/tui/__tests__/router.test.js +87 -0
- package/dist/src/ui/tui/__tests__/router.test.js.map +1 -0
- package/dist/src/ui/tui/__tests__/store.test.js +100 -10
- package/dist/src/ui/tui/__tests__/store.test.js.map +1 -1
- package/dist/src/ui/tui/flows.d.ts +17 -6
- package/dist/src/ui/tui/flows.js +28 -52
- package/dist/src/ui/tui/flows.js.map +1 -1
- package/dist/src/ui/tui/ink-ui.d.ts +6 -3
- package/dist/src/ui/tui/ink-ui.js +7 -0
- package/dist/src/ui/tui/ink-ui.js.map +1 -1
- package/dist/src/ui/tui/primitives/ProgressList.d.ts +3 -1
- package/dist/src/ui/tui/primitives/ProgressList.js +2 -2
- package/dist/src/ui/tui/primitives/ProgressList.js.map +1 -1
- package/dist/src/ui/tui/router.js +1 -1
- package/dist/src/ui/tui/router.js.map +1 -1
- package/dist/src/ui/tui/screen-registry.js +2 -0
- package/dist/src/ui/tui/screen-registry.js.map +1 -1
- package/dist/src/ui/tui/screens/ManagedSettingsScreen.js.map +1 -1
- package/dist/src/ui/tui/screens/OutroScreen.js +1 -1
- package/dist/src/ui/tui/screens/OutroScreen.js.map +1 -1
- package/dist/src/ui/tui/screens/RevenueIntroScreen.d.ts +16 -0
- package/dist/src/ui/tui/screens/RevenueIntroScreen.js +64 -0
- package/dist/src/ui/tui/screens/RevenueIntroScreen.js.map +1 -0
- package/dist/src/ui/tui/screens/RunScreen.js +1 -1
- package/dist/src/ui/tui/screens/RunScreen.js.map +1 -1
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js.map +1 -1
- package/dist/src/ui/tui/screens/health/HealthCheckScreen.js +2 -2
- package/dist/src/ui/tui/screens/health/HealthCheckScreen.js.map +1 -1
- package/dist/src/ui/tui/start-tui.js +2 -2
- package/dist/src/ui/tui/start-tui.js.map +1 -1
- package/dist/src/ui/tui/store.d.ts +46 -21
- package/dist/src/ui/tui/store.js +105 -47
- package/dist/src/ui/tui/store.js.map +1 -1
- package/dist/src/ui/wizard-ui.d.ts +13 -3
- package/dist/src/ui/wizard-ui.js.map +1 -1
- package/dist/src/utils/__tests__/provisioning.test.d.ts +1 -0
- package/dist/src/utils/__tests__/provisioning.test.js +192 -0
- package/dist/src/utils/__tests__/provisioning.test.js.map +1 -0
- package/dist/src/utils/file-utils.d.ts +8 -0
- package/dist/src/utils/file-utils.js +32 -0
- package/dist/src/utils/file-utils.js.map +1 -1
- package/dist/src/utils/provisioning.d.ts +25 -0
- package/dist/src/utils/provisioning.js +191 -0
- package/dist/src/utils/provisioning.js.map +1 -0
- package/dist/src/utils/setup-utils.d.ts +4 -1
- package/dist/src/utils/setup-utils.js +46 -2
- package/dist/src/utils/setup-utils.js.map +1 -1
- package/dist/src/utils/types.d.ts +4 -0
- package/dist/src/utils/types.js.map +1 -1
- package/dist/src/utils/wizard-abort.d.ts +3 -0
- package/dist/src/utils/wizard-abort.js +5 -3
- package/dist/src/utils/wizard-abort.js.map +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/dist/src/__tests__/run.test.js +0 -95
- package/dist/src/__tests__/run.test.js.map +0 -1
- package/dist/src/lib/__tests__/package-manager-detection.test.js.map +0 -1
- package/dist/src/lib/agent-interface.js.map +0 -1
- package/dist/src/lib/agent-runner.d.ts +0 -9
- package/dist/src/lib/agent-runner.js +0 -383
- package/dist/src/lib/agent-runner.js.map +0 -1
- package/dist/src/lib/commandments.js.map +0 -1
- package/dist/src/lib/package-manager-detection.js.map +0 -1
- package/dist/src/run.d.ts +0 -22
- package/dist/src/run.js +0 -152
- package/dist/src/run.js.map +0 -1
- /package/dist/src/{__tests__/run.test.d.ts → lib/agent/__tests__/agent-prompt.test.d.ts} +0 -0
- /package/dist/src/lib/{commandments.d.ts → agent/commandments.d.ts} +0 -0
- /package/dist/src/lib/{commandments.js → agent/commandments.js} +0 -0
- /package/dist/src/lib/{__tests__/package-manager-detection.test.d.ts → detection/__tests__/context.test.d.ts} +0 -0
- /package/dist/src/lib/{package-manager-detection.d.ts → detection/package-manager.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/lib/workflows/revenue-analytics/index.ts"],"names":[],"mappings":";;;AACA,yCAAwD;AACxD,2CAAkD;AAErC,QAAA,sBAAsB,GAAmB;IACpD,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,4DAA4D;IACzE,OAAO,EAAE,yBAAyB;IAClC,KAAK,EAAE,qCAA0B;IACjC,GAAG,EAAE;QACH,OAAO,EAAE,yBAAyB;QAClC,gBAAgB,EAAE,yBAAyB;QAC3C,YAAY,EAAE,GAAG,EAAE,CAAC,4CAA4C;QAChE,cAAc,EAAE,+BAA+B;QAC/C,UAAU,EAAE,2BAA2B;QACvC,OAAO,EAAE,4CAA4C;QACrD,cAAc,EAAE,iCAAiC;QACjD,wBAAwB,EAAE,CAAC;QAC3B,UAAU,EAAE,+BAAmB;KAChC;IACD,QAAQ,EAAE,CAAC,qBAAqB,CAAC;CAClC,CAAC;AAEF,uCAAwD;AAA/C,sHAAA,0BAA0B,OAAA;AACnC,yCAKqB;AAJnB,uHAAA,0BAA0B,OAAA;AAC1B,yGAAA,YAAY,OAAA;AACZ,wGAAA,WAAW,OAAA","sourcesContent":["import type { WorkflowConfig } from '../workflow-step.js';\nimport { REVENUE_ANALYTICS_WORKFLOW } from './steps.js';\nimport { REVENUE_ABORT_CASES } from './detect.js';\n\nexport const revenueAnalyticsConfig: WorkflowConfig = {\n command: 'revenue',\n description: 'Set up PostHog revenue analytics (e.g. Stripe integration)',\n flowKey: 'revenue-analytics-setup',\n steps: REVENUE_ANALYTICS_WORKFLOW,\n run: {\n skillId: 'revenue-analytics-setup',\n integrationLabel: 'revenue-analytics-setup',\n customPrompt: () => 'Set up revenue analytics for this project.',\n successMessage: 'Revenue analytics configured!',\n reportFile: 'posthog-revenue-report.md',\n docsUrl: 'https://posthog.com/docs/revenue-analytics',\n spinnerMessage: 'Setting up revenue analytics...',\n estimatedDurationMinutes: 5,\n abortCases: REVENUE_ABORT_CASES,\n },\n requires: ['posthog-integration'],\n};\n\nexport { REVENUE_ANALYTICS_WORKFLOW } from './steps.js';\nexport {\n detectRevenuePrerequisites,\n POSTHOG_SDKS,\n STRIPE_SDKS,\n type RevenueDetectError,\n} from './detect.js';\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Revenue analytics workflow step list.
|
|
3
|
+
*
|
|
4
|
+
* The detect step checks for PostHog + Stripe SDKs. The skill install
|
|
5
|
+
* and agent run live in the workflow runner (see agent-runner.ts).
|
|
6
|
+
*/
|
|
7
|
+
import type { Workflow } from '../workflow-step.js';
|
|
8
|
+
export declare const REVENUE_ANALYTICS_WORKFLOW: Workflow;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Revenue analytics workflow step list.
|
|
4
|
+
*
|
|
5
|
+
* The detect step checks for PostHog + Stripe SDKs. The skill install
|
|
6
|
+
* and agent run live in the workflow runner (see agent-runner.ts).
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.REVENUE_ANALYTICS_WORKFLOW = void 0;
|
|
10
|
+
const wizard_session_js_1 = require("../../wizard-session.js");
|
|
11
|
+
const detect_js_1 = require("./detect.js");
|
|
12
|
+
exports.REVENUE_ANALYTICS_WORKFLOW = [
|
|
13
|
+
{
|
|
14
|
+
id: 'detect',
|
|
15
|
+
label: 'Detecting prerequisites',
|
|
16
|
+
// Headless step: no screen, no gate. onReady fires after bin.ts
|
|
17
|
+
// assigns the session — the hook scans for PostHog + Stripe SDKs
|
|
18
|
+
// and writes the results (or a detectError) to frameworkContext
|
|
19
|
+
// for the intro screen to render.
|
|
20
|
+
onReady: (ctx) => (0, detect_js_1.detectRevenuePrerequisites)(ctx.session, ctx.setFrameworkContext),
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: 'intro',
|
|
24
|
+
label: 'Welcome',
|
|
25
|
+
screen: 'revenue-intro',
|
|
26
|
+
gate: (session) => session.setupConfirmed,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'auth',
|
|
30
|
+
label: 'Authentication',
|
|
31
|
+
screen: 'auth',
|
|
32
|
+
isComplete: (session) => session.credentials !== null,
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'run',
|
|
36
|
+
label: 'Revenue analytics',
|
|
37
|
+
screen: 'run',
|
|
38
|
+
isComplete: (session) => session.runPhase === wizard_session_js_1.RunPhase.Completed ||
|
|
39
|
+
session.runPhase === wizard_session_js_1.RunPhase.Error,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'outro',
|
|
43
|
+
label: 'Done',
|
|
44
|
+
screen: 'outro',
|
|
45
|
+
isComplete: (session) => session.outroDismissed,
|
|
46
|
+
},
|
|
47
|
+
];
|
|
48
|
+
//# sourceMappingURL=steps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"steps.js","sourceRoot":"","sources":["../../../../../src/lib/workflows/revenue-analytics/steps.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAGH,+DAAmD;AACnD,2CAAyD;AAE5C,QAAA,0BAA0B,GAAa;IAClD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,yBAAyB;QAChC,gEAAgE;QAChE,iEAAiE;QACjE,gEAAgE;QAChE,kCAAkC;QAClC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,IAAA,sCAA0B,EAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,mBAAmB,CAAC;KACnE;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,eAAe;QACvB,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc;KAC1C;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,gBAAgB;QACvB,MAAM,EAAE,MAAM;QACd,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,KAAK,IAAI;KACtD;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,mBAAmB;QAC1B,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACtB,OAAO,CAAC,QAAQ,KAAK,4BAAQ,CAAC,SAAS;YACvC,OAAO,CAAC,QAAQ,KAAK,4BAAQ,CAAC,KAAK;KACtC;IACD;QACE,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,MAAM;QACb,MAAM,EAAE,OAAO;QACf,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc;KAChD;CACF,CAAC","sourcesContent":["/**\n * Revenue analytics workflow step list.\n *\n * The detect step checks for PostHog + Stripe SDKs. The skill install\n * and agent run live in the workflow runner (see agent-runner.ts).\n */\n\nimport type { Workflow } from '../workflow-step.js';\nimport { RunPhase } from '../../wizard-session.js';\nimport { detectRevenuePrerequisites } from './detect.js';\n\nexport const REVENUE_ANALYTICS_WORKFLOW: Workflow = [\n {\n id: 'detect',\n label: 'Detecting prerequisites',\n // Headless step: no screen, no gate. onReady fires after bin.ts\n // assigns the session — the hook scans for PostHog + Stripe SDKs\n // and writes the results (or a detectError) to frameworkContext\n // for the intro screen to render.\n onReady: (ctx) =>\n detectRevenuePrerequisites(ctx.session, ctx.setFrameworkContext),\n },\n {\n id: 'intro',\n label: 'Welcome',\n screen: 'revenue-intro',\n gate: (session) => session.setupConfirmed,\n },\n {\n id: 'auth',\n label: 'Authentication',\n screen: 'auth',\n isComplete: (session) => session.credentials !== null,\n },\n {\n id: 'run',\n label: 'Revenue analytics',\n screen: 'run',\n isComplete: (session) =>\n session.runPhase === RunPhase.Completed ||\n session.runPhase === RunPhase.Error,\n },\n {\n id: 'outro',\n label: 'Done',\n screen: 'outro',\n isComplete: (session) => session.outroDismissed,\n },\n];\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central registry of all wizard workflows.
|
|
3
|
+
*
|
|
4
|
+
* Adding a new workflow:
|
|
5
|
+
* 1. Create src/lib/workflows/<name>/ with index.ts exporting a WorkflowConfig
|
|
6
|
+
* 2. Import and add it to WORKFLOW_REGISTRY below
|
|
7
|
+
* 3. Add a matching Flow enum entry in src/ui/tui/flows.ts
|
|
8
|
+
* 4. (If custom intro screen) add to src/ui/tui/screen-registry.tsx
|
|
9
|
+
*
|
|
10
|
+
* flows.ts, store.ts, and bin.ts all derive their wiring from this array —
|
|
11
|
+
* no need to touch those files when adding a workflow.
|
|
12
|
+
*/
|
|
13
|
+
import type { WorkflowConfig } from './workflow-step.js';
|
|
14
|
+
export declare const WORKFLOW_REGISTRY: WorkflowConfig[];
|
|
15
|
+
/** Look up a workflow config by its flowKey. */
|
|
16
|
+
export declare function getWorkflowConfig(flowKey: string): WorkflowConfig | undefined;
|
|
17
|
+
/** All workflow configs that are exposed as CLI subcommands. */
|
|
18
|
+
export declare function getSubcommandWorkflows(): WorkflowConfig[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Central registry of all wizard workflows.
|
|
4
|
+
*
|
|
5
|
+
* Adding a new workflow:
|
|
6
|
+
* 1. Create src/lib/workflows/<name>/ with index.ts exporting a WorkflowConfig
|
|
7
|
+
* 2. Import and add it to WORKFLOW_REGISTRY below
|
|
8
|
+
* 3. Add a matching Flow enum entry in src/ui/tui/flows.ts
|
|
9
|
+
* 4. (If custom intro screen) add to src/ui/tui/screen-registry.tsx
|
|
10
|
+
*
|
|
11
|
+
* flows.ts, store.ts, and bin.ts all derive their wiring from this array —
|
|
12
|
+
* no need to touch those files when adding a workflow.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.WORKFLOW_REGISTRY = void 0;
|
|
16
|
+
exports.getWorkflowConfig = getWorkflowConfig;
|
|
17
|
+
exports.getSubcommandWorkflows = getSubcommandWorkflows;
|
|
18
|
+
const index_js_1 = require("./posthog-integration/index.js");
|
|
19
|
+
const index_js_2 = require("./revenue-analytics/index.js");
|
|
20
|
+
exports.WORKFLOW_REGISTRY = [
|
|
21
|
+
index_js_1.posthogIntegrationConfig,
|
|
22
|
+
index_js_2.revenueAnalyticsConfig,
|
|
23
|
+
];
|
|
24
|
+
/** Look up a workflow config by its flowKey. */
|
|
25
|
+
function getWorkflowConfig(flowKey) {
|
|
26
|
+
return exports.WORKFLOW_REGISTRY.find((c) => c.flowKey === flowKey);
|
|
27
|
+
}
|
|
28
|
+
/** All workflow configs that are exposed as CLI subcommands. */
|
|
29
|
+
function getSubcommandWorkflows() {
|
|
30
|
+
return exports.WORKFLOW_REGISTRY.filter((c) => c.command != null);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=workflow-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-registry.js","sourceRoot":"","sources":["../../../../src/lib/workflows/workflow-registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;AAYH,8CAEC;AAGD,wDAEC;AAhBD,6DAA0E;AAC1E,2DAAsE;AAEzD,QAAA,iBAAiB,GAAqB;IACjD,mCAAwB;IACxB,iCAAsB;CACvB,CAAC;AAEF,gDAAgD;AAChD,SAAgB,iBAAiB,CAAC,OAAe;IAC/C,OAAO,yBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED,gEAAgE;AAChE,SAAgB,sBAAsB;IACpC,OAAO,yBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["/**\n * Central registry of all wizard workflows.\n *\n * Adding a new workflow:\n * 1. Create src/lib/workflows/<name>/ with index.ts exporting a WorkflowConfig\n * 2. Import and add it to WORKFLOW_REGISTRY below\n * 3. Add a matching Flow enum entry in src/ui/tui/flows.ts\n * 4. (If custom intro screen) add to src/ui/tui/screen-registry.tsx\n *\n * flows.ts, store.ts, and bin.ts all derive their wiring from this array —\n * no need to touch those files when adding a workflow.\n */\n\nimport type { WorkflowConfig } from './workflow-step.js';\nimport { posthogIntegrationConfig } from './posthog-integration/index.js';\nimport { revenueAnalyticsConfig } from './revenue-analytics/index.js';\n\nexport const WORKFLOW_REGISTRY: WorkflowConfig[] = [\n posthogIntegrationConfig,\n revenueAnalyticsConfig,\n];\n\n/** Look up a workflow config by its flowKey. */\nexport function getWorkflowConfig(flowKey: string): WorkflowConfig | undefined {\n return WORKFLOW_REGISTRY.find((c) => c.flowKey === flowKey);\n}\n\n/** All workflow configs that are exposed as CLI subcommands. */\nexport function getSubcommandWorkflows(): WorkflowConfig[] {\n return WORKFLOW_REGISTRY.filter((c) => c.command != null);\n}\n"]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import type { WizardSession, DiscoveredFeature } from '../wizard-session';
|
|
2
|
+
import type { WizardReadinessResult } from '../health-checks/readiness.js';
|
|
3
|
+
import type { WorkflowRun } from '../agent/agent-runner.js';
|
|
4
|
+
import type { Integration } from '../constants.js';
|
|
5
|
+
import type { FrameworkConfig } from '../framework-config.js';
|
|
6
|
+
/**
|
|
7
|
+
* A workflow step is the primary unit of the wizard's execution model.
|
|
8
|
+
*
|
|
9
|
+
* It can own:
|
|
10
|
+
* - a screen in the TUI (optional — some steps are headless)
|
|
11
|
+
* - agent work via a workflow reference (optional — some steps are UI-only)
|
|
12
|
+
* - completion and visibility predicates
|
|
13
|
+
*
|
|
14
|
+
* The current PostHog integration flow is one ordered list of steps.
|
|
15
|
+
* Future flows (e.g. revenue analytics) register a different step list.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Context passed to onInit callbacks — fires during store construction,
|
|
19
|
+
* before bin.ts has assigned the real session.
|
|
20
|
+
*/
|
|
21
|
+
export interface StoreInitContext {
|
|
22
|
+
readonly session: WizardSession;
|
|
23
|
+
readonly setReadinessResult: (result: WizardReadinessResult | null) => void;
|
|
24
|
+
readonly setFrameworkContext: (key: string, value: unknown) => void;
|
|
25
|
+
readonly emitChange: () => void;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Context passed to onReady callbacks — fires after bin.ts has assigned
|
|
29
|
+
* the real session, so reading `session.installDir` returns the target
|
|
30
|
+
* project. Use for async pre-flow work like prerequisite detection.
|
|
31
|
+
*/
|
|
32
|
+
export interface WorkflowReadyContext {
|
|
33
|
+
readonly session: WizardSession;
|
|
34
|
+
readonly setFrameworkContext: (key: string, value: unknown) => void;
|
|
35
|
+
readonly setFrameworkConfig: (integration: Integration, config: FrameworkConfig) => void;
|
|
36
|
+
readonly setDetectedFramework: (label: string) => void;
|
|
37
|
+
readonly setUnsupportedVersion: (info: {
|
|
38
|
+
current: string;
|
|
39
|
+
minimum: string;
|
|
40
|
+
docsUrl: string;
|
|
41
|
+
}) => void;
|
|
42
|
+
readonly addDiscoveredFeature: (feature: DiscoveredFeature) => void;
|
|
43
|
+
readonly setDetectionComplete: () => void;
|
|
44
|
+
}
|
|
45
|
+
export interface WorkflowStep {
|
|
46
|
+
/** Unique identifier for this step */
|
|
47
|
+
id: string;
|
|
48
|
+
/** Human-readable label for progress display */
|
|
49
|
+
label: string;
|
|
50
|
+
/**
|
|
51
|
+
* TUI screen this step owns, if any.
|
|
52
|
+
* Matches the Screen enum values (e.g. 'intro', 'run', 'outro').
|
|
53
|
+
*/
|
|
54
|
+
screen?: string;
|
|
55
|
+
/**
|
|
56
|
+
* Whether this step should be visible in the current flow.
|
|
57
|
+
* If omitted, the step is always visible.
|
|
58
|
+
*/
|
|
59
|
+
show?: (session: WizardSession) => boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Exit condition for the screen. Router advances when true.
|
|
62
|
+
* Defaults to `gate` if unset.
|
|
63
|
+
*/
|
|
64
|
+
isComplete?: (session: WizardSession) => boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Define a gate if your screen needs to await user interactions.
|
|
67
|
+
* bin.ts can `await store.getGate(stepId)` to pause until the
|
|
68
|
+
* predicate becomes true.
|
|
69
|
+
*/
|
|
70
|
+
gate?: (session: WizardSession) => boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Called once during store construction, with the default session.
|
|
73
|
+
* Use for session-independent fire-and-forget work that should start
|
|
74
|
+
* as early as possible (e.g. health check kicked off while the user
|
|
75
|
+
* is still reading the intro screen).
|
|
76
|
+
*/
|
|
77
|
+
onInit?: (ctx: StoreInitContext) => void;
|
|
78
|
+
/**
|
|
79
|
+
* Called once after bin.ts has assigned the real session to the store,
|
|
80
|
+
* before any gate is awaited. Awaited in sequence with other steps'
|
|
81
|
+
* onReady callbacks. Use for session-dependent pre-flow work like
|
|
82
|
+
* scanning the installDir for prerequisites. May be sync or async.
|
|
83
|
+
*/
|
|
84
|
+
onReady?: (ctx: WorkflowReadyContext) => void | Promise<void>;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* An ordered list of workflow steps that defines a wizard flow.
|
|
88
|
+
*/
|
|
89
|
+
export type Workflow = WorkflowStep[];
|
|
90
|
+
/**
|
|
91
|
+
* Uniform configuration for a wizard workflow.
|
|
92
|
+
*
|
|
93
|
+
* Each workflow directory exports one of these. The system uses it
|
|
94
|
+
* for CLI registration, flow/step wiring, and skill bootstrap.
|
|
95
|
+
*/
|
|
96
|
+
export interface WorkflowConfig {
|
|
97
|
+
/** CLI command name (e.g. 'revenue'). Omit for the default flow. */
|
|
98
|
+
command?: string;
|
|
99
|
+
/** CLI description shown in --help */
|
|
100
|
+
description: string;
|
|
101
|
+
/** Unique flow key — matches the Flow enum value */
|
|
102
|
+
flowKey: string;
|
|
103
|
+
/** The ordered step list */
|
|
104
|
+
steps: Workflow;
|
|
105
|
+
/** Agent run config. Static object or async function for dynamic config. */
|
|
106
|
+
run?: WorkflowRun | ((session: WizardSession) => Promise<WorkflowRun>);
|
|
107
|
+
/** Prerequisites: other workflow flowKeys that must have run first */
|
|
108
|
+
requires?: string[];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Project a Workflow into the narrower FlowEntry shape the router consumes.
|
|
112
|
+
*
|
|
113
|
+
* Two things happen here:
|
|
114
|
+
* 1. Headless steps (no `screen`) are filtered out. The router walks
|
|
115
|
+
* visible screens; gate-only steps like `detect` are store concerns.
|
|
116
|
+
* 2. The step is narrowed to just { screen, show, isComplete } — the
|
|
117
|
+
* router has no business touching gate, onInit, id, or label.
|
|
118
|
+
*
|
|
119
|
+
* This intentional separation keeps the router focused on one question:
|
|
120
|
+
* "Which screen should be rendered right now?"
|
|
121
|
+
*/
|
|
122
|
+
export declare function workflowToFlowEntries(workflow: Workflow): Array<{
|
|
123
|
+
screen: string;
|
|
124
|
+
show?: (session: WizardSession) => boolean;
|
|
125
|
+
isComplete?: (session: WizardSession) => boolean;
|
|
126
|
+
}>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.workflowToFlowEntries = workflowToFlowEntries;
|
|
4
|
+
/**
|
|
5
|
+
* Project a Workflow into the narrower FlowEntry shape the router consumes.
|
|
6
|
+
*
|
|
7
|
+
* Two things happen here:
|
|
8
|
+
* 1. Headless steps (no `screen`) are filtered out. The router walks
|
|
9
|
+
* visible screens; gate-only steps like `detect` are store concerns.
|
|
10
|
+
* 2. The step is narrowed to just { screen, show, isComplete } — the
|
|
11
|
+
* router has no business touching gate, onInit, id, or label.
|
|
12
|
+
*
|
|
13
|
+
* This intentional separation keeps the router focused on one question:
|
|
14
|
+
* "Which screen should be rendered right now?"
|
|
15
|
+
*/
|
|
16
|
+
function workflowToFlowEntries(workflow) {
|
|
17
|
+
return workflow
|
|
18
|
+
.filter((step) => step.screen != null)
|
|
19
|
+
.map((step) => ({
|
|
20
|
+
screen: step.screen,
|
|
21
|
+
show: step.show,
|
|
22
|
+
// `isComplete` defaults to `gate` — for most steps they're the same
|
|
23
|
+
// predicate (e.g. intro: setupConfirmed unblocks bin.ts AND finishes
|
|
24
|
+
// the screen). Only override when the two conditions diverge.
|
|
25
|
+
isComplete: step.isComplete ?? step.gate,
|
|
26
|
+
}));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=workflow-step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-step.js","sourceRoot":"","sources":["../../../../src/lib/workflows/workflow-step.ts"],"names":[],"mappings":";;AA2IA,sDAeC;AA3BD;;;;;;;;;;;GAWG;AACH,SAAgB,qBAAqB,CAAC,QAAkB;IAKtD,OAAO,QAAQ;SACZ,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC;SACrC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACd,MAAM,EAAE,IAAI,CAAC,MAAO;QACpB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,oEAAoE;QACpE,qEAAqE;QACrE,8DAA8D;QAC9D,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI;KACzC,CAAC,CAAC,CAAC;AACR,CAAC","sourcesContent":["import type { WizardSession, DiscoveredFeature } from '../wizard-session';\nimport type { WizardReadinessResult } from '../health-checks/readiness.js';\nimport type { WorkflowRun } from '../agent/agent-runner.js';\nimport type { Integration } from '../constants.js';\nimport type { FrameworkConfig } from '../framework-config.js';\n\n/**\n * A workflow step is the primary unit of the wizard's execution model.\n *\n * It can own:\n * - a screen in the TUI (optional — some steps are headless)\n * - agent work via a workflow reference (optional — some steps are UI-only)\n * - completion and visibility predicates\n *\n * The current PostHog integration flow is one ordered list of steps.\n * Future flows (e.g. revenue analytics) register a different step list.\n */\n/**\n * Context passed to onInit callbacks — fires during store construction,\n * before bin.ts has assigned the real session.\n */\nexport interface StoreInitContext {\n readonly session: WizardSession;\n readonly setReadinessResult: (result: WizardReadinessResult | null) => void;\n readonly setFrameworkContext: (key: string, value: unknown) => void;\n readonly emitChange: () => void;\n}\n\n/**\n * Context passed to onReady callbacks — fires after bin.ts has assigned\n * the real session, so reading `session.installDir` returns the target\n * project. Use for async pre-flow work like prerequisite detection.\n */\nexport interface WorkflowReadyContext {\n readonly session: WizardSession;\n readonly setFrameworkContext: (key: string, value: unknown) => void;\n\n // Detection-specific methods — used by core-integration's detect step\n readonly setFrameworkConfig: (\n integration: Integration,\n config: FrameworkConfig,\n ) => void;\n readonly setDetectedFramework: (label: string) => void;\n readonly setUnsupportedVersion: (info: {\n current: string;\n minimum: string;\n docsUrl: string;\n }) => void;\n readonly addDiscoveredFeature: (feature: DiscoveredFeature) => void;\n readonly setDetectionComplete: () => void;\n}\n\nexport interface WorkflowStep {\n /** Unique identifier for this step */\n id: string;\n\n /** Human-readable label for progress display */\n label: string;\n\n /**\n * TUI screen this step owns, if any.\n * Matches the Screen enum values (e.g. 'intro', 'run', 'outro').\n */\n screen?: string;\n\n /**\n * Whether this step should be visible in the current flow.\n * If omitted, the step is always visible.\n */\n show?: (session: WizardSession) => boolean;\n\n /**\n * Exit condition for the screen. Router advances when true.\n * Defaults to `gate` if unset.\n */\n isComplete?: (session: WizardSession) => boolean;\n\n /**\n * Define a gate if your screen needs to await user interactions.\n * bin.ts can `await store.getGate(stepId)` to pause until the\n * predicate becomes true.\n */\n gate?: (session: WizardSession) => boolean;\n\n /**\n * Called once during store construction, with the default session.\n * Use for session-independent fire-and-forget work that should start\n * as early as possible (e.g. health check kicked off while the user\n * is still reading the intro screen).\n */\n onInit?: (ctx: StoreInitContext) => void;\n\n /**\n * Called once after bin.ts has assigned the real session to the store,\n * before any gate is awaited. Awaited in sequence with other steps'\n * onReady callbacks. Use for session-dependent pre-flow work like\n * scanning the installDir for prerequisites. May be sync or async.\n */\n onReady?: (ctx: WorkflowReadyContext) => void | Promise<void>;\n}\n\n/**\n * An ordered list of workflow steps that defines a wizard flow.\n */\nexport type Workflow = WorkflowStep[];\n\n/**\n * Uniform configuration for a wizard workflow.\n *\n * Each workflow directory exports one of these. The system uses it\n * for CLI registration, flow/step wiring, and skill bootstrap.\n */\nexport interface WorkflowConfig {\n /** CLI command name (e.g. 'revenue'). Omit for the default flow. */\n command?: string;\n /** CLI description shown in --help */\n description: string;\n /** Unique flow key — matches the Flow enum value */\n flowKey: string;\n /** The ordered step list */\n steps: Workflow;\n /** Agent run config. Static object or async function for dynamic config. */\n run?: WorkflowRun | ((session: WizardSession) => Promise<WorkflowRun>);\n /** Prerequisites: other workflow flowKeys that must have run first */\n requires?: string[];\n}\n\n/**\n * Project a Workflow into the narrower FlowEntry shape the router consumes.\n *\n * Two things happen here:\n * 1. Headless steps (no `screen`) are filtered out. The router walks\n * visible screens; gate-only steps like `detect` are store concerns.\n * 2. The step is narrowed to just { screen, show, isComplete } — the\n * router has no business touching gate, onInit, id, or label.\n *\n * This intentional separation keeps the router focused on one question:\n * \"Which screen should be rendered right now?\"\n */\nexport function workflowToFlowEntries(workflow: Workflow): Array<{\n screen: string;\n show?: (session: WizardSession) => boolean;\n isComplete?: (session: WizardSession) => boolean;\n}> {\n return workflow\n .filter((step) => step.screen != null)\n .map((step) => ({\n screen: step.screen!,\n show: step.show,\n // `isComplete` defaults to `gate` — for most steps they're the same\n // predicate (e.g. intro: setupConfirmed unblocks bin.ts AND finishes\n // the screen). Only override when the two conditions diverge.\n isComplete: step.isComplete ?? step.gate,\n }));\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Integration } from '../../lib/constants';
|
|
2
|
+
import type { CloudRegion } from '../../utils/types';
|
|
2
3
|
import { MCPClient } from './MCPClient';
|
|
3
4
|
export declare const getSupportedClients: () => Promise<MCPClient[]>;
|
|
4
5
|
/**
|
|
@@ -9,7 +10,7 @@ export declare const addMCPServerToClientsStep: ({ integration, local, ci, cloud
|
|
|
9
10
|
integration?: Integration;
|
|
10
11
|
local?: boolean;
|
|
11
12
|
ci?: boolean;
|
|
12
|
-
cloudRegion?:
|
|
13
|
+
cloudRegion?: CloudRegion;
|
|
13
14
|
features?: string[];
|
|
14
15
|
apiKey?: string;
|
|
15
16
|
}) => Promise<string[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/steps/add-mcp-server-to-clients/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from '../../lib/constants';\nimport type { CloudRegion } from '../../utils/types';\nimport { traceStep } from '../../telemetry';\nimport { analytics } from '../../utils/analytics';\nimport { getUI } from '../../ui';\nimport { MCPClient } from './MCPClient';\nimport { CursorMCPClient } from './clients/cursor';\nimport { ClaudeMCPClient } from './clients/claude';\nimport { ClaudeCodeMCPClient } from './clients/claude-code';\nimport { VisualStudioCodeClient } from './clients/visual-studio-code';\nimport { ZedClient } from './clients/zed';\nimport { CodexMCPClient } from './clients/codex';\nimport { ALL_FEATURE_VALUES } from './defaults';\nimport { debug } from '../../utils/debug';\n\nexport const getSupportedClients = async (): Promise<MCPClient[]> => {\n const allClients = [\n new CursorMCPClient(),\n new ClaudeMCPClient(),\n new ClaudeCodeMCPClient(),\n new VisualStudioCodeClient(),\n new ZedClient(),\n new CodexMCPClient(),\n ];\n const supportedClients: MCPClient[] = [];\n\n debug('Checking for supported MCP clients...');\n for (const client of allClients) {\n const isSupported = await client.isClientSupported();\n debug(`${client.name}: ${isSupported ? '✓ supported' : '✗ not supported'}`);\n if (isSupported) {\n supportedClients.push(client);\n }\n }\n debug(\n `Found ${supportedClients.length} supported client(s): ${supportedClients\n .map((c) => c.name)\n .join(', ')}`,\n );\n\n return supportedClients;\n};\n\n/**\n * Add MCP server to clients. No prompts — pure orchestration.\n * Prompts are handled by McpScreen (TUI) or auto-accepted (CI).\n */\nexport const addMCPServerToClientsStep = async ({\n integration,\n local = false,\n ci = false,\n cloudRegion: _cloudRegion,\n features,\n apiKey,\n}: {\n integration?: Integration;\n local?: boolean;\n ci?: boolean;\n cloudRegion?: CloudRegion;\n features?: string[];\n apiKey?: string;\n}): Promise<string[]> => {\n const ui = getUI();\n\n // CI mode: skip MCP installation entirely\n if (ci) {\n ui.log.info('Skipping MCP installation (CI mode)');\n return [];\n }\n\n const supportedClients = await getSupportedClients();\n\n if (supportedClients.length === 0) {\n ui.log.info(\n 'No supported MCP clients detected. Skipping MCP installation.',\n );\n return [];\n }\n\n // Auto-install to all supported clients\n await traceStep('adding mcp servers', async () => {\n await addMCPServer(\n supportedClients,\n apiKey,\n features ?? [...ALL_FEATURE_VALUES],\n local,\n );\n });\n\n ui.log.success(\n `Added the MCP server to:\n ${supportedClients.map((c) => `- ${c.name}`).join('\\n ')} `,\n );\n\n analytics.wizardCapture('mcp servers added', {\n clients: supportedClients.map((c) => c.name),\n integration,\n });\n\n return supportedClients.map((c) => c.name);\n};\n\nexport const removeMCPServerFromClientsStep = async ({\n integration,\n local = false,\n}: {\n integration?: Integration;\n local?: boolean;\n}): Promise<string[]> => {\n const installedClients = await getInstalledClients(local);\n if (installedClients.length === 0) {\n analytics.wizardCapture('mcp no servers to remove', {\n integration,\n });\n return [];\n }\n\n // Auto-remove from all installed clients\n const results = await traceStep('removing mcp servers', async () => {\n await removeMCPServer(installedClients, local);\n return installedClients.map((c) => c.name);\n });\n\n analytics.wizardCapture('mcp servers removed', {\n clients: results,\n integration,\n });\n\n return results;\n};\n\nexport const getInstalledClients = async (\n local?: boolean,\n): Promise<MCPClient[]> => {\n const clients = await getSupportedClients();\n const installedClients: MCPClient[] = [];\n\n for (const client of clients) {\n if (await client.isServerInstalled(local)) {\n installedClients.push(client);\n }\n }\n\n return installedClients;\n};\n\nexport const addMCPServer = async (\n clients: MCPClient[],\n personalApiKey?: string,\n selectedFeatures?: string[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.addServer(personalApiKey, selectedFeatures, local);\n }\n};\n\nexport const removeMCPServer = async (\n clients: MCPClient[],\n local?: boolean,\n): Promise<void> => {\n for (const client of clients) {\n await client.removeServer(local);\n }\n};\n"]}
|
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
* No prompts, no TUI, no interactivity. Just console output.
|
|
4
4
|
*/
|
|
5
5
|
import { type WizardUI, type SpinnerHandle } from './wizard-ui';
|
|
6
|
-
import type { SettingsConflict } from '../lib/agent-interface';
|
|
6
|
+
import type { SettingsConflict } from '../lib/agent/agent-interface';
|
|
7
|
+
import type { WizardReadinessResult } from '../lib/health-checks/readiness.js';
|
|
8
|
+
import type { OutroData } from '../lib/wizard-session';
|
|
7
9
|
export declare class LoggingUI implements WizardUI {
|
|
8
10
|
intro(message: string): void;
|
|
9
11
|
outro(message: string): void;
|
|
12
|
+
outroError(data: OutroData): void;
|
|
10
13
|
cancel(message: string): void;
|
|
11
14
|
log: {
|
|
12
15
|
info(message: string): void;
|
|
@@ -21,8 +24,8 @@ export declare class LoggingUI implements WizardUI {
|
|
|
21
24
|
setDetectedFramework(label: string): void;
|
|
22
25
|
onEnterScreen(_screen: string, _fn: () => void): void;
|
|
23
26
|
setLoginUrl(url: string | null): void;
|
|
24
|
-
showBlockingOutage(result:
|
|
25
|
-
setReadinessWarnings(result:
|
|
27
|
+
showBlockingOutage(result: WizardReadinessResult): Promise<void>;
|
|
28
|
+
setReadinessWarnings(result: WizardReadinessResult): void;
|
|
26
29
|
showPortConflict(_processInfo: {
|
|
27
30
|
command: string;
|
|
28
31
|
pid: string;
|
|
@@ -14,6 +14,13 @@ class LoggingUI {
|
|
|
14
14
|
outro(message) {
|
|
15
15
|
console.log(`└ ${message}`);
|
|
16
16
|
}
|
|
17
|
+
outroError(data) {
|
|
18
|
+
console.log(`✖ ${data.message ?? 'Wizard aborted'}`);
|
|
19
|
+
if (data.body)
|
|
20
|
+
console.log(`│ ${data.body}`);
|
|
21
|
+
if (data.docsUrl)
|
|
22
|
+
console.log(`│ Docs: ${data.docsUrl}`);
|
|
23
|
+
}
|
|
17
24
|
cancel(message) {
|
|
18
25
|
console.log(`■ ${message}`);
|
|
19
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging-ui.js","sourceRoot":"","sources":["../../../src/ui/logging-ui.ts"],"names":[],"mappings":";AAAA,+BAA+B;AAC/B;;;GAGG;;;AAEH,2CAA4E;
|
|
1
|
+
{"version":3,"file":"logging-ui.js","sourceRoot":"","sources":["../../../src/ui/logging-ui.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\n/**\n * LoggingUI — Logging-only implementation for CI mode.\n * No prompts, no TUI, no interactivity. Just console output.\n */\n\nimport { TaskStatus, type WizardUI, type SpinnerHandle } from './wizard-ui';\nimport type { SettingsConflict } from '../lib/agent/agent-interface';\nimport type { WizardReadinessResult } from '../lib/health-checks/readiness.js';\nimport type { OutroData } from '../lib/wizard-session';\n\nexport class LoggingUI implements WizardUI {\n intro(message: string): void {\n console.log(`┌ ${message}`);\n }\n\n outro(message: string): void {\n console.log(`└ ${message}`);\n }\n\n outroError(data: OutroData): void {\n console.log(`✖ ${data.message ?? 'Wizard aborted'}`);\n if (data.body) console.log(`│ ${data.body}`);\n if (data.docsUrl) console.log(`│ Docs: ${data.docsUrl}`);\n }\n\n cancel(message: string): void {\n console.log(`■ ${message}`);\n }\n\n log = {\n info(message: string): void {\n console.log(`│ ${message}`);\n },\n warn(message: string): void {\n console.log(`▲ ${message}`);\n },\n error(message: string): void {\n console.log(`✖ ${message}`);\n },\n success(message: string): void {\n console.log(`✔ ${message}`);\n },\n step(message: string): void {\n console.log(`◇ ${message}`);\n },\n };\n\n note(message: string): void {\n console.log(`│ ${message}`);\n }\n\n spinner(): SpinnerHandle {\n return {\n start(message?: string) {\n if (message) console.log(`◌ ${message}`);\n },\n stop(message?: string) {\n if (message) console.log(`● ${message}`);\n },\n message(msg?: string) {\n if (msg) console.log(`◌ ${msg}`);\n },\n };\n }\n\n pushStatus(message: string): void {\n console.log(`◇ ${message}`);\n }\n\n setDetectedFramework(label: string): void {\n console.log(`✔ Framework: ${label}`);\n }\n\n onEnterScreen(_screen: string, _fn: () => void): void {\n // No screen transitions in CI\n }\n\n setLoginUrl(url: string | null): void {\n if (url) {\n console.log(\n `│ If the browser didn't open automatically, use this link:`,\n );\n console.log(`│ ${url}`);\n }\n }\n\n showBlockingOutage(result: WizardReadinessResult): Promise<void> {\n console.log(`▲ Service health issues detected — blocking outage.`);\n for (const reason of result.reasons) {\n console.log(`│ ${reason}`);\n }\n console.log(\n `│ The wizard may not work reliably while services are affected.`,\n );\n return Promise.resolve();\n }\n\n setReadinessWarnings(result: WizardReadinessResult): void {\n console.log(`▲ Service health warnings detected.`);\n for (const reason of result.reasons) {\n console.log(`│ ${reason}`);\n }\n }\n\n showPortConflict(_processInfo: {\n command: string;\n pid: string;\n user: string;\n }): Promise<void> {\n return Promise.resolve();\n }\n\n showSettingsOverride(\n _conflicts: SettingsConflict[],\n _backupAndFix: () => boolean,\n ): Promise<void> {\n return Promise.resolve();\n }\n\n showAuthError(): void {\n console.log(`✖ Authentication failed (401)`);\n console.log(\n `│ Claude Code auth is conflicting with the wizard. Please try again after logging out:`,\n );\n console.log(`│ claude auth logout`);\n }\n\n startRun(): void {\n // No-op in CI mode\n }\n\n setCredentials(_credentials: {\n accessToken: string;\n projectApiKey: string;\n host: string;\n projectId: number;\n }): void {\n // No-op in CI mode — credentials are handled directly\n }\n\n syncTodos(\n todos: Array<{ content: string; status: string; activeForm?: string }>,\n ): void {\n const completed = todos.filter(\n (t) => t.status === TaskStatus.Completed,\n ).length;\n const inProgress = todos.find((t) => t.status === TaskStatus.InProgress);\n if (inProgress) {\n console.log(\n `◌ [${completed}/${todos.length}] ${\n inProgress.activeForm || inProgress.content\n }`,\n );\n }\n }\n\n setEventPlan(_events: Array<{ name: string; description: string }>): void {\n // No-op in CI mode\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { buildSession, RunPhase } from '../../../lib/wizard-session.js';
|
|
2
|
+
import { WizardReadiness } from '../../../lib/health-checks/readiness.js';
|
|
3
|
+
import { FLOWS, Flow, Screen } from '../flows.js';
|
|
4
|
+
function getEntry(flow, screen) {
|
|
5
|
+
const entry = FLOWS[flow].find((candidate) => candidate.screen === screen);
|
|
6
|
+
if (!entry) {
|
|
7
|
+
throw new Error(`Missing flow entry for ${flow}:${screen}`);
|
|
8
|
+
}
|
|
9
|
+
return entry;
|
|
10
|
+
}
|
|
11
|
+
describe('FLOWS', () => {
|
|
12
|
+
describe('Wizard setup predicate', () => {
|
|
13
|
+
it('hides setup when there are no setup questions', () => {
|
|
14
|
+
const session = buildSession({});
|
|
15
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.Setup);
|
|
16
|
+
expect(entry.show?.(session)).toBe(false);
|
|
17
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it('shows setup when framework questions are missing answers', () => {
|
|
20
|
+
const session = buildSession({});
|
|
21
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.Setup);
|
|
22
|
+
session.frameworkConfig = {
|
|
23
|
+
metadata: {
|
|
24
|
+
setup: {
|
|
25
|
+
questions: [{ key: 'packageManager' }, { key: 'srcDir' }],
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
session.frameworkContext = { packageManager: 'pnpm' };
|
|
30
|
+
expect(entry.show?.(session)).toBe(true);
|
|
31
|
+
expect(entry.isComplete?.(session)).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it('marks setup complete once all required answers are present', () => {
|
|
34
|
+
const session = buildSession({});
|
|
35
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.Setup);
|
|
36
|
+
session.frameworkConfig = {
|
|
37
|
+
metadata: {
|
|
38
|
+
setup: {
|
|
39
|
+
questions: [{ key: 'packageManager' }, { key: 'srcDir' }],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
session.frameworkContext = {
|
|
44
|
+
packageManager: 'pnpm',
|
|
45
|
+
srcDir: 'src',
|
|
46
|
+
};
|
|
47
|
+
expect(entry.show?.(session)).toBe(false);
|
|
48
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
describe('Wizard health-check predicate', () => {
|
|
52
|
+
it('stays incomplete before readiness exists', () => {
|
|
53
|
+
const session = buildSession({});
|
|
54
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.HealthCheck);
|
|
55
|
+
expect(entry.isComplete?.(session)).toBe(false);
|
|
56
|
+
});
|
|
57
|
+
it('stays incomplete for blocking readiness until outage is dismissed', () => {
|
|
58
|
+
const session = buildSession({});
|
|
59
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.HealthCheck);
|
|
60
|
+
session.readinessResult = {
|
|
61
|
+
decision: WizardReadiness.No,
|
|
62
|
+
health: {},
|
|
63
|
+
reasons: ['Anthropic: down'],
|
|
64
|
+
};
|
|
65
|
+
expect(entry.isComplete?.(session)).toBe(false);
|
|
66
|
+
session.outageDismissed = true;
|
|
67
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
it('completes immediately for non-blocking readiness', () => {
|
|
70
|
+
const session = buildSession({});
|
|
71
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.HealthCheck);
|
|
72
|
+
session.readinessResult = {
|
|
73
|
+
decision: WizardReadiness.YesWithWarnings,
|
|
74
|
+
health: {},
|
|
75
|
+
reasons: [],
|
|
76
|
+
};
|
|
77
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe('Wizard run predicate', () => {
|
|
81
|
+
it('stays incomplete while run is idle or running', () => {
|
|
82
|
+
const session = buildSession({});
|
|
83
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.Run);
|
|
84
|
+
session.runPhase = RunPhase.Idle;
|
|
85
|
+
expect(entry.isComplete?.(session)).toBe(false);
|
|
86
|
+
session.runPhase = RunPhase.Running;
|
|
87
|
+
expect(entry.isComplete?.(session)).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
it('completes when run finishes or errors', () => {
|
|
90
|
+
const session = buildSession({});
|
|
91
|
+
const entry = getEntry(Flow.PostHogIntegration, Screen.Run);
|
|
92
|
+
session.runPhase = RunPhase.Completed;
|
|
93
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
94
|
+
session.runPhase = RunPhase.Error;
|
|
95
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('MCP flow predicates', () => {
|
|
99
|
+
it('uses mcpComplete for McpAdd', () => {
|
|
100
|
+
const session = buildSession({});
|
|
101
|
+
const entry = getEntry(Flow.McpAdd, Screen.McpAdd);
|
|
102
|
+
expect(entry.isComplete?.(session)).toBe(false);
|
|
103
|
+
session.mcpComplete = true;
|
|
104
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
105
|
+
});
|
|
106
|
+
it('uses mcpComplete for McpRemove', () => {
|
|
107
|
+
const session = buildSession({});
|
|
108
|
+
const entry = getEntry(Flow.McpRemove, Screen.McpRemove);
|
|
109
|
+
expect(entry.isComplete?.(session)).toBe(false);
|
|
110
|
+
session.mcpComplete = true;
|
|
111
|
+
expect(entry.isComplete?.(session)).toBe(true);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
//# sourceMappingURL=flows.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flows.test.js","sourceRoot":"","sources":["../../../../../src/ui/tui/__tests__/flows.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { buildSession, RunPhase } from '../../../lib/wizard-session.js';\nimport { WizardReadiness } from '../../../lib/health-checks/readiness.js';\nimport { FLOWS, Flow, Screen } from '../flows.js';\n\nfunction getEntry(flow: Flow, screen: Screen) {\n const entry = FLOWS[flow].find((candidate) => candidate.screen === screen);\n if (!entry) {\n throw new Error(`Missing flow entry for ${flow}:${screen}`);\n }\n return entry;\n}\n\ndescribe('FLOWS', () => {\n describe('Wizard setup predicate', () => {\n it('hides setup when there are no setup questions', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.Setup);\n\n expect(entry.show?.(session)).toBe(false);\n expect(entry.isComplete?.(session)).toBe(true);\n });\n\n it('shows setup when framework questions are missing answers', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.Setup);\n\n session.frameworkConfig = {\n metadata: {\n setup: {\n questions: [{ key: 'packageManager' }, { key: 'srcDir' }],\n },\n },\n } as never;\n session.frameworkContext = { packageManager: 'pnpm' };\n\n expect(entry.show?.(session)).toBe(true);\n expect(entry.isComplete?.(session)).toBe(false);\n });\n\n it('marks setup complete once all required answers are present', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.Setup);\n\n session.frameworkConfig = {\n metadata: {\n setup: {\n questions: [{ key: 'packageManager' }, { key: 'srcDir' }],\n },\n },\n } as never;\n session.frameworkContext = {\n packageManager: 'pnpm',\n srcDir: 'src',\n };\n\n expect(entry.show?.(session)).toBe(false);\n expect(entry.isComplete?.(session)).toBe(true);\n });\n });\n\n describe('Wizard health-check predicate', () => {\n it('stays incomplete before readiness exists', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.HealthCheck);\n\n expect(entry.isComplete?.(session)).toBe(false);\n });\n\n it('stays incomplete for blocking readiness until outage is dismissed', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.HealthCheck);\n\n session.readinessResult = {\n decision: WizardReadiness.No,\n health: {} as never,\n reasons: ['Anthropic: down'],\n };\n\n expect(entry.isComplete?.(session)).toBe(false);\n\n session.outageDismissed = true;\n\n expect(entry.isComplete?.(session)).toBe(true);\n });\n\n it('completes immediately for non-blocking readiness', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.HealthCheck);\n\n session.readinessResult = {\n decision: WizardReadiness.YesWithWarnings,\n health: {} as never,\n reasons: [],\n };\n\n expect(entry.isComplete?.(session)).toBe(true);\n });\n });\n\n describe('Wizard run predicate', () => {\n it('stays incomplete while run is idle or running', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.Run);\n\n session.runPhase = RunPhase.Idle;\n expect(entry.isComplete?.(session)).toBe(false);\n\n session.runPhase = RunPhase.Running;\n expect(entry.isComplete?.(session)).toBe(false);\n });\n\n it('completes when run finishes or errors', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.PostHogIntegration, Screen.Run);\n\n session.runPhase = RunPhase.Completed;\n expect(entry.isComplete?.(session)).toBe(true);\n\n session.runPhase = RunPhase.Error;\n expect(entry.isComplete?.(session)).toBe(true);\n });\n });\n\n describe('MCP flow predicates', () => {\n it('uses mcpComplete for McpAdd', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.McpAdd, Screen.McpAdd);\n\n expect(entry.isComplete?.(session)).toBe(false);\n\n session.mcpComplete = true;\n\n expect(entry.isComplete?.(session)).toBe(true);\n });\n\n it('uses mcpComplete for McpRemove', () => {\n const session = buildSession({});\n const entry = getEntry(Flow.McpRemove, Screen.McpRemove);\n\n expect(entry.isComplete?.(session)).toBe(false);\n\n session.mcpComplete = true;\n\n expect(entry.isComplete?.(session)).toBe(true);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|