@sudocode-ai/cli 0.1.21 → 0.1.22
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/dist/cli/config-commands.d.ts +28 -0
- package/dist/cli/config-commands.d.ts.map +1 -0
- package/dist/cli/config-commands.js +203 -0
- package/dist/cli/config-commands.js.map +1 -0
- package/dist/cli/feedback-commands.d.ts.map +1 -1
- package/dist/cli/feedback-commands.js +4 -0
- package/dist/cli/feedback-commands.js.map +1 -1
- package/dist/cli/init-commands.d.ts.map +1 -1
- package/dist/cli/init-commands.js +46 -19
- package/dist/cli/init-commands.js.map +1 -1
- package/dist/cli/issue-commands.d.ts.map +1 -1
- package/dist/cli/issue-commands.js +16 -0
- package/dist/cli/issue-commands.js.map +1 -1
- package/dist/cli/query-commands.d.ts.map +1 -1
- package/dist/cli/query-commands.js +4 -0
- package/dist/cli/query-commands.js.map +1 -1
- package/dist/cli/relationship-commands.d.ts.map +1 -1
- package/dist/cli/relationship-commands.js +4 -0
- package/dist/cli/relationship-commands.js.map +1 -1
- package/dist/cli/spec-commands.d.ts.map +1 -1
- package/dist/cli/spec-commands.js +13 -0
- package/dist/cli/spec-commands.js.map +1 -1
- package/dist/cli/sync-commands.d.ts.map +1 -1
- package/dist/cli/sync-commands.js +15 -2
- package/dist/cli/sync-commands.js.map +1 -1
- package/dist/cli/update-commands.d.ts.map +1 -1
- package/dist/cli/update-commands.js +251 -8
- package/dist/cli/update-commands.js.map +1 -1
- package/dist/cli.js +25 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +34 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +181 -22
- package/dist/config.js.map +1 -1
- package/dist/import.d.ts.map +1 -1
- package/dist/import.js +13 -0
- package/dist/import.js.map +1 -1
- package/dist/install-source.d.ts +37 -0
- package/dist/install-source.d.ts.map +1 -0
- package/dist/install-source.js +136 -0
- package/dist/install-source.js.map +1 -0
- package/dist/telemetry.d.ts +84 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +410 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/update-checker.d.ts.map +1 -1
- package/dist/update-checker.js +30 -2
- package/dist/update-checker.js.map +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +16 -5
- package/dist/version.js.map +1 -1
- package/dist/watcher.d.ts.map +1 -1
- package/dist/watcher.js +213 -38
- package/dist/watcher.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Telemetry via OTLP with Buffer-and-Flush
|
|
3
|
+
*
|
|
4
|
+
* Appends usage events to a local buffer file (<1ms per call).
|
|
5
|
+
* Flushes to a configured OTLP endpoint when conditions are met.
|
|
6
|
+
* Constructs OTLP/HTTP JSON manually — no SDK dependency.
|
|
7
|
+
*/
|
|
8
|
+
export interface TelemetryEvent {
|
|
9
|
+
/** CLI command name (e.g., "upsert_issue", "link") */
|
|
10
|
+
cmd: string;
|
|
11
|
+
/** Whether the command succeeded */
|
|
12
|
+
success: boolean;
|
|
13
|
+
/** Duration in milliseconds */
|
|
14
|
+
dur: number;
|
|
15
|
+
/** Session ID from SUDOCODE_SESSION_ID env var (optional) */
|
|
16
|
+
sid?: string;
|
|
17
|
+
/** Command-specific attributes */
|
|
18
|
+
attrs?: Record<string, string | number | boolean | undefined>;
|
|
19
|
+
}
|
|
20
|
+
interface BufferLine {
|
|
21
|
+
ts: number;
|
|
22
|
+
cmd: string;
|
|
23
|
+
success: boolean;
|
|
24
|
+
dur: number;
|
|
25
|
+
sid?: string;
|
|
26
|
+
attrs?: Record<string, string | number | boolean | undefined>;
|
|
27
|
+
}
|
|
28
|
+
export interface TelemetryConfig {
|
|
29
|
+
endpoint: string;
|
|
30
|
+
authHeader: string;
|
|
31
|
+
projectId: string;
|
|
32
|
+
installationId: string;
|
|
33
|
+
serviceVersion: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if telemetry is enabled by reading config.
|
|
37
|
+
* Returns TelemetryConfig if enabled, null otherwise.
|
|
38
|
+
*/
|
|
39
|
+
export declare function getTelemetryConfig(outputDir: string): TelemetryConfig | null;
|
|
40
|
+
/**
|
|
41
|
+
* Record a telemetry event and maybe flush the buffer.
|
|
42
|
+
* Convenience wrapper for command handlers — handles config check,
|
|
43
|
+
* event recording, and flush in one call. All errors caught silently.
|
|
44
|
+
*/
|
|
45
|
+
export declare function trackCommand(outputDir: string, command: string, args: Record<string, unknown>, success: boolean, durationMs: number): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Append a telemetry event to the buffer file.
|
|
48
|
+
* <1ms overhead — sync file append.
|
|
49
|
+
* No-op if telemetry is not configured.
|
|
50
|
+
*/
|
|
51
|
+
export declare function recordEvent(outputDir: string, event: TelemetryEvent): void;
|
|
52
|
+
/**
|
|
53
|
+
* Check flush conditions and flush if needed.
|
|
54
|
+
* Only adds latency (~100-200ms) when actually flushing.
|
|
55
|
+
*/
|
|
56
|
+
export declare function maybeFlush(outputDir: string, config: TelemetryConfig): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Build OTLP/HTTP JSON Log Records payload from buffered events.
|
|
59
|
+
*/
|
|
60
|
+
export declare function buildOtlpPayload(events: BufferLine[], config: TelemetryConfig): object;
|
|
61
|
+
/**
|
|
62
|
+
* Extract command-specific attributes from CLI command name and args.
|
|
63
|
+
*/
|
|
64
|
+
export declare function extractAttributes(command: string, args: Record<string, unknown>): Record<string, string | number | boolean | undefined>;
|
|
65
|
+
/**
|
|
66
|
+
* Get the installation config directory path.
|
|
67
|
+
* Uses XDG_CONFIG_HOME if set, otherwise ~/.config/sudocode
|
|
68
|
+
* (same location as cli/src/auth/credentials.ts)
|
|
69
|
+
*/
|
|
70
|
+
export declare function getInstallationConfigDir(): string;
|
|
71
|
+
/**
|
|
72
|
+
* Ensure projectId exists in project config, generate if missing.
|
|
73
|
+
* Migrates from old `anonymousId` if present.
|
|
74
|
+
* Returns the project ID.
|
|
75
|
+
*/
|
|
76
|
+
export declare function ensureProjectId(outputDir: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Ensure installationId exists in home directory config, generate if missing.
|
|
79
|
+
* Stored at ~/.config/sudocode/config.json (respects XDG_CONFIG_HOME).
|
|
80
|
+
* Returns the installation ID.
|
|
81
|
+
*/
|
|
82
|
+
export declare function ensureInstallationId(): string;
|
|
83
|
+
export {};
|
|
84
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC/D;AAED,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;CAC/D;AAMD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA+B5E;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAwB1E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CAmFf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAAE,EACpB,MAAM,EAAE,eAAe,GACtB,MAAM,CAsER;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAqEvD;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAIjD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAgCzD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAkD7C"}
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Telemetry via OTLP with Buffer-and-Flush
|
|
3
|
+
*
|
|
4
|
+
* Appends usage events to a local buffer file (<1ms per call).
|
|
5
|
+
* Flushes to a configured OTLP endpoint when conditions are met.
|
|
6
|
+
* Constructs OTLP/HTTP JSON manually — no SDK dependency.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from "fs";
|
|
9
|
+
import * as path from "path";
|
|
10
|
+
import * as os from "os";
|
|
11
|
+
import * as crypto from "crypto";
|
|
12
|
+
import { getProjectConfig, getLocalConfig, updateProjectConfig, } from "./config.js";
|
|
13
|
+
// --- Constants ---
|
|
14
|
+
const BUFFER_FILE = "telemetry-buffer.jsonl";
|
|
15
|
+
const FLUSH_META_FILE = "telemetry-flush.json";
|
|
16
|
+
const FLUSH_INTERVAL_MS = 60_000; // 60 seconds
|
|
17
|
+
const MAX_BUFFER_LINES = 100;
|
|
18
|
+
const FLUSH_TIMEOUT_MS = 5_000; // 5 second HTTP timeout
|
|
19
|
+
const INSTALLATION_CONFIG_FILE = "config.json";
|
|
20
|
+
// --- Public API ---
|
|
21
|
+
/**
|
|
22
|
+
* Check if telemetry is enabled by reading config.
|
|
23
|
+
* Returns TelemetryConfig if enabled, null otherwise.
|
|
24
|
+
*/
|
|
25
|
+
export function getTelemetryConfig(outputDir) {
|
|
26
|
+
try {
|
|
27
|
+
const localConfig = getLocalConfig(outputDir);
|
|
28
|
+
if (!localConfig.telemetry?.endpoint || localConfig.telemetry?.disabled) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const projectId = ensureProjectId(outputDir);
|
|
32
|
+
const installationId = ensureInstallationId();
|
|
33
|
+
// Read version from package.json
|
|
34
|
+
let serviceVersion = "unknown";
|
|
35
|
+
try {
|
|
36
|
+
const pkgPath = path.join(__dirname, "..", "package.json");
|
|
37
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
38
|
+
serviceVersion = pkg.version || "unknown";
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// ignore
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
endpoint: localConfig.telemetry.endpoint,
|
|
45
|
+
authHeader: localConfig.telemetry.authHeader || "",
|
|
46
|
+
projectId,
|
|
47
|
+
installationId,
|
|
48
|
+
serviceVersion,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Record a telemetry event and maybe flush the buffer.
|
|
57
|
+
* Convenience wrapper for command handlers — handles config check,
|
|
58
|
+
* event recording, and flush in one call. All errors caught silently.
|
|
59
|
+
*/
|
|
60
|
+
export async function trackCommand(outputDir, command, args, success, durationMs) {
|
|
61
|
+
try {
|
|
62
|
+
const config = getTelemetryConfig(outputDir);
|
|
63
|
+
if (!config)
|
|
64
|
+
return;
|
|
65
|
+
recordEvent(outputDir, {
|
|
66
|
+
cmd: command,
|
|
67
|
+
success,
|
|
68
|
+
dur: durationMs,
|
|
69
|
+
sid: process.env.SUDOCODE_SESSION_ID,
|
|
70
|
+
attrs: extractAttributes(command, args),
|
|
71
|
+
});
|
|
72
|
+
await maybeFlush(outputDir, config);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// Telemetry must never break CLI commands
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Append a telemetry event to the buffer file.
|
|
80
|
+
* <1ms overhead — sync file append.
|
|
81
|
+
* No-op if telemetry is not configured.
|
|
82
|
+
*/
|
|
83
|
+
export function recordEvent(outputDir, event) {
|
|
84
|
+
try {
|
|
85
|
+
const bufferPath = path.join(outputDir, BUFFER_FILE);
|
|
86
|
+
// Strip undefined values from attrs
|
|
87
|
+
const attrs = event.attrs
|
|
88
|
+
? Object.fromEntries(Object.entries(event.attrs).filter(([, v]) => v !== undefined))
|
|
89
|
+
: undefined;
|
|
90
|
+
const line = {
|
|
91
|
+
ts: Date.now(),
|
|
92
|
+
cmd: event.cmd,
|
|
93
|
+
success: event.success,
|
|
94
|
+
dur: event.dur,
|
|
95
|
+
...(event.sid ? { sid: event.sid } : {}),
|
|
96
|
+
...(attrs && Object.keys(attrs).length > 0 ? { attrs } : {}),
|
|
97
|
+
};
|
|
98
|
+
fs.appendFileSync(bufferPath, JSON.stringify(line) + "\n", "utf8");
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Telemetry must never break CLI commands
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Check flush conditions and flush if needed.
|
|
106
|
+
* Only adds latency (~100-200ms) when actually flushing.
|
|
107
|
+
*/
|
|
108
|
+
export async function maybeFlush(outputDir, config) {
|
|
109
|
+
try {
|
|
110
|
+
const bufferPath = path.join(outputDir, BUFFER_FILE);
|
|
111
|
+
const flushMetaPath = path.join(outputDir, FLUSH_META_FILE);
|
|
112
|
+
// Check if buffer file exists
|
|
113
|
+
if (!fs.existsSync(bufferPath))
|
|
114
|
+
return;
|
|
115
|
+
const bufferContent = fs.readFileSync(bufferPath, "utf8").trim();
|
|
116
|
+
if (!bufferContent)
|
|
117
|
+
return;
|
|
118
|
+
const lines = bufferContent.split("\n");
|
|
119
|
+
// Read flush metadata
|
|
120
|
+
let lastFlushAt = 0;
|
|
121
|
+
try {
|
|
122
|
+
if (fs.existsSync(flushMetaPath)) {
|
|
123
|
+
const meta = JSON.parse(fs.readFileSync(flushMetaPath, "utf8"));
|
|
124
|
+
lastFlushAt = meta.lastFlushAt || 0;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// ignore corrupt flush meta
|
|
129
|
+
}
|
|
130
|
+
const now = Date.now();
|
|
131
|
+
const shouldFlush = now - lastFlushAt > FLUSH_INTERVAL_MS ||
|
|
132
|
+
lines.length >= MAX_BUFFER_LINES;
|
|
133
|
+
if (!shouldFlush)
|
|
134
|
+
return;
|
|
135
|
+
// Parse buffer lines
|
|
136
|
+
const events = [];
|
|
137
|
+
for (const line of lines) {
|
|
138
|
+
try {
|
|
139
|
+
events.push(JSON.parse(line));
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
// skip malformed lines
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (events.length === 0)
|
|
146
|
+
return;
|
|
147
|
+
// Build and send OTLP payload
|
|
148
|
+
const payload = buildOtlpPayload(events, config);
|
|
149
|
+
const controller = new AbortController();
|
|
150
|
+
const timeout = setTimeout(() => controller.abort(), FLUSH_TIMEOUT_MS);
|
|
151
|
+
try {
|
|
152
|
+
const response = await fetch(config.endpoint, {
|
|
153
|
+
method: "POST",
|
|
154
|
+
headers: {
|
|
155
|
+
"Content-Type": "application/json",
|
|
156
|
+
...(config.authHeader
|
|
157
|
+
? { Authorization: config.authHeader }
|
|
158
|
+
: {}),
|
|
159
|
+
},
|
|
160
|
+
body: JSON.stringify(payload),
|
|
161
|
+
signal: controller.signal,
|
|
162
|
+
});
|
|
163
|
+
clearTimeout(timeout);
|
|
164
|
+
if (response.ok || response.status === 204) {
|
|
165
|
+
// Success — truncate buffer and update flush metadata
|
|
166
|
+
fs.writeFileSync(bufferPath, "", "utf8");
|
|
167
|
+
fs.writeFileSync(flushMetaPath, JSON.stringify({ lastFlushAt: now }), "utf8");
|
|
168
|
+
}
|
|
169
|
+
// On non-OK response, leave buffer intact for retry
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
clearTimeout(timeout);
|
|
173
|
+
// Network error or timeout — leave buffer intact for retry
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Telemetry must never break CLI commands
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Build OTLP/HTTP JSON Log Records payload from buffered events.
|
|
182
|
+
*/
|
|
183
|
+
export function buildOtlpPayload(events, config) {
|
|
184
|
+
const logRecords = events.map((event) => {
|
|
185
|
+
const attributes = [
|
|
186
|
+
{ key: "tool.name", value: { stringValue: event.cmd } },
|
|
187
|
+
{ key: "tool.success", value: { boolValue: event.success } },
|
|
188
|
+
{ key: "tool.duration_ms", value: { intValue: String(event.dur) } },
|
|
189
|
+
];
|
|
190
|
+
// Add session ID if present
|
|
191
|
+
if (event.sid) {
|
|
192
|
+
attributes.push({
|
|
193
|
+
key: "session.id",
|
|
194
|
+
value: { stringValue: event.sid },
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// Add command-specific attributes
|
|
198
|
+
if (event.attrs) {
|
|
199
|
+
for (const [key, val] of Object.entries(event.attrs)) {
|
|
200
|
+
if (val === undefined)
|
|
201
|
+
continue;
|
|
202
|
+
if (typeof val === "boolean") {
|
|
203
|
+
attributes.push({ key, value: { boolValue: val } });
|
|
204
|
+
}
|
|
205
|
+
else if (typeof val === "number") {
|
|
206
|
+
attributes.push({ key, value: { intValue: String(val) } });
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
attributes.push({ key, value: { stringValue: String(val) } });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
timeUnixNano: String(event.ts) + "000000",
|
|
215
|
+
severityNumber: 9,
|
|
216
|
+
body: { stringValue: "tool_call" },
|
|
217
|
+
attributes,
|
|
218
|
+
};
|
|
219
|
+
});
|
|
220
|
+
return {
|
|
221
|
+
resourceLogs: [
|
|
222
|
+
{
|
|
223
|
+
resource: {
|
|
224
|
+
attributes: [
|
|
225
|
+
{
|
|
226
|
+
key: "service.name",
|
|
227
|
+
value: { stringValue: "sudocode-cli" },
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
key: "service.version",
|
|
231
|
+
value: { stringValue: config.serviceVersion },
|
|
232
|
+
},
|
|
233
|
+
{
|
|
234
|
+
key: "project.id",
|
|
235
|
+
value: { stringValue: config.projectId },
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
key: "installation.id",
|
|
239
|
+
value: { stringValue: config.installationId },
|
|
240
|
+
},
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
scopeLogs: [
|
|
244
|
+
{
|
|
245
|
+
scope: { name: "sudocode.usage", version: "1" },
|
|
246
|
+
logRecords,
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Extract command-specific attributes from CLI command name and args.
|
|
255
|
+
*/
|
|
256
|
+
export function extractAttributes(command, args) {
|
|
257
|
+
switch (command) {
|
|
258
|
+
case "issue_create":
|
|
259
|
+
return {
|
|
260
|
+
"entity.type": "issue",
|
|
261
|
+
"entity.operation": "create",
|
|
262
|
+
};
|
|
263
|
+
case "issue_update":
|
|
264
|
+
case "issue_close":
|
|
265
|
+
return {
|
|
266
|
+
"entity.id": args.id,
|
|
267
|
+
"entity.type": "issue",
|
|
268
|
+
"entity.operation": "update",
|
|
269
|
+
"entity.status": args.status,
|
|
270
|
+
"entity.archived": args.archived,
|
|
271
|
+
};
|
|
272
|
+
case "issue_show":
|
|
273
|
+
return {
|
|
274
|
+
"entity.id": args.id,
|
|
275
|
+
"entity.type": "issue",
|
|
276
|
+
};
|
|
277
|
+
case "issue_list":
|
|
278
|
+
return { "entity.type": "issue" };
|
|
279
|
+
case "spec_create":
|
|
280
|
+
return {
|
|
281
|
+
"entity.type": "spec",
|
|
282
|
+
"entity.operation": "create",
|
|
283
|
+
};
|
|
284
|
+
case "spec_update":
|
|
285
|
+
return {
|
|
286
|
+
"entity.id": args.id,
|
|
287
|
+
"entity.type": "spec",
|
|
288
|
+
"entity.operation": "update",
|
|
289
|
+
};
|
|
290
|
+
case "spec_show":
|
|
291
|
+
return {
|
|
292
|
+
"entity.id": args.id,
|
|
293
|
+
"entity.type": "spec",
|
|
294
|
+
};
|
|
295
|
+
case "spec_list":
|
|
296
|
+
return { "entity.type": "spec" };
|
|
297
|
+
case "link":
|
|
298
|
+
return {
|
|
299
|
+
"link.from_id": args.from_id,
|
|
300
|
+
"link.to_id": args.to_id,
|
|
301
|
+
"link.type": args.type,
|
|
302
|
+
};
|
|
303
|
+
case "add_feedback":
|
|
304
|
+
return {
|
|
305
|
+
"feedback.to_id": args.to_id,
|
|
306
|
+
"feedback.from_id": args.from_id,
|
|
307
|
+
"feedback.type": args.feedback_type,
|
|
308
|
+
};
|
|
309
|
+
case "ready":
|
|
310
|
+
return {};
|
|
311
|
+
default:
|
|
312
|
+
return {};
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Get the installation config directory path.
|
|
317
|
+
* Uses XDG_CONFIG_HOME if set, otherwise ~/.config/sudocode
|
|
318
|
+
* (same location as cli/src/auth/credentials.ts)
|
|
319
|
+
*/
|
|
320
|
+
export function getInstallationConfigDir() {
|
|
321
|
+
return process.env.XDG_CONFIG_HOME
|
|
322
|
+
? path.join(process.env.XDG_CONFIG_HOME, "sudocode")
|
|
323
|
+
: path.join(os.homedir(), ".config", "sudocode");
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Ensure projectId exists in project config, generate if missing.
|
|
327
|
+
* Migrates from old `anonymousId` if present.
|
|
328
|
+
* Returns the project ID.
|
|
329
|
+
*/
|
|
330
|
+
export function ensureProjectId(outputDir) {
|
|
331
|
+
const projectConfig = getProjectConfig(outputDir);
|
|
332
|
+
// Check for new projectId first
|
|
333
|
+
if (projectConfig.telemetry?.projectId) {
|
|
334
|
+
return projectConfig.telemetry.projectId;
|
|
335
|
+
}
|
|
336
|
+
// Migrate from old anonymousId
|
|
337
|
+
if (projectConfig.telemetry?.anonymousId) {
|
|
338
|
+
const projectId = projectConfig.telemetry.anonymousId;
|
|
339
|
+
updateProjectConfig(outputDir, {
|
|
340
|
+
...projectConfig,
|
|
341
|
+
telemetry: {
|
|
342
|
+
projectId,
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
return projectId;
|
|
346
|
+
}
|
|
347
|
+
// Generate new project ID
|
|
348
|
+
const projectId = `proj-${crypto.randomBytes(4).toString("hex")}`;
|
|
349
|
+
updateProjectConfig(outputDir, {
|
|
350
|
+
...projectConfig,
|
|
351
|
+
telemetry: {
|
|
352
|
+
...projectConfig.telemetry,
|
|
353
|
+
projectId,
|
|
354
|
+
},
|
|
355
|
+
});
|
|
356
|
+
return projectId;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Ensure installationId exists in home directory config, generate if missing.
|
|
360
|
+
* Stored at ~/.config/sudocode/config.json (respects XDG_CONFIG_HOME).
|
|
361
|
+
* Returns the installation ID.
|
|
362
|
+
*/
|
|
363
|
+
export function ensureInstallationId() {
|
|
364
|
+
try {
|
|
365
|
+
const configDir = getInstallationConfigDir();
|
|
366
|
+
const configPath = path.join(configDir, INSTALLATION_CONFIG_FILE);
|
|
367
|
+
// Try to read existing
|
|
368
|
+
try {
|
|
369
|
+
if (fs.existsSync(configPath)) {
|
|
370
|
+
const config = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
371
|
+
if (config.telemetry?.installationId) {
|
|
372
|
+
return config.telemetry.installationId;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch {
|
|
377
|
+
// ignore corrupt config
|
|
378
|
+
}
|
|
379
|
+
// Generate new installation ID
|
|
380
|
+
const installationId = `inst-${crypto.randomBytes(4).toString("hex")}`;
|
|
381
|
+
// Ensure directory exists with secure permissions
|
|
382
|
+
fs.mkdirSync(configDir, { recursive: true, mode: 0o700 });
|
|
383
|
+
// Read existing config to preserve other fields (e.g., credentials references)
|
|
384
|
+
let config = {};
|
|
385
|
+
try {
|
|
386
|
+
if (fs.existsSync(configPath)) {
|
|
387
|
+
config = JSON.parse(fs.readFileSync(configPath, "utf8"));
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
catch {
|
|
391
|
+
// start fresh
|
|
392
|
+
}
|
|
393
|
+
config.telemetry = {
|
|
394
|
+
...(config.telemetry || {}),
|
|
395
|
+
installationId,
|
|
396
|
+
};
|
|
397
|
+
// Atomic write with secure permissions
|
|
398
|
+
const tmpPath = configPath + ".tmp";
|
|
399
|
+
fs.writeFileSync(tmpPath, JSON.stringify(config, null, 2), {
|
|
400
|
+
mode: 0o600,
|
|
401
|
+
});
|
|
402
|
+
fs.renameSync(tmpPath, configPath);
|
|
403
|
+
return installationId;
|
|
404
|
+
}
|
|
405
|
+
catch {
|
|
406
|
+
// Fallback: return a transient ID if we can't persist
|
|
407
|
+
return `inst-${crypto.randomBytes(4).toString("hex")}`;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH,UAAU,UAAU;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;CAC1B;AA4GD;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA2BlE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAa9D;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBpE;AA+BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAiBnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAWvC"}
|
package/dist/update-checker.js
CHANGED
|
@@ -6,7 +6,9 @@ import * as fs from "fs";
|
|
|
6
6
|
import * as path from "path";
|
|
7
7
|
import * as os from "os";
|
|
8
8
|
import { VERSION } from "./version.js";
|
|
9
|
+
import { isBinaryInstall } from "./install-source.js";
|
|
9
10
|
const PACKAGE_NAME = "@sudocode-ai/cli";
|
|
11
|
+
const GITHUB_REPO = "sudocode-ai/sudocode";
|
|
10
12
|
const CACHE_DIR = path.join(os.tmpdir(), "sudocode-cli");
|
|
11
13
|
const CACHE_FILE = path.join(CACHE_DIR, "update-cache.json");
|
|
12
14
|
const DISMISS_FILE = path.join(CACHE_DIR, "update-dismissed.json");
|
|
@@ -32,6 +34,30 @@ async function fetchLatestVersion() {
|
|
|
32
34
|
return null;
|
|
33
35
|
}
|
|
34
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Fetch latest version from GitHub Releases (for binary installs)
|
|
39
|
+
*/
|
|
40
|
+
async function fetchLatestVersionFromGitHub() {
|
|
41
|
+
try {
|
|
42
|
+
const response = await fetch(`https://api.github.com/repos/${GITHUB_REPO}/releases/latest`, {
|
|
43
|
+
headers: {
|
|
44
|
+
Accept: "application/vnd.github+json",
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
if (!response.ok) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const data = (await response.json());
|
|
51
|
+
const tag = data.tag_name;
|
|
52
|
+
if (!tag)
|
|
53
|
+
return null;
|
|
54
|
+
// Strip leading "v" from tag (e.g. "v0.1.22" → "0.1.22")
|
|
55
|
+
return tag.startsWith("v") ? tag.slice(1) : tag;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
35
61
|
/**
|
|
36
62
|
* Read cached version info
|
|
37
63
|
*/
|
|
@@ -84,8 +110,10 @@ export async function checkForUpdates() {
|
|
|
84
110
|
updateAvailable: VERSION !== cached.latest,
|
|
85
111
|
};
|
|
86
112
|
}
|
|
87
|
-
// Fetch latest version from
|
|
88
|
-
const latest =
|
|
113
|
+
// Fetch latest version from appropriate source
|
|
114
|
+
const latest = isBinaryInstall()
|
|
115
|
+
? await fetchLatestVersionFromGitHub()
|
|
116
|
+
: await fetchLatestVersion();
|
|
89
117
|
if (!latest) {
|
|
90
118
|
return null;
|
|
91
119
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../src/update-checker.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAgBnC;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,QAAe,CAAC"}
|
package/dist/version.js
CHANGED
|
@@ -10,11 +10,22 @@ const __dirname = path.dirname(__filename);
|
|
|
10
10
|
* Get the CLI version from package.json
|
|
11
11
|
*/
|
|
12
12
|
export function getVersion() {
|
|
13
|
-
// In
|
|
14
|
-
//
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
// In compiled binaries (SEA/Bun), import.meta.url resolves to a virtual path.
|
|
14
|
+
// Fall back to reading package.json relative to the executable.
|
|
15
|
+
const candidates = [
|
|
16
|
+
path.join(__dirname, "..", "package.json"),
|
|
17
|
+
path.join(path.dirname(process.execPath), "..", "package.json"),
|
|
18
|
+
path.join(path.dirname(process.execPath), "package.json"),
|
|
19
|
+
];
|
|
20
|
+
for (const p of candidates) {
|
|
21
|
+
try {
|
|
22
|
+
return JSON.parse(fs.readFileSync(p, "utf8")).version;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return "0.0.0-unknown";
|
|
18
29
|
}
|
|
19
30
|
/**
|
|
20
31
|
* The current CLI version
|
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,8EAA8E;IAC9E,gEAAgE;IAChE,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC;QAC/D,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;KAC1D,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC"}
|
package/dist/watcher.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../src/watcher.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAmB3C,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AA2ElF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ7D;AAiCD,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEhE;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B;;OAEG;IACH,QAAQ,EAAE,MAAM,YAAY,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CA8/BpE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CA+BnE"}
|