@planckspace/cli 0.1.1 → 0.2.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 (190) hide show
  1. package/README.md +24 -1
  2. package/dist/anomaly/constants.d.ts +13 -0
  3. package/dist/anomaly/constants.d.ts.map +1 -0
  4. package/dist/anomaly/constants.js +13 -0
  5. package/dist/anomaly/constants.js.map +1 -0
  6. package/dist/anomaly/detector.d.ts +12 -0
  7. package/dist/anomaly/detector.d.ts.map +1 -0
  8. package/dist/anomaly/detector.js +98 -0
  9. package/dist/anomaly/detector.js.map +1 -0
  10. package/dist/anomaly/types.d.ts +19 -0
  11. package/dist/anomaly/types.d.ts.map +1 -0
  12. package/dist/anomaly/types.js +2 -0
  13. package/dist/anomaly/types.js.map +1 -0
  14. package/dist/commands/budget.d.ts +26 -0
  15. package/dist/commands/budget.d.ts.map +1 -0
  16. package/dist/commands/budget.js +91 -0
  17. package/dist/commands/budget.js.map +1 -0
  18. package/dist/commands/config.d.ts +4 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +45 -0
  21. package/dist/commands/config.js.map +1 -0
  22. package/dist/commands/connect.d.ts +17 -0
  23. package/dist/commands/connect.d.ts.map +1 -0
  24. package/dist/commands/connect.js +191 -0
  25. package/dist/commands/connect.js.map +1 -0
  26. package/dist/commands/daemon.d.ts +8 -0
  27. package/dist/commands/daemon.d.ts.map +1 -0
  28. package/dist/commands/daemon.js +310 -0
  29. package/dist/commands/daemon.js.map +1 -0
  30. package/dist/commands/diagnose.d.ts +2 -0
  31. package/dist/commands/diagnose.d.ts.map +1 -0
  32. package/dist/commands/diagnose.js +81 -0
  33. package/dist/commands/diagnose.js.map +1 -0
  34. package/dist/commands/doctor.d.ts +2 -0
  35. package/dist/commands/doctor.d.ts.map +1 -0
  36. package/dist/commands/doctor.js +67 -0
  37. package/dist/commands/doctor.js.map +1 -0
  38. package/dist/commands/export.d.ts +40 -0
  39. package/dist/commands/export.d.ts.map +1 -0
  40. package/dist/commands/export.js +184 -0
  41. package/dist/commands/export.js.map +1 -0
  42. package/dist/commands/init.d.ts +3 -1
  43. package/dist/commands/init.d.ts.map +1 -1
  44. package/dist/commands/init.js +14 -1
  45. package/dist/commands/init.js.map +1 -1
  46. package/dist/commands/insights.d.ts +2 -0
  47. package/dist/commands/insights.d.ts.map +1 -0
  48. package/dist/commands/insights.js +71 -0
  49. package/dist/commands/insights.js.map +1 -0
  50. package/dist/commands/inspect.d.ts +2 -0
  51. package/dist/commands/inspect.d.ts.map +1 -0
  52. package/dist/commands/inspect.js +81 -0
  53. package/dist/commands/inspect.js.map +1 -0
  54. package/dist/commands/integrations.d.ts +2 -0
  55. package/dist/commands/integrations.d.ts.map +1 -0
  56. package/dist/commands/integrations.js +46 -0
  57. package/dist/commands/integrations.js.map +1 -0
  58. package/dist/commands/login.d.ts +1 -1
  59. package/dist/commands/login.d.ts.map +1 -1
  60. package/dist/commands/login.js +45 -6
  61. package/dist/commands/login.js.map +1 -1
  62. package/dist/commands/metrics.d.ts +6 -0
  63. package/dist/commands/metrics.d.ts.map +1 -0
  64. package/dist/commands/metrics.js +85 -0
  65. package/dist/commands/metrics.js.map +1 -0
  66. package/dist/commands/reconcile.d.ts +2 -0
  67. package/dist/commands/reconcile.d.ts.map +1 -0
  68. package/dist/commands/reconcile.js +63 -0
  69. package/dist/commands/reconcile.js.map +1 -0
  70. package/dist/commands/scan.d.ts.map +1 -1
  71. package/dist/commands/scan.js +53 -10
  72. package/dist/commands/scan.js.map +1 -1
  73. package/dist/commands/status.d.ts +1 -1
  74. package/dist/commands/status.d.ts.map +1 -1
  75. package/dist/commands/status.js +84 -14
  76. package/dist/commands/status.js.map +1 -1
  77. package/dist/commands/subscription.d.ts +15 -0
  78. package/dist/commands/subscription.d.ts.map +1 -0
  79. package/dist/commands/subscription.js +62 -0
  80. package/dist/commands/subscription.js.map +1 -0
  81. package/dist/commands/sync.d.ts +1 -1
  82. package/dist/commands/sync.d.ts.map +1 -1
  83. package/dist/commands/sync.js +77 -10
  84. package/dist/commands/sync.js.map +1 -1
  85. package/dist/commands/value.d.ts +5 -0
  86. package/dist/commands/value.d.ts.map +1 -0
  87. package/dist/commands/value.js +95 -0
  88. package/dist/commands/value.js.map +1 -0
  89. package/dist/config.d.ts +28 -3
  90. package/dist/config.d.ts.map +1 -1
  91. package/dist/config.js +9 -1
  92. package/dist/config.js.map +1 -1
  93. package/dist/correlate.d.ts +7 -0
  94. package/dist/correlate.d.ts.map +1 -1
  95. package/dist/correlate.js +102 -15
  96. package/dist/correlate.js.map +1 -1
  97. package/dist/daemon/daemon.d.ts +2 -0
  98. package/dist/daemon/daemon.d.ts.map +1 -0
  99. package/dist/daemon/daemon.js +188 -0
  100. package/dist/daemon/daemon.js.map +1 -0
  101. package/dist/daemon/daemonState.d.ts +25 -0
  102. package/dist/daemon/daemonState.d.ts.map +1 -0
  103. package/dist/daemon/daemonState.js +82 -0
  104. package/dist/daemon/daemonState.js.map +1 -0
  105. package/dist/daemon/logger.d.ts +7 -0
  106. package/dist/daemon/logger.d.ts.map +1 -0
  107. package/dist/daemon/logger.js +61 -0
  108. package/dist/daemon/logger.js.map +1 -0
  109. package/dist/daemon/syncLoop.d.ts +38 -0
  110. package/dist/daemon/syncLoop.d.ts.map +1 -0
  111. package/dist/daemon/syncLoop.js +119 -0
  112. package/dist/daemon/syncLoop.js.map +1 -0
  113. package/dist/daemon/watcher.d.ts +26 -0
  114. package/dist/daemon/watcher.d.ts.map +1 -0
  115. package/dist/daemon/watcher.js +187 -0
  116. package/dist/daemon/watcher.js.map +1 -0
  117. package/dist/db/store.d.ts +123 -2
  118. package/dist/db/store.d.ts.map +1 -1
  119. package/dist/db/store.js +397 -11
  120. package/dist/db/store.js.map +1 -1
  121. package/dist/detectors/cache-gap.d.ts +3 -0
  122. package/dist/detectors/cache-gap.d.ts.map +1 -0
  123. package/dist/detectors/cache-gap.js +70 -0
  124. package/dist/detectors/cache-gap.js.map +1 -0
  125. package/dist/detectors/context-bloat.d.ts +3 -0
  126. package/dist/detectors/context-bloat.d.ts.map +1 -0
  127. package/dist/detectors/context-bloat.js +68 -0
  128. package/dist/detectors/context-bloat.js.map +1 -0
  129. package/dist/detectors/fileTokens.d.ts +3 -0
  130. package/dist/detectors/fileTokens.d.ts.map +1 -0
  131. package/dist/detectors/fileTokens.js +12 -0
  132. package/dist/detectors/fileTokens.js.map +1 -0
  133. package/dist/detectors/index.d.ts +20 -0
  134. package/dist/detectors/index.d.ts.map +1 -0
  135. package/dist/detectors/index.js +41 -0
  136. package/dist/detectors/index.js.map +1 -0
  137. package/dist/detectors/model-routing.d.ts +3 -0
  138. package/dist/detectors/model-routing.d.ts.map +1 -0
  139. package/dist/detectors/model-routing.js +71 -0
  140. package/dist/detectors/model-routing.js.map +1 -0
  141. package/dist/detectors/repeat-read.d.ts +3 -0
  142. package/dist/detectors/repeat-read.d.ts.map +1 -0
  143. package/dist/detectors/repeat-read.js +69 -0
  144. package/dist/detectors/repeat-read.js.map +1 -0
  145. package/dist/detectors/seat-efficiency.d.ts +4 -0
  146. package/dist/detectors/seat-efficiency.d.ts.map +1 -0
  147. package/dist/detectors/seat-efficiency.js +86 -0
  148. package/dist/detectors/seat-efficiency.js.map +1 -0
  149. package/dist/detectors/types.d.ts +46 -0
  150. package/dist/detectors/types.d.ts.map +1 -0
  151. package/dist/detectors/types.js +2 -0
  152. package/dist/detectors/types.js.map +1 -0
  153. package/dist/health.d.ts +59 -0
  154. package/dist/health.d.ts.map +1 -0
  155. package/dist/health.js +106 -0
  156. package/dist/health.js.map +1 -0
  157. package/dist/index.js +389 -5
  158. package/dist/index.js.map +1 -1
  159. package/dist/metrics.d.ts +29 -0
  160. package/dist/metrics.d.ts.map +1 -0
  161. package/dist/metrics.js +205 -0
  162. package/dist/metrics.js.map +1 -0
  163. package/dist/scrapers/claudeCode.d.ts +1 -0
  164. package/dist/scrapers/claudeCode.d.ts.map +1 -1
  165. package/dist/scrapers/claudeCode.js +43 -13
  166. package/dist/scrapers/claudeCode.js.map +1 -1
  167. package/dist/scrapers/cursor.d.ts +3 -2
  168. package/dist/scrapers/cursor.d.ts.map +1 -1
  169. package/dist/scrapers/cursor.js +56 -16
  170. package/dist/scrapers/cursor.js.map +1 -1
  171. package/dist/scrapers/jetbrains.d.ts +15 -0
  172. package/dist/scrapers/jetbrains.d.ts.map +1 -0
  173. package/dist/scrapers/jetbrains.js +232 -0
  174. package/dist/scrapers/jetbrains.js.map +1 -0
  175. package/dist/scrapers/types.d.ts +4 -1
  176. package/dist/scrapers/types.d.ts.map +1 -1
  177. package/dist/scrapers/windsurf.d.ts +3 -2
  178. package/dist/scrapers/windsurf.d.ts.map +1 -1
  179. package/dist/scrapers/windsurf.js +25 -9
  180. package/dist/scrapers/windsurf.js.map +1 -1
  181. package/dist/sync/payload.d.ts +4 -5
  182. package/dist/sync/payload.d.ts.map +1 -1
  183. package/dist/sync/payload.js +88 -7
  184. package/dist/sync/payload.js.map +1 -1
  185. package/dist/sync/syncEngine.d.ts +19 -3
  186. package/dist/sync/syncEngine.d.ts.map +1 -1
  187. package/dist/sync/syncEngine.js +116 -10
  188. package/dist/sync/syncEngine.js.map +1 -1
  189. package/install.sh +27 -10
  190. package/package.json +43 -42
