@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,323 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unified workflow runner.
|
|
4
|
+
*
|
|
5
|
+
* Single configurable pipeline for all workflows. Each workflow
|
|
6
|
+
* provides a WorkflowRun (via the `run` field on WorkflowConfig)
|
|
7
|
+
* that controls:
|
|
8
|
+
* - Whether a skill is pre-installed or discovered at runtime
|
|
9
|
+
* - How the agent prompt is built
|
|
10
|
+
* - What MCP servers and package manager detector to use
|
|
11
|
+
* - What happens after the agent completes
|
|
12
|
+
*
|
|
13
|
+
* The pipeline itself is fixed:
|
|
14
|
+
* init → health check → settings → OAuth → [skill install] →
|
|
15
|
+
* agent init → prompt → run → errors → [postRun] → outro
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.runAgent = runAgent;
|
|
19
|
+
exports.runWorkflow = runWorkflow;
|
|
20
|
+
const fs_1 = require("fs");
|
|
21
|
+
const path_1 = require("path");
|
|
22
|
+
const wizard_session_1 = require("../wizard-session");
|
|
23
|
+
const setup_utils_1 = require("../../utils/setup-utils");
|
|
24
|
+
const analytics_1 = require("../../utils/analytics");
|
|
25
|
+
const ui_1 = require("../../ui");
|
|
26
|
+
const agent_interface_1 = require("./agent-interface");
|
|
27
|
+
const urls_1 = require("../../utils/urls");
|
|
28
|
+
const readiness_1 = require("../health-checks/readiness");
|
|
29
|
+
const debug_1 = require("../../utils/debug");
|
|
30
|
+
const benchmark_1 = require("../middleware/benchmark");
|
|
31
|
+
const wizard_abort_1 = require("../../utils/wizard-abort");
|
|
32
|
+
const yara_hooks_1 = require("../yara-hooks");
|
|
33
|
+
const package_manager_1 = require("../detection/package-manager");
|
|
34
|
+
const constants_1 = require("../constants");
|
|
35
|
+
const wizard_tools_1 = require("../wizard-tools");
|
|
36
|
+
const agent_prompt_1 = require("./agent-prompt");
|
|
37
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
38
|
+
function sessionToOptions(session) {
|
|
39
|
+
return {
|
|
40
|
+
installDir: session.installDir,
|
|
41
|
+
debug: session.debug,
|
|
42
|
+
forceInstall: session.forceInstall,
|
|
43
|
+
default: false,
|
|
44
|
+
signup: session.signup,
|
|
45
|
+
localMcp: session.localMcp,
|
|
46
|
+
ci: session.ci,
|
|
47
|
+
menu: session.menu,
|
|
48
|
+
benchmark: session.benchmark,
|
|
49
|
+
projectId: session.projectId,
|
|
50
|
+
apiKey: session.apiKey,
|
|
51
|
+
yaraReport: session.yaraReport,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// ── Runner ───────────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Resolve a WorkflowConfig's agent run definition and execute the pipeline.
|
|
57
|
+
* Entry point for bin.ts — handles buildRunConfig, bootstrap, and (future) run field.
|
|
58
|
+
*/
|
|
59
|
+
async function runAgent(workflowConfig, session) {
|
|
60
|
+
if (!workflowConfig.run) {
|
|
61
|
+
throw new Error(`Workflow "${workflowConfig.flowKey}" has no run configuration.`);
|
|
62
|
+
}
|
|
63
|
+
const runDef = typeof workflowConfig.run === 'function'
|
|
64
|
+
? await workflowConfig.run(session)
|
|
65
|
+
: workflowConfig.run;
|
|
66
|
+
await runWorkflow(session, runDef);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Run a workflow's agent pipeline.
|
|
70
|
+
*
|
|
71
|
+
* This is the single execution path for all workflows — both skill-based
|
|
72
|
+
* (revenue analytics) and framework-based (core integration). The
|
|
73
|
+
* `WorkflowRun` controls what varies between them.
|
|
74
|
+
*/
|
|
75
|
+
async function runWorkflow(session, config) {
|
|
76
|
+
// 1. Init logging + debug
|
|
77
|
+
(0, debug_1.initLogFile)();
|
|
78
|
+
(0, debug_1.logToFile)(`[agent-runner] START ${config.integrationLabel}`);
|
|
79
|
+
if (session.debug) {
|
|
80
|
+
(0, debug_1.enableDebugLogs)();
|
|
81
|
+
}
|
|
82
|
+
const skillsBaseUrl = (0, constants_1.getSkillsBaseUrl)(session.localMcp);
|
|
83
|
+
// 2. Health check (guarded — skip if TUI already ran it)
|
|
84
|
+
if (!session.readinessResult) {
|
|
85
|
+
(0, debug_1.logToFile)('[agent-runner] evaluating wizard readiness');
|
|
86
|
+
const readiness = await (0, readiness_1.evaluateWizardReadiness)();
|
|
87
|
+
(0, debug_1.logToFile)(`[agent-runner] readiness=${readiness.decision}`);
|
|
88
|
+
if (readiness.decision === readiness_1.WizardReadiness.No) {
|
|
89
|
+
await (0, ui_1.getUI)().showBlockingOutage(readiness);
|
|
90
|
+
}
|
|
91
|
+
else if (readiness.decision === readiness_1.WizardReadiness.YesWithWarnings) {
|
|
92
|
+
(0, ui_1.getUI)().setReadinessWarnings(readiness);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// 3. Settings conflicts
|
|
96
|
+
const settingsConflicts = (0, agent_interface_1.checkAllSettingsConflicts)(session.installDir);
|
|
97
|
+
(0, debug_1.logToFile)(`[agent-runner] settings conflicts: ${settingsConflicts.length > 0
|
|
98
|
+
? settingsConflicts
|
|
99
|
+
.map((c) => `${c.source}(${c.keys.join(',')})`)
|
|
100
|
+
.join('; ')
|
|
101
|
+
: 'none'}`);
|
|
102
|
+
if (settingsConflicts.length > 0) {
|
|
103
|
+
for (const conflict of settingsConflicts) {
|
|
104
|
+
const level = conflict.source === 'managed' ? 'org' : conflict.source;
|
|
105
|
+
analytics_1.analytics.wizardCapture('settings conflict detected', {
|
|
106
|
+
level,
|
|
107
|
+
keys: conflict.keys,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
await (0, ui_1.getUI)().showSettingsOverride(settingsConflicts, () => (0, agent_interface_1.backupAndFixClaudeSettings)(session.installDir));
|
|
111
|
+
(0, debug_1.logToFile)('[agent-runner] settings override resolved');
|
|
112
|
+
}
|
|
113
|
+
analytics_1.analytics.wizardCapture('agent started', {
|
|
114
|
+
integration: config.integrationLabel,
|
|
115
|
+
});
|
|
116
|
+
// 4. OAuth
|
|
117
|
+
(0, debug_1.logToFile)('[agent-runner] starting OAuth');
|
|
118
|
+
const { projectApiKey, host, accessToken, projectId, cloudRegion } = await (0, setup_utils_1.getOrAskForProjectData)({
|
|
119
|
+
signup: session.signup,
|
|
120
|
+
ci: session.ci,
|
|
121
|
+
apiKey: session.apiKey,
|
|
122
|
+
projectId: session.projectId,
|
|
123
|
+
});
|
|
124
|
+
session.credentials = { accessToken, projectApiKey, host, projectId };
|
|
125
|
+
(0, ui_1.getUI)().setCredentials(session.credentials);
|
|
126
|
+
// 5. Skill install (if skillId provided)
|
|
127
|
+
let skillPath;
|
|
128
|
+
if (config.skillId) {
|
|
129
|
+
(0, debug_1.logToFile)(`[agent-runner] installing skill ${config.skillId}`);
|
|
130
|
+
const installResult = await (0, wizard_tools_1.installSkillById)(config.skillId, session.installDir, skillsBaseUrl);
|
|
131
|
+
if (installResult.kind !== 'ok') {
|
|
132
|
+
await abortOnInstallFailure(config.integrationLabel, installResult);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
skillPath = installResult.path;
|
|
136
|
+
(0, debug_1.logToFile)(`[agent-runner] skill installed at ${skillPath}`);
|
|
137
|
+
}
|
|
138
|
+
// 6. Initialize agent
|
|
139
|
+
const spinner = (0, ui_1.getUI)().spinner();
|
|
140
|
+
const wizardFlags = await analytics_1.analytics.getAllFlagsForWizard();
|
|
141
|
+
const wizardMetadata = (0, agent_interface_1.buildWizardMetadata)(wizardFlags);
|
|
142
|
+
const mcpUrl = session.localMcp
|
|
143
|
+
? 'http://localhost:8787/mcp'
|
|
144
|
+
: process.env.MCP_URL ||
|
|
145
|
+
(cloudRegion === 'eu'
|
|
146
|
+
? 'https://mcp-eu.posthog.com/mcp'
|
|
147
|
+
: 'https://mcp.posthog.com/mcp');
|
|
148
|
+
const restoreSettings = () => (0, agent_interface_1.restoreClaudeSettings)(session.installDir);
|
|
149
|
+
(0, ui_1.getUI)().onEnterScreen('outro', restoreSettings);
|
|
150
|
+
if (session.yaraReport) {
|
|
151
|
+
(0, wizard_abort_1.registerCleanup)(() => {
|
|
152
|
+
const reportPath = (0, yara_hooks_1.writeScanReport)();
|
|
153
|
+
if (reportPath) {
|
|
154
|
+
const summary = (0, yara_hooks_1.formatScanReport)();
|
|
155
|
+
(0, ui_1.getUI)().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
(0, ui_1.getUI)().startRun();
|
|
160
|
+
const agent = await (0, agent_interface_1.initializeAgent)({
|
|
161
|
+
workingDirectory: session.installDir,
|
|
162
|
+
posthogMcpUrl: mcpUrl,
|
|
163
|
+
posthogApiKey: accessToken,
|
|
164
|
+
posthogApiHost: host,
|
|
165
|
+
additionalMcpServers: config.additionalMcpServers,
|
|
166
|
+
detectPackageManager: config.detectPackageManager ?? package_manager_1.detectNodePackageManagers,
|
|
167
|
+
skillsBaseUrl,
|
|
168
|
+
wizardFlags,
|
|
169
|
+
wizardMetadata,
|
|
170
|
+
}, sessionToOptions(session));
|
|
171
|
+
const middleware = session.benchmark
|
|
172
|
+
? (0, benchmark_1.createBenchmarkPipeline)(spinner, sessionToOptions(session))
|
|
173
|
+
: undefined;
|
|
174
|
+
// 7. Build prompt
|
|
175
|
+
const prompt = (0, agent_prompt_1.assemblePrompt)(config, {
|
|
176
|
+
projectId,
|
|
177
|
+
projectApiKey,
|
|
178
|
+
host,
|
|
179
|
+
skillPath,
|
|
180
|
+
});
|
|
181
|
+
// 8. Run agent
|
|
182
|
+
const agentResult = await (0, agent_interface_1.runAgent)(agent, prompt, sessionToOptions(session), spinner, {
|
|
183
|
+
estimatedDurationMinutes: config.estimatedDurationMinutes,
|
|
184
|
+
spinnerMessage: config.spinnerMessage,
|
|
185
|
+
successMessage: config.successMessage,
|
|
186
|
+
errorMessage: config.errorMessage ?? `${config.integrationLabel} failed`,
|
|
187
|
+
additionalFeatureQueue: config.additionalFeatureQueue ?? [],
|
|
188
|
+
abortCases: config.abortCases,
|
|
189
|
+
}, middleware);
|
|
190
|
+
// 9. Error handling (full set from both runners)
|
|
191
|
+
if (agentResult.error === agent_interface_1.AgentErrorType.ABORT) {
|
|
192
|
+
const reason = agentResult.message ?? '';
|
|
193
|
+
const matched = config.abortCases?.find((c) => c.match.test(reason));
|
|
194
|
+
const outroData = matched
|
|
195
|
+
? {
|
|
196
|
+
kind: wizard_session_1.OutroKind.Error,
|
|
197
|
+
message: matched.message,
|
|
198
|
+
body: matched.body,
|
|
199
|
+
docsUrl: matched.docsUrl,
|
|
200
|
+
}
|
|
201
|
+
: {
|
|
202
|
+
kind: wizard_session_1.OutroKind.Error,
|
|
203
|
+
message: `${config.integrationLabel} aborted`,
|
|
204
|
+
body: reason || 'The agent aborted the workflow.',
|
|
205
|
+
docsUrl: config.docsUrl,
|
|
206
|
+
};
|
|
207
|
+
analytics_1.analytics.wizardCapture('agent aborted', {
|
|
208
|
+
integration: config.integrationLabel,
|
|
209
|
+
reason,
|
|
210
|
+
matched: matched?.message ?? null,
|
|
211
|
+
});
|
|
212
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
213
|
+
outroData,
|
|
214
|
+
error: new wizard_abort_1.WizardError(`Agent aborted: ${reason}`, {
|
|
215
|
+
integration: config.integrationLabel,
|
|
216
|
+
error_type: agent_interface_1.AgentErrorType.ABORT,
|
|
217
|
+
reason,
|
|
218
|
+
}),
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
if (agentResult.error === agent_interface_1.AgentErrorType.MCP_MISSING) {
|
|
222
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
223
|
+
message: 'Could not access the PostHog MCP server\n\n' +
|
|
224
|
+
'The wizard was unable to connect to the PostHog MCP server.\n' +
|
|
225
|
+
'This could be due to a network issue or a configuration problem.\n\n' +
|
|
226
|
+
`Please try again, or check the documentation:\n${config.docsUrl}`,
|
|
227
|
+
error: new wizard_abort_1.WizardError('Agent could not access PostHog MCP server', {
|
|
228
|
+
integration: config.integrationLabel,
|
|
229
|
+
error_type: agent_interface_1.AgentErrorType.MCP_MISSING,
|
|
230
|
+
signal: agent_interface_1.AgentSignals.ERROR_MCP_MISSING,
|
|
231
|
+
}),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
if (agentResult.error === agent_interface_1.AgentErrorType.RESOURCE_MISSING) {
|
|
235
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
236
|
+
message: 'Could not access the setup resource\n\n' +
|
|
237
|
+
'This may indicate a version mismatch or a temporary service issue.\n\n' +
|
|
238
|
+
`Please try again, or check the documentation:\n${config.docsUrl}`,
|
|
239
|
+
error: new wizard_abort_1.WizardError('Agent could not access setup resource', {
|
|
240
|
+
integration: config.integrationLabel,
|
|
241
|
+
error_type: agent_interface_1.AgentErrorType.RESOURCE_MISSING,
|
|
242
|
+
signal: agent_interface_1.AgentSignals.ERROR_RESOURCE_MISSING,
|
|
243
|
+
}),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
if (agentResult.error === agent_interface_1.AgentErrorType.YARA_VIOLATION) {
|
|
247
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
248
|
+
message: 'Security violation detected.\nPlease report this to: wizard@posthog.com',
|
|
249
|
+
error: new wizard_abort_1.WizardError('YARA scanner terminated session', {
|
|
250
|
+
integration: config.integrationLabel,
|
|
251
|
+
error_type: agent_interface_1.AgentErrorType.YARA_VIOLATION,
|
|
252
|
+
}),
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
if (agentResult.error === agent_interface_1.AgentErrorType.RATE_LIMIT ||
|
|
256
|
+
agentResult.error === agent_interface_1.AgentErrorType.API_ERROR) {
|
|
257
|
+
analytics_1.analytics.wizardCapture('agent api error', {
|
|
258
|
+
integration: config.integrationLabel,
|
|
259
|
+
error_type: agentResult.error,
|
|
260
|
+
error_message: agentResult.message,
|
|
261
|
+
});
|
|
262
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
263
|
+
message: `API Error\n\n${agentResult.message || 'Unknown error'}\n\nPlease report this to: wizard@posthog.com`,
|
|
264
|
+
error: new wizard_abort_1.WizardError(`API error: ${agentResult.message}`, {
|
|
265
|
+
integration: config.integrationLabel,
|
|
266
|
+
error_type: agentResult.error,
|
|
267
|
+
}),
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
// 10. Post-run hooks
|
|
271
|
+
if (config.postRun) {
|
|
272
|
+
await config.postRun(session, {
|
|
273
|
+
accessToken,
|
|
274
|
+
projectApiKey,
|
|
275
|
+
host,
|
|
276
|
+
projectId,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
// 11. Outro
|
|
280
|
+
if (config.buildOutroData) {
|
|
281
|
+
session.outroData = config.buildOutroData(session, { accessToken, projectApiKey, host, projectId }, cloudRegion);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
const continueUrl = session.signup
|
|
285
|
+
? `${(0, urls_1.getCloudUrlFromRegion)(cloudRegion)}/products?source=wizard`
|
|
286
|
+
: undefined;
|
|
287
|
+
const reportPath = (0, path_1.join)(session.installDir, config.reportFile);
|
|
288
|
+
const reportExists = (0, fs_1.existsSync)(reportPath);
|
|
289
|
+
session.outroData = {
|
|
290
|
+
kind: wizard_session_1.OutroKind.Success,
|
|
291
|
+
message: config.successMessage,
|
|
292
|
+
reportFile: reportExists ? config.reportFile : undefined,
|
|
293
|
+
docsUrl: config.docsUrl,
|
|
294
|
+
continueUrl,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
(0, ui_1.getUI)().outro(config.successMessage);
|
|
298
|
+
// 12. Analytics shutdown
|
|
299
|
+
await analytics_1.analytics.shutdown('success');
|
|
300
|
+
}
|
|
301
|
+
// ── Shared error helpers ─────────────────────────────────────────────
|
|
302
|
+
async function abortOnInstallFailure(integrationLabel, result) {
|
|
303
|
+
if (result.kind === 'ok')
|
|
304
|
+
return;
|
|
305
|
+
const message = (() => {
|
|
306
|
+
switch (result.kind) {
|
|
307
|
+
case 'menu-fetch-failed':
|
|
308
|
+
return 'Could not fetch the skill menu from context-mill.\nCheck your network connection and try again.';
|
|
309
|
+
case 'skill-not-found':
|
|
310
|
+
return `Could not find the "${result.skillId}" skill in the context-mill menu.\nPlease try again later.`;
|
|
311
|
+
case 'download-failed':
|
|
312
|
+
return `Failed to install skill: ${result.message}\nPlease try again.`;
|
|
313
|
+
}
|
|
314
|
+
})();
|
|
315
|
+
await (0, wizard_abort_1.wizardAbort)({
|
|
316
|
+
message,
|
|
317
|
+
error: new wizard_abort_1.WizardError(`Skill install failed: ${result.kind}`, {
|
|
318
|
+
integration: integrationLabel,
|
|
319
|
+
error_type: result.kind,
|
|
320
|
+
}),
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=agent-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../../../../src/lib/agent/agent-runner.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unified workflow runner.\n *\n * Single configurable pipeline for all workflows. Each workflow\n * provides a WorkflowRun (via the `run` field on WorkflowConfig)\n * that controls:\n * - Whether a skill is pre-installed or discovered at runtime\n * - How the agent prompt is built\n * - What MCP servers and package manager detector to use\n * - What happens after the agent completes\n *\n * The pipeline itself is fixed:\n * init → health check → settings → OAuth → [skill install] →\n * agent init → prompt → run → errors → [postRun] → outro\n */\n\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport {\n type WizardSession,\n type AdditionalFeature,\n type Credentials,\n OutroKind,\n} from '../wizard-session';\nimport { getOrAskForProjectData } from '../../utils/setup-utils';\nimport { analytics } from '../../utils/analytics';\nimport { getUI } from '../../ui';\nimport {\n initializeAgent,\n runAgent as executeAgent,\n AgentErrorType,\n AgentSignals,\n buildWizardMetadata,\n checkAllSettingsConflicts,\n backupAndFixClaudeSettings,\n restoreClaudeSettings,\n} from './agent-interface';\nimport { getCloudUrlFromRegion } from '../../utils/urls';\nimport {\n evaluateWizardReadiness,\n WizardReadiness,\n} from '../health-checks/readiness';\nimport { enableDebugLogs, initLogFile, logToFile } from '../../utils/debug';\nimport { createBenchmarkPipeline } from '../middleware/benchmark';\nimport {\n wizardAbort,\n WizardError,\n registerCleanup,\n} from '../../utils/wizard-abort';\nimport { formatScanReport, writeScanReport } from '../yara-hooks';\nimport { detectNodePackageManagers } from '../detection/package-manager';\nimport type { PackageManagerDetector } from '../detection/package-manager';\nimport { getSkillsBaseUrl } from '../constants';\nimport { installSkillById, type InstallSkillResult } from '../wizard-tools';\nimport type { WizardOptions } from '../../utils/types';\n\nimport type { WorkflowConfig } from '../workflows/workflow-step';\nimport { assemblePrompt, type PromptContext } from './agent-prompt';\n\nexport type { PromptContext };\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport type { Credentials };\n\n/**\n * A known `[ABORT] <reason>` case. First matching entry is rendered on\n * the error outro; unmatched aborts use a generic fallback.\n */\nexport interface AbortCase {\n match: RegExp;\n message: string;\n body: string;\n docsUrl?: string;\n}\n\n/**\n * Unified agent run configuration.\n *\n * Every workflow provides one of these — either as a static object\n * or via a function that builds one from the session. The runner\n * assembles the final prompt from `prompt` + `skillId`.\n */\nexport interface WorkflowRun {\n /** Analytics label (e.g. 'revenue-analytics-setup', 'nextjs') */\n integrationLabel: string;\n /** Skill ID to pre-install. Omit for agent-driven skill discovery. */\n skillId?: string;\n /** Additional workflow-specific prompt instructions. Appended after the default project prompt. */\n customPrompt?: (ctx: PromptContext) => string;\n /** Additional MCP servers (e.g. Svelte MCP) */\n additionalMcpServers?: Record<string, { url: string }>;\n /** Package manager detector. Defaults to detectNodePackageManagers. */\n detectPackageManager?: PackageManagerDetector;\n spinnerMessage: string;\n successMessage: string;\n estimatedDurationMinutes: number;\n reportFile: string;\n docsUrl: string;\n errorMessage?: string;\n additionalFeatureQueue?: readonly AdditionalFeature[];\n /** Known `[ABORT] <reason>` cases this workflow can render. */\n abortCases?: AbortCase[];\n /** Runs after agent completes, before outro (e.g. env var upload). */\n postRun?: (session: WizardSession, credentials: Credentials) => Promise<void>;\n /** Custom outro data. Omit for default built from successMessage/reportFile/docsUrl. */\n buildOutroData?: (\n session: WizardSession,\n credentials: Credentials,\n cloudRegion: import('../../utils/types').CloudRegion | undefined,\n ) => WizardSession['outroData'];\n}\n\n// ── Helpers ──────────────────────────────────────────────────────────\n\nfunction sessionToOptions(session: WizardSession): WizardOptions {\n return {\n installDir: session.installDir,\n debug: session.debug,\n forceInstall: session.forceInstall,\n default: false,\n signup: session.signup,\n localMcp: session.localMcp,\n ci: session.ci,\n menu: session.menu,\n benchmark: session.benchmark,\n projectId: session.projectId,\n apiKey: session.apiKey,\n yaraReport: session.yaraReport,\n };\n}\n\n// ── Runner ───────────────────────────────────────────────────────────\n\n/**\n * Resolve a WorkflowConfig's agent run definition and execute the pipeline.\n * Entry point for bin.ts — handles buildRunConfig, bootstrap, and (future) run field.\n */\nexport async function runAgent(\n workflowConfig: WorkflowConfig,\n session: WizardSession,\n): Promise<void> {\n if (!workflowConfig.run) {\n throw new Error(\n `Workflow \"${workflowConfig.flowKey}\" has no run configuration.`,\n );\n }\n\n const runDef =\n typeof workflowConfig.run === 'function'\n ? await workflowConfig.run(session)\n : workflowConfig.run;\n\n await runWorkflow(session, runDef);\n}\n\n/**\n * Run a workflow's agent pipeline.\n *\n * This is the single execution path for all workflows — both skill-based\n * (revenue analytics) and framework-based (core integration). The\n * `WorkflowRun` controls what varies between them.\n */\nexport async function runWorkflow(\n session: WizardSession,\n config: WorkflowRun,\n): Promise<void> {\n // 1. Init logging + debug\n initLogFile();\n logToFile(`[agent-runner] START ${config.integrationLabel}`);\n\n if (session.debug) {\n enableDebugLogs();\n }\n\n const skillsBaseUrl = getSkillsBaseUrl(session.localMcp);\n\n // 2. Health check (guarded — skip if TUI already ran it)\n if (!session.readinessResult) {\n logToFile('[agent-runner] evaluating wizard readiness');\n const readiness = await evaluateWizardReadiness();\n logToFile(`[agent-runner] readiness=${readiness.decision}`);\n if (readiness.decision === WizardReadiness.No) {\n await getUI().showBlockingOutage(readiness);\n } else if (readiness.decision === WizardReadiness.YesWithWarnings) {\n getUI().setReadinessWarnings(readiness);\n }\n }\n\n // 3. Settings conflicts\n const settingsConflicts = checkAllSettingsConflicts(session.installDir);\n logToFile(\n `[agent-runner] settings conflicts: ${\n settingsConflicts.length > 0\n ? settingsConflicts\n .map((c) => `${c.source}(${c.keys.join(',')})`)\n .join('; ')\n : 'none'\n }`,\n );\n\n if (settingsConflicts.length > 0) {\n for (const conflict of settingsConflicts) {\n const level = conflict.source === 'managed' ? 'org' : conflict.source;\n analytics.wizardCapture('settings conflict detected', {\n level,\n keys: conflict.keys,\n });\n }\n await getUI().showSettingsOverride(settingsConflicts, () =>\n backupAndFixClaudeSettings(session.installDir),\n );\n logToFile('[agent-runner] settings override resolved');\n }\n\n analytics.wizardCapture('agent started', {\n integration: config.integrationLabel,\n });\n\n // 4. OAuth\n logToFile('[agent-runner] starting OAuth');\n const { projectApiKey, host, accessToken, projectId, cloudRegion } =\n await getOrAskForProjectData({\n signup: session.signup,\n ci: session.ci,\n apiKey: session.apiKey,\n projectId: session.projectId,\n });\n\n session.credentials = { accessToken, projectApiKey, host, projectId };\n getUI().setCredentials(session.credentials);\n\n // 5. Skill install (if skillId provided)\n let skillPath: string | undefined;\n if (config.skillId) {\n logToFile(`[agent-runner] installing skill ${config.skillId}`);\n const installResult = await installSkillById(\n config.skillId,\n session.installDir,\n skillsBaseUrl,\n );\n if (installResult.kind !== 'ok') {\n await abortOnInstallFailure(config.integrationLabel, installResult);\n return;\n }\n skillPath = installResult.path;\n logToFile(`[agent-runner] skill installed at ${skillPath}`);\n }\n\n // 6. Initialize agent\n const spinner = getUI().spinner();\n const wizardFlags = await analytics.getAllFlagsForWizard();\n const wizardMetadata = buildWizardMetadata(wizardFlags);\n\n const mcpUrl = session.localMcp\n ? 'http://localhost:8787/mcp'\n : process.env.MCP_URL ||\n (cloudRegion === 'eu'\n ? 'https://mcp-eu.posthog.com/mcp'\n : 'https://mcp.posthog.com/mcp');\n\n const restoreSettings = () => restoreClaudeSettings(session.installDir);\n getUI().onEnterScreen('outro', restoreSettings);\n\n if (session.yaraReport) {\n registerCleanup(() => {\n const reportPath = writeScanReport();\n if (reportPath) {\n const summary = formatScanReport();\n getUI().log.info(`YARA scan report: ${reportPath}${summary ?? ''}`);\n }\n });\n }\n\n getUI().startRun();\n\n const agent = await initializeAgent(\n {\n workingDirectory: session.installDir,\n posthogMcpUrl: mcpUrl,\n posthogApiKey: accessToken,\n posthogApiHost: host,\n additionalMcpServers: config.additionalMcpServers,\n detectPackageManager:\n config.detectPackageManager ?? detectNodePackageManagers,\n skillsBaseUrl,\n wizardFlags,\n wizardMetadata,\n },\n sessionToOptions(session),\n );\n\n const middleware = session.benchmark\n ? createBenchmarkPipeline(spinner, sessionToOptions(session))\n : undefined;\n\n // 7. Build prompt\n const prompt = assemblePrompt(config, {\n projectId,\n projectApiKey,\n host,\n skillPath,\n });\n\n // 8. Run agent\n const agentResult = await executeAgent(\n agent,\n prompt,\n sessionToOptions(session),\n spinner,\n {\n estimatedDurationMinutes: config.estimatedDurationMinutes,\n spinnerMessage: config.spinnerMessage,\n successMessage: config.successMessage,\n errorMessage: config.errorMessage ?? `${config.integrationLabel} failed`,\n additionalFeatureQueue: config.additionalFeatureQueue ?? [],\n abortCases: config.abortCases,\n },\n middleware,\n );\n\n // 9. Error handling (full set from both runners)\n if (agentResult.error === AgentErrorType.ABORT) {\n const reason = agentResult.message ?? '';\n const matched = config.abortCases?.find((c) => c.match.test(reason));\n const outroData: WizardSession['outroData'] = matched\n ? {\n kind: OutroKind.Error,\n message: matched.message,\n body: matched.body,\n docsUrl: matched.docsUrl,\n }\n : {\n kind: OutroKind.Error,\n message: `${config.integrationLabel} aborted`,\n body: reason || 'The agent aborted the workflow.',\n docsUrl: config.docsUrl,\n };\n analytics.wizardCapture('agent aborted', {\n integration: config.integrationLabel,\n reason,\n matched: matched?.message ?? null,\n });\n await wizardAbort({\n outroData,\n error: new WizardError(`Agent aborted: ${reason}`, {\n integration: config.integrationLabel,\n error_type: AgentErrorType.ABORT,\n reason,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.MCP_MISSING) {\n await wizardAbort({\n message:\n 'Could not access the PostHog MCP server\\n\\n' +\n 'The wizard was unable to connect to the PostHog MCP server.\\n' +\n 'This could be due to a network issue or a configuration problem.\\n\\n' +\n `Please try again, or check the documentation:\\n${config.docsUrl}`,\n error: new WizardError('Agent could not access PostHog MCP server', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.MCP_MISSING,\n signal: AgentSignals.ERROR_MCP_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.RESOURCE_MISSING) {\n await wizardAbort({\n message:\n 'Could not access the setup resource\\n\\n' +\n 'This may indicate a version mismatch or a temporary service issue.\\n\\n' +\n `Please try again, or check the documentation:\\n${config.docsUrl}`,\n error: new WizardError('Agent could not access setup resource', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.RESOURCE_MISSING,\n signal: AgentSignals.ERROR_RESOURCE_MISSING,\n }),\n });\n }\n\n if (agentResult.error === AgentErrorType.YARA_VIOLATION) {\n await wizardAbort({\n message:\n 'Security violation detected.\\nPlease report this to: wizard@posthog.com',\n error: new WizardError('YARA scanner terminated session', {\n integration: config.integrationLabel,\n error_type: AgentErrorType.YARA_VIOLATION,\n }),\n });\n }\n\n if (\n agentResult.error === AgentErrorType.RATE_LIMIT ||\n agentResult.error === AgentErrorType.API_ERROR\n ) {\n analytics.wizardCapture('agent api error', {\n integration: config.integrationLabel,\n error_type: agentResult.error,\n error_message: agentResult.message,\n });\n\n await wizardAbort({\n message: `API Error\\n\\n${\n agentResult.message || 'Unknown error'\n }\\n\\nPlease report this to: wizard@posthog.com`,\n error: new WizardError(`API error: ${agentResult.message}`, {\n integration: config.integrationLabel,\n error_type: agentResult.error,\n }),\n });\n }\n\n // 10. Post-run hooks\n if (config.postRun) {\n await config.postRun(session, {\n accessToken,\n projectApiKey,\n host,\n projectId,\n });\n }\n\n // 11. Outro\n if (config.buildOutroData) {\n session.outroData = config.buildOutroData(\n session,\n { accessToken, projectApiKey, host, projectId },\n cloudRegion,\n );\n } else {\n const continueUrl = session.signup\n ? `${getCloudUrlFromRegion(cloudRegion)}/products?source=wizard`\n : undefined;\n\n const reportPath = join(session.installDir, config.reportFile);\n const reportExists = existsSync(reportPath);\n\n session.outroData = {\n kind: OutroKind.Success,\n message: config.successMessage,\n reportFile: reportExists ? config.reportFile : undefined,\n docsUrl: config.docsUrl,\n continueUrl,\n };\n }\n\n getUI().outro(config.successMessage);\n\n // 12. Analytics shutdown\n await analytics.shutdown('success');\n}\n\n// ── Shared error helpers ─────────────────────────────────────────────\n\nasync function abortOnInstallFailure(\n integrationLabel: string,\n result: InstallSkillResult,\n): Promise<void> {\n if (result.kind === 'ok') return;\n\n const message = (() => {\n switch (result.kind) {\n case 'menu-fetch-failed':\n return 'Could not fetch the skill menu from context-mill.\\nCheck your network connection and try again.';\n case 'skill-not-found':\n return `Could not find the \"${result.skillId}\" skill in the context-mill menu.\\nPlease try again later.`;\n case 'download-failed':\n return `Failed to install skill: ${result.message}\\nPlease try again.`;\n }\n })();\n\n await wizardAbort({\n message,\n error: new WizardError(`Skill install failed: ${result.kind}`, {\n integration: integrationLabel,\n error_type: result.kind,\n }),\n });\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandments.js","sourceRoot":"","sources":["../../../../src/lib/agent/commandments.ts"],"names":[],"mappings":";;AA8BA,sDAEC;AAhCD;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG;IAC1B,sLAAsL;IAEtL,4OAA4O;IAE5O,4LAA4L;IAE5L,oLAAoL;IAEpL,uMAAuM;IAEvM,gVAAgV;IAEhV,gNAAgN;IAEhN,+DAA+D;IAE/D,qfAAqf;IAErf,+LAA+L;IAE/L,2SAA2S;CAC5S,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,SAAgB,qBAAqB;IACnC,OAAO,mBAAmB,CAAC;AAC7B,CAAC","sourcesContent":["/**\n * Wizard-wide commandments that are always appended as a system prompt.\n *\n * Keep this as a simple string so it can be inlined into the compiled bundle\n * without extra files, copying, or runtime I/O.\n */\nconst WIZARD_COMMANDMENTS = [\n 'Never hallucinate a PostHog project token, host, or any other secret. Always use the real values that have been configured for this project (for example via environment variables).',\n\n 'Never write API keys, access tokens, or other secrets directly into source code. Always reference environment variables instead, and rely on the wizard-tools MCP server (check_env_keys / set_env_values) to create or update .env files.',\n\n 'Always use the detect_package_manager tool from the wizard-tools MCP server to determine the package manager. Do not guess based on lockfiles or hard-code npm, yarn, pnpm, bun, pip, etc.',\n\n 'When installing packages, start the installation as a background task and then continue with other work. Do not block waiting for installs to finish unless explicitly instructed.',\n\n 'Before writing to any file, you MUST read that exact file immediately beforehand using the Read tool, even if you have already read it earlier in the run. This avoids tool failures and stale edits.',\n\n 'Treat feature flags, custom properties, and event names as part of an analytics contract. Prefer reusing existing names and patterns in the project. When you must introduce new ones, make them clear, descriptive, and consistent with existing conventions, and avoid scattering the same flag or property across many unrelated callsites.',\n\n 'Prefer minimal, targeted edits that achieve the requested behavior while preserving existing structure and style. Avoid large refactors, broad reformatting, or unrelated changes unless explicitly requested.',\n\n 'Do not spawn subagents unless explicitly instructed to do so.',\n\n 'After reading the integration skill, use the TodoWrite tool to track your progress. Create a todo list at the describing the high-level areas of work, mark each as in_progress when you begin it, and completed when done. Describe high-level tasks from the workflow (\"inserting event tracking code\", etc), not specific files or lines. For each new stage of the integration, create additional todos if necessary. Create a final \"wrapping up\" step and mark it completed when the integration is complete.',\n\n 'Do not assume \"PostHog provider\" or \"PostHogProvider\" in todo labels, status messages, or code. Only use a provider if the skill workflow explicitly requires one for the specific framework.',\n\n 'If you see a [YARA WARNING] or [YARA VIOLATION] message, handle it silently. Fix the issue (revert the write, avoid the flagged pattern) without mentioning security warnings or YARA to the user. These are internal guardrails, not user-facing alerts. Never show scary security language to the user.',\n].join('\\n');\n\nexport function getWizardCommandments(): string {\n return WIZARD_COMMANDMENTS;\n}\n"]}
|
|
@@ -37,6 +37,15 @@ export declare const DEFAULT_URL: string;
|
|
|
37
37
|
export declare const DEFAULT_HOST_URL: string;
|
|
38
38
|
export declare const ISSUES_URL = "https://github.com/posthog/wizard/issues";
|
|
39
39
|
export declare const CONTEXT_MILL_URL = "https://github.com/PostHog/context-mill";
|
|
40
|
+
/** Remote base URL for fetching the skill menu + downloading skills. */
|
|
41
|
+
export declare const REMOTE_SKILLS_BASE_URL = "https://github.com/PostHog/context-mill/releases/latest/download";
|
|
42
|
+
/** Local base URL when `--local-mcp` is set (served by context-mill dev server). */
|
|
43
|
+
export declare const LOCAL_SKILLS_BASE_URL = "http://localhost:8765";
|
|
44
|
+
/**
|
|
45
|
+
* Pick the skills base URL based on the session's localMcp flag.
|
|
46
|
+
* Single source of truth — do not inline this ternary anywhere.
|
|
47
|
+
*/
|
|
48
|
+
export declare function getSkillsBaseUrl(localMcp: boolean): string;
|
|
40
49
|
export declare const ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = "sTMFPsFhdP1Ssg";
|
|
41
50
|
export declare const ANALYTICS_HOST_URL = "https://internal-j.posthog.com";
|
|
42
51
|
export declare const ANALYTICS_TEAM_TAG = "docs-and-wizard";
|
|
@@ -54,7 +63,7 @@ export declare const WIZARD_VARIANT_FLAG_KEY = "wizard-variant";
|
|
|
54
63
|
/** Variant key -> metadata for wizard run (VARIANT flag selects which entry to use). */
|
|
55
64
|
export declare const WIZARD_VARIANTS: Record<string, Record<string, string>>;
|
|
56
65
|
/** User-Agent for wizard HTTP requests and MCP server identification. */
|
|
57
|
-
export declare const WIZARD_USER_AGENT = "posthog/wizard; version: 2.
|
|
66
|
+
export declare const WIZARD_USER_AGENT = "posthog/wizard; version: 2.9.0";
|
|
58
67
|
/** Header prefix for PostHog properties (e.g. X-POSTHOG-PROPERTY-VARIANT). */
|
|
59
68
|
export declare const POSTHOG_PROPERTY_HEADER_PREFIX = "X-POSTHOG-PROPERTY-";
|
|
60
69
|
/** Header prefix for PostHog feature flags. */
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* Shared constants for the PostHog wizard.
|
|
4
4
|
*/
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.OAUTH_TIMEOUT_MS = exports.DETECTION_TIMEOUT_MS = exports.POSTHOG_FLAG_HEADER_PREFIX = exports.POSTHOG_PROPERTY_HEADER_PREFIX = exports.WIZARD_USER_AGENT = exports.WIZARD_VARIANTS = exports.WIZARD_VARIANT_FLAG_KEY = exports.WIZARD_REMARK_EVENT_NAME = exports.WIZARD_INTERACTION_EVENT_NAME = exports.DUMMY_PROJECT_API_KEY = exports.POSTHOG_PROXY_CLIENT_ID = exports.POSTHOG_DEV_CLIENT_ID = exports.POSTHOG_EU_CLIENT_ID = exports.POSTHOG_US_CLIENT_ID = exports.OAUTH_PORT = exports.POSTHOG_OAUTH_URL = exports.ANALYTICS_TEAM_TAG = exports.ANALYTICS_HOST_URL = exports.ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = exports.CONTEXT_MILL_URL = exports.ISSUES_URL = exports.DEFAULT_HOST_URL = exports.DEFAULT_URL = exports.DEBUG = exports.IS_DEV = exports.Integration = void 0;
|
|
6
|
+
exports.OAUTH_TIMEOUT_MS = exports.DETECTION_TIMEOUT_MS = exports.POSTHOG_FLAG_HEADER_PREFIX = exports.POSTHOG_PROPERTY_HEADER_PREFIX = exports.WIZARD_USER_AGENT = exports.WIZARD_VARIANTS = exports.WIZARD_VARIANT_FLAG_KEY = exports.WIZARD_REMARK_EVENT_NAME = exports.WIZARD_INTERACTION_EVENT_NAME = exports.DUMMY_PROJECT_API_KEY = exports.POSTHOG_PROXY_CLIENT_ID = exports.POSTHOG_DEV_CLIENT_ID = exports.POSTHOG_EU_CLIENT_ID = exports.POSTHOG_US_CLIENT_ID = exports.OAUTH_PORT = exports.POSTHOG_OAUTH_URL = exports.ANALYTICS_TEAM_TAG = exports.ANALYTICS_HOST_URL = exports.ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = exports.LOCAL_SKILLS_BASE_URL = exports.REMOTE_SKILLS_BASE_URL = exports.CONTEXT_MILL_URL = exports.ISSUES_URL = exports.DEFAULT_HOST_URL = exports.DEFAULT_URL = exports.DEBUG = exports.IS_DEV = exports.Integration = void 0;
|
|
7
|
+
exports.getSkillsBaseUrl = getSkillsBaseUrl;
|
|
7
8
|
const version_1 = require("./version");
|
|
8
9
|
// ── Integration / CLI ───────────────────────────────────────────────
|
|
9
10
|
/**
|
|
@@ -47,6 +48,17 @@ exports.DEFAULT_HOST_URL = exports.IS_DEV
|
|
|
47
48
|
: 'https://us.i.posthog.com';
|
|
48
49
|
exports.ISSUES_URL = 'https://github.com/posthog/wizard/issues';
|
|
49
50
|
exports.CONTEXT_MILL_URL = 'https://github.com/PostHog/context-mill';
|
|
51
|
+
/** Remote base URL for fetching the skill menu + downloading skills. */
|
|
52
|
+
exports.REMOTE_SKILLS_BASE_URL = 'https://github.com/PostHog/context-mill/releases/latest/download';
|
|
53
|
+
/** Local base URL when `--local-mcp` is set (served by context-mill dev server). */
|
|
54
|
+
exports.LOCAL_SKILLS_BASE_URL = 'http://localhost:8765';
|
|
55
|
+
/**
|
|
56
|
+
* Pick the skills base URL based on the session's localMcp flag.
|
|
57
|
+
* Single source of truth — do not inline this ternary anywhere.
|
|
58
|
+
*/
|
|
59
|
+
function getSkillsBaseUrl(localMcp) {
|
|
60
|
+
return localMcp ? exports.LOCAL_SKILLS_BASE_URL : exports.REMOTE_SKILLS_BASE_URL;
|
|
61
|
+
}
|
|
50
62
|
// ── Analytics (internal) ──────────────────────────────────────────────
|
|
51
63
|
exports.ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = 'sTMFPsFhdP1Ssg';
|
|
52
64
|
exports.ANALYTICS_HOST_URL = 'https://internal-j.posthog.com';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":";AAAA;;GAEG;;;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/lib/constants.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared constants for the PostHog wizard.\n */\n\nimport { VERSION } from './version';\n\n// ── Integration / CLI ───────────────────────────────────────────────\n\n/**\n * Detection order matters: put framework-specific integrations BEFORE basic language fallbacks.\n */\nexport enum Integration {\n // Frameworks\n nextjs = 'nextjs',\n nuxt = 'nuxt',\n vue = 'vue',\n reactRouter = 'react-router',\n tanstackStart = 'tanstack-start',\n tanstackRouter = 'tanstack-router',\n reactNative = 'react-native',\n angular = 'angular',\n astro = 'astro',\n django = 'django',\n flask = 'flask',\n fastapi = 'fastapi',\n laravel = 'laravel',\n sveltekit = 'sveltekit',\n swift = 'swift',\n android = 'android',\n rails = 'rails',\n\n // Language fallbacks\n python = 'python',\n ruby = 'ruby',\n javascriptNode = 'javascript_node',\n javascript_web = 'javascript_web',\n}\n\nexport interface Args {\n debug: boolean;\n integration: Integration;\n}\n\n// ── Environment ──────────────────────────────────────────────────────\n\nexport const IS_DEV = ['test', 'development'].includes(\n process.env.NODE_ENV ?? '',\n);\nexport const DEBUG = false;\n\n// ── URLs ─────────────────────────────────────────────────────────────\n\nexport const DEFAULT_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.posthog.com';\nexport const DEFAULT_HOST_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.i.posthog.com';\nexport const ISSUES_URL = 'https://github.com/posthog/wizard/issues';\nexport const CONTEXT_MILL_URL = 'https://github.com/PostHog/context-mill';\n\n/** Remote base URL for fetching the skill menu + downloading skills. */\nexport const REMOTE_SKILLS_BASE_URL =\n 'https://github.com/PostHog/context-mill/releases/latest/download';\n/** Local base URL when `--local-mcp` is set (served by context-mill dev server). */\nexport const LOCAL_SKILLS_BASE_URL = 'http://localhost:8765';\n\n/**\n * Pick the skills base URL based on the session's localMcp flag.\n * Single source of truth — do not inline this ternary anywhere.\n */\nexport function getSkillsBaseUrl(localMcp: boolean): string {\n return localMcp ? LOCAL_SKILLS_BASE_URL : REMOTE_SKILLS_BASE_URL;\n}\n\n// ── Analytics (internal) ──────────────────────────────────────────────\n\nexport const ANALYTICS_POSTHOG_PUBLIC_PROJECT_WRITE_KEY = 'sTMFPsFhdP1Ssg';\nexport const ANALYTICS_HOST_URL = 'https://internal-j.posthog.com';\nexport const ANALYTICS_TEAM_TAG = 'docs-and-wizard';\n\n// ── OAuth / Auth ────────────────────────────────────────────────────\n\nexport const POSTHOG_OAUTH_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://oauth.posthog.com';\nexport const OAUTH_PORT = 8239;\nexport const POSTHOG_US_CLIENT_ID = 'c4Rdw8DIxgtQfA80IiSnGKlNX8QN00cFWF00QQhM';\nexport const POSTHOG_EU_CLIENT_ID = 'bx2C5sZRN03TkdjraCcetvQFPGH6N2Y9vRLkcKEy';\nexport const POSTHOG_DEV_CLIENT_ID = 'DC5uRLVbGI02YQ82grxgnK6Qn12SXWpCqdPb60oZ';\nexport const POSTHOG_PROXY_CLIENT_ID = POSTHOG_US_CLIENT_ID;\nexport const DUMMY_PROJECT_API_KEY = '_YOUR_POSTHOG_PROJECT_TOKEN_';\n\n// ── Wizard run / variants ───────────────────────────────────────────\n\nexport const WIZARD_INTERACTION_EVENT_NAME = 'wizard interaction';\nexport const WIZARD_REMARK_EVENT_NAME = 'wizard remark';\n/** Feature flag key whose value selects a variant from WIZARD_VARIANTS. */\nexport const WIZARD_VARIANT_FLAG_KEY = 'wizard-variant';\n/** Variant key -> metadata for wizard run (VARIANT flag selects which entry to use). */\nexport const WIZARD_VARIANTS: Record<string, Record<string, string>> = {\n base: { VARIANT: 'base' },\n subagents: { VARIANT: 'subagents' },\n};\n/** User-Agent for wizard HTTP requests and MCP server identification. */\nexport const WIZARD_USER_AGENT = `posthog/wizard; version: ${VERSION}`;\n\n// ── HTTP headers ─────────────────────────────────────────────────────\n\n/** Header prefix for PostHog properties (e.g. X-POSTHOG-PROPERTY-VARIANT). */\nexport const POSTHOG_PROPERTY_HEADER_PREFIX = 'X-POSTHOG-PROPERTY-';\n/** Header prefix for PostHog feature flags. */\nexport const POSTHOG_FLAG_HEADER_PREFIX = 'X-POSTHOG-FLAG-';\n\n// ── Timeouts ─────────────────────────────────────────────────────────\n\n/** Timeout for framework / project detection probes (ms). */\nexport const DETECTION_TIMEOUT_MS = 10_000;\n\n/** Timeout for the OAuth authorization flow (ms). */\nexport const OAUTH_TIMEOUT_MS = 360_000;\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const context_js_1 = require("../context.js");
|
|
4
|
+
const baseOptions = {
|
|
5
|
+
installDir: '/test/dir',
|
|
6
|
+
debug: false,
|
|
7
|
+
forceInstall: false,
|
|
8
|
+
default: false,
|
|
9
|
+
signup: false,
|
|
10
|
+
localMcp: false,
|
|
11
|
+
ci: false,
|
|
12
|
+
menu: false,
|
|
13
|
+
benchmark: false,
|
|
14
|
+
yaraReport: false,
|
|
15
|
+
};
|
|
16
|
+
describe('gatherFrameworkContext', () => {
|
|
17
|
+
it('calls gatherContext and returns the result', async () => {
|
|
18
|
+
const config = {
|
|
19
|
+
metadata: {
|
|
20
|
+
gatherContext: jest
|
|
21
|
+
.fn()
|
|
22
|
+
.mockResolvedValue({ routerType: 'app', srcDir: 'src' }),
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const result = await (0, context_js_1.gatherFrameworkContext)(config, baseOptions);
|
|
26
|
+
expect(result).toEqual({ routerType: 'app', srcDir: 'src' });
|
|
27
|
+
expect(config.metadata.gatherContext).toHaveBeenCalledWith(baseOptions);
|
|
28
|
+
});
|
|
29
|
+
it('returns {} when gatherContext is missing or throws', async () => {
|
|
30
|
+
const noGather = { metadata: {} };
|
|
31
|
+
expect(await (0, context_js_1.gatherFrameworkContext)(noGather, baseOptions)).toEqual({});
|
|
32
|
+
const throws = {
|
|
33
|
+
metadata: {
|
|
34
|
+
gatherContext: jest.fn().mockRejectedValue(new Error('fail')),
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
expect(await (0, context_js_1.gatherFrameworkContext)(throws, baseOptions)).toEqual({});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('checkFrameworkVersion', () => {
|
|
41
|
+
it('returns supported when no minimum is configured', async () => {
|
|
42
|
+
const config = { detection: {} };
|
|
43
|
+
const result = await (0, context_js_1.checkFrameworkVersion)(config, baseOptions);
|
|
44
|
+
expect(result.supported).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
it('returns supported when installed version meets minimum', async () => {
|
|
47
|
+
const config = {
|
|
48
|
+
detection: {
|
|
49
|
+
minimumVersion: '14.0.0',
|
|
50
|
+
getInstalledVersion: jest.fn().mockResolvedValue('15.2.3'),
|
|
51
|
+
},
|
|
52
|
+
metadata: { docsUrl: 'https://example.com/docs' },
|
|
53
|
+
};
|
|
54
|
+
expect((await (0, context_js_1.checkFrameworkVersion)(config, baseOptions)).supported).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
it('returns version details when installed version is below minimum', async () => {
|
|
57
|
+
const config = {
|
|
58
|
+
detection: {
|
|
59
|
+
minimumVersion: '14.0.0',
|
|
60
|
+
getInstalledVersion: jest.fn().mockResolvedValue('13.5.0'),
|
|
61
|
+
},
|
|
62
|
+
metadata: { docsUrl: 'https://example.com/docs' },
|
|
63
|
+
};
|
|
64
|
+
const result = await (0, context_js_1.checkFrameworkVersion)(config, baseOptions);
|
|
65
|
+
expect(result.supported).toEqual({
|
|
66
|
+
current: '13.5.0',
|
|
67
|
+
minimum: '14.0.0',
|
|
68
|
+
docsUrl: 'https://example.com/docs',
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
//# sourceMappingURL=context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../../../../src/lib/detection/__tests__/context.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { gatherFrameworkContext, checkFrameworkVersion } from '../context.js';\nimport type { FrameworkConfig } from '../../framework-config.js';\nimport type { WizardOptions } from '../../../utils/types.js';\n\nconst baseOptions: WizardOptions = {\n installDir: '/test/dir',\n debug: false,\n forceInstall: false,\n default: false,\n signup: false,\n localMcp: false,\n ci: false,\n menu: false,\n benchmark: false,\n yaraReport: false,\n};\n\ndescribe('gatherFrameworkContext', () => {\n it('calls gatherContext and returns the result', async () => {\n const config = {\n metadata: {\n gatherContext: jest\n .fn()\n .mockResolvedValue({ routerType: 'app', srcDir: 'src' }),\n },\n } as unknown as FrameworkConfig;\n\n const result = await gatherFrameworkContext(config, baseOptions);\n\n expect(result).toEqual({ routerType: 'app', srcDir: 'src' });\n expect(config.metadata.gatherContext).toHaveBeenCalledWith(baseOptions);\n });\n\n it('returns {} when gatherContext is missing or throws', async () => {\n const noGather = { metadata: {} } as FrameworkConfig;\n expect(await gatherFrameworkContext(noGather, baseOptions)).toEqual({});\n\n const throws = {\n metadata: {\n gatherContext: jest.fn().mockRejectedValue(new Error('fail')),\n },\n } as unknown as FrameworkConfig;\n expect(await gatherFrameworkContext(throws, baseOptions)).toEqual({});\n });\n});\n\ndescribe('checkFrameworkVersion', () => {\n it('returns supported when no minimum is configured', async () => {\n const config = { detection: {} } as unknown as FrameworkConfig;\n const result = await checkFrameworkVersion(config, baseOptions);\n expect(result.supported).toBe(true);\n });\n\n it('returns supported when installed version meets minimum', async () => {\n const config = {\n detection: {\n minimumVersion: '14.0.0',\n getInstalledVersion: jest.fn().mockResolvedValue('15.2.3'),\n },\n metadata: { docsUrl: 'https://example.com/docs' },\n } as unknown as FrameworkConfig;\n\n expect((await checkFrameworkVersion(config, baseOptions)).supported).toBe(\n true,\n );\n });\n\n it('returns version details when installed version is below minimum', async () => {\n const config = {\n detection: {\n minimumVersion: '14.0.0',\n getInstalledVersion: jest.fn().mockResolvedValue('13.5.0'),\n },\n metadata: { docsUrl: 'https://example.com/docs' },\n } as unknown as FrameworkConfig;\n\n const result = await checkFrameworkVersion(config, baseOptions);\n expect(result.supported).toEqual({\n current: '13.5.0',\n minimum: '14.0.0',\n docsUrl: 'https://example.com/docs',\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|