@stackbilt/cli 0.4.1 → 0.5.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.
Files changed (84) hide show
  1. package/README.md +25 -5
  2. package/dist/__tests__/adf-metrics.test.d.ts +2 -0
  3. package/dist/__tests__/adf-metrics.test.d.ts.map +1 -0
  4. package/dist/__tests__/adf-metrics.test.js +117 -0
  5. package/dist/__tests__/adf-metrics.test.js.map +1 -0
  6. package/dist/__tests__/git-helpers.test.d.ts +2 -0
  7. package/dist/__tests__/git-helpers.test.d.ts.map +1 -0
  8. package/dist/__tests__/git-helpers.test.js +136 -0
  9. package/dist/__tests__/git-helpers.test.js.map +1 -0
  10. package/dist/__tests__/setup.test.d.ts +2 -0
  11. package/dist/__tests__/setup.test.d.ts.map +1 -0
  12. package/dist/__tests__/setup.test.js +74 -0
  13. package/dist/__tests__/setup.test.js.map +1 -0
  14. package/dist/__tests__/telemetry.test.d.ts +2 -0
  15. package/dist/__tests__/telemetry.test.d.ts.map +1 -0
  16. package/dist/__tests__/telemetry.test.js +119 -0
  17. package/dist/__tests__/telemetry.test.js.map +1 -0
  18. package/dist/commands/adf-bundle.d.ts.map +1 -1
  19. package/dist/commands/adf-bundle.js +37 -17
  20. package/dist/commands/adf-bundle.js.map +1 -1
  21. package/dist/commands/adf-evidence.d.ts.map +1 -1
  22. package/dist/commands/adf-evidence.js +57 -19
  23. package/dist/commands/adf-evidence.js.map +1 -1
  24. package/dist/commands/adf-metrics.d.ts +8 -0
  25. package/dist/commands/adf-metrics.d.ts.map +1 -0
  26. package/dist/commands/adf-metrics.js +242 -0
  27. package/dist/commands/adf-metrics.js.map +1 -0
  28. package/dist/commands/adf-migrate.js +16 -13
  29. package/dist/commands/adf-migrate.js.map +1 -1
  30. package/dist/commands/adf-sync.d.ts.map +1 -1
  31. package/dist/commands/adf-sync.js +22 -12
  32. package/dist/commands/adf-sync.js.map +1 -1
  33. package/dist/commands/adf.d.ts +4 -0
  34. package/dist/commands/adf.d.ts.map +1 -1
  35. package/dist/commands/adf.js +232 -83
  36. package/dist/commands/adf.js.map +1 -1
  37. package/dist/commands/audit.d.ts.map +1 -1
  38. package/dist/commands/audit.js +19 -87
  39. package/dist/commands/audit.js.map +1 -1
  40. package/dist/commands/bootstrap.d.ts.map +1 -1
  41. package/dist/commands/bootstrap.js +32 -33
  42. package/dist/commands/bootstrap.js.map +1 -1
  43. package/dist/commands/doctor.d.ts +1 -1
  44. package/dist/commands/doctor.d.ts.map +1 -1
  45. package/dist/commands/doctor.js +66 -41
  46. package/dist/commands/doctor.js.map +1 -1
  47. package/dist/commands/drift.d.ts.map +1 -1
  48. package/dist/commands/drift.js +2 -8
  49. package/dist/commands/drift.js.map +1 -1
  50. package/dist/commands/hook.d.ts.map +1 -1
  51. package/dist/commands/hook.js +23 -21
  52. package/dist/commands/hook.js.map +1 -1
  53. package/dist/commands/init.d.ts.map +1 -1
  54. package/dist/commands/init.js +2 -8
  55. package/dist/commands/init.js.map +1 -1
  56. package/dist/commands/setup.d.ts.map +1 -1
  57. package/dist/commands/setup.js +38 -9
  58. package/dist/commands/setup.js.map +1 -1
  59. package/dist/commands/telemetry.d.ts +8 -0
  60. package/dist/commands/telemetry.d.ts.map +1 -0
  61. package/dist/commands/telemetry.js +184 -0
  62. package/dist/commands/telemetry.js.map +1 -0
  63. package/dist/commands/validate.d.ts.map +1 -1
  64. package/dist/commands/validate.js +11 -97
  65. package/dist/commands/validate.js.map +1 -1
  66. package/dist/commands/why.d.ts.map +1 -1
  67. package/dist/commands/why.js +7 -76
  68. package/dist/commands/why.js.map +1 -1
  69. package/dist/flags.d.ts +20 -0
  70. package/dist/flags.d.ts.map +1 -0
  71. package/dist/flags.js +76 -0
  72. package/dist/flags.js.map +1 -0
  73. package/dist/git-helpers.d.ts +36 -0
  74. package/dist/git-helpers.d.ts.map +1 -0
  75. package/dist/git-helpers.js +146 -0
  76. package/dist/git-helpers.js.map +1 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +95 -55
  79. package/dist/index.js.map +1 -1
  80. package/dist/telemetry.d.ts +29 -0
  81. package/dist/telemetry.d.ts.map +1 -0
  82. package/dist/telemetry.js +88 -0
  83. package/dist/telemetry.js.map +1 -0
  84. package/package.json +8 -8
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * Shared git invocation helpers.
4
+ *
5
+ * Centralizes all child-process git calls behind a single `runGit()` that
6
+ * uses `shell: true` for cross-platform PATH resolution (fixes WSL, CMD,
7
+ * PowerShell parity — see ADX-005 F2).
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.runGit = runGit;
11
+ exports.isGitRepo = isGitRepo;
12
+ exports.hasCommits = hasCommits;
13
+ exports.getGitErrorMessage = getGitErrorMessage;
14
+ exports.parseCommitMetadata = parseCommitMetadata;
15
+ exports.parseChangedFilesByCommit = parseChangedFilesByCommit;
16
+ exports.getRecentCommitRange = getRecentCommitRange;
17
+ const node_child_process_1 = require("node:child_process");
18
+ // ---------------------------------------------------------------------------
19
+ // Core git invocation
20
+ // ---------------------------------------------------------------------------
21
+ /**
22
+ * Run a git command and return its stdout.
23
+ *
24
+ * Uses `shell: true` so that the OS shell resolves the `git` binary via
25
+ * PATH. This is the key cross-platform fix: `execFileSync` *without* a
26
+ * shell can fail on WSL/Windows when git lives in a PATH entry the Node
27
+ * process doesn't see directly.
28
+ */
29
+ function runGit(args) {
30
+ return (0, node_child_process_1.execFileSync)('git', args, {
31
+ encoding: 'utf-8',
32
+ stdio: ['ignore', 'pipe', 'pipe'],
33
+ maxBuffer: 10 * 1024 * 1024,
34
+ shell: true,
35
+ });
36
+ }
37
+ /** Returns `true` when the current working directory is inside a git work tree. */
38
+ function isGitRepo() {
39
+ try {
40
+ runGit(['rev-parse', '--is-inside-work-tree']);
41
+ return true;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ /** Returns `true` when the repository has at least one commit (HEAD exists). */
48
+ function hasCommits() {
49
+ try {
50
+ runGit(['rev-parse', '--verify', 'HEAD']);
51
+ return true;
52
+ }
53
+ catch {
54
+ return false;
55
+ }
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Error formatting
59
+ // ---------------------------------------------------------------------------
60
+ /** Extract a human-readable message from a git child-process error. */
61
+ function getGitErrorMessage(error) {
62
+ const fallback = 'Unknown git error.';
63
+ if (!(error instanceof Error))
64
+ return fallback;
65
+ const execError = error;
66
+ if (execError.stderr) {
67
+ const stderr = execError.stderr.toString().trim();
68
+ if (stderr.length > 0) {
69
+ return stderr;
70
+ }
71
+ }
72
+ if (execError.message) {
73
+ return execError.message.trim();
74
+ }
75
+ return fallback;
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Commit log parsing (shared by audit, validate, why)
79
+ // ---------------------------------------------------------------------------
80
+ /**
81
+ * Parse `git log --format=%H%x1f%an%x1f%aI%x1f%B%x1e` output into commit
82
+ * metadata (without file lists).
83
+ */
84
+ function parseCommitMetadata(logOutput) {
85
+ const commits = [];
86
+ for (const rawRecord of logOutput.split('\x1e')) {
87
+ const record = rawRecord.trim();
88
+ if (!record)
89
+ continue;
90
+ const [sha = '', author = '', timestamp = '', ...messageParts] = record.split('\x1f');
91
+ if (!sha)
92
+ continue;
93
+ commits.push({
94
+ sha: sha.trim(),
95
+ author: author.trim(),
96
+ timestamp: timestamp.trim(),
97
+ message: messageParts.join('\x1f').replace(/\r\n/g, '\n').replace(/\n+$/, ''),
98
+ });
99
+ }
100
+ return commits;
101
+ }
102
+ /**
103
+ * Parse `git log --name-only --format=%H` output into a Map of SHA → changed
104
+ * file paths.
105
+ */
106
+ function parseChangedFilesByCommit(logOutput) {
107
+ const filesBySha = new Map();
108
+ let currentSha = '';
109
+ for (const rawLine of logOutput.split(/\r?\n/)) {
110
+ const line = rawLine.trim();
111
+ if (!line)
112
+ continue;
113
+ if (/^[a-f0-9]{40}$/i.test(line)) {
114
+ currentSha = line;
115
+ if (!filesBySha.has(currentSha)) {
116
+ filesBySha.set(currentSha, []);
117
+ }
118
+ continue;
119
+ }
120
+ if (!currentSha)
121
+ continue;
122
+ const files = filesBySha.get(currentSha);
123
+ if (!files || files.includes(line))
124
+ continue;
125
+ files.push(line);
126
+ }
127
+ return filesBySha;
128
+ }
129
+ // ---------------------------------------------------------------------------
130
+ // Commit range helpers (shared by audit, validate)
131
+ // ---------------------------------------------------------------------------
132
+ /** Return a short recent-commits range like `HEAD~5..HEAD`. */
133
+ function getRecentCommitRange() {
134
+ try {
135
+ const count = Number.parseInt(runGit(['rev-list', '--count', 'HEAD']).trim(), 10);
136
+ if (!Number.isFinite(count) || count <= 1) {
137
+ return 'HEAD';
138
+ }
139
+ const span = Math.min(5, count - 1);
140
+ return `HEAD~${span}..HEAD`;
141
+ }
142
+ catch {
143
+ return 'HEAD';
144
+ }
145
+ }
146
+ //# sourceMappingURL=git-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-helpers.js","sourceRoot":"","sources":["../src/git-helpers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuDH,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,qBAAa,QAAS,SAAQ,KAAK;aAGf,QAAQ,EAAE,MAAM;gBADhC,OAAO,EAAE,MAAM,EACC,QAAQ,GAAE,MAAgC;CAK7D;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDzD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA2DH,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAEX,qBAAa,QAAS,SAAQ,KAAK;aAGf,QAAQ,EAAE,MAAM;gBADhC,OAAO,EAAE,MAAM,EACC,QAAQ,GAAE,MAAgC;CAK7D;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAqGzD"}
package/dist/index.js CHANGED
@@ -22,6 +22,9 @@ const why_1 = require("./commands/why");
22
22
  const hook_1 = require("./commands/hook");
23
23
  const adf_1 = require("./commands/adf");
24
24
  const bootstrap_1 = require("./commands/bootstrap");
25
+ const telemetry_1 = require("./commands/telemetry");
26
+ const telemetry_2 = require("./telemetry");
27
+ const flags_1 = require("./flags");
25
28
  const package_json_1 = __importDefault(require("../package.json"));
26
29
  const CLI_VERSION = package_json_1.default.version;
27
30
  const HELP = `
@@ -45,9 +48,10 @@ Usage:
45
48
  Install git commit-msg hook for trailer normalization
46
49
  charter hook install --pre-commit [--force]
47
50
  Install git pre-commit hook for ADF evidence gate
48
- charter adf <subcommand> ADF context format tools (init, fmt, patch, bundle, sync, evidence, migrate)
51
+ charter adf <subcommand> ADF context format tools (init, fmt, patch, create, bundle, sync, evidence, migrate, metrics)
52
+ charter telemetry report Local telemetry summary (passive CLI observability)
49
53
  charter why Explain why teams adopt Charter and expected ROI
50
- charter doctor Check CLI + config health
54
+ charter doctor [--adf-only] Check CLI + config health (or ADF-only wiring checks)
51
55
  charter --help Show this help
52
56
  charter --version Show version
53
57
 
@@ -76,61 +80,97 @@ class CLIError extends Error {
76
80
  }
77
81
  exports.CLIError = CLIError;
78
82
  async function run(args) {
79
- if (args.includes('--help') || args.includes('-h')) {
80
- console.log(HELP);
81
- return exports.EXIT_CODE.SUCCESS;
82
- }
83
- if (args.includes('--version') || args.includes('-v')) {
84
- console.log(`charter v${CLI_VERSION}`);
85
- return exports.EXIT_CODE.SUCCESS;
86
- }
87
- const format = getFlag(args, '--format') || 'text';
88
- if (format !== 'text' && format !== 'json') {
89
- throw new CLIError(`Invalid --format value: ${format}. Use text or json.`);
90
- }
91
- const options = {
92
- configPath: getFlag(args, '--config') || '.charter',
93
- format,
94
- ciMode: args.includes('--ci'),
95
- yes: args.includes('--yes'),
83
+ const start = Date.now();
84
+ const configPath = (0, flags_1.getFlag)(args, '--config') || '.charter';
85
+ const rawFormat = (0, flags_1.getFlag)(args, '--format') || 'text';
86
+ const ciMode = args.includes('--ci');
87
+ const yes = args.includes('--yes');
88
+ const writeTelemetry = (exitCode, errorName) => {
89
+ (0, telemetry_2.recordTelemetryEvent)(configPath, {
90
+ args,
91
+ format: rawFormat,
92
+ ciMode,
93
+ durationMs: Date.now() - start,
94
+ exitCode,
95
+ errorName,
96
+ });
96
97
  };
97
- if (args.length === 0 || args[0].startsWith('-')) {
98
- return (0, why_1.quickstartCommand)(options);
98
+ try {
99
+ if (args.includes('--help') || args.includes('-h')) {
100
+ console.log(HELP);
101
+ writeTelemetry(exports.EXIT_CODE.SUCCESS);
102
+ return exports.EXIT_CODE.SUCCESS;
103
+ }
104
+ if (args.includes('--version') || args.includes('-v')) {
105
+ console.log(`charter v${CLI_VERSION}`);
106
+ writeTelemetry(exports.EXIT_CODE.SUCCESS);
107
+ return exports.EXIT_CODE.SUCCESS;
108
+ }
109
+ if (rawFormat !== 'text' && rawFormat !== 'json') {
110
+ throw new CLIError(`Invalid --format value: ${rawFormat}. Use text or json.`);
111
+ }
112
+ const options = {
113
+ configPath,
114
+ format: rawFormat,
115
+ ciMode,
116
+ yes,
117
+ };
118
+ let exitCode;
119
+ if (args.length === 0 || args[0].startsWith('-')) {
120
+ exitCode = await (0, why_1.quickstartCommand)(options);
121
+ writeTelemetry(exitCode);
122
+ return exitCode;
123
+ }
124
+ const command = args[0];
125
+ const restArgs = args.slice(1);
126
+ switch (command) {
127
+ case 'bootstrap':
128
+ exitCode = await (0, bootstrap_1.bootstrapCommand)(options, restArgs);
129
+ break;
130
+ case 'setup':
131
+ exitCode = await (0, setup_1.setupCommand)(options, restArgs);
132
+ break;
133
+ case 'init':
134
+ exitCode = await (0, init_1.initCommand)(options, restArgs);
135
+ break;
136
+ case 'validate':
137
+ exitCode = await (0, validate_1.validateCommand)(options, restArgs);
138
+ break;
139
+ case 'audit':
140
+ exitCode = await (0, audit_1.auditCommand)(options, restArgs);
141
+ break;
142
+ case 'drift':
143
+ exitCode = await (0, drift_1.driftCommand)(options, restArgs);
144
+ break;
145
+ case 'classify':
146
+ exitCode = await (0, classify_1.classifyCommand)(options, restArgs);
147
+ break;
148
+ case 'why':
149
+ exitCode = await (0, why_1.whyCommand)(options);
150
+ break;
151
+ case 'doctor':
152
+ exitCode = await (0, doctor_1.doctorCommand)(options, restArgs);
153
+ break;
154
+ case 'hook':
155
+ exitCode = await (0, hook_1.hookCommand)(options, restArgs);
156
+ break;
157
+ case 'adf':
158
+ exitCode = await (0, adf_1.adfCommand)(options, restArgs);
159
+ break;
160
+ case 'telemetry':
161
+ exitCode = await (0, telemetry_1.telemetryCommand)(options, restArgs);
162
+ break;
163
+ default:
164
+ throw new CLIError(`Unknown command: ${command}\n${HELP}`);
165
+ }
166
+ writeTelemetry(exitCode);
167
+ return exitCode;
99
168
  }
100
- const command = args[0];
101
- const restArgs = args.slice(1);
102
- switch (command) {
103
- case 'bootstrap':
104
- return (0, bootstrap_1.bootstrapCommand)(options, restArgs);
105
- case 'setup':
106
- return (0, setup_1.setupCommand)(options, restArgs);
107
- case 'init':
108
- return (0, init_1.initCommand)(options, restArgs);
109
- case 'validate':
110
- return (0, validate_1.validateCommand)(options, restArgs);
111
- case 'audit':
112
- return (0, audit_1.auditCommand)(options, restArgs);
113
- case 'drift':
114
- return (0, drift_1.driftCommand)(options, restArgs);
115
- case 'classify':
116
- return (0, classify_1.classifyCommand)(options, restArgs);
117
- case 'why':
118
- return (0, why_1.whyCommand)(options);
119
- case 'doctor':
120
- return (0, doctor_1.doctorCommand)(options);
121
- case 'hook':
122
- return (0, hook_1.hookCommand)(options, restArgs);
123
- case 'adf':
124
- return (0, adf_1.adfCommand)(options, restArgs);
125
- default:
126
- throw new CLIError(`Unknown command: ${command}\n${HELP}`);
127
- }
128
- }
129
- function getFlag(args, flag) {
130
- const idx = args.indexOf(flag);
131
- if (idx !== -1 && idx + 1 < args.length) {
132
- return args[idx + 1];
169
+ catch (err) {
170
+ const exitCode = err instanceof CLIError ? err.exitCode : exports.EXIT_CODE.RUNTIME_ERROR;
171
+ const errorName = err instanceof Error ? err.name : 'UnknownError';
172
+ writeTelemetry(exitCode, errorName);
173
+ throw err;
133
174
  }
134
- return undefined;
135
175
  }
136
176
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * CLI telemetry (local-first, append-only).
3
+ *
4
+ * Writes command execution metadata to .charter/telemetry/events.ndjson
5
+ * with no prompt/content capture.
6
+ */
7
+ export interface CliTelemetryEvent {
8
+ version: 1;
9
+ timestamp: string;
10
+ commandPath: string;
11
+ flags: string[];
12
+ format: string;
13
+ ciMode: boolean;
14
+ durationMs: number;
15
+ exitCode: number;
16
+ success: boolean;
17
+ errorName?: string;
18
+ }
19
+ export interface RecordEventInput {
20
+ args: string[];
21
+ format: string;
22
+ ciMode: boolean;
23
+ durationMs: number;
24
+ exitCode: number;
25
+ errorName?: string;
26
+ }
27
+ export declare function recordTelemetryEvent(configPath: string, input: RecordEventInput): void;
28
+ export declare function inferCommandPath(args: string[]): string;
29
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAuBtF;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAUvD"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /**
3
+ * CLI telemetry (local-first, append-only).
4
+ *
5
+ * Writes command execution metadata to .charter/telemetry/events.ndjson
6
+ * with no prompt/content capture.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.recordTelemetryEvent = recordTelemetryEvent;
43
+ exports.inferCommandPath = inferCommandPath;
44
+ const fs = __importStar(require("node:fs"));
45
+ const path = __importStar(require("node:path"));
46
+ function recordTelemetryEvent(configPath, input) {
47
+ try {
48
+ const telemetryDir = path.join(configPath, 'telemetry');
49
+ const telemetryFile = path.join(telemetryDir, 'events.ndjson');
50
+ fs.mkdirSync(telemetryDir, { recursive: true });
51
+ const event = {
52
+ version: 1,
53
+ timestamp: new Date().toISOString(),
54
+ commandPath: inferCommandPath(input.args),
55
+ flags: extractFlagNames(input.args),
56
+ format: input.format,
57
+ ciMode: input.ciMode,
58
+ durationMs: input.durationMs,
59
+ exitCode: input.exitCode,
60
+ success: input.exitCode === 0,
61
+ errorName: input.errorName,
62
+ };
63
+ fs.appendFileSync(telemetryFile, `${JSON.stringify(event)}\n`);
64
+ }
65
+ catch {
66
+ // Telemetry is best-effort and must never block command execution.
67
+ }
68
+ }
69
+ function inferCommandPath(args) {
70
+ if (args.length === 0 || args[0].startsWith('-')) {
71
+ return 'quickstart';
72
+ }
73
+ const command = args[0];
74
+ if ((command === 'adf' || command === 'hook' || command === 'telemetry') && args[1] && !args[1].startsWith('-')) {
75
+ return `${command}.${args[1]}`;
76
+ }
77
+ return command;
78
+ }
79
+ function extractFlagNames(args) {
80
+ const flags = [];
81
+ for (const arg of args) {
82
+ if (arg.startsWith('-')) {
83
+ flags.push(arg);
84
+ }
85
+ }
86
+ return [...new Set(flags)];
87
+ }
88
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BH,oDAuBC;AAED,4CAUC;AA5DD,4CAA8B;AAC9B,gDAAkC;AAwBlC,SAAgB,oBAAoB,CAAC,UAAkB,EAAE,KAAuB;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAC/D,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhD,MAAM,KAAK,GAAsB;YAC/B,OAAO,EAAE,CAAC;YACV,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;YACzC,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,QAAQ,KAAK,CAAC;YAC7B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC;QAEF,EAAE,CAAC,cAAc,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;AACH,CAAC;AAED,SAAgB,gBAAgB,CAAC,IAAc;IAC7C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,IAAI,OAAO,KAAK,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChH,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stackbilt/cli",
3
3
  "sideEffects": false,
4
- "version": "0.4.1",
4
+ "version": "0.5.0",
5
5
  "description": "Charter CLI — repo-level governance checks",
6
6
  "bin": {
7
7
  "charter": "./dist/bin.js"
@@ -35,13 +35,13 @@
35
35
  "access": "public"
36
36
  },
37
37
  "dependencies": {
38
- "@stackbilt/classify": "^0.4.1",
39
- "@stackbilt/core": "^0.4.1",
40
- "@stackbilt/types": "^0.4.1",
41
- "@stackbilt/git": "^0.4.1",
42
- "@stackbilt/validate": "^0.4.1",
43
- "@stackbilt/drift": "^0.4.1",
44
- "@stackbilt/adf": "^0.4.1"
38
+ "@stackbilt/core": "^0.5.0",
39
+ "@stackbilt/git": "^0.5.0",
40
+ "@stackbilt/classify": "^0.5.0",
41
+ "@stackbilt/types": "^0.5.0",
42
+ "@stackbilt/drift": "^0.5.0",
43
+ "@stackbilt/adf": "^0.5.0",
44
+ "@stackbilt/validate": "^0.5.0"
45
45
  },
46
46
  "license": "Apache-2.0",
47
47
  "scripts": {