@komatikai/trailhead 3.0.2

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 ADDED
@@ -0,0 +1,52 @@
1
+ # Trailhead CLI
2
+
3
+ Interactive setup wizard for Trailhead. Generates `.trailhead.yml` and the GitHub Actions workflow YAML with all v3 features configured.
4
+
5
+ ## Usage
6
+
7
+ ```bash
8
+ npx @komatikai/trailhead init
9
+ ```
10
+
11
+ No installation required. The wizard walks you through:
12
+
13
+ 1. **Sensitivity patterns** — which file paths are high/medium risk (auth, payments, migrations)
14
+ 2. **Thresholds** — risk and warn scores (defaults: 70/55)
15
+ 3. **Freeze windows** — days and hours when deployments are blocked
16
+ 4. **Environments** — per-environment threshold overrides (production, staging, etc.)
17
+ 5. **Services** — monorepo service boundaries with path patterns
18
+ 6. **Security gate** — whether to include Code Scanning alerts as a risk factor
19
+ 7. **Canary tracking** — Vercel or generic deploy outcome webhook type
20
+ 8. **DORA metrics** — whether to compute DORA-5 alongside gate evaluations
21
+ 9. **Health checks** — URLs to probe before scoring
22
+ 10. **Webhooks** — Slack/Discord notification URL and trigger events
23
+ 11. **OpenTelemetry** — OTLP endpoint for evaluation span export
24
+ 12. **Evaluation store** — URL for persisting evaluations to a trend dashboard
25
+
26
+ ## Output
27
+
28
+ The wizard generates two files:
29
+
30
+ - **`.trailhead.yml`** — per-repo configuration (sensitivity, thresholds, freeze windows, environments, services, security, canary)
31
+ - **`.github/workflows/trailhead.yml`** — GitHub Actions workflow with all selected features
32
+
33
+ ## Development
34
+
35
+ ```bash
36
+ cd cli
37
+ npm install
38
+ npx tsc
39
+ node dist/index.js
40
+ ```
41
+
42
+ The CLI is a zero-dependency ESM module. Build output goes to `cli/dist/` (gitignored — build before npm publish).
43
+
44
+ ## Publishing
45
+
46
+ ```bash
47
+ cd cli
48
+ npx tsc
49
+ npm publish
50
+ ```
51
+
52
+ The package is published as `@komatikai/trailhead` on npm, making `npx @komatikai/trailhead init` work without installation.
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,358 @@
1
+ #!/usr/bin/env node
2
+ import * as readline from "node:readline";
3
+ import * as fs from "node:fs";
4
+ import * as path from "node:path";
5
+ const BOLD = "\x1b[1m";
6
+ const GREEN = "\x1b[32m";
7
+ const YELLOW = "\x1b[33m";
8
+ const CYAN = "\x1b[36m";
9
+ const RESET = "\x1b[0m";
10
+ const DIM = "\x1b[2m";
11
+ function print(msg) {
12
+ process.stdout.write(msg + "\n");
13
+ }
14
+ function ask(rl, question, defaultValue) {
15
+ const suffix = defaultValue ? ` ${DIM}(${defaultValue})${RESET}` : "";
16
+ return new Promise((resolve) => {
17
+ rl.question(` ${question}${suffix}: `, (answer) => {
18
+ resolve(answer.trim() || defaultValue || "");
19
+ });
20
+ });
21
+ }
22
+ function askYN(rl, question, defaultYes) {
23
+ const hint = defaultYes ? "Y/n" : "y/N";
24
+ return new Promise((resolve) => {
25
+ rl.question(` ${question} ${DIM}(${hint})${RESET}: `, (answer) => {
26
+ const a = answer.trim().toLowerCase();
27
+ if (a === "")
28
+ resolve(defaultYes);
29
+ else
30
+ resolve(a === "y" || a === "yes");
31
+ });
32
+ });
33
+ }
34
+ function generateTrailheadYml(options) {
35
+ const lines = [
36
+ "# Trailhead v3 configuration",
37
+ "# https://github.com/KomatikAI/trailhead",
38
+ "",
39
+ ];
40
+ if (options.highSensitivity.length > 0 || options.mediumSensitivity.length > 0) {
41
+ lines.push("sensitivity:");
42
+ if (options.highSensitivity.length > 0) {
43
+ lines.push(" high:");
44
+ for (const p of options.highSensitivity)
45
+ lines.push(` - "${p}"`);
46
+ }
47
+ if (options.mediumSensitivity.length > 0) {
48
+ lines.push(" medium:");
49
+ for (const p of options.mediumSensitivity)
50
+ lines.push(` - "${p}"`);
51
+ }
52
+ lines.push("");
53
+ }
54
+ lines.push("thresholds:");
55
+ lines.push(` risk: ${options.riskThreshold}`);
56
+ lines.push(` warn: ${options.warnThreshold}`);
57
+ lines.push("");
58
+ if (options.environments.length > 0) {
59
+ lines.push("environments:");
60
+ for (const env of options.environments) {
61
+ lines.push(` ${env.name}:`);
62
+ lines.push(` risk: ${env.risk}`);
63
+ lines.push(` warn: ${env.warn}`);
64
+ }
65
+ lines.push("");
66
+ }
67
+ if (options.services.length > 0) {
68
+ lines.push("services:");
69
+ for (const svc of options.services) {
70
+ lines.push(` ${svc.name}:`);
71
+ lines.push(" paths:");
72
+ for (const p of svc.paths)
73
+ lines.push(` - "${p}"`);
74
+ if (svc.env)
75
+ lines.push(` environment: ${svc.env}`);
76
+ }
77
+ lines.push("");
78
+ }
79
+ if (options.securityGate) {
80
+ lines.push("security:");
81
+ lines.push(" severity_threshold: warning");
82
+ lines.push(" block_on_critical: true");
83
+ lines.push("");
84
+ }
85
+ if (options.canaryType) {
86
+ lines.push("canary:");
87
+ lines.push(` webhook_type: ${options.canaryType}`);
88
+ lines.push("");
89
+ }
90
+ if (options.freezeDays.length > 0 && options.freezeAfterHour !== null) {
91
+ lines.push("freeze:");
92
+ lines.push(" - days:");
93
+ for (const d of options.freezeDays)
94
+ lines.push(` - "${d}"`);
95
+ lines.push(` afterHour: ${options.freezeAfterHour}`);
96
+ lines.push(` message: "No deploys during freeze window"`);
97
+ lines.push("");
98
+ }
99
+ return lines.join("\n") + "\n";
100
+ }
101
+ function generateWorkflowYml(options) {
102
+ const lines = [
103
+ "name: Trailhead",
104
+ "",
105
+ "on:",
106
+ " pull_request:",
107
+ " types: [opened, synchronize, reopened]",
108
+ "",
109
+ "permissions:",
110
+ " contents: read",
111
+ " pull-requests: write",
112
+ " checks: write",
113
+ " security-events: read",
114
+ "",
115
+ "jobs:",
116
+ " trailhead:",
117
+ " runs-on: ubuntu-latest",
118
+ " steps:",
119
+ " - uses: actions/checkout@v4",
120
+ "",
121
+ " - uses: KomatikAI/trailhead@v3",
122
+ " id: gate",
123
+ " with:",
124
+ ` risk-threshold: "${options.riskThreshold}"`,
125
+ ];
126
+ if (options.healthCheckUrls.length > 0) {
127
+ lines.push(` health-check-urls: "${options.healthCheckUrls.join(",")}"`);
128
+ }
129
+ if (options.doraMetrics) {
130
+ lines.push(' dora-metrics: "true"');
131
+ }
132
+ if (options.doraEnvironment) {
133
+ lines.push(` dora-environment: "${options.doraEnvironment}"`);
134
+ }
135
+ if (options.environment) {
136
+ lines.push(` environment: "${options.environment}"`);
137
+ }
138
+ if (!options.securityGate) {
139
+ lines.push(' security-gate: "false"');
140
+ }
141
+ if (options.otelEndpoint) {
142
+ lines.push(` otel-endpoint: "${options.otelEndpoint}"`);
143
+ }
144
+ if (options.evaluationStoreUrl) {
145
+ lines.push(` evaluation-store-url: "${options.evaluationStoreUrl}"`);
146
+ if (options.storeSecretName) {
147
+ lines.push(` evaluation-store-secret: \${{ secrets.${options.storeSecretName} }}`);
148
+ }
149
+ }
150
+ const envLines = [];
151
+ if (options.evaluationStoreUrl && options.storeSecretName) {
152
+ envLines.push(` EVALUATION_STORE_SECRET: \${{ secrets.${options.storeSecretName} }}`);
153
+ }
154
+ if (options.supabaseFallback) {
155
+ envLines.push(` SUPABASE_URL: \${{ secrets.SUPABASE_URL }}`);
156
+ envLines.push(` SUPABASE_SERVICE_ROLE_KEY: \${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}`);
157
+ }
158
+ if (envLines.length > 0) {
159
+ lines.push(" env:");
160
+ for (const el of envLines)
161
+ lines.push(el);
162
+ }
163
+ if (options.doraMetrics) {
164
+ lines.push("");
165
+ lines.push(" - name: DORA outputs");
166
+ lines.push(" if: always()");
167
+ lines.push(" run: |");
168
+ lines.push(' echo "dora-rating: ${{ steps.gate.outputs.dora-rating }}"');
169
+ lines.push(' echo "dora-freq: ${{ steps.gate.outputs.dora-deployment-frequency }}"');
170
+ lines.push(' echo "dora-cfr: ${{ steps.gate.outputs.dora-change-failure-rate }}"');
171
+ lines.push(' echo "dora-lead: ${{ steps.gate.outputs.dora-lead-time }}"');
172
+ lines.push(' echo "dora-fdrt: ${{ steps.gate.outputs.dora-fdrt }}"');
173
+ lines.push(' echo "dora-rework: ${{ steps.gate.outputs.dora-rework-rate }}"');
174
+ }
175
+ lines.push("");
176
+ return lines.join("\n") + "\n";
177
+ }
178
+ async function main() {
179
+ const args = process.argv.slice(2);
180
+ const command = args[0];
181
+ if (command !== "init") {
182
+ print(`
183
+ ${BOLD}${GREEN}Trailhead CLI v3.0.2${RESET}
184
+
185
+ ${BOLD}Usage:${RESET}
186
+ npx @komatikai/trailhead init Interactive setup wizard
187
+
188
+ ${BOLD}Learn more:${RESET}
189
+ https://github.com/KomatikAI/trailhead
190
+ `);
191
+ return;
192
+ }
193
+ const rl = readline.createInterface({
194
+ input: process.stdin,
195
+ output: process.stdout,
196
+ });
197
+ print(`\n${BOLD}${GREEN}Trailhead v3 Setup Wizard${RESET}\n`);
198
+ print(`${DIM}This will create .trailhead.yml and a GitHub Actions workflow.${RESET}\n`);
199
+ const riskStr = await ask(rl, `${CYAN}Risk threshold${RESET} (block above this score, 0-100)`, "70");
200
+ const riskThreshold = Math.max(0, Math.min(100, parseInt(riskStr, 10) || 70));
201
+ const warnStr = await ask(rl, `${CYAN}Warn threshold${RESET} (warn above this score)`, String(riskThreshold - 15));
202
+ const warnThreshold = Math.max(0, Math.min(100, parseInt(warnStr, 10) || riskThreshold - 15));
203
+ print(`\n${BOLD}Sensitive file patterns${RESET} ${DIM}(files that carry extra risk weight)${RESET}`);
204
+ const highInput = await ask(rl, "High-sensitivity globs (comma-separated)", "");
205
+ const highSensitivity = highInput
206
+ ? highInput
207
+ .split(",")
208
+ .map((s) => s.trim())
209
+ .filter(Boolean)
210
+ : [];
211
+ const medInput = await ask(rl, "Medium-sensitivity globs (comma-separated)", "");
212
+ const mediumSensitivity = medInput
213
+ ? medInput
214
+ .split(",")
215
+ .map((s) => s.trim())
216
+ .filter(Boolean)
217
+ : [];
218
+ print(`\n${BOLD}Environment configuration${RESET} ${DIM}(per-environment threshold overrides)${RESET}`);
219
+ const wantEnvs = await askYN(rl, "Configure environment-specific thresholds?", false);
220
+ const environments = [];
221
+ let environment = "";
222
+ if (wantEnvs) {
223
+ const envsInput = await ask(rl, "Environment names (comma-separated)", "production,staging");
224
+ const envNames = envsInput
225
+ .split(",")
226
+ .map((s) => s.trim())
227
+ .filter(Boolean);
228
+ for (const name of envNames) {
229
+ const r = await ask(rl, ` ${name} risk threshold`, String(riskThreshold));
230
+ const w = await ask(rl, ` ${name} warn threshold`, String(parseInt(r, 10) - 15));
231
+ environments.push({
232
+ name,
233
+ risk: parseInt(r, 10) || riskThreshold,
234
+ warn: parseInt(w, 10) || riskThreshold - 15,
235
+ });
236
+ }
237
+ environment = envNames[0] ?? "";
238
+ }
239
+ print(`\n${BOLD}Service mapping${RESET} ${DIM}(monorepo per-service DORA + risk)${RESET}`);
240
+ const wantServices = await askYN(rl, "Configure service boundaries?", false);
241
+ const services = [];
242
+ if (wantServices) {
243
+ const svcInput = await ask(rl, "Service names (comma-separated)", "api,web");
244
+ const svcNames = svcInput
245
+ .split(",")
246
+ .map((s) => s.trim())
247
+ .filter(Boolean);
248
+ for (const name of svcNames) {
249
+ const p = await ask(rl, ` ${name} path globs (comma-separated)`, `src/${name}/**`);
250
+ const e = await ask(rl, ` ${name} environment`, "");
251
+ services.push({
252
+ name,
253
+ paths: p
254
+ .split(",")
255
+ .map((s) => s.trim())
256
+ .filter(Boolean),
257
+ env: e,
258
+ });
259
+ }
260
+ }
261
+ print(`\n${BOLD}Health checks${RESET} ${DIM}(URLs to ping before scoring)${RESET}`);
262
+ const healthInput = await ask(rl, "Health check URLs (comma-separated, or blank to skip)", "");
263
+ const healthCheckUrls = healthInput
264
+ ? healthInput
265
+ .split(",")
266
+ .map((s) => s.trim())
267
+ .filter(Boolean)
268
+ : [];
269
+ const doraMetrics = await askYN(rl, `${CYAN}Enable DORA-5 metrics?${RESET}`, true);
270
+ const doraEnvironment = doraMetrics
271
+ ? await ask(rl, `${CYAN}DORA environment filter${RESET} (blank for all)`, environment || "")
272
+ : "";
273
+ const securityGate = await askYN(rl, `${CYAN}Enable security alerts gate?${RESET} ${DIM}(requires Code Scanning)${RESET}`, true);
274
+ print(`\n${BOLD}Canary / deploy tracking${RESET} ${DIM}(track deployment outcomes)${RESET}`);
275
+ const wantCanary = await askYN(rl, "Configure deployment outcome webhooks?", false);
276
+ let canaryType = "";
277
+ if (wantCanary) {
278
+ canaryType = await ask(rl, "Webhook type (vercel/generic)", "vercel");
279
+ }
280
+ const otelEndpoint = await ask(rl, `${CYAN}OTLP endpoint${RESET} (blank to skip)`, "");
281
+ const wantStore = await askYN(rl, `${CYAN}POST evaluations to a trend-store URL?${RESET} ${DIM}(optional)${RESET}`, false);
282
+ let evaluationStoreUrl = "";
283
+ let storeSecretName = "";
284
+ let supabaseFallback = false;
285
+ if (wantStore) {
286
+ evaluationStoreUrl = await ask(rl, "Store URL (your API that accepts Trailhead evaluation JSON)", "");
287
+ storeSecretName = await ask(rl, "GitHub Actions secret name for the Bearer token", "INTERNAL_API_SECRET");
288
+ supabaseFallback = await askYN(rl, "Include Supabase URL + service role for direct-insert fallback?", true);
289
+ }
290
+ print(`\n${BOLD}Release freeze${RESET} ${DIM}(block deploys during specific times)${RESET}`);
291
+ const wantFreeze = await askYN(rl, "Configure a freeze window?", false);
292
+ let freezeDays = [];
293
+ let freezeAfterHour = null;
294
+ if (wantFreeze) {
295
+ const daysInput = await ask(rl, "Freeze days (e.g. friday,saturday)", "friday");
296
+ freezeDays = daysInput
297
+ .split(",")
298
+ .map((s) => s.trim().toLowerCase())
299
+ .filter(Boolean);
300
+ const hourStr = await ask(rl, "Freeze after hour (0-23, UTC)", "15");
301
+ freezeAfterHour = Math.max(0, Math.min(23, parseInt(hourStr, 10) || 15));
302
+ }
303
+ rl.close();
304
+ print(`\n${BOLD}Writing files...${RESET}\n`);
305
+ const configContent = generateTrailheadYml({
306
+ highSensitivity,
307
+ mediumSensitivity,
308
+ riskThreshold,
309
+ warnThreshold,
310
+ freezeDays,
311
+ freezeAfterHour,
312
+ environments,
313
+ services,
314
+ securityGate,
315
+ canaryType,
316
+ });
317
+ const configPath = path.join(process.cwd(), ".trailhead.yml");
318
+ fs.writeFileSync(configPath, configContent, "utf-8");
319
+ print(` ${GREEN}✓${RESET} .trailhead.yml`);
320
+ const workflowDir = path.join(process.cwd(), ".github", "workflows");
321
+ fs.mkdirSync(workflowDir, { recursive: true });
322
+ const workflowContent = generateWorkflowYml({
323
+ riskThreshold,
324
+ healthCheckUrls,
325
+ doraMetrics,
326
+ doraEnvironment,
327
+ otelEndpoint,
328
+ evaluationStoreUrl,
329
+ storeSecretName,
330
+ supabaseFallback,
331
+ securityGate,
332
+ environment,
333
+ });
334
+ const workflowPath = path.join(workflowDir, "trailhead.yml");
335
+ if (fs.existsSync(workflowPath)) {
336
+ print(` ${YELLOW}⚠${RESET} .github/workflows/trailhead.yml already exists — writing to trailhead-generated.yml`);
337
+ fs.writeFileSync(path.join(workflowDir, "trailhead-generated.yml"), workflowContent, "utf-8");
338
+ }
339
+ else {
340
+ fs.writeFileSync(workflowPath, workflowContent, "utf-8");
341
+ print(` ${GREEN}✓${RESET} .github/workflows/trailhead.yml`);
342
+ }
343
+ print(`
344
+ ${BOLD}${GREEN}Setup complete!${RESET}
345
+
346
+ ${BOLD}Next steps:${RESET}
347
+ 1. Review the generated files
348
+ 2. Commit and push to your repository
349
+ 3. Open a PR to see Trailhead in action
350
+
351
+ ${DIM}Docs: https://github.com/KomatikAI/trailhead${RESET}
352
+ `);
353
+ }
354
+ main().catch((err) => {
355
+ console.error("Error:", err);
356
+ process.exit(1);
357
+ });
358
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "@komatikai/trailhead",
3
+ "version": "3.0.2",
4
+ "description": "Trailhead CLI — setup wizard and utilities for the Trailhead deployment gate",
5
+ "type": "module",
6
+ "bin": {
7
+ "trailhead": "dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "prepublishOnly": "npm run build",
12
+ "start": "node dist/index.js"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "keywords": [
18
+ "deploy",
19
+ "deployment",
20
+ "gate",
21
+ "cicd",
22
+ "github-actions",
23
+ "risk",
24
+ "dora"
25
+ ],
26
+ "license": "MIT",
27
+ "dependencies": {},
28
+ "devDependencies": {
29
+ "@types/node": "^25.8.0",
30
+ "typescript": "^5.5.0"
31
+ }
32
+ }