@rasensio/aidlc 1.2.0 → 1.3.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 (82) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli.js +4 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/claim.d.ts +15 -0
  5. package/dist/commands/claim.d.ts.map +1 -0
  6. package/dist/commands/claim.js +122 -0
  7. package/dist/commands/claim.js.map +1 -0
  8. package/dist/commands/cost.d.ts +12 -0
  9. package/dist/commands/cost.d.ts.map +1 -0
  10. package/dist/commands/cost.js +409 -0
  11. package/dist/commands/cost.js.map +1 -0
  12. package/dist/commands/init.d.ts.map +1 -1
  13. package/dist/commands/init.js +38 -2
  14. package/dist/commands/init.js.map +1 -1
  15. package/dist/commands/status.d.ts.map +1 -1
  16. package/dist/commands/status.js +30 -1
  17. package/dist/commands/status.js.map +1 -1
  18. package/dist/commands/transition.js +9 -0
  19. package/dist/commands/transition.js.map +1 -1
  20. package/dist/core/types.d.ts +8 -0
  21. package/dist/core/types.d.ts.map +1 -1
  22. package/dist/cost/config.d.ts +8 -0
  23. package/dist/cost/config.d.ts.map +1 -0
  24. package/dist/cost/config.js +37 -0
  25. package/dist/cost/config.js.map +1 -0
  26. package/dist/cost/hooks/claude-code.d.ts +29 -0
  27. package/dist/cost/hooks/claude-code.d.ts.map +1 -0
  28. package/dist/cost/hooks/claude-code.js +101 -0
  29. package/dist/cost/hooks/claude-code.js.map +1 -0
  30. package/dist/cost/hooks/kiro.d.ts +17 -0
  31. package/dist/cost/hooks/kiro.d.ts.map +1 -0
  32. package/dist/cost/hooks/kiro.js +66 -0
  33. package/dist/cost/hooks/kiro.js.map +1 -0
  34. package/dist/cost/ledger.d.ts +70 -0
  35. package/dist/cost/ledger.d.ts.map +1 -0
  36. package/dist/cost/ledger.js +314 -0
  37. package/dist/cost/ledger.js.map +1 -0
  38. package/dist/cost/providers/claude-code.d.ts +20 -0
  39. package/dist/cost/providers/claude-code.d.ts.map +1 -0
  40. package/dist/cost/providers/claude-code.js +116 -0
  41. package/dist/cost/providers/claude-code.js.map +1 -0
  42. package/dist/cost/providers/kiro.d.ts +19 -0
  43. package/dist/cost/providers/kiro.d.ts.map +1 -0
  44. package/dist/cost/providers/kiro.js +147 -0
  45. package/dist/cost/providers/kiro.js.map +1 -0
  46. package/dist/cost/providers/provider.d.ts +36 -0
  47. package/dist/cost/providers/provider.d.ts.map +1 -0
  48. package/dist/cost/providers/provider.js +21 -0
  49. package/dist/cost/providers/provider.js.map +1 -0
  50. package/dist/cost/rates-bundled.d.ts +11 -0
  51. package/dist/cost/rates-bundled.d.ts.map +1 -0
  52. package/dist/cost/rates-bundled.js +23 -0
  53. package/dist/cost/rates-bundled.js.map +1 -0
  54. package/dist/cost/rates.d.ts +42 -0
  55. package/dist/cost/rates.d.ts.map +1 -0
  56. package/dist/cost/rates.js +190 -0
  57. package/dist/cost/rates.js.map +1 -0
  58. package/dist/cost/recorder.d.ts +57 -0
  59. package/dist/cost/recorder.d.ts.map +1 -0
  60. package/dist/cost/recorder.js +339 -0
  61. package/dist/cost/recorder.js.map +1 -0
  62. package/dist/cost/report.d.ts +44 -0
  63. package/dist/cost/report.d.ts.map +1 -0
  64. package/dist/cost/report.js +164 -0
  65. package/dist/cost/report.js.map +1 -0
  66. package/dist/cost/sessions.d.ts +40 -0
  67. package/dist/cost/sessions.d.ts.map +1 -0
  68. package/dist/cost/sessions.js +200 -0
  69. package/dist/cost/sessions.js.map +1 -0
  70. package/dist/cost/sync.d.ts +24 -0
  71. package/dist/cost/sync.d.ts.map +1 -0
  72. package/dist/cost/sync.js +191 -0
  73. package/dist/cost/sync.js.map +1 -0
  74. package/dist/cost/types.d.ts +116 -0
  75. package/dist/cost/types.d.ts.map +1 -0
  76. package/dist/cost/types.js +13 -0
  77. package/dist/cost/types.js.map +1 -0
  78. package/dist/setup/setup-compute.d.ts +6 -0
  79. package/dist/setup/setup-compute.d.ts.map +1 -1
  80. package/dist/setup/setup-compute.js +3 -0
  81. package/dist/setup/setup-compute.js.map +1 -1
  82. package/package.json +11 -14
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Rodrigo Asensio
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/cli.js CHANGED
@@ -34,6 +34,8 @@ import { registerDocs } from './commands/docs.js';
34
34
  import { registerReview } from './commands/review.js';