package/dist/health.js ADDED
@@ -0,0 +1,106 @@
1
+ import { readConfig, resolveApiUrl } from "./config.js";
2
+ import { getConnectionState, setConnectionState, getSyncedSessionIds, resetSyncStateForIds, } from "./db/store.js";
3
+ // ── preflightHealth ───────────────────────────────────────────────────────────
4
+ /**
5
+ * Check /api/me/health and detect three classes of drift:
6
+ * - workspace-changed (token now bound to a different workspace)
7
+ * - db-reset (backend DB was wiped/restored since last check)
8
+ *
9
+ * On success, updates last_backend_db_instance_id / last_workspace_id /
10
+ * last_health_check_at in connection_state.
11
+ *
12
+ * On drift, returns the failure type with `current` values but does NOT
13
+ * update stored state — callers must call commitHealthState() after resolving.
14
+ */
15
+ export async function preflightHealth() {
16
+ const config = readConfig();
17
+ if (!config.token)
18
+ return { ok: false, reason: "no-token" };
19
+ const apiUrl = resolveApiUrl();
20
+ let data;
21
+ try {
22
+ const res = await fetch(`${apiUrl}/api/me/health`, {
23
+ headers: { Authorization: `Bearer ${config.token}` },
24
+ signal: AbortSignal.timeout(10_000),
25
+ });
26
+ if (res.status === 401 || res.status === 403) {
27
+ return { ok: false, reason: "invalid-token" };
28
+ }
29
+ if (!res.ok) {
30
+ return { ok: false, reason: "network" };
31
+ }
32
+ data = (await res.json());
33
+ }
34
+ catch {
35
+ return { ok: false, reason: "network" };
36
+ }
37
+ const { workspaceId, workspaceName, backendDbInstanceId } = data;
38
+ const prevWorkspaceId = getConnectionState("last_workspace_id");
39
+ const prevDbInstanceId = getConnectionState("last_backend_db_instance_id");
40
+ if (prevWorkspaceId && prevWorkspaceId !== workspaceId) {
41
+ return {
42
+ ok: false,
43
+ reason: "workspace-changed",
44
+ previous: prevWorkspaceId,
45
+ current: workspaceId,
46
+ workspaceName,
47
+ dbInstanceId: backendDbInstanceId,
48
+ };
49
+ }
50
+ if (prevDbInstanceId && prevDbInstanceId !== backendDbInstanceId) {
51
+ return {
52
+ ok: false,
53
+ reason: "db-reset",
54
+ previous: prevDbInstanceId,
55
+ current: backendDbInstanceId,
56
+ workspaceId,
57
+ workspaceName,
58
+ };
59
+ }
60
+ commitHealthState(backendDbInstanceId, workspaceId);
61
+ return { ok: true, workspaceId, workspaceName, dbInstanceId: backendDbInstanceId };
62
+ }
63
+ // ── commitHealthState ─────────────────────────────────────────────────────────
64
+ /** Persist health state; call after a successful preflight or after reconcile resolves drift. */
65
+ export function commitHealthState(dbInstanceId, workspaceId) {
66
+ setConnectionState("last_backend_db_instance_id", dbInstanceId);
67
+ setConnectionState("last_workspace_id", workspaceId);
68
+ setConnectionState("last_health_check_at", new Date().toISOString());
69
+ }
70
+ // ── reconcileWithManifest ─────────────────────────────────────────────────────
71
+ /**
72
+ * Fetch the backend session manifest and reset sync state for any local
73
+ * sessions that are marked synced but absent from the backend.
74
+ *
75
+ * Returns the count of sessions whose sync state was reset (they will be
76
+ * re-sent on the next `planck sync`).
77
+ */
78
+ export async function reconcileWithManifest() {
79
+ const config = readConfig();
80
+ if (!config.token)
81
+ return { reset: 0 };
82
+ const apiUrl = resolveApiUrl();
83
+ const since = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString();
84
+ let manifest;
85
+ try {
86
+ const res = await fetch(`${apiUrl}/api/sessions/manifest?since=${encodeURIComponent(since)}`, {
87
+ headers: { Authorization: `Bearer ${config.token}` },
88
+ signal: AbortSignal.timeout(15_000),
89
+ });
90
+ if (!res.ok)
91
+ return { reset: 0 };
92
+ const raw = (await res.json());
93
+ manifest = Array.isArray(raw) ? raw : (raw.sessionIds ?? []);
94
+ }
95
+ catch {
96
+ return { reset: 0 };
97
+ }
98
+ const backendSet = new Set(manifest);
99
+ const localSyncedIds = getSyncedSessionIds();
100
+ const drifted = localSyncedIds.filter((id) => !backendSet.has(id));
101
+ if (drifted.length > 0) {
102
+ resetSyncStateForIds(drifted, "not in backend manifest");
103
+ }
104
+ return { reset: drifted.length };
105
+ }
106
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,9 +7,23 @@ import { dirname, join } from "path";
7
7
  import { runInit } from "./commands/init.js";
8
8
  import { runScan } from "./commands/scan.js";
9
9
  import { runStatus } from "./commands/status.js";
10
+ import { runDiagnose } from "./commands/diagnose.js";
10
11
  import { runLogin } from "./commands/login.js";
11
12
  import { runLogout } from "./commands/logout.js";
12
13
  import { runSync } from "./commands/sync.js";
14
+ import { runSubscriptionAdd, runSubscriptionList, runSubscriptionRemove, } from "./commands/subscription.js";
15
+ import { runValue } from "./commands/value.js";
16
+ import { runConnectAnthropic, runConnectOpenAI, runConnectBedrock, } from "./commands/connect.js";
17
+ import { runIntegrationsList } from "./commands/integrations.js";
18
+ import { runInsights } from "./commands/insights.js";
19
+ import { runMetrics } from "./commands/metrics.js";
20
+ import { installDaemon, uninstallDaemon, statusDaemon, runDaemonCommand, } from "./commands/daemon.js";
21
+ import { runBudgetSet, runBudgetList, runBudgetRemove, } from "./commands/budget.js";
22
+ import { runExportChargeback, runExportSessions, } from "./commands/export.js";
23
+ import { runInspect } from "./commands/inspect.js";
24
+ import { runReconcile } from "./commands/reconcile.js";
25
+ import { runDoctor } from "./commands/doctor.js";
26
+ import { runConfigSet, runConfigGet, runConfigShow } from "./commands/config.js";
13
27
  const __dirname = dirname(fileURLToPath(import.meta.url));
14
28
  const pkg = JSON.parse(readFileSync(join(__dirname, "..", "package.json"), "utf-8"));
15
29
  const program = new Command();
@@ -20,9 +34,10 @@ program
20
34
  program
21
35
  .command("init")
22
36
  .description("Initialize ~/.planckspace workspace and local database")
23
- .action(() => {
37
+ .option("--no-daemon", "Skip automatic daemon installation")
38
+ .action((opts) => {
24
39
  try {
25
- runInit();
40
+ runInit({ noDaemon: opts.daemon === false });
26
41
  }
27
42
  catch (err) {
28
43
  console.error(String(err));
@@ -59,9 +74,9 @@ program
59
74
  program
60
75
  .command("status")
61
76
  .description("Show workspace status and session statistics")
62
- .action(() => {
77
+ .action(async () => {
63
78
  try {
64
- runStatus();
79
+ await runStatus();
65
80
  }
66
81
  catch (err) {
67
82
  console.error(String(err));
@@ -72,9 +87,22 @@ program
72
87
  .command("login [token]")
73
88
  .description("Connect to a PlanckSpace workspace")
74
89
  .option("-t, --token <token>", "API token (for non-interactive/script installs)")
90
+ .option("--api-url <url>", "Backend API base URL (cross-platform alternative to PLANCKSPACE_API_URL)")
75
91
  .action(async (tokenArg, options) => {
76
92
  try {
77
- await runLogin(options.token ?? tokenArg);
93
+ await runLogin(options.token ?? tokenArg, options.apiUrl);
94
+ }
95
+ catch (err) {
96
+ console.error(String(err));
97
+ process.exit(1);
98
+ }
99
+ });
100
+ program
101
+ .command("diagnose")
102
+ .description("Show all model IDs seen, unmatched models, and session counts by costType")
103
+ .action(() => {
104
+ try {
105
+ runDiagnose();
78
106
  }
79
107
  catch (err) {
80
108
  console.error(String(err));
@@ -93,5 +121,361 @@ program
93
121
  process.exit(1);
94
122
  }
95
123
  });
124
+ // ── subscription ─────────────────────────────────────────────────────────────
125
+ const subscription = program
126
+ .command("subscription")
127
+ .description("Manage workspace subscription inventory (seat cost declarations)");
128
+ subscription
129
+ .command("add")
130
+ .description("Declare or update a subscription (tool + plan + seats + seat cost)")
131
+ .requiredOption("--tool <tool>", "Tool name (cursor, windsurf, claude_code, …)")
132
+ .requiredOption("--plan <plan>", "Plan name (pro, max, team, enterprise, api, …)")
133
+ .requiredOption("--seats <n>", "Number of licensed seats", (v) => parseInt(v, 10))
134
+ .requiredOption("--seat-cost <usd>", "Monthly USD cost per seat", (v) => parseFloat(v))
135
+ .action((opts) => {
136
+ try {
137
+ runSubscriptionAdd(opts);
138
+ }
139
+ catch (err) {
140
+ console.error(String(err));
141
+ process.exit(1);
142
+ }
143
+ });
144
+ subscription
145
+ .command("list")
146
+ .description("List declared subscriptions")
147
+ .action(() => {
148
+ try {
149
+ runSubscriptionList();
150
+ }
151
+ catch (err) {
152
+ console.error(String(err));
153
+ process.exit(1);
154
+ }
155
+ });
156
+ subscription
157
+ .command("remove")
158
+ .description("Remove a declared subscription")
159
+ .requiredOption("--tool <tool>", "Tool name")
160
+ .requiredOption("--plan <plan>", "Plan name")
161
+ .action((opts) => {
162
+ try {
163
+ runSubscriptionRemove(opts);
164
+ }
165
+ catch (err) {
166
+ console.error(String(err));
167
+ process.exit(1);
168
+ }
169
+ });
170
+ // ── value ─────────────────────────────────────────────────────────────────────
171
+ program
172
+ .command("value")
173
+ .description("Show consumption value vs seat cost for declared subscriptions (last 30 days)")
174
+ .option("--tool <tool>", "Filter to a specific tool")
175
+ .action((opts) => {
176
+ try {
177
+ runValue(opts);
178
+ }
179
+ catch (err) {
180
+ console.error(String(err));
181
+ process.exit(1);
182
+ }
183
+ });
184
+ // ── connect ───────────────────────────────────────────────────────────────────
185
+ const connect = program
186
+ .command("connect")
187
+ .description("Connect a billing source so PlanckSpace can pull usage data");
188
+ connect
189
+ .command("anthropic")
190
+ .description("Connect an Anthropic workspace admin key")
191
+ .requiredOption("--admin-key <key>", "Anthropic admin key (sk-ant-admin-…)")
192
+ .action(async (opts) => {
193
+ try {
194
+ await runConnectAnthropic(opts);
195
+ }
196
+ catch (err) {
197
+ console.error(String(err));
198
+ process.exitCode = 1;
199
+ }
200
+ });
201
+ connect
202
+ .command("openai")
203
+ .description("Connect an OpenAI organization API key")
204
+ .requiredOption("--api-key <key>", "OpenAI API key (sk-…)")
205
+ .action(async (opts) => {
206
+ try {
207
+ await runConnectOpenAI(opts);
208
+ }
209
+ catch (err) {
210
+ console.error(String(err));
211
+ process.exitCode = 1;
212
+ }
213
+ });
214
+ connect
215
+ .command("bedrock")
216
+ .description("Connect an AWS IAM role for Bedrock cost ingestion")
217
+ .requiredOption("--role-arn <arn>", "Read-only IAM role ARN (arn:aws:iam::…:role/…)")
218
+ .action(async (opts) => {
219
+ try {
220
+ await runConnectBedrock(opts);
221
+ }
222
+ catch (err) {
223
+ console.error(String(err));
224
+ process.exitCode = 1;
225
+ }
226
+ });
227
+ // ── insights ──────────────────────────────────────────────────────────────────
228
+ program
229
+ .command("insights")
230
+ .description("Run all detectors over stored sessions and print actionable cost insights")
231
+ .action(async () => {
232
+ try {
233
+ await runInsights();
234
+ }
235
+ catch (err) {
236
+ console.error(String(err));
237
+ process.exit(1);
238
+ }
239
+ });
240
+ // ── metrics ───────────────────────────────────────────────────────────────────
241
+ program
242
+ .command("metrics")
243
+ .description("Show productivity metrics: cost per shipped PR, time-to-merge, AI adoption rate")
244
+ .option("--by-repo", "Pivot metrics by repository")
245
+ .option("--by-developer", "Pivot metrics by developer (shows individual git emails)")
246
+ .action(async (opts) => {
247
+ try {
248
+ await runMetrics({ byRepo: opts.byRepo, byDeveloper: opts.byDeveloper });
249
+ }
250
+ catch (err) {
251
+ console.error(String(err));
252
+ process.exit(1);
253
+ }
254
+ });
255
+ // ── daemon ────────────────────────────────────────────────────────────────────
256
+ const daemon = program
257
+ .command("daemon")
258
+ .description("Manage the background sync daemon (install, uninstall, status, run)");
259
+ daemon
260
+ .command("install")
261
+ .description("Register the daemon to auto-start at user login (idempotent)")
262
+ .action(() => {
263
+ try {
264
+ installDaemon();
265
+ }
266
+ catch (err) {
267
+ console.error(String(err));
268
+ process.exitCode = 1;
269
+ }
270
+ });
271
+ daemon
272
+ .command("uninstall")
273
+ .description("Remove the daemon auto-start registration")
274
+ .action(() => {
275
+ try {
276
+ uninstallDaemon();
277
+ }
278
+ catch (err) {
279
+ console.error(String(err));
280
+ process.exitCode = 1;
281
+ }
282
+ });
283
+ daemon
284
+ .command("status")
285
+ .description("Show daemon running state, queue depth, and last sync")
286
+ .option("--verbose", "Include recent event log (last 50 entries)")
287
+ .action((opts) => {
288
+ try {
289
+ statusDaemon({ verbose: opts.verbose });
290
+ }
291
+ catch (err) {
292
+ console.error(String(err));
293
+ process.exitCode = 1;
294
+ }
295
+ });
296
+ daemon
297
+ .command("run")
298
+ .description("Start the daemon in the foreground (called by the OS auto-start)")
299
+ .action(async () => {
300
+ try {
301
+ await runDaemonCommand();
302
+ }
303
+ catch (err) {
304
+ console.error(String(err));
305
+ process.exitCode = 1;
306
+ }
307
+ });
308
+ // ── budget ────────────────────────────────────────────────────────────────────
309
+ const budget = program
310
+ .command("budget")
311
+ .description("Manage monthly spend budgets for repos or the whole workspace");
312
+ budget
313
+ .command("set")
314
+ .description("Create or update a monthly budget")
315
+ .requiredOption("--scope <scope>", "Budget scope: repo or workspace")
316
+ .requiredOption("--name <name>", "Repo name (scope=repo) or label (scope=workspace)")
317
+ .requiredOption("--monthly <usd>", "Monthly budget cap in USD", (v) => parseFloat(v))
318
+ .action((opts) => {
319
+ try {
320
+ runBudgetSet(opts);
321
+ }
322
+ catch (err) {
323
+ console.error(String(err));
324
+ process.exitCode = 1;
325
+ }
326
+ });
327
+ budget
328
+ .command("list")
329
+ .description("List all configured budgets")
330
+ .action(() => {
331
+ try {
332
+ runBudgetList();
333
+ }
334
+ catch (err) {
335
+ console.error(String(err));
336
+ process.exitCode = 1;
337
+ }
338
+ });
339
+ budget
340
+ .command("remove")
341
+ .description("Remove a configured budget")
342
+ .requiredOption("--scope <scope>", "Budget scope: repo or workspace")
343
+ .requiredOption("--name <name>", "Repo name or label to remove")
344
+ .action((opts) => {
345
+ try {
346
+ runBudgetRemove(opts);
347
+ }
348
+ catch (err) {
349
+ console.error(String(err));
350
+ process.exitCode = 1;
351
+ }
352
+ });
353
+ // ── export ────────────────────────────────────────────────────────────────────
354
+ const exportCmd = program
355
+ .command("export")
356
+ .description("Finance-friendly data exports (chargeback CSV, sessions JSONL)");
357
+ exportCmd
358
+ .command("chargeback")
359
+ .description("Export monthly cost data aggregated for chargeback to a CSV file")
360
+ .requiredOption("--month <YYYY-MM>", "Month to export (e.g. 2026-06)")
361
+ .requiredOption("--out <file>", "Output CSV file path")
362
+ .action((opts) => {
363
+ try {
364
+ runExportChargeback(opts);
365
+ }
366
+ catch (err) {
367
+ console.error(String(err));
368
+ process.exitCode = 1;
369
+ }
370
+ });
371
+ exportCmd
372
+ .command("sessions")
373
+ .description("Export raw per-session data as JSONL (no prompt text) for audit / re-analysis")
374
+ .requiredOption("--month <YYYY-MM>", "Month to export (e.g. 2026-06)")
375
+ .requiredOption("--out <file>", "Output JSONL file path")
376
+ .action((opts) => {
377
+ try {
378
+ runExportSessions(opts);
379
+ }
380
+ catch (err) {
381
+ console.error(String(err));
382
+ process.exitCode = 1;
383
+ }
384
+ });
385
+ // ── integrations ──────────────────────────────────────────────────────────────
386
+ const integrations = program
387
+ .command("integrations")
388
+ .description("Manage connected billing source integrations");
389
+ integrations
390
+ .command("list")
391
+ .description("List connected integrations and their last-sync status")
392
+ .action(async () => {
393
+ try {
394
+ await runIntegrationsList();
395
+ }
396
+ catch (err) {
397
+ console.error(String(err));
398
+ process.exitCode = 1;
399
+ }
400
+ });
401
+ // ── inspect ───────────────────────────────────────────────────────────────────
402
+ program
403
+ .command("inspect <sessionId>")
404
+ .description("Print the full local-DB view of a session: turns, files, re-reads, costs, model breakdown")
405
+ .action((sessionId) => {
406
+ try {
407
+ runInspect(sessionId);
408
+ }
409
+ catch (err) {
410
+ console.error(String(err));
411
+ process.exitCode = 1;
412
+ }
413
+ });
414
+ // ── config ────────────────────────────────────────────────────────────────────
415
+ const configCmd = program
416
+ .command("config")
417
+ .description("Read or write CLI configuration (apiUrl, privacyMode, …)");
418
+ configCmd
419
+ .command("show")
420
+ .description("Print all current config values")
421
+ .action(() => {
422
+ try {
423
+ runConfigShow();
424
+ }
425
+ catch (err) {
426
+ console.error(String(err));
427
+ process.exitCode = 1;
428
+ }
429
+ });
430
+ configCmd
431
+ .command("get <key>")
432
+ .description("Print the value of a single config key")
433
+ .action((key) => {
434
+ try {
435
+ runConfigGet(key);
436
+ }
437
+ catch (err) {
438
+ console.error(String(err));
439
+ process.exitCode = 1;
440
+ }
441
+ });
442
+ configCmd
443
+ .command("set <key> <value>")
444
+ .description("Persist a config value (e.g. planck config set apiUrl https://api.planckspace.dev)")
445
+ .action((key, value) => {
446
+ try {
447
+ runConfigSet(key, value);
448
+ }
449
+ catch (err) {
450
+ console.error(String(err));
451
+ process.exitCode = 1;
452
+ }
453
+ });
454
+ // ── reconcile ─────────────────────────────────────────────────────────────────
455
+ program
456
+ .command("reconcile")
457
+ .description("Align local sync state with the backend — resets sessions missing from the backend manifest")
458
+ .action(async () => {
459
+ try {
460
+ await runReconcile();
461
+ }
462
+ catch (err) {
463
+ console.error(String(err));
464
+ process.exit(1);
465
+ }
466
+ });
467
+ // ── doctor ────────────────────────────────────────────────────────────────────
468
+ program
469
+ .command("doctor")
470
+ .description("Print full connection diagnostics: token, workspace, DB instance, session counts, live health")
471
+ .action(async () => {
472
+ try {
473
+ await runDoctor();
474
+ }
475
+ catch (err) {
476
+ console.error(String(err));
477
+ process.exit(1);
478
+ }
479
+ });
96
480
  program.parse();
97
481
  //# 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
+ export type RepoMetrics = {
2
+ repoName: string;
3
+ costPerShippedPr: number | null;
4
+ costPerMergedLine: number | null;
5
+ timeToMergeMedian: number | null;
6
+ aiAdoptionRate: number | null;
7
+ };
8
+ export type DeveloperMetrics = {
9
+ gitAuthorEmail: string;
10
+ totalCostUsd: number;
11
+ shippedPrCount: number;
12
+ timeToMergeMedian: number | null;
13
+ };
14
+ export type ProductivityMetrics = {
15
+ costPerShippedPr: number | null;
16
+ costPerMergedLine: number | null;
17
+ /** Median time-to-merge in milliseconds across the last 30 days of shipped sessions. */
18
+ timeToMergeMedian: number | null;
19
+ /** 0–1 fraction of merged branches in tracked repos that had at least one session. */
20
+ aiAdoptionRate: number | null;
21
+ perRepo: RepoMetrics[];
22
+ perDeveloper: DeveloperMetrics[];
23
+ };
24
+ export type MetricsOptions = {
25
+ /** ISO date lower bound (default: all time for costs; 30-day window for TTM). */
26
+ since?: string;
27
+ };
28
+ export declare function computeProductivityMetrics(opts?: MetricsOptions): Promise<ProductivityMetrics>;
29
+ //# sourceMappingURL=metrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../src/metrics.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,wFAAwF;IACxF,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,sFAAsF;IACtF,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC,CAAC;AAmOF,MAAM,MAAM,cAAc,GAAG;IAC3B,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAsB,0BAA0B,CAC9C,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAY9B"}