@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,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provisioning API client for creating new PostHog accounts.
|
|
4
|
+
*
|
|
5
|
+
* Uses the agentic provisioning API with PKCE auth:
|
|
6
|
+
* 1. POST /account_requests - create account, get auth code
|
|
7
|
+
* 2. POST /oauth/token - exchange code for tokens (with PKCE)
|
|
8
|
+
* 3. POST /resources - provision project, get API key
|
|
9
|
+
*/
|
|
10
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
13
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
14
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
15
|
+
}
|
|
16
|
+
Object.defineProperty(o, k2, desc);
|
|
17
|
+
}) : (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
o[k2] = m[k];
|
|
20
|
+
}));
|
|
21
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
22
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
23
|
+
}) : function(o, v) {
|
|
24
|
+
o["default"] = v;
|
|
25
|
+
});
|
|
26
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
27
|
+
var ownKeys = function(o) {
|
|
28
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
29
|
+
var ar = [];
|
|
30
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
31
|
+
return ar;
|
|
32
|
+
};
|
|
33
|
+
return ownKeys(o);
|
|
34
|
+
};
|
|
35
|
+
return function (mod) {
|
|
36
|
+
if (mod && mod.__esModule) return mod;
|
|
37
|
+
var result = {};
|
|
38
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
39
|
+
__setModuleDefault(result, mod);
|
|
40
|
+
return result;
|
|
41
|
+
};
|
|
42
|
+
})();
|
|
43
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
44
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
45
|
+
};
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.provisionNewAccount = provisionNewAccount;
|
|
48
|
+
const crypto = __importStar(require("node:crypto"));
|
|
49
|
+
const axios_1 = __importDefault(require("axios"));
|
|
50
|
+
const zod_1 = require("zod");
|
|
51
|
+
const constants_1 = require("../lib/constants");
|
|
52
|
+
const debug_1 = require("./debug");
|
|
53
|
+
const analytics_1 = require("./analytics");
|
|
54
|
+
const WIZARD_CLIENT_ID = 'posthog-wizard';
|
|
55
|
+
const API_VERSION = '0.1d';
|
|
56
|
+
const PROVISIONING_BASE_URL = constants_1.IS_DEV
|
|
57
|
+
? 'http://localhost:8010'
|
|
58
|
+
: 'https://us.posthog.com';
|
|
59
|
+
function generateCodeVerifier() {
|
|
60
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
61
|
+
}
|
|
62
|
+
function generateCodeChallenge(verifier) {
|
|
63
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
64
|
+
}
|
|
65
|
+
// --- Response schemas ---
|
|
66
|
+
const AccountRequestResponseSchema = zod_1.z.object({
|
|
67
|
+
id: zod_1.z.string(),
|
|
68
|
+
type: zod_1.z.enum(['oauth', 'requires_auth', 'error']),
|
|
69
|
+
oauth: zod_1.z
|
|
70
|
+
.object({
|
|
71
|
+
code: zod_1.z.string(),
|
|
72
|
+
})
|
|
73
|
+
.optional(),
|
|
74
|
+
error: zod_1.z
|
|
75
|
+
.object({
|
|
76
|
+
code: zod_1.z.string(),
|
|
77
|
+
message: zod_1.z.string(),
|
|
78
|
+
})
|
|
79
|
+
.optional(),
|
|
80
|
+
});
|
|
81
|
+
const TokenResponseSchema = zod_1.z.object({
|
|
82
|
+
token_type: zod_1.z.string(),
|
|
83
|
+
access_token: zod_1.z.string(),
|
|
84
|
+
refresh_token: zod_1.z.string(),
|
|
85
|
+
expires_in: zod_1.z.number(),
|
|
86
|
+
account: zod_1.z
|
|
87
|
+
.object({
|
|
88
|
+
id: zod_1.z.string(),
|
|
89
|
+
})
|
|
90
|
+
.optional(),
|
|
91
|
+
});
|
|
92
|
+
const ResourceResponseSchema = zod_1.z.object({
|
|
93
|
+
status: zod_1.z.string(),
|
|
94
|
+
id: zod_1.z.string(),
|
|
95
|
+
service_id: zod_1.z.string(),
|
|
96
|
+
complete: zod_1.z
|
|
97
|
+
.object({
|
|
98
|
+
access_configuration: zod_1.z.object({
|
|
99
|
+
api_key: zod_1.z.string(),
|
|
100
|
+
host: zod_1.z.string(),
|
|
101
|
+
personal_api_key: zod_1.z.string().optional(),
|
|
102
|
+
}),
|
|
103
|
+
})
|
|
104
|
+
.optional(),
|
|
105
|
+
});
|
|
106
|
+
/**
|
|
107
|
+
* Create a new PostHog account and provision a project via the provisioning API.
|
|
108
|
+
*
|
|
109
|
+
* This is the "no browser" signup path: the wizard collects the email,
|
|
110
|
+
* calls the provisioning API to create the account, and gets back
|
|
111
|
+
* credentials without opening a browser.
|
|
112
|
+
*/
|
|
113
|
+
async function provisionNewAccount(email, name, region = 'US') {
|
|
114
|
+
const codeVerifier = generateCodeVerifier();
|
|
115
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
116
|
+
(0, debug_1.logToFile)('[provisioning] starting account creation');
|
|
117
|
+
// Step 1: Create account
|
|
118
|
+
const accountRes = await axios_1.default.post(`${PROVISIONING_BASE_URL}/api/agentic/provisioning/account_requests`, {
|
|
119
|
+
id: crypto.randomUUID(),
|
|
120
|
+
email,
|
|
121
|
+
name,
|
|
122
|
+
client_id: WIZARD_CLIENT_ID,
|
|
123
|
+
code_challenge: codeChallenge,
|
|
124
|
+
code_challenge_method: 'S256',
|
|
125
|
+
configuration: { region },
|
|
126
|
+
}, {
|
|
127
|
+
headers: {
|
|
128
|
+
'Content-Type': 'application/json',
|
|
129
|
+
'API-Version': API_VERSION,
|
|
130
|
+
'User-Agent': constants_1.WIZARD_USER_AGENT,
|
|
131
|
+
},
|
|
132
|
+
timeout: 30_000,
|
|
133
|
+
});
|
|
134
|
+
const accountData = AccountRequestResponseSchema.parse(accountRes.data);
|
|
135
|
+
if (accountData.type === 'error') {
|
|
136
|
+
const msg = accountData.error?.message ?? 'Account creation failed';
|
|
137
|
+
analytics_1.analytics.captureException(new Error(msg), {
|
|
138
|
+
step: 'provisioning_account_request',
|
|
139
|
+
error_code: accountData.error?.code,
|
|
140
|
+
});
|
|
141
|
+
throw new Error(msg);
|
|
142
|
+
}
|
|
143
|
+
if (accountData.type === 'requires_auth') {
|
|
144
|
+
throw new Error('This email is already associated with a PostHog account. Please use the login flow instead.');
|
|
145
|
+
}
|
|
146
|
+
const code = accountData.oauth?.code;
|
|
147
|
+
if (!code) {
|
|
148
|
+
throw new Error('No authorization code received from account creation');
|
|
149
|
+
}
|
|
150
|
+
(0, debug_1.logToFile)('[provisioning] account created, exchanging code for tokens');
|
|
151
|
+
// Step 2: Exchange code for tokens
|
|
152
|
+
const tokenRes = await axios_1.default.post(`${PROVISIONING_BASE_URL}/api/agentic/oauth/token`, new URLSearchParams({
|
|
153
|
+
grant_type: 'authorization_code',
|
|
154
|
+
code,
|
|
155
|
+
code_verifier: codeVerifier,
|
|
156
|
+
}).toString(), {
|
|
157
|
+
headers: {
|
|
158
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
159
|
+
'API-Version': API_VERSION,
|
|
160
|
+
'User-Agent': constants_1.WIZARD_USER_AGENT,
|
|
161
|
+
},
|
|
162
|
+
timeout: 30_000,
|
|
163
|
+
});
|
|
164
|
+
const tokenData = TokenResponseSchema.parse(tokenRes.data);
|
|
165
|
+
(0, debug_1.logToFile)('[provisioning] tokens received, provisioning resources');
|
|
166
|
+
// Step 3: Provision resources
|
|
167
|
+
const resourceRes = await axios_1.default.post(`${PROVISIONING_BASE_URL}/api/agentic/provisioning/resources`, { service_id: 'analytics' }, {
|
|
168
|
+
headers: {
|
|
169
|
+
'Content-Type': 'application/json',
|
|
170
|
+
Authorization: `Bearer ${tokenData.access_token}`,
|
|
171
|
+
'API-Version': API_VERSION,
|
|
172
|
+
'User-Agent': constants_1.WIZARD_USER_AGENT,
|
|
173
|
+
},
|
|
174
|
+
timeout: 30_000,
|
|
175
|
+
});
|
|
176
|
+
const resourceData = ResourceResponseSchema.parse(resourceRes.data);
|
|
177
|
+
if (resourceData.status !== 'complete' || !resourceData.complete) {
|
|
178
|
+
throw new Error('Resource provisioning did not complete');
|
|
179
|
+
}
|
|
180
|
+
(0, debug_1.logToFile)('[provisioning] resources provisioned successfully');
|
|
181
|
+
return {
|
|
182
|
+
accessToken: tokenData.access_token,
|
|
183
|
+
refreshToken: tokenData.refresh_token,
|
|
184
|
+
projectApiKey: resourceData.complete.access_configuration.api_key,
|
|
185
|
+
host: resourceData.complete.access_configuration.host,
|
|
186
|
+
personalApiKey: resourceData.complete.access_configuration.personal_api_key,
|
|
187
|
+
projectId: resourceData.id,
|
|
188
|
+
accountId: tokenData.account?.id ?? '',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=provisioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provisioning.js","sourceRoot":"","sources":["../../../src/utils/provisioning.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Provisioning API client for creating new PostHog accounts.\n *\n * Uses the agentic provisioning API with PKCE auth:\n * 1. POST /account_requests - create account, get auth code\n * 2. POST /oauth/token - exchange code for tokens (with PKCE)\n * 3. POST /resources - provision project, get API key\n */\n\nimport * as crypto from 'node:crypto';\nimport axios from 'axios';\nimport { z } from 'zod';\nimport { IS_DEV, WIZARD_USER_AGENT } from '../lib/constants';\nimport { logToFile } from './debug';\nimport { analytics } from './analytics';\n\nconst WIZARD_CLIENT_ID = 'posthog-wizard';\nconst API_VERSION = '0.1d';\n\nconst PROVISIONING_BASE_URL = IS_DEV\n ? 'http://localhost:8010'\n : 'https://us.posthog.com';\n\nfunction generateCodeVerifier(): string {\n return crypto.randomBytes(32).toString('base64url');\n}\n\nfunction generateCodeChallenge(verifier: string): string {\n return crypto.createHash('sha256').update(verifier).digest('base64url');\n}\n\n// --- Response schemas ---\n\nconst AccountRequestResponseSchema = z.object({\n id: z.string(),\n type: z.enum(['oauth', 'requires_auth', 'error']),\n oauth: z\n .object({\n code: z.string(),\n })\n .optional(),\n error: z\n .object({\n code: z.string(),\n message: z.string(),\n })\n .optional(),\n});\n\nconst TokenResponseSchema = z.object({\n token_type: z.string(),\n access_token: z.string(),\n refresh_token: z.string(),\n expires_in: z.number(),\n account: z\n .object({\n id: z.string(),\n })\n .optional(),\n});\n\nconst ResourceResponseSchema = z.object({\n status: z.string(),\n id: z.string(),\n service_id: z.string(),\n complete: z\n .object({\n access_configuration: z.object({\n api_key: z.string(),\n host: z.string(),\n personal_api_key: z.string().optional(),\n }),\n })\n .optional(),\n});\n\nexport interface ProvisioningResult {\n accessToken: string;\n refreshToken: string;\n projectApiKey: string;\n host: string;\n personalApiKey?: string;\n projectId: string;\n accountId: string;\n}\n\n/**\n * Create a new PostHog account and provision a project via the provisioning API.\n *\n * This is the \"no browser\" signup path: the wizard collects the email,\n * calls the provisioning API to create the account, and gets back\n * credentials without opening a browser.\n */\nexport async function provisionNewAccount(\n email: string,\n name: string,\n region: 'US' | 'EU' = 'US',\n): Promise<ProvisioningResult> {\n const codeVerifier = generateCodeVerifier();\n const codeChallenge = generateCodeChallenge(codeVerifier);\n\n logToFile('[provisioning] starting account creation');\n\n // Step 1: Create account\n const accountRes = await axios.post(\n `${PROVISIONING_BASE_URL}/api/agentic/provisioning/account_requests`,\n {\n id: crypto.randomUUID(),\n email,\n name,\n client_id: WIZARD_CLIENT_ID,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n configuration: { region },\n },\n {\n headers: {\n 'Content-Type': 'application/json',\n 'API-Version': API_VERSION,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n timeout: 30_000,\n },\n );\n\n const accountData = AccountRequestResponseSchema.parse(accountRes.data);\n\n if (accountData.type === 'error') {\n const msg = accountData.error?.message ?? 'Account creation failed';\n analytics.captureException(new Error(msg), {\n step: 'provisioning_account_request',\n error_code: accountData.error?.code,\n });\n throw new Error(msg);\n }\n\n if (accountData.type === 'requires_auth') {\n throw new Error(\n 'This email is already associated with a PostHog account. Please use the login flow instead.',\n );\n }\n\n const code = accountData.oauth?.code;\n if (!code) {\n throw new Error('No authorization code received from account creation');\n }\n\n logToFile('[provisioning] account created, exchanging code for tokens');\n\n // Step 2: Exchange code for tokens\n const tokenRes = await axios.post(\n `${PROVISIONING_BASE_URL}/api/agentic/oauth/token`,\n new URLSearchParams({\n grant_type: 'authorization_code',\n code,\n code_verifier: codeVerifier,\n }).toString(),\n {\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'API-Version': API_VERSION,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n timeout: 30_000,\n },\n );\n\n const tokenData = TokenResponseSchema.parse(tokenRes.data);\n\n logToFile('[provisioning] tokens received, provisioning resources');\n\n // Step 3: Provision resources\n const resourceRes = await axios.post(\n `${PROVISIONING_BASE_URL}/api/agentic/provisioning/resources`,\n { service_id: 'analytics' },\n {\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${tokenData.access_token}`,\n 'API-Version': API_VERSION,\n 'User-Agent': WIZARD_USER_AGENT,\n },\n timeout: 30_000,\n },\n );\n\n const resourceData = ResourceResponseSchema.parse(resourceRes.data);\n\n if (resourceData.status !== 'complete' || !resourceData.complete) {\n throw new Error('Resource provisioning did not complete');\n }\n\n logToFile('[provisioning] resources provisioned successfully');\n\n return {\n accessToken: tokenData.access_token,\n refreshToken: tokenData.refresh_token,\n projectApiKey: resourceData.complete.access_configuration.api_key,\n host: resourceData.complete.access_configuration.host,\n personalApiKey: resourceData.complete.access_configuration.personal_api_key,\n projectId: resourceData.id,\n accountId: tokenData.account?.id ?? '',\n };\n}\n"]}
|
|
@@ -63,7 +63,10 @@ export declare function isUsingTypeScript({ installDir, }: Pick<WizardOptions, '
|
|
|
63
63
|
/**
|
|
64
64
|
* Get project data for the wizard via OAuth or CI API key.
|
|
65
65
|
*/
|
|
66
|
-
export declare function getOrAskForProjectData(_options: Pick<WizardOptions, 'signup' | 'ci' | 'apiKey' | 'projectId'>
|
|
66
|
+
export declare function getOrAskForProjectData(_options: Pick<WizardOptions, 'signup' | 'ci' | 'apiKey' | 'projectId'> & {
|
|
67
|
+
email?: string;
|
|
68
|
+
region?: CloudRegion;
|
|
69
|
+
}): Promise<{
|
|
67
70
|
host: string;
|
|
68
71
|
projectApiKey: string;
|
|
69
72
|
accessToken: string;
|
|
@@ -58,6 +58,7 @@ const analytics_1 = require("./analytics");
|
|
|
58
58
|
const ui_1 = require("../ui");
|
|
59
59
|
const urls_1 = require("./urls");
|
|
60
60
|
const oauth_1 = require("./oauth");
|
|
61
|
+
const provisioning_1 = require("./provisioning");
|
|
61
62
|
const api_1 = require("../lib/api");
|
|
62
63
|
const semver_1 = require("./semver");
|
|
63
64
|
const wizard_abort_1 = require("./wizard-abort");
|
|
@@ -256,6 +257,8 @@ async function getOrAskForProjectData(_options) {
|
|
|
256
257
|
}
|
|
257
258
|
const { host, projectApiKey, accessToken, projectId, cloudRegion } = await (0, telemetry_1.traceStep)('login', () => askForWizardLogin({
|
|
258
259
|
signup: _options.signup,
|
|
260
|
+
email: _options.email,
|
|
261
|
+
region: _options.region,
|
|
259
262
|
}));
|
|
260
263
|
if (!projectApiKey) {
|
|
261
264
|
const cloudUrl = (0, urls_1.getCloudUrlFromRegion)(cloudRegion);
|
|
@@ -296,6 +299,9 @@ async function fetchProjectDataById(apiKey, projectId, cloudUrl) {
|
|
|
296
299
|
};
|
|
297
300
|
}
|
|
298
301
|
async function askForWizardLogin(options) {
|
|
302
|
+
if (options.signup) {
|
|
303
|
+
return askForProvisioningSignup(options.email, options.region);
|
|
304
|
+
}
|
|
299
305
|
const tokenResponse = await (0, oauth_1.performOAuthFlow)({
|
|
300
306
|
scopes: [
|
|
301
307
|
'user:read',
|
|
@@ -306,7 +312,7 @@ async function askForWizardLogin(options) {
|
|
|
306
312
|
'insight:write',
|
|
307
313
|
'query:read',
|
|
308
314
|
],
|
|
309
|
-
signup:
|
|
315
|
+
signup: false,
|
|
310
316
|
});
|
|
311
317
|
const projectId = tokenResponse.scoped_teams?.[0];
|
|
312
318
|
if (projectId === undefined) {
|
|
@@ -331,11 +337,49 @@ async function askForWizardLogin(options) {
|
|
|
331
337
|
projectId: projectId,
|
|
332
338
|
cloudRegion,
|
|
333
339
|
};
|
|
334
|
-
(0, ui_1.getUI)().log.success(
|
|
340
|
+
(0, ui_1.getUI)().log.success('Login complete.');
|
|
335
341
|
analytics_1.analytics.setTag('opened-wizard-link', true);
|
|
336
342
|
analytics_1.analytics.setDistinctId(data.distinctId);
|
|
337
343
|
return data;
|
|
338
344
|
}
|
|
345
|
+
async function askForProvisioningSignup(email, region) {
|
|
346
|
+
if (!email || !email.includes('@')) {
|
|
347
|
+
(0, ui_1.getUI)().log.error('Email is required for signup. Use --email your@email.com with --signup.');
|
|
348
|
+
await abort();
|
|
349
|
+
throw new Error('unreachable');
|
|
350
|
+
}
|
|
351
|
+
const spinner = (0, ui_1.getUI)().spinner();
|
|
352
|
+
spinner.start('Creating your PostHog account...');
|
|
353
|
+
try {
|
|
354
|
+
const provisionRegion = (region ?? 'us').toUpperCase();
|
|
355
|
+
const result = await (0, provisioning_1.provisionNewAccount)(email, '', provisionRegion);
|
|
356
|
+
spinner.stop('Account created!');
|
|
357
|
+
(0, ui_1.getUI)().log.success('Welcome to PostHog!');
|
|
358
|
+
const host = result.host;
|
|
359
|
+
const cloudRegion = host.includes('eu.') ? 'eu' : 'us';
|
|
360
|
+
analytics_1.analytics.setTag('provisioning-signup', true);
|
|
361
|
+
return {
|
|
362
|
+
accessToken: result.accessToken,
|
|
363
|
+
projectApiKey: result.projectApiKey,
|
|
364
|
+
host,
|
|
365
|
+
distinctId: email,
|
|
366
|
+
projectId: parseInt(result.projectId, 10) || 0,
|
|
367
|
+
cloudRegion,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
catch (error) {
|
|
371
|
+
spinner.stop('Account creation failed.');
|
|
372
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
373
|
+
if (message.includes('already associated')) {
|
|
374
|
+
(0, ui_1.getUI)().log.info('This email already has a PostHog account. Switching to login flow...');
|
|
375
|
+
return askForWizardLogin({ signup: false });
|
|
376
|
+
}
|
|
377
|
+
(0, ui_1.getUI)().log.error(`Failed to create account: ${message}`);
|
|
378
|
+
analytics_1.analytics.captureException(error instanceof Error ? error : new Error(message), { step: 'provisioning_signup' });
|
|
379
|
+
await abort();
|
|
380
|
+
throw error;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
339
383
|
/**
|
|
340
384
|
* Creates a new config file with the given filepath and codeSnippet.
|
|
341
385
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-utils.js","sourceRoot":"","sources":["../../../src/utils/setup-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { isAbsolute, join, relative } from 'node:path';\n\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport type { PackageDotJson } from './package-json';\nimport {\n type PackageManager,\n detectAllPackageManagers,\n NPM as npm,\n} from './package-manager';\nimport type { CloudRegion, WizardOptions } from './types';\nimport { getPackageVersion } from './package-json';\nimport {\n DEFAULT_HOST_URL,\n DUMMY_PROJECT_API_KEY,\n ISSUES_URL,\n} from '../lib/constants';\nimport { analytics } from './analytics';\nimport { getUI } from '../ui';\nimport {\n getCloudUrlFromRegion,\n getHostFromRegion,\n detectRegionFromToken,\n} from './urls';\nimport { performOAuthFlow } from './oauth';\nimport { fetchUserData, fetchProjectData } from '../lib/api';\nimport { fulfillsVersionRange } from './semver';\nimport { wizardAbort } from './wizard-abort';\n\ninterface ProjectData {\n projectApiKey: string;\n accessToken: string;\n host: string;\n distinctId: string;\n projectId: number;\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\n/** @deprecated Use wizardAbort() directly for new code. */\nexport async function abort(message?: string, status?: number): Promise<never> {\n return wizardAbort({ message, exitCode: status });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function isReact19Installed({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n try {\n const packageJson = await tryGetPackageJson({ installDir });\n if (!packageJson) return false;\n const reactVersion = getPackageVersion('react', packageJson);\n\n if (!reactVersion) {\n return false;\n }\n\n return fulfillsVersionRange({\n version: reactVersion,\n acceptableVersions: '>=19.0.0',\n canBeLatest: true,\n });\n } catch {\n return false;\n }\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n integration,\n installDir,\n}: {\n packageName: string;\n alreadyInstalled: boolean;\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n forceInstall?: boolean;\n integration?: string;\n installDir: string;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n const sdkInstallSpinner = getUI().spinner();\n\n const pkgManager =\n packageManager || (await getPackageManager({ installDir }));\n\n const isReact19 = await isReact19Installed({ installDir });\n const legacyPeerDepsFlag =\n isReact19 && pkgManager.name === 'npm' ? '--legacy-peer-deps' : '';\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${\n packageNameDisplayLabel ?? packageName\n } with ${pkgManager.label}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${\n forceInstall ? pkgManager.forceInstallFlag : ''\n } ${legacyPeerDepsFlag}`.trim(),\n { cwd: installDir },\n (err, stdout, stderr) => {\n if (err) {\n fs.writeFileSync(\n join(\n process.cwd(),\n `posthog-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n getUI().log.error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Encountered the following error during installation:\\n\\n${e}\\n\\nThe wizard has created a \\`posthog-wizard-installation-error-*.log\\` file. If you think this issue is caused by the PostHog wizard, create an issue on GitHub and include the log file's content:\\n${ISSUES_URL}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${\n packageNameDisplayLabel ?? packageName\n } with ${pkgManager.label}.`,\n );\n\n analytics.wizardCapture('package installed', {\n package_name: packageName,\n package_manager: pkgManager.name,\n integration,\n });\n\n return { packageManager: pkgManager };\n });\n}\n\n/**\n * Get package.json or abort the wizard if not found.\n * Only use where package.json is required (e.g., package install, overrides).\n * For detection/version-checks, use tryGetPackageJson() instead.\n */\nexport async function getPackageDotJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(installDir, 'package.json'), 'utf8')\n .catch(() => {\n getUI().log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n getUI().log.error(\n `Unable to parse your package.json. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\n/**\n * Try to get package.json, returning null if it doesn't exist.\n * Use this for detection purposes where missing package.json is expected (e.g., Python projects).\n */\nexport async function tryGetPackageJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson | null> {\n try {\n const packageJsonFileContents = await fs.promises.readFile(\n join(installDir, 'package.json'),\n 'utf8',\n );\n return JSON.parse(packageJsonFileContents) as PackageDotJson;\n } catch {\n return null;\n }\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(installDir, 'package.json'),\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n getUI().log.error(`Unable to update your package.json.`);\n\n await abort();\n }\n}\n\n/**\n * Detect and return the package manager. Pure — no prompts.\n * Falls back to first detected or npm if ambiguous.\n */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function getPackageManager(\n options: Pick<WizardOptions, 'installDir'> & { ci?: boolean },\n): Promise<PackageManager> {\n const detectedPackageManagers = detectAllPackageManagers({\n installDir: options.installDir,\n });\n\n if (detectedPackageManagers.length >= 1) {\n const selected = detectedPackageManagers[0];\n analytics.setTag('package-manager', selected.name);\n return selected;\n }\n\n // No package manager detected — default to npm\n analytics.setTag('package-manager', npm.name);\n return npm;\n}\n\nexport function isUsingTypeScript({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n try {\n return fs.existsSync(join(installDir, 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Get project data for the wizard via OAuth or CI API key.\n */\nexport async function getOrAskForProjectData(\n _options: Pick<WizardOptions, 'signup' | 'ci' | 'apiKey' | 'projectId'>,\n): Promise<{\n host: string;\n projectApiKey: string;\n accessToken: string;\n projectId: number;\n cloudRegion: CloudRegion;\n}> {\n // CI mode: bypass OAuth, use personal API key for LLM gateway\n if (_options.ci && _options.apiKey) {\n getUI().log.info('Using provided API key (CI mode - OAuth bypassed)');\n\n const cloudRegion = await detectRegionFromToken(_options.apiKey);\n const host = getHostFromRegion(cloudRegion);\n const cloudUrl = getCloudUrlFromRegion(cloudRegion);\n\n const projectData =\n _options.projectId != null\n ? await fetchProjectDataById(\n _options.apiKey,\n _options.projectId,\n cloudUrl,\n )\n : await fetchProjectDataWithApiKey(_options.apiKey, cloudUrl);\n\n return {\n host,\n projectApiKey: projectData.api_token,\n accessToken: _options.apiKey,\n projectId: projectData.id,\n cloudRegion,\n };\n }\n\n const { host, projectApiKey, accessToken, projectId, cloudRegion } =\n await traceStep('login', () =>\n askForWizardLogin({\n signup: _options.signup,\n }),\n );\n\n if (!projectApiKey) {\n const cloudUrl = getCloudUrlFromRegion(cloudRegion);\n getUI().log.error(`Didn't receive a project token. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${ISSUES_URL}`);\n\n getUI().log\n .info(`In the meantime, we'll add a dummy project token (\"${DUMMY_PROJECT_API_KEY}\") for you to replace later.\nYou can find your project token here:\n${cloudUrl}/settings/project#variables`);\n }\n\n return {\n accessToken,\n host: host || DEFAULT_HOST_URL,\n projectApiKey: projectApiKey || DUMMY_PROJECT_API_KEY,\n projectId,\n cloudRegion,\n };\n}\n\nasync function fetchProjectDataWithApiKey(\n apiKey: string,\n cloudUrl: string,\n): Promise<{ api_token: string; id: number }> {\n const userData = await fetchUserData(apiKey, cloudUrl);\n const projectId = userData.team?.id;\n\n if (!projectId) {\n throw new Error(\n 'Could not determine project ID from API key. Please ensure your API key has access to a project in this cloud region.',\n );\n }\n\n const projectData = await fetchProjectData(apiKey, projectId, cloudUrl);\n return {\n api_token: projectData.api_token,\n id: projectId,\n };\n}\n\nasync function fetchProjectDataById(\n apiKey: string,\n projectId: number,\n cloudUrl: string,\n): Promise<{ api_token: string; id: number }> {\n const projectData = await fetchProjectData(apiKey, projectId, cloudUrl);\n return {\n api_token: projectData.api_token,\n id: projectId,\n };\n}\n\nasync function askForWizardLogin(options: {\n signup: boolean;\n}): Promise<ProjectData & { cloudRegion: CloudRegion }> {\n const tokenResponse = await performOAuthFlow({\n scopes: [\n 'user:read',\n 'project:read',\n 'introspection',\n 'llm_gateway:read',\n 'dashboard:write',\n 'insight:write',\n 'query:read',\n ],\n signup: options.signup,\n });\n\n const projectId = tokenResponse.scoped_teams?.[0];\n\n if (projectId === undefined) {\n const error = new Error(\n 'No project access granted. Please authorize with project-level access.',\n );\n analytics.captureException(error, {\n step: 'wizard_login',\n has_scoped_teams: !!tokenResponse.scoped_teams,\n });\n getUI().log.error(error.message);\n await abort();\n }\n\n const cloudRegion = await detectRegionFromToken(tokenResponse.access_token);\n const cloudUrl = getCloudUrlFromRegion(cloudRegion);\n const host = getHostFromRegion(cloudRegion);\n\n const projectData = await fetchProjectData(\n tokenResponse.access_token,\n projectId!,\n cloudUrl,\n );\n const userData = await fetchUserData(tokenResponse.access_token, cloudUrl);\n\n const data = {\n accessToken: tokenResponse.access_token,\n projectApiKey: projectData.api_token,\n host,\n distinctId: userData.distinct_id,\n projectId: projectId!,\n cloudRegion,\n };\n\n getUI().log.success(\n `Login complete. ${options.signup ? 'Welcome to PostHog!' : ''}`,\n );\n analytics.setTag('opened-wizard-link', true);\n analytics.setDistinctId(data.distinctId);\n\n return data;\n}\n\n/**\n * Creates a new config file with the given filepath and codeSnippet.\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = relative(installDir, filepath);\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n getUI().log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n getUI().log.info(moreInformation);\n }\n\n return true;\n } catch (e) {\n debug(e);\n getUI().log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"setup-utils.js","sourceRoot":"","sources":["../../../src/utils/setup-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as childProcess from 'node:child_process';\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport { isAbsolute, join, relative } from 'node:path';\n\nimport { traceStep } from '../telemetry';\nimport { debug } from './debug';\nimport type { PackageDotJson } from './package-json';\nimport {\n type PackageManager,\n detectAllPackageManagers,\n NPM as npm,\n} from './package-manager';\nimport type { CloudRegion, WizardOptions } from './types';\nimport { getPackageVersion } from './package-json';\nimport {\n DEFAULT_HOST_URL,\n DUMMY_PROJECT_API_KEY,\n ISSUES_URL,\n} from '../lib/constants';\nimport { analytics } from './analytics';\nimport { getUI } from '../ui';\nimport {\n getCloudUrlFromRegion,\n getHostFromRegion,\n detectRegionFromToken,\n} from './urls';\nimport { performOAuthFlow } from './oauth';\nimport { provisionNewAccount } from './provisioning';\nimport { fetchUserData, fetchProjectData } from '../lib/api';\nimport { fulfillsVersionRange } from './semver';\nimport { wizardAbort } from './wizard-abort';\n\ninterface ProjectData {\n projectApiKey: string;\n accessToken: string;\n host: string;\n distinctId: string;\n projectId: number;\n}\n\nexport interface CliSetupConfig {\n filename: string;\n name: string;\n gitignore: boolean;\n\n likelyAlreadyHasAuthToken(contents: string): boolean;\n tokenContent(authToken: string): string;\n\n likelyAlreadyHasOrgAndProject(contents: string): boolean;\n orgAndProjContent(org: string, project: string): string;\n\n likelyAlreadyHasUrl?(contents: string): boolean;\n urlContent?(url: string): string;\n}\n\nexport interface CliSetupConfigContent {\n authToken: string;\n org?: string;\n project?: string;\n url?: string;\n}\n\n/** @deprecated Use wizardAbort() directly for new code. */\nexport async function abort(message?: string, status?: number): Promise<never> {\n return wizardAbort({ message, exitCode: status });\n}\n\nexport function isInGitRepo() {\n try {\n childProcess.execSync('git rev-parse --is-inside-work-tree', {\n stdio: 'ignore',\n });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function getUncommittedOrUntrackedFiles(): string[] {\n try {\n const gitStatus = childProcess\n .execSync('git status --porcelain=v1', {\n // we only care about stdout\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString();\n\n const files = gitStatus\n .split(os.EOL)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((f) => `- ${f.split(/\\s+/)[1]}`);\n\n return files;\n } catch {\n return [];\n }\n}\n\nexport async function isReact19Installed({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<boolean> {\n try {\n const packageJson = await tryGetPackageJson({ installDir });\n if (!packageJson) return false;\n const reactVersion = getPackageVersion('react', packageJson);\n\n if (!reactVersion) {\n return false;\n }\n\n return fulfillsVersionRange({\n version: reactVersion,\n acceptableVersions: '>=19.0.0',\n canBeLatest: true,\n });\n } catch {\n return false;\n }\n}\n\n/**\n * Installs or updates a package with the user's package manager.\n *\n * IMPORTANT: This function modifies the `package.json`! Be sure to re-read\n * it if you make additional modifications to it after calling this function!\n */\nexport async function installPackage({\n packageName,\n alreadyInstalled,\n packageNameDisplayLabel,\n packageManager,\n forceInstall = false,\n integration,\n installDir,\n}: {\n packageName: string;\n alreadyInstalled: boolean;\n packageNameDisplayLabel?: string;\n packageManager?: PackageManager;\n forceInstall?: boolean;\n integration?: string;\n installDir: string;\n}): Promise<{ packageManager?: PackageManager }> {\n return traceStep('install-package', async () => {\n const sdkInstallSpinner = getUI().spinner();\n\n const pkgManager =\n packageManager || (await getPackageManager({ installDir }));\n\n const isReact19 = await isReact19Installed({ installDir });\n const legacyPeerDepsFlag =\n isReact19 && pkgManager.name === 'npm' ? '--legacy-peer-deps' : '';\n\n sdkInstallSpinner.start(\n `${alreadyInstalled ? 'Updating' : 'Installing'} ${\n packageNameDisplayLabel ?? packageName\n } with ${pkgManager.label}.`,\n );\n\n try {\n await new Promise<void>((resolve, reject) => {\n childProcess.exec(\n `${pkgManager.installCommand} ${packageName} ${pkgManager.flags} ${\n forceInstall ? pkgManager.forceInstallFlag : ''\n } ${legacyPeerDepsFlag}`.trim(),\n { cwd: installDir },\n (err, stdout, stderr) => {\n if (err) {\n fs.writeFileSync(\n join(\n process.cwd(),\n `posthog-wizard-installation-error-${Date.now()}.log`,\n ),\n JSON.stringify({\n stdout,\n stderr,\n }),\n { encoding: 'utf8' },\n );\n\n reject(err);\n } else {\n resolve();\n }\n },\n );\n });\n } catch (e) {\n sdkInstallSpinner.stop('Installation failed.');\n getUI().log.error(\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n `Encountered the following error during installation:\\n\\n${e}\\n\\nThe wizard has created a \\`posthog-wizard-installation-error-*.log\\` file. If you think this issue is caused by the PostHog wizard, create an issue on GitHub and include the log file's content:\\n${ISSUES_URL}`,\n );\n await abort();\n }\n\n sdkInstallSpinner.stop(\n `${alreadyInstalled ? 'Updated' : 'Installed'} ${\n packageNameDisplayLabel ?? packageName\n } with ${pkgManager.label}.`,\n );\n\n analytics.wizardCapture('package installed', {\n package_name: packageName,\n package_manager: pkgManager.name,\n integration,\n });\n\n return { packageManager: pkgManager };\n });\n}\n\n/**\n * Get package.json or abort the wizard if not found.\n * Only use where package.json is required (e.g., package install, overrides).\n * For detection/version-checks, use tryGetPackageJson() instead.\n */\nexport async function getPackageDotJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson> {\n const packageJsonFileContents = await fs.promises\n .readFile(join(installDir, 'package.json'), 'utf8')\n .catch(() => {\n getUI().log.error(\n 'Could not find package.json. Make sure to run the wizard in the root of your app!',\n );\n return abort();\n });\n\n let packageJson: PackageDotJson | undefined = undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n packageJson = JSON.parse(packageJsonFileContents);\n } catch {\n getUI().log.error(\n `Unable to parse your package.json. Make sure it has a valid format!`,\n );\n\n await abort();\n }\n\n return packageJson || {};\n}\n\n/**\n * Try to get package.json, returning null if it doesn't exist.\n * Use this for detection purposes where missing package.json is expected (e.g., Python projects).\n */\nexport async function tryGetPackageJson({\n installDir,\n}: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson | null> {\n try {\n const packageJsonFileContents = await fs.promises.readFile(\n join(installDir, 'package.json'),\n 'utf8',\n );\n return JSON.parse(packageJsonFileContents) as PackageDotJson;\n } catch {\n return null;\n }\n}\n\nexport async function updatePackageDotJson(\n packageDotJson: PackageDotJson,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n): Promise<void> {\n try {\n await fs.promises.writeFile(\n join(installDir, 'package.json'),\n JSON.stringify(packageDotJson, null, 2),\n {\n encoding: 'utf8',\n flag: 'w',\n },\n );\n } catch {\n getUI().log.error(`Unable to update your package.json.`);\n\n await abort();\n }\n}\n\n/**\n * Detect and return the package manager. Pure — no prompts.\n * Falls back to first detected or npm if ambiguous.\n */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function getPackageManager(\n options: Pick<WizardOptions, 'installDir'> & { ci?: boolean },\n): Promise<PackageManager> {\n const detectedPackageManagers = detectAllPackageManagers({\n installDir: options.installDir,\n });\n\n if (detectedPackageManagers.length >= 1) {\n const selected = detectedPackageManagers[0];\n analytics.setTag('package-manager', selected.name);\n return selected;\n }\n\n // No package manager detected — default to npm\n analytics.setTag('package-manager', npm.name);\n return npm;\n}\n\nexport function isUsingTypeScript({\n installDir,\n}: Pick<WizardOptions, 'installDir'>) {\n try {\n return fs.existsSync(join(installDir, 'tsconfig.json'));\n } catch {\n return false;\n }\n}\n\n/**\n * Get project data for the wizard via OAuth or CI API key.\n */\nexport async function getOrAskForProjectData(\n _options: Pick<WizardOptions, 'signup' | 'ci' | 'apiKey' | 'projectId'> & {\n email?: string;\n region?: CloudRegion;\n },\n): Promise<{\n host: string;\n projectApiKey: string;\n accessToken: string;\n projectId: number;\n cloudRegion: CloudRegion;\n}> {\n // CI mode: bypass OAuth, use personal API key for LLM gateway\n if (_options.ci && _options.apiKey) {\n getUI().log.info('Using provided API key (CI mode - OAuth bypassed)');\n\n const cloudRegion = await detectRegionFromToken(_options.apiKey);\n const host = getHostFromRegion(cloudRegion);\n const cloudUrl = getCloudUrlFromRegion(cloudRegion);\n\n const projectData =\n _options.projectId != null\n ? await fetchProjectDataById(\n _options.apiKey,\n _options.projectId,\n cloudUrl,\n )\n : await fetchProjectDataWithApiKey(_options.apiKey, cloudUrl);\n\n return {\n host,\n projectApiKey: projectData.api_token,\n accessToken: _options.apiKey,\n projectId: projectData.id,\n cloudRegion,\n };\n }\n\n const { host, projectApiKey, accessToken, projectId, cloudRegion } =\n await traceStep('login', () =>\n askForWizardLogin({\n signup: _options.signup,\n email: _options.email,\n region: _options.region,\n }),\n );\n\n if (!projectApiKey) {\n const cloudUrl = getCloudUrlFromRegion(cloudRegion);\n getUI().log.error(`Didn't receive a project token. This shouldn't happen :(\n\nPlease let us know if you think this is a bug in the wizard:\n${ISSUES_URL}`);\n\n getUI().log\n .info(`In the meantime, we'll add a dummy project token (\"${DUMMY_PROJECT_API_KEY}\") for you to replace later.\nYou can find your project token here:\n${cloudUrl}/settings/project#variables`);\n }\n\n return {\n accessToken,\n host: host || DEFAULT_HOST_URL,\n projectApiKey: projectApiKey || DUMMY_PROJECT_API_KEY,\n projectId,\n cloudRegion,\n };\n}\n\nasync function fetchProjectDataWithApiKey(\n apiKey: string,\n cloudUrl: string,\n): Promise<{ api_token: string; id: number }> {\n const userData = await fetchUserData(apiKey, cloudUrl);\n const projectId = userData.team?.id;\n\n if (!projectId) {\n throw new Error(\n 'Could not determine project ID from API key. Please ensure your API key has access to a project in this cloud region.',\n );\n }\n\n const projectData = await fetchProjectData(apiKey, projectId, cloudUrl);\n return {\n api_token: projectData.api_token,\n id: projectId,\n };\n}\n\nasync function fetchProjectDataById(\n apiKey: string,\n projectId: number,\n cloudUrl: string,\n): Promise<{ api_token: string; id: number }> {\n const projectData = await fetchProjectData(apiKey, projectId, cloudUrl);\n return {\n api_token: projectData.api_token,\n id: projectId,\n };\n}\n\nasync function askForWizardLogin(options: {\n signup: boolean;\n email?: string;\n region?: CloudRegion;\n}): Promise<ProjectData & { cloudRegion: CloudRegion }> {\n if (options.signup) {\n return askForProvisioningSignup(options.email, options.region);\n }\n\n const tokenResponse = await performOAuthFlow({\n scopes: [\n 'user:read',\n 'project:read',\n 'introspection',\n 'llm_gateway:read',\n 'dashboard:write',\n 'insight:write',\n 'query:read',\n ],\n signup: false,\n });\n\n const projectId = tokenResponse.scoped_teams?.[0];\n\n if (projectId === undefined) {\n const error = new Error(\n 'No project access granted. Please authorize with project-level access.',\n );\n analytics.captureException(error, {\n step: 'wizard_login',\n has_scoped_teams: !!tokenResponse.scoped_teams,\n });\n getUI().log.error(error.message);\n await abort();\n }\n\n const cloudRegion = await detectRegionFromToken(tokenResponse.access_token);\n const cloudUrl = getCloudUrlFromRegion(cloudRegion);\n const host = getHostFromRegion(cloudRegion);\n\n const projectData = await fetchProjectData(\n tokenResponse.access_token,\n projectId!,\n cloudUrl,\n );\n const userData = await fetchUserData(tokenResponse.access_token, cloudUrl);\n\n const data = {\n accessToken: tokenResponse.access_token,\n projectApiKey: projectData.api_token,\n host,\n distinctId: userData.distinct_id,\n projectId: projectId!,\n cloudRegion,\n };\n\n getUI().log.success('Login complete.');\n analytics.setTag('opened-wizard-link', true);\n analytics.setDistinctId(data.distinctId);\n\n return data;\n}\n\nasync function askForProvisioningSignup(\n email?: string,\n region?: CloudRegion,\n): Promise<ProjectData & { cloudRegion: CloudRegion }> {\n if (!email || !email.includes('@')) {\n getUI().log.error(\n 'Email is required for signup. Use --email your@email.com with --signup.',\n );\n await abort();\n throw new Error('unreachable');\n }\n\n const spinner = getUI().spinner();\n spinner.start('Creating your PostHog account...');\n\n try {\n const provisionRegion = (region ?? 'us').toUpperCase() as 'US' | 'EU';\n const result = await provisionNewAccount(email, '', provisionRegion);\n\n spinner.stop('Account created!');\n getUI().log.success('Welcome to PostHog!');\n\n const host = result.host;\n const cloudRegion: CloudRegion = host.includes('eu.') ? 'eu' : 'us';\n\n analytics.setTag('provisioning-signup', true);\n\n return {\n accessToken: result.accessToken,\n projectApiKey: result.projectApiKey,\n host,\n distinctId: email,\n projectId: parseInt(result.projectId, 10) || 0,\n cloudRegion,\n };\n } catch (error) {\n spinner.stop('Account creation failed.');\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n if (message.includes('already associated')) {\n getUI().log.info(\n 'This email already has a PostHog account. Switching to login flow...',\n );\n return askForWizardLogin({ signup: false });\n }\n\n getUI().log.error(`Failed to create account: ${message}`);\n analytics.captureException(\n error instanceof Error ? error : new Error(message),\n { step: 'provisioning_signup' },\n );\n await abort();\n throw error;\n }\n}\n\n/**\n * Creates a new config file with the given filepath and codeSnippet.\n */\nexport async function createNewConfigFile(\n filepath: string,\n codeSnippet: string,\n { installDir }: Pick<WizardOptions, 'installDir'>,\n moreInformation?: string,\n): Promise<boolean> {\n if (!isAbsolute(filepath)) {\n debug(`createNewConfigFile: filepath is not absolute: ${filepath}`);\n return false;\n }\n\n const prettyFilename = relative(installDir, filepath);\n\n try {\n await fs.promises.writeFile(filepath, codeSnippet);\n\n getUI().log.success(`Added new ${prettyFilename} file.`);\n\n if (moreInformation) {\n getUI().log.info(moreInformation);\n }\n\n return true;\n } catch (e) {\n debug(e);\n getUI().log.warn(\n `Could not create a new ${prettyFilename} file. Please create one manually and follow the instructions below.`,\n );\n }\n\n return false;\n}\n"]}
|
|
@@ -41,6 +41,10 @@ export type WizardOptions = {
|
|
|
41
41
|
* Personal API key (phx_xxx) - used for LLM gateway auth, skips OAuth
|
|
42
42
|
*/
|
|
43
43
|
apiKey?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Email address for account creation (used with --signup)
|
|
46
|
+
*/
|
|
47
|
+
email?: string;
|
|
44
48
|
/**
|
|
45
49
|
* PostHog project ID. When set (e.g. in CI with --project-id), the wizard uses this project
|
|
46
50
|
* instead of the default from the API key or OAuth.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PostHogProjectData = Record<string, unknown>;\n\nexport type PreselectedProject = {\n project: PostHogProjectData;\n authToken: string;\n};\n\nexport type WizardOptions = {\n /**\n * Whether to enable debug mode.\n */\n debug: boolean;\n\n /**\n * Whether to force install the SDK package to continue with the installation in case\n * any package manager checks are failing (e.g. peer dependency versions).\n *\n * Use with caution and only if you know what you're doing.\n *\n * Does not apply to all wizard flows (currently NPM only)\n */\n forceInstall: boolean;\n\n /**\n * The directory to run the wizard in.\n */\n installDir: string;\n\n /**\n * Whether to select the default option for all questions automatically.\n */\n default: boolean;\n\n /**\n * Whether to create a new PostHog account during setup.\n */\n signup: boolean;\n\n /**\n * Whether to use the local MCP server at http://localhost:8787/mcp\n */\n localMcp: boolean;\n\n /**\n * CI mode - non-interactive execution\n */\n ci: boolean;\n\n /**\n * Personal API key (phx_xxx) - used for LLM gateway auth, skips OAuth\n */\n apiKey?: string;\n\n /**\n * PostHog project ID. When set (e.g. in CI with --project-id), the wizard uses this project\n * instead of the default from the API key or OAuth.\n */\n projectId?: number;\n\n /**\n * Whether to show the menu for manual integration selection instead of auto-detecting.\n */\n menu: boolean;\n\n /**\n * Whether to run in benchmark mode with per-phase token tracking.\n * When enabled, the wizard runs each workflow phase as a separate agent call\n * and writes detailed usage data to /tmp/posthog-wizard-benchmark.json.\n */\n benchmark: boolean;\n\n /**\n * Cloud region for the PostHog instance (US or EU).\n * When not provided, the user will be prompted to select one.\n */\n cloudRegion?: CloudRegion;\n\n /**\n * Whether to print a YARA scanner summary after the agent run.\n */\n yaraReport: boolean;\n};\n\nexport interface Feature {\n id: string;\n prompt: string;\n enabledHint?: string;\n disabledHint?: string;\n}\n\nexport type FileChange = {\n filePath: string;\n oldContent?: string;\n newContent: string;\n};\n\nexport type CloudRegion = 'us' | 'eu';\n\nexport type AIModel =\n | 'gpt-5-mini'\n | 'o4-mini'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-pro';\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/utils/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PostHogProjectData = Record<string, unknown>;\n\nexport type PreselectedProject = {\n project: PostHogProjectData;\n authToken: string;\n};\n\nexport type WizardOptions = {\n /**\n * Whether to enable debug mode.\n */\n debug: boolean;\n\n /**\n * Whether to force install the SDK package to continue with the installation in case\n * any package manager checks are failing (e.g. peer dependency versions).\n *\n * Use with caution and only if you know what you're doing.\n *\n * Does not apply to all wizard flows (currently NPM only)\n */\n forceInstall: boolean;\n\n /**\n * The directory to run the wizard in.\n */\n installDir: string;\n\n /**\n * Whether to select the default option for all questions automatically.\n */\n default: boolean;\n\n /**\n * Whether to create a new PostHog account during setup.\n */\n signup: boolean;\n\n /**\n * Whether to use the local MCP server at http://localhost:8787/mcp\n */\n localMcp: boolean;\n\n /**\n * CI mode - non-interactive execution\n */\n ci: boolean;\n\n /**\n * Personal API key (phx_xxx) - used for LLM gateway auth, skips OAuth\n */\n apiKey?: string;\n\n /**\n * Email address for account creation (used with --signup)\n */\n email?: string;\n\n /**\n * PostHog project ID. When set (e.g. in CI with --project-id), the wizard uses this project\n * instead of the default from the API key or OAuth.\n */\n projectId?: number;\n\n /**\n * Whether to show the menu for manual integration selection instead of auto-detecting.\n */\n menu: boolean;\n\n /**\n * Whether to run in benchmark mode with per-phase token tracking.\n * When enabled, the wizard runs each workflow phase as a separate agent call\n * and writes detailed usage data to /tmp/posthog-wizard-benchmark.json.\n */\n benchmark: boolean;\n\n /**\n * Cloud region for the PostHog instance (US or EU).\n * When not provided, the user will be prompted to select one.\n */\n cloudRegion?: CloudRegion;\n\n /**\n * Whether to print a YARA scanner summary after the agent run.\n */\n yaraReport: boolean;\n};\n\nexport interface Feature {\n id: string;\n prompt: string;\n enabledHint?: string;\n disabledHint?: string;\n}\n\nexport type FileChange = {\n filePath: string;\n oldContent?: string;\n newContent: string;\n};\n\nexport type CloudRegion = 'us' | 'eu';\n\nexport type AIModel =\n | 'gpt-5-mini'\n | 'o4-mini'\n | 'gemini-2.5-flash'\n | 'gemini-2.5-pro';\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { type OutroData } from '../lib/wizard-session';
|
|
1
2
|
export declare class WizardError extends Error {
|
|
2
3
|
readonly context?: Record<string, unknown> | undefined;
|
|
3
4
|
constructor(message: string, context?: Record<string, unknown> | undefined);
|
|
4
5
|
}
|
|
5
6
|
interface WizardAbortOptions {
|
|
6
7
|
message?: string;
|
|
8
|
+
/** Structured error data. Renders via `outroError` instead of `outro`. */
|
|
9
|
+
outroData?: OutroData;
|
|
7
10
|
error?: Error | WizardError;
|
|
8
11
|
exitCode?: number;
|
|
9
12
|
}
|
|
@@ -14,6 +14,7 @@ exports.wizardAbort = wizardAbort;
|
|
|
14
14
|
*/
|
|
15
15
|
const analytics_1 = require("./analytics");
|
|
16
16
|
const ui_1 = require("../ui");
|
|
17
|
+
const wizard_session_1 = require("../lib/wizard-session");
|
|
17
18
|
class WizardError extends Error {
|
|
18
19
|
context;
|
|
19
20
|
constructor(message, context) {
|
|
@@ -31,7 +32,7 @@ function clearCleanup() {
|
|
|
31
32
|
cleanupFns.length = 0;
|
|
32
33
|
}
|
|
33
34
|
async function wizardAbort(options) {
|
|
34
|
-
const { message = 'Wizard setup cancelled.', error, exitCode = 1, } = options ?? {};
|
|
35
|
+
const { message = 'Wizard setup cancelled.', outroData, error, exitCode = 1, } = options ?? {};
|
|
35
36
|
// 1. Run registered cleanup functions
|
|
36
37
|
for (const fn of cleanupFns) {
|
|
37
38
|
try {
|
|
@@ -49,8 +50,9 @@ async function wizardAbort(options) {
|
|
|
49
50
|
}
|
|
50
51
|
// 3. Shutdown analytics
|
|
51
52
|
await analytics_1.analytics.shutdown(error ? 'error' : 'cancelled');
|
|
52
|
-
// 4.
|
|
53
|
-
|
|
53
|
+
// 4. Render the error outro. Synthesize OutroData from `message`
|
|
54
|
+
// when the caller didn't provide structured data.
|
|
55
|
+
(0, ui_1.getUI)().outroError(outroData ?? { kind: wizard_session_1.OutroKind.Error, message });
|
|
54
56
|
// 5. Exit (fires 'exit' event so TUI cleanup runs)
|
|
55
57
|
return process.exit(exitCode);
|
|
56
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wizard-abort.js","sourceRoot":"","sources":["../../../src/utils/wizard-abort.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"wizard-abort.js","sourceRoot":"","sources":["../../../src/utils/wizard-abort.ts"],"names":[],"mappings":";;;AAgCA,0CAEC;AAED,oCAEC;AAED,kCAmCC;AA3ED;;;;;;;GAOG;AACH,2CAAwC;AACxC,8BAA8B;AAC9B,0DAAkE;AAElE,MAAa,WAAY,SAAQ,KAAK;IAGlB;IAFlB,YACE,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AARD,kCAQC;AAUD,MAAM,UAAU,GAAsB,EAAE,CAAC;AAEzC,SAAgB,eAAe,CAAC,EAAc;IAC5C,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,SAAgB,YAAY;IAC1B,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;AACxB,CAAC;AAEM,KAAK,UAAU,WAAW,CAC/B,OAA4B;IAE5B,MAAM,EACJ,OAAO,GAAG,yBAAyB,EACnC,SAAS,EACT,KAAK,EACL,QAAQ,GAAG,CAAC,GACb,GAAG,OAAO,IAAI,EAAE,CAAC;IAElB,sCAAsC;IACtC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,EAAE,EAAE,CAAC;QACP,CAAC;QAAC,MAAM,CAAC;YACP,qCAAqC;QACvC,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,KAAK,EAAE,CAAC;QACV,qBAAS,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAChC,GAAG,CAAC,CAAC,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;SAC3D,CAAC,CAAC;IACL,CAAC;IAED,wBAAwB;IACxB,MAAM,qBAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAExD,iEAAiE;IACjE,qDAAqD;IACrD,IAAA,UAAK,GAAE,CAAC,UAAU,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,0BAAS,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAEpE,mDAAmD;IACnD,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC","sourcesContent":["/**\n * Single exit point for the wizard. Use instead of process.exit() directly.\n *\n * Sequence: cleanup -> error capture (optional) -> analytics shutdown -> outro -> process.exit\n *\n * WizardError is a data carrier passed to wizardAbort() for analytics context, never thrown.\n * The legacy abort() in setup-utils.ts delegates here.\n */\nimport { analytics } from './analytics';\nimport { getUI } from '../ui';\nimport { OutroKind, type OutroData } from '../lib/wizard-session';\n\nexport class WizardError extends Error {\n constructor(\n message: string,\n public readonly context?: Record<string, unknown>,\n ) {\n super(message);\n this.name = 'WizardError';\n }\n}\n\ninterface WizardAbortOptions {\n message?: string;\n /** Structured error data. Renders via `outroError` instead of `outro`. */\n outroData?: OutroData;\n error?: Error | WizardError;\n exitCode?: number;\n}\n\nconst cleanupFns: Array<() => void> = [];\n\nexport function registerCleanup(fn: () => void): void {\n cleanupFns.push(fn);\n}\n\nexport function clearCleanup(): void {\n cleanupFns.length = 0;\n}\n\nexport async function wizardAbort(\n options?: WizardAbortOptions,\n): Promise<never> {\n const {\n message = 'Wizard setup cancelled.',\n outroData,\n error,\n exitCode = 1,\n } = options ?? {};\n\n // 1. Run registered cleanup functions\n for (const fn of cleanupFns) {\n try {\n fn();\n } catch {\n /* cleanup should not prevent exit */\n }\n }\n\n // 2. Capture error in analytics (if provided)\n if (error) {\n analytics.captureException(error, {\n ...((error instanceof WizardError && error.context) || {}),\n });\n }\n\n // 3. Shutdown analytics\n await analytics.shutdown(error ? 'error' : 'cancelled');\n\n // 4. Render the error outro. Synthesize OutroData from `message`\n // when the caller didn't provide structured data.\n getUI().outroError(outroData ?? { kind: OutroKind.Error, message });\n\n // 5. Exit (fires 'exit' event so TUI cleanup runs)\n return process.exit(exitCode);\n}\n"]}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@posthog/wizard",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@posthog/wizard",
|
|
9
|
-
"version": "2.
|
|
9
|
+
"version": "2.9.0",
|
|
10
10
|
"dependencies": {
|
|
11
11
|
"@anthropic-ai/claude-agent-sdk": "0.2.73",
|
|
12
12
|
"@inkjs/ui": "^2.0.0",
|
package/package.json
CHANGED