35
35
  import { registerUpdate } from './commands/update.js';
36
36
  import { registerKnowledge } from './commands/knowledge.js';
37
+ import { registerCost } from './commands/cost.js';
38
+ import { registerClaim } from './commands/claim.js';
37
39
  const pkg = JSON.parse(readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), '..', 'package.json'), 'utf8'));
38
40
  const program = new Command();
39
41
  program
@@ -52,5 +54,7 @@ registerDocs(program);
52
54
  registerReview(program);
53
55
  registerUpdate(program);
54
56
  registerKnowledge(program);
57
+ registerCost(program);
58
+ registerClaim(program);
55
59
  program.parse();
56
60
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,6EAA6E;AAC7E,6EAA6E;AAC7E,yDAAyD;AACzD,MAAM,uBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC7D,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACtC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO;IACzF,KAAK,MAAM,QAAQ,IAAI,uBAAuB;QAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACtE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAE3B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAEH,6EAA6E;AAC7E,6EAA6E;AAC7E,yDAAyD;AACzD,MAAM,uBAAuB,GAAG,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AAC7D,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;AACtC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO;IACzF,KAAK,MAAM,QAAQ,IAAI,uBAAuB;QAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC,CAAC,CAAC;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACtE,CAAC;AAEzB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,oCAAoC,CAAC;KACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAExB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `aidlc claim` / `aidlc release`: instance claiming with a durable
3
+ * session ledger (FR1.2).
4
+ *
5
+ * Performs the instance.yaml claim update and the sessions.ndjson append
6
+ * as one protocol step — in that order, so a failure between the two
7
+ * leaves exactly the divergence `aidlc cost sync` detects and reports.
8
+ *
9
+ * Session identity (FR1.5/D4): resolved from the active-session stash
10
+ * with the strict single-candidate rule; zero or multiple candidates
11
+ * degrade to a generated agent id with interval-based attribution.
12
+ */
13
+ import { Command } from 'commander';
14
+ export declare function registerClaim(program: Command): void;
15
+ //# sourceMappingURL=claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.d.ts","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2GpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiBpD"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * `aidlc claim` / `aidlc release`: instance claiming with a durable
3
+ * session ledger (FR1.2).
4
+ *
5
+ * Performs the instance.yaml claim update and the sessions.ndjson append
6
+ * as one protocol step — in that order, so a failure between the two
7
+ * leaves exactly the divergence `aidlc cost sync` detects and reports.
8
+ *
9
+ * Session identity (FR1.5/D4): resolved from the active-session stash
10
+ * with the strict single-candidate rule; zero or multiple candidates
11
+ * degrade to a generated agent id with interval-based attribution.
12
+ */
13
+ import { Command } from 'commander';
14
+ import { existsSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import { randomUUID } from 'node:crypto';
17
+ import { loadYaml, saveYaml } from '../state/yaml-helpers.js';
18
+ import { appendSessionEvent, sessionsPath, resolveCurrentSession } from '../cost/sessions.js';
19
+ import { loadClaimTimeoutMinutes } from '../cost/config.js';
20
+ function instanceYamlPath(root, instance) {
21
+ return join(root, '.aidlc', 'state', instance, 'instance.yaml');
22
+ }
23
+ function resolveSession(root) {
24
+ const active = resolveCurrentSession(root);
25
+ if (active)
26
+ return { id: active.session_id, source: 'platform', agent: active.agent };
27
+ return { id: `agent-${randomUUID()}`, source: 'agent', agent: process.env.AIDLC_AGENT ?? 'unknown' };
28
+ }
29
+ function runClaim(instance, opts) {
30
+ const root = process.cwd();
31
+ const yamlPath = instanceYamlPath(root, instance);
32
+ if (!existsSync(yamlPath)) {
33
+ process.stderr.write(`no such instance: ${instance}\n`);
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ const state = loadYaml(yamlPath);
38
+ const now = new Date().toISOString();
39
+ const timeoutMs = loadClaimTimeoutMinutes(root) * 60_000;
40
+ if (opts.renew) {
41
+ if (!state.claim) {
42
+ process.stderr.write(`${instance} is not claimed — nothing to renew\n`);
43
+ process.exitCode = 1;
44
+ return;
45
+ }
46
+ state.claim.renewed_at = now;
47
+ saveYaml(yamlPath, state);
48
+ appendSessionEvent(sessionsPath(root, instance), {
49
+ event: 'renew',
50
+ session_id: state.claim.session,
51
+ id_source: state.claim.session.startsWith('agent-') ? 'agent' : 'platform',
52
+ agent: process.env.AIDLC_AGENT ?? 'unknown',
53
+ timestamp: now,
54
+ });
55
+ process.stdout.write(`renewed claim on ${instance}\n`);
56
+ return;
57
+ }
58
+ if (state.claim) {
59
+ const last = Date.parse(state.claim.renewed_at ?? state.claim.claimed_at);
60
+ if (Date.now() - last < timeoutMs) {
61
+ process.stderr.write(`${instance} is claimed by session ${state.claim.session} (not stale) — release it first or wait for timeout\n`);
62
+ process.exitCode = 1;
63
+ return;
64
+ }
65
+ process.stderr.write(`overriding stale claim by ${state.claim.session}\n`);
66
+ }
67
+ const session = resolveSession(root);
68
+ state.claim = { session: session.id, claimed_at: now };
69
+ saveYaml(yamlPath, state);
70
+ appendSessionEvent(sessionsPath(root, instance), {
71
+ event: 'claim',
72
+ session_id: session.id,
73
+ id_source: session.source,
74
+ agent: session.agent,
75
+ timestamp: now,
76
+ });
77
+ process.stdout.write(`claimed ${instance} as ${session.id} (${session.source})\n`);
78
+ }
79
+ function runRelease(instance) {
80
+ const root = process.cwd();
81
+ const yamlPath = instanceYamlPath(root, instance);
82
+ if (!existsSync(yamlPath)) {
83
+ process.stderr.write(`no such instance: ${instance}\n`);
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ const state = loadYaml(yamlPath);
88
+ if (!state.claim) {
89
+ process.stderr.write(`${instance} is not claimed\n`);
90
+ return;
91
+ }
92
+ const session = state.claim.session;
93
+ const now = new Date().toISOString();
94
+ state.claim = null;
95
+ saveYaml(yamlPath, state);
96
+ appendSessionEvent(sessionsPath(root, instance), {
97
+ event: 'release',
98
+ session_id: session,
99
+ id_source: session.startsWith('agent-') ? 'agent' : 'platform',
100
+ agent: process.env.AIDLC_AGENT ?? 'unknown',
101
+ timestamp: now,
102
+ });
103
+ process.stdout.write(`released ${instance}\n`);
104
+ }
105
+ export function registerClaim(program) {
106
+ program
107
+ .command('claim')
108
+ .description('Claim a lifecycle instance for this session (writes sessions.ndjson)')
109
+ .argument('<instance>', 'Instance name')
110
+ .option('--renew', 'Renew an existing claim instead of taking a new one')
111
+ .action((instance, opts) => {
112
+ runClaim(instance, opts);
113
+ });
114
+ program
115
+ .command('release')
116
+ .description('Release a claimed instance (writes sessions.ndjson)')
117
+ .argument('<instance>', 'Instance name')
118
+ .action((instance) => {
119
+ runRelease(instance);
120
+ });
121
+ }
122
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `aidlc cost` command family: reports, capture, sync, rates, hooks.
3
+ *
4
+ * Machine-consumable output goes to stdout, diagnostics to stderr
5
+ * (cli.ts convention). Hook-mode subcommands (record, session-start) are
6
+ * silent on success — they run inside platform hooks.
7
+ *
8
+ * Design: design.md §1 (command surface)
9
+ */
10
+ import { Command } from 'commander';
11
+ export declare function registerCost(program: Command): void;
12
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmXpC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+EnD"}
@@ -0,0 +1,409 @@
1
+ /**
2
+ * `aidlc cost` command family: reports, capture, sync, rates, hooks.
3
+ *
4
+ * Machine-consumable output goes to stdout, diagnostics to stderr
5
+ * (cli.ts convention). Hook-mode subcommands (record, session-start) are
6
+ * silent on success — they run inside platform hooks.
7
+ *
8
+ * Design: design.md §1 (command surface)
9
+ */
10
+ import { Command } from 'commander';
11
+ import { spawn } from 'node:child_process';
12
+ import { readFileSync } from 'node:fs';
13
+ import { fileURLToPath } from 'node:url';
14
+ import { dirname, resolve } from 'node:path';
15
+ import { registerProvider, getProvider, allProviders } from '../cost/providers/provider.js';
16
+ import { claudeCodeProvider } from '../cost/providers/claude-code.js';
17
+ import { kiroProvider } from '../cost/providers/kiro.js';
18
+ import { recordUsage, lastCaptureError, logCapture } from '../cost/recorder.js';
19
+ import { stashSession } from '../cost/sessions.js';
20
+ import { appendEntry, ledgerPath } from '../cost/ledger.js';
21
+ import { instanceCost, listInstances, byTemplate, unattributedEntries } from '../cost/report.js';
22
+ import { effectiveRates, updateRates, microToUsd, NORMALIZATION_RULES } from '../cost/rates.js';
23
+ import { loadCostConfig, loadClaimTimeoutMinutes } from '../cost/config.js';
24
+ import { installClaudeCodeHooks, removeClaudeCodeHooks, claudeCodeHookStatus, } from '../cost/hooks/claude-code.js';
25
+ import { installKiroHooks, removeKiroHooks, kiroHookStatus } from '../cost/hooks/kiro.js';
26
+ import { SESSION_ID_RE } from '../cost/types.js';
27
+ registerProvider(claudeCodeProvider);
28
+ registerProvider(kiroProvider);
29
+ function projectRoot() {
30
+ return process.cwd();
31
+ }
32
+ function cliEntryPath() {
33
+ return resolve(dirname(fileURLToPath(import.meta.url)), '..', 'cli.js');
34
+ }
35
+ function readStdin() {
36
+ return new Promise((resolveInput) => {
37
+ let data = '';
38
+ process.stdin.setEncoding('utf8');
39
+ process.stdin.on('data', (chunk) => (data += chunk));
40
+ process.stdin.on('end', () => resolveInput(data));
41
+ // Hooks always pipe stdin; a TTY means manual invocation with no payload.
42
+ if (process.stdin.isTTY)
43
+ resolveInput('');
44
+ });
45
+ }
46
+ function parseHookInput(raw) {
47
+ try {
48
+ const parsed = JSON.parse(raw);
49
+ if (typeof parsed.session_id !== 'string' || !SESSION_ID_RE.test(parsed.session_id))
50
+ return null;
51
+ return {
52
+ session_id: parsed.session_id,
53
+ transcript_path: typeof parsed.transcript_path === 'string' ? parsed.transcript_path : undefined,
54
+ cwd: typeof parsed.cwd === 'string' ? parsed.cwd : undefined,
55
+ };
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ function fmtSeconds(secs) {
62
+ if (secs <= 0)
63
+ return '-';
64
+ const h = secs / 3600;
65
+ return h >= 1 ? `${h.toFixed(1)}h` : `${Math.round(secs / 60)}m`;
66
+ }
67
+ function fmtFidelityMix(mix) {
68
+ const parts = [];
69
+ for (const [k, v] of Object.entries(mix)) {
70
+ if (v > 0)
71
+ parts.push(`${Math.round(v * 100)}% ${k}`);
72
+ }
73
+ return parts.join(', ') || '-';
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Subcommand actions
77
+ // ---------------------------------------------------------------------------
78
+ async function runRecord(opts) {
79
+ const root = projectRoot();
80
+ if (opts.manual) {
81
+ runManualRecord(root, opts);
82
+ return;
83
+ }
84
+ if (!opts.provider || !getProvider(opts.provider)) {
85
+ process.stderr.write('cost record: unknown or missing --provider\n');
86
+ process.exitCode = 1;
87
+ return;
88
+ }
89
+ const raw = await readStdin();
90
+ const input = parseHookInput(raw);
91
+ if (!input) {
92
+ logCapture(root, 'parse-stdin', 'invalid-payload');
93
+ return; // Hook context: silent, logged.
94
+ }
95
+ if (opts.detach) {
96
+ // Respawn without --detach and exit immediately (SessionEnd budget).
97
+ const args = [cliEntryPath(), 'cost', 'record', '--provider', opts.provider];
98
+ const child = spawn(process.execPath, args, {
99
+ detached: true,
100
+ stdio: ['pipe', 'ignore', 'ignore'],
101
+ cwd: root,
102
+ });
103
+ child.stdin.write(raw);
104
+ child.stdin.end();
105
+ child.unref();
106
+ return;
107
+ }
108
+ const result = await recordUsage({
109
+ projectRoot: root,
110
+ provider: opts.provider,
111
+ input,
112
+ claimTimeoutMinutes: loadClaimTimeoutMinutes(root),
113
+ });
114
+ if (result && (result.appended > 0 || result.unattributed > 0)) {
115
+ process.stderr.write(`cost record: ${result.appended} entries (${result.instances.join(', ') || 'none'}), ${result.unattributed} unattributed\n`);
116
+ }
117
+ }
118
+ function runManualRecord(root, opts) {
119
+ if (!opts.instance) {
120
+ process.stderr.write('cost record --manual requires --instance\n');
121
+ process.exitCode = 1;
122
+ return;
123
+ }
124
+ const fidelity = opts.fidelity === 'estimated' || opts.fidelity === 'unknown' ? opts.fidelity : null;
125
+ if (!fidelity) {
126
+ process.stderr.write('cost record --manual requires --fidelity estimated|unknown\n');
127
+ process.exitCode = 1;
128
+ return;
129
+ }
130
+ if (fidelity === 'estimated' && !opts.units) {
131
+ process.stderr.write('--fidelity estimated requires --units\n');
132
+ process.exitCode = 1;
133
+ return;
134
+ }
135
+ if (fidelity === 'unknown' && opts.units) {
136
+ process.stderr.write('--fidelity unknown forbids --units\n');
137
+ process.exitCode = 1;
138
+ return;
139
+ }
140
+ let units = null;
141
+ if (opts.units) {
142
+ try {
143
+ units = JSON.parse(opts.units);
144
+ }
145
+ catch {
146
+ process.stderr.write('--units is not valid JSON\n');
147
+ process.exitCode = 1;
148
+ return;
149
+ }
150
+ }
151
+ const session = opts.session && opts.session !== '-' && SESSION_ID_RE.test(opts.session)
152
+ ? opts.session
153
+ : null;
154
+ const now = new Date().toISOString();
155
+ const entry = {
156
+ timestamp: now,
157
+ session_id: session,
158
+ phase: currentPhase(root, opts.instance),
159
+ provider: 'manual',
160
+ fidelity,
161
+ coverage: { from: opts.from ?? now, to: opts.to ?? now },
162
+ cursor: null,
163
+ units,
164
+ };
165
+ try {
166
+ appendEntry(ledgerPath(root, opts.instance), entry);
167
+ process.stderr.write(`recorded ${fidelity} entry for ${opts.instance}\n`);
168
+ }
169
+ catch (err) {
170
+ process.stderr.write(`cost record: ${err.message}\n`);
171
+ process.exitCode = 1;
172
+ }
173
+ }
174
+ function currentPhase(root, instance) {
175
+ try {
176
+ const raw = readFileSync(`${root}/.aidlc/state/${instance}/instance.yaml`, 'utf8');
177
+ const match = raw.match(/^current_phase:\s*(\S+)/m);
178
+ return match ? match[1] : null;
179
+ }
180
+ catch {
181
+ return null;
182
+ }
183
+ }
184
+ async function runSessionStart(opts) {
185
+ const root = projectRoot();
186
+ const raw = await readStdin();
187
+ const input = parseHookInput(raw);
188
+ if (!input || !opts.provider) {
189
+ logCapture(root, 'session-start', 'invalid-payload');
190
+ return;
191
+ }
192
+ try {
193
+ stashSession(root, {
194
+ session_id: input.session_id,
195
+ agent: opts.provider,
196
+ cwd: input.cwd ?? root,
197
+ transcript_path: input.transcript_path,
198
+ started_at: new Date().toISOString(),
199
+ });
200
+ }
201
+ catch {
202
+ logCapture(root, 'session-start', 'stash-failed');
203
+ }
204
+ }
205
+ function runReport(instance, opts) {
206
+ const root = projectRoot();
207
+ const config = loadCostConfig(root);
208
+ if (opts.unattributed) {
209
+ const entries = unattributedEntries(root);
210
+ if (opts.json) {
211
+ process.stdout.write(JSON.stringify(entries, null, 2) + '\n');
212
+ }
213
+ else {
214
+ process.stdout.write(`${entries.length} unattributed entries\n`);
215
+ }
216
+ return;
217
+ }
218
+ if (opts.byTemplate) {
219
+ const rollup = byTemplate(root, config);
220
+ if (opts.json) {
221
+ process.stdout.write(JSON.stringify(rollup, null, 2) + '\n');
222
+ return;
223
+ }
224
+ for (const r of rollup) {
225
+ process.stdout.write(`${r.template.padEnd(16)} n=${String(r.count).padEnd(4)} avg ${microToUsd(r.avgMicroUsd).padEnd(9)} avg time ${fmtSeconds(r.avgElapsedSeconds)}\n`);
226
+ }
227
+ return;
228
+ }
229
+ const names = instance ? [instance] : listInstances(root);
230
+ const costs = names.map((n) => instanceCost(root, n, config));
231
+ if (opts.json) {
232
+ process.stdout.write(JSON.stringify(costs, null, 2) + '\n');
233
+ return;
234
+ }
235
+ for (const c of costs) {
236
+ process.stdout.write(`${c.instance} (${c.template ?? 'unknown'})\n`);
237
+ for (const p of c.phases) {
238
+ const cost = p.microUsd !== null ? microToUsd(p.microUsd) : `${p.tokens} tok`;
239
+ process.stdout.write(` ${p.phase.padEnd(16)} ${cost.padEnd(9)} ${fmtSeconds(p.elapsedSeconds).padEnd(6)}${p.unpricedModels.length > 0 ? ` (unpriced: ${p.unpricedModels.join(', ')})` : ''}\n`);
240
+ }
241
+ const total = c.microUsd !== null ? microToUsd(c.microUsd) : '-';
242
+ process.stdout.write(` total: ${total} time: ${fmtSeconds(c.elapsedSeconds)} fidelity: ${fmtFidelityMix(c.fidelityMix)}\n`);
243
+ process.stdout.write(` rates: ${c.snapshot}\n`);
244
+ }
245
+ const err = lastCaptureError(root);
246
+ if (err) {
247
+ process.stderr.write(`note: last capture error ${err.error_code} at ${err.stage} (${err.timestamp}) — see .aidlc/cost/capture.log\n`);
248
+ }
249
+ }
250
+ async function runSync(instance) {
251
+ const root = projectRoot();
252
+ const { syncCosts } = await import('../cost/sync.js');
253
+ const report = await syncCosts(root, instance ?? null, loadClaimTimeoutMinutes(root));
254
+ process.stdout.write(`attributed: ${report.attributed}\nunattributed: ${report.unattributed}\n`);
255
+ for (const s of report.skipped)
256
+ process.stdout.write(`skipped: ${s}\n`);
257
+ }
258
+ async function runRatesUpdate() {
259
+ const root = projectRoot();
260
+ try {
261
+ const snapshot = await updateRates(root, loadCostConfig(root));
262
+ process.stdout.write(`rates updated: ${snapshot.snapshot_version} (${Object.keys(snapshot.rates).length} models)\n`);
263
+ }
264
+ catch (err) {
265
+ process.stderr.write(`rates update failed: ${err.message}\n`);
266
+ const effective = effectiveRates(root, loadCostConfig(root));
267
+ process.stderr.write(`still using: ${effective.snapshot}\n`);
268
+ process.exitCode = 1;
269
+ }
270
+ }
271
+ function runRatesShow(opts) {
272
+ const root = projectRoot();
273
+ if (opts.normalization) {
274
+ for (const rule of NORMALIZATION_RULES)
275
+ process.stdout.write(`- ${rule.describe}\n`);
276
+ return;
277
+ }
278
+ const effective = effectiveRates(root, loadCostConfig(root));
279
+ process.stdout.write(`snapshot: ${effective.snapshot}\n`);
280
+ for (const [model, { rate, origin }] of effective.entries) {
281
+ const desc = rate.per_unit !== undefined
282
+ ? `$${rate.per_unit}/unit`
283
+ : `in $${rate.input_per_mtok}/MTok out $${rate.output_per_mtok}/MTok`;
284
+ process.stdout.write(`${model.padEnd(28)} ${desc.padEnd(36)} [${origin}]\n`);
285
+ }
286
+ }
287
+ function runHooks(action, opts) {
288
+ const root = projectRoot();
289
+ const platforms = opts.platform ? [opts.platform] : ['claude-code', 'kiro'];
290
+ const nodePath = process.execPath;
291
+ const cliPath = cliEntryPath();
292
+ for (const platform of platforms) {
293
+ if (platform === 'claude-code') {
294
+ if (action === 'install')
295
+ installClaudeCodeHooks(root, nodePath, cliPath);
296
+ else if (action === 'remove')
297
+ removeClaudeCodeHooks(root);
298
+ else {
299
+ const s = claudeCodeHookStatus(root);
300
+ process.stdout.write(`claude-code: ${s.installed ? 'installed' : 'not installed'}${s.installed && !s.commandResolvable ? ' (command path broken — re-run install)' : ''}\n`);
301
+ continue;
302
+ }
303
+ process.stdout.write(`claude-code: hooks ${action === 'install' ? 'installed' : 'removed'}\n`);
304
+ }
305
+ else if (platform === 'kiro') {
306
+ if (action === 'install')
307
+ installKiroHooks(root, nodePath, cliPath);
308
+ else if (action === 'remove')
309
+ removeKiroHooks(root);
310
+ else {
311
+ const s = kiroHookStatus(root);
312
+ process.stdout.write(`kiro: ${s.installed ? 'installed' : 'not installed'}${s.installed && !s.commandResolvable ? ' (command path broken — re-run install)' : ''}\n`);
313
+ continue;
314
+ }
315
+ process.stdout.write(`kiro: hooks ${action === 'install' ? 'installed' : 'removed'}\n`);
316
+ }
317
+ else {
318
+ process.stderr.write(`unknown platform: ${platform}\n`);
319
+ process.exitCode = 1;
320
+ }
321
+ }
322
+ }
323
+ function runProvidersStatus() {
324
+ const root = projectRoot();
325
+ const env = { projectRoot: root };
326
+ for (const p of allProviders()) {
327
+ const detected = p.detect(env);
328
+ const hooks = p.name === 'claude-code' ? claudeCodeHookStatus(root) : kiroHookStatus(root);
329
+ const metered = detected && hooks.installed && hooks.commandResolvable;
330
+ process.stdout.write(`${p.name}: ${detected ? 'detected' : 'not detected'}, hooks ${hooks.installed ? 'installed' : 'absent'} → ${metered ? 'metered capture ACTIVE' : 'no metered capture (fallback applies)'}\n`);
331
+ }
332
+ }
333
+ // ---------------------------------------------------------------------------
334
+ // Registration
335
+ // ---------------------------------------------------------------------------
336
+ export function registerCost(program) {
337
+ const cost = program
338
+ .command('cost')
339
+ .description('Per-instance cost tracking: reports, capture, rates, hooks');
340
+ cost
341
+ .argument('[instance]', 'Instance to report on (default: all)')
342
+ .option('--json', 'Structured JSON output')
343
+ .option('--by-template', 'Roll up average cost per template')
344
+ .option('--unattributed', 'List usage not attributed to any instance')
345
+ .action((instance, opts) => {
346
+ runReport(instance, opts);
347
+ });
348
+ cost
349
+ .command('record')
350
+ .description('Record usage (hook mode via stdin, or --manual)')
351
+ .option('--provider <name>', 'Cost provider (claude-code, kiro)')
352
+ .option('--detach', 'Spawn a background recorder and exit immediately')
353
+ .option('--manual', 'Manual entry mode (agent-driven fallback)')
354
+ .option('--instance <name>', 'Target instance (manual mode)')
355
+ .option('--session <id>', 'Session id, or "-" for none (manual mode)')
356
+ .option('--fidelity <f>', 'estimated | unknown (manual mode)')
357
+ .option('--units <json>', 'Units JSON (manual mode, estimated only)')
358
+ .option('--from <iso>', 'Coverage start (manual mode)')
359
+ .option('--to <iso>', 'Coverage end (manual mode)')
360
+ .action(async (opts) => {
361
+ await runRecord(opts);
362
+ });
363
+ cost
364
+ .command('session-start')
365
+ .description('Stash a platform session id (hook mode via stdin)')
366
+ .option('--provider <name>', 'Platform name')
367
+ .action(async (opts) => {
368
+ await runSessionStart(opts);
369
+ });
370
+ cost
371
+ .command('sync')
372
+ .description('Reconcile historical platform records into ledgers')
373
+ .argument('[instance]', 'Limit to one instance')
374
+ .action(async (instance) => {
375
+ await runSync(instance);
376
+ });
377
+ const rates = cost.command('rates').description('Manage the usage→dollar rate table');
378
+ rates
379
+ .command('update')
380
+ .description('Fetch current rates from the configured source')
381
+ .action(async () => {
382
+ await runRatesUpdate();
383
+ });
384
+ rates
385
+ .command('show')
386
+ .description('Print the effective merged rate table')
387
+ .option('--normalization', 'Print the model-id normalization rules')
388
+ .action((opts) => {
389
+ runRatesShow(opts);
390
+ });
391
+ const hooks = cost.command('hooks').description('Manage cost-capture hooks per platform');
392
+ for (const action of ['install', 'remove', 'status']) {
393
+ hooks
394
+ .command(action)
395
+ .description(`${action[0].toUpperCase()}${action.slice(1)} cost-capture hooks`)
396
+ .option('--platform <name>', 'Limit to one platform (claude-code, kiro)')
397
+ .action((opts) => {
398
+ runHooks(action, opts);
399
+ });
400
+ }
401
+ const providers = cost.command('providers').description('Cost provider status');
402
+ providers
403
+ .command('status')
404
+ .description('Show detection and metered-capture state per provider')
405
+ .action(() => {
406
+ runProvidersStatus();
407
+ });
408
+ }
409
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"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"}