@aligndottech/cli 0.34.1 → 0.36.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 (136) hide show
  1. package/README.md +2 -0
  2. package/dist/commands/context.d.ts.map +1 -1
  3. package/dist/commands/context.js +5 -0
  4. package/dist/commands/context.js.map +1 -1
  5. package/dist/commands/decisions/index.d.ts.map +1 -1
  6. package/dist/commands/decisions/index.js +9 -1
  7. package/dist/commands/decisions/index.js.map +1 -1
  8. package/dist/commands/import/sessions.d.ts +28 -0
  9. package/dist/commands/import/sessions.d.ts.map +1 -0
  10. package/dist/commands/import/sessions.js +215 -0
  11. package/dist/commands/import/sessions.js.map +1 -0
  12. package/dist/commands/import.d.ts.map +1 -1
  13. package/dist/commands/import.js +2 -0
  14. package/dist/commands/import.js.map +1 -1
  15. package/dist/commands/push.d.ts +25 -0
  16. package/dist/commands/push.d.ts.map +1 -0
  17. package/dist/commands/push.js +98 -0
  18. package/dist/commands/push.js.map +1 -0
  19. package/dist/commands/ratify.d.ts +23 -0
  20. package/dist/commands/ratify.d.ts.map +1 -0
  21. package/dist/commands/ratify.js +51 -0
  22. package/dist/commands/ratify.js.map +1 -0
  23. package/dist/commands/why.d.ts.map +1 -1
  24. package/dist/commands/why.js +4 -1
  25. package/dist/commands/why.js.map +1 -1
  26. package/dist/index.js +5 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/lib/answer-render.d.ts +2 -0
  29. package/dist/lib/answer-render.d.ts.map +1 -0
  30. package/dist/lib/answer-render.js +24 -0
  31. package/dist/lib/answer-render.js.map +1 -0
  32. package/dist/lib/capture-sources.d.ts +4 -0
  33. package/dist/lib/capture-sources.d.ts.map +1 -1
  34. package/dist/lib/capture-sources.js +1 -0
  35. package/dist/lib/capture-sources.js.map +1 -1
  36. package/dist/lib/decider-kind.d.ts +37 -0
  37. package/dist/lib/decider-kind.d.ts.map +1 -0
  38. package/dist/lib/decider-kind.js +41 -0
  39. package/dist/lib/decider-kind.js.map +1 -0
  40. package/dist/lib/decision-render.d.ts +35 -0
  41. package/dist/lib/decision-render.d.ts.map +1 -0
  42. package/dist/lib/decision-render.js +149 -0
  43. package/dist/lib/decision-render.js.map +1 -0
  44. package/dist/lib/decisions-context.d.ts +7 -0
  45. package/dist/lib/decisions-context.d.ts.map +1 -1
  46. package/dist/lib/decisions-context.js +29 -6
  47. package/dist/lib/decisions-context.js.map +1 -1
  48. package/dist/lib/gateway-client.d.ts +32 -0
  49. package/dist/lib/gateway-client.d.ts.map +1 -1
  50. package/dist/lib/gateway-client.js +10 -0
  51. package/dist/lib/gateway-client.js.map +1 -1
  52. package/dist/lib/git.d.ts +18 -0
  53. package/dist/lib/git.d.ts.map +1 -1
  54. package/dist/lib/git.js +31 -0
  55. package/dist/lib/git.js.map +1 -1
  56. package/dist/lib/import-defaults.d.ts +1 -0
  57. package/dist/lib/import-defaults.d.ts.map +1 -1
  58. package/dist/lib/import-defaults.js +1 -0
  59. package/dist/lib/import-defaults.js.map +1 -1
  60. package/dist/lib/local-db.d.ts +56 -1
  61. package/dist/lib/local-db.d.ts.map +1 -1
  62. package/dist/lib/local-db.js +104 -7
  63. package/dist/lib/local-db.js.map +1 -1
  64. package/dist/lib/local-gateway-client.d.ts +50 -0
  65. package/dist/lib/local-gateway-client.d.ts.map +1 -1
  66. package/dist/lib/local-gateway-client.js +94 -5
  67. package/dist/lib/local-gateway-client.js.map +1 -1
  68. package/dist/lib/local-llm.d.ts +66 -1
  69. package/dist/lib/local-llm.d.ts.map +1 -1
  70. package/dist/lib/local-llm.js +167 -12
  71. package/dist/lib/local-llm.js.map +1 -1
  72. package/dist/lib/local-relationship-classifier.d.ts +18 -0
  73. package/dist/lib/local-relationship-classifier.d.ts.map +1 -1
  74. package/dist/lib/local-relationship-classifier.js +32 -6
  75. package/dist/lib/local-relationship-classifier.js.map +1 -1
  76. package/dist/lib/personal-import.d.ts +26 -0
  77. package/dist/lib/personal-import.d.ts.map +1 -1
  78. package/dist/lib/personal-import.js +43 -0
  79. package/dist/lib/personal-import.js.map +1 -1
  80. package/dist/lib/sessions/adapters/claude-code.d.ts +4 -0
  81. package/dist/lib/sessions/adapters/claude-code.d.ts.map +1 -0
  82. package/dist/lib/sessions/adapters/claude-code.js +93 -0
  83. package/dist/lib/sessions/adapters/claude-code.js.map +1 -0
  84. package/dist/lib/sessions/adapters/codex.d.ts +6 -0
  85. package/dist/lib/sessions/adapters/codex.d.ts.map +1 -0
  86. package/dist/lib/sessions/adapters/codex.js +91 -0
  87. package/dist/lib/sessions/adapters/codex.js.map +1 -0
  88. package/dist/lib/sessions/adapters/cursor.d.ts +17 -0
  89. package/dist/lib/sessions/adapters/cursor.d.ts.map +1 -0
  90. package/dist/lib/sessions/adapters/cursor.js +31 -0
  91. package/dist/lib/sessions/adapters/cursor.js.map +1 -0
  92. package/dist/lib/sessions/adapters/gemini-cli.d.ts +15 -0
  93. package/dist/lib/sessions/adapters/gemini-cli.d.ts.map +1 -0
  94. package/dist/lib/sessions/adapters/gemini-cli.js +29 -0
  95. package/dist/lib/sessions/adapters/gemini-cli.js.map +1 -0
  96. package/dist/lib/sessions/adapters/opencode.d.ts +4 -0
  97. package/dist/lib/sessions/adapters/opencode.d.ts.map +1 -0
  98. package/dist/lib/sessions/adapters/opencode.js +100 -0
  99. package/dist/lib/sessions/adapters/opencode.js.map +1 -0
  100. package/dist/lib/sessions/adapters/pi.d.ts +4 -0
  101. package/dist/lib/sessions/adapters/pi.d.ts.map +1 -0
  102. package/dist/lib/sessions/adapters/pi.js +102 -0
  103. package/dist/lib/sessions/adapters/pi.js.map +1 -0
  104. package/dist/lib/sessions/confirm-freetext.d.ts +43 -0
  105. package/dist/lib/sessions/confirm-freetext.d.ts.map +1 -0
  106. package/dist/lib/sessions/confirm-freetext.js +82 -0
  107. package/dist/lib/sessions/confirm-freetext.js.map +1 -0
  108. package/dist/lib/sessions/extract-freetext.d.ts +26 -0
  109. package/dist/lib/sessions/extract-freetext.d.ts.map +1 -0
  110. package/dist/lib/sessions/extract-freetext.js +53 -0
  111. package/dist/lib/sessions/extract-freetext.js.map +1 -0
  112. package/dist/lib/sessions/extract-structured.d.ts +21 -0
  113. package/dist/lib/sessions/extract-structured.d.ts.map +1 -0
  114. package/dist/lib/sessions/extract-structured.js +72 -0
  115. package/dist/lib/sessions/extract-structured.js.map +1 -0
  116. package/dist/lib/sessions/fs-scan.d.ts +10 -0
  117. package/dist/lib/sessions/fs-scan.d.ts.map +1 -0
  118. package/dist/lib/sessions/fs-scan.js +33 -0
  119. package/dist/lib/sessions/fs-scan.js.map +1 -0
  120. package/dist/lib/sessions/registry.d.ts +11 -0
  121. package/dist/lib/sessions/registry.d.ts.map +1 -0
  122. package/dist/lib/sessions/registry.js +22 -0
  123. package/dist/lib/sessions/registry.js.map +1 -0
  124. package/dist/lib/sessions/source-url.d.ts +10 -0
  125. package/dist/lib/sessions/source-url.d.ts.map +1 -0
  126. package/dist/lib/sessions/source-url.js +20 -0
  127. package/dist/lib/sessions/source-url.js.map +1 -0
  128. package/dist/lib/sessions/types.d.ts +62 -0
  129. package/dist/lib/sessions/types.d.ts.map +1 -0
  130. package/dist/lib/sessions/types.js +19 -0
  131. package/dist/lib/sessions/types.js.map +1 -0
  132. package/dist/lib/token-estimate.d.ts +17 -0
  133. package/dist/lib/token-estimate.d.ts.map +1 -0
  134. package/dist/lib/token-estimate.js +24 -0
  135. package/dist/lib/token-estimate.js.map +1 -0
  136. package/package.json +10 -1
@@ -0,0 +1,62 @@
1
+ /**
2
+ * ALI-808: the canonical shape every per-agent adapter parses into, so extraction (Pass A,
3
+ * and eventually ALI-809's Pass B) never learns which agent it is reading - the same
4
+ * `normalizeHookPayload` pattern used for the destructive-command guard (ALI-357/#1953) and
5
+ * the pre-edit conflict check (align-cli#86), both cited in the ALI-608 addendum.
6
+ */
7
+ /** The six agents named in the ALI-808 shared contract. Not every adapter parses content yet
8
+ * (see `fixtureVerified` on SessionAdapter) - the name is reserved even where the reader
9
+ * is not, because it is also the scheme host in a session's source_url. */
10
+ export type AgentName = 'claude-code' | 'codex' | 'cursor' | 'gemini-cli' | 'opencode' | 'pi';
11
+ export interface SessionToolCall {
12
+ id: string;
13
+ name: string;
14
+ arguments: unknown;
15
+ }
16
+ export interface SessionTurn {
17
+ role: 'user' | 'assistant';
18
+ /** The turn's own text, own words - never a tool result or a system reminder. Empty
19
+ * string, not absent, when a turn is tool-calls-only (keeps every consumer's access
20
+ * uniform rather than optional-chaining everywhere). */
21
+ text: string;
22
+ toolCalls: SessionToolCall[];
23
+ /** Keyed by SessionToolCall.id, when the transcript records a result for it. A missing
24
+ * key means "no result recorded", not "empty result" - the two are different facts
25
+ * (a cancelled tool call vs. one that returned nothing). */
26
+ toolResults: Record<string, string>;
27
+ /** ISO-8601, or null when the source did not carry one for this turn. */
28
+ timestamp: string | null;
29
+ }
30
+ export interface CanonicalSession {
31
+ agent: AgentName;
32
+ sessionId: string;
33
+ /** The working directory the agent was running in, when the source records one. */
34
+ cwd: string | null;
35
+ turns: SessionTurn[];
36
+ }
37
+ export interface SessionAdapter {
38
+ agent: AgentName;
39
+ /** True only when a real captured session backs this adapter's fixture (the ALI-808
40
+ * shared-contract gate: "the gate is the fixture, not the agent name"). False means
41
+ * `parseSession` is intentionally unimplemented - see fixtures/sessions/README.md for
42
+ * which agents and why. */
43
+ fixtureVerified: boolean;
44
+ /** Session files for the given project directory, newest first. Never throws on a
45
+ * missing/unreadable agent data directory - that is "this agent has no local data
46
+ * here", not an error, and every caller (detectAgents, the import command) treats an
47
+ * empty array as the normal "not installed / never used here" case. */
48
+ locateSessionFiles(cwd: string): string[];
49
+ /** Parses one session file. Returns null for a file that does not belong to this agent's
50
+ * format (defensive - locateSessionFiles should not hand it one, but a caller passing an
51
+ * arbitrary path must get an honest null rather than a throw). Throws
52
+ * SessionFormatUnverifiedError for an adapter with fixtureVerified === false. */
53
+ parseSession(filePath: string): CanonicalSession | null;
54
+ }
55
+ /** Thrown by an unverified adapter's parseSession, instead of guessing at a format nobody
56
+ * has confirmed against a real session (verification.md: a plausible construction is not
57
+ * data). Naming the fixtures README in the message is deliberate - it is the one place
58
+ * that explains why and what unblocks it. */
59
+ export declare class SessionFormatUnverifiedError extends Error {
60
+ constructor(agent: AgentName);
61
+ }
62
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/sessions/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;4EAE4E;AAC5E,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,IAAI,CAAC;AAE9F,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B;;6DAEyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B;;iEAE6D;IAC7D,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,yEAAyE;IACzE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,CAAC;IACjB;;;gCAG4B;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB;;;4EAGwE;IACxE,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1C;;;sFAGkF;IAClF,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;CACzD;AAED;;;8CAG8C;AAC9C,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,KAAK,EAAE,SAAS;CAQ7B"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ALI-808: the canonical shape every per-agent adapter parses into, so extraction (Pass A,
3
+ * and eventually ALI-809's Pass B) never learns which agent it is reading - the same
4
+ * `normalizeHookPayload` pattern used for the destructive-command guard (ALI-357/#1953) and
5
+ * the pre-edit conflict check (align-cli#86), both cited in the ALI-608 addendum.
6
+ */
7
+ /** Thrown by an unverified adapter's parseSession, instead of guessing at a format nobody
8
+ * has confirmed against a real session (verification.md: a plausible construction is not
9
+ * data). Naming the fixtures README in the message is deliberate - it is the one place
10
+ * that explains why and what unblocks it. */
11
+ export class SessionFormatUnverifiedError extends Error {
12
+ constructor(agent) {
13
+ super(`${agent}'s session format is not fixture-verified yet (no real captured session was ` +
14
+ `available - see src/__tests__/fixtures/sessions/README.md). Capture a real session and ` +
15
+ `add it as a fixture before parsing this agent's data.`);
16
+ this.name = 'SessionFormatUnverifiedError';
17
+ }
18
+ }
19
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/sessions/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuDH;;;8CAG8C;AAC9C,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,YAAY,KAAgB;QAC1B,KAAK,CACH,GAAG,KAAK,8EAA8E;YACtF,yFAAyF;YACzF,uDAAuD,CACxD,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Chars per token, measured (2026-09-03 research doc) with Anthropic's count_tokens against a
3
+ * rendered decision corpus: 2.56 on 4.7+ models, 3.43 on older ones. The SMALLER ratio is the
4
+ * conservative one - it estimates MORE tokens per char - so Phase 0 uses it for every family.
5
+ * Never chars/4: that under-counts our corpus by ~36% and the under-count is silent.
6
+ * The per-family table is ALI-852.
7
+ */
8
+ export declare const CHARS_PER_TOKEN = 2.56;
9
+ export declare const ESTIMATE_MARGIN = 1.1;
10
+ /** Conservative token estimate for a string: rounds UP, and adds a 10% margin on top. */
11
+ export declare function estimateTokens(text: string): number;
12
+ /**
13
+ * The char budget that fits `tokens`, inverse of estimateTokens. Rounds DOWN, so a caller
14
+ * that slices text to `charsForTokens(n)` characters never re-estimates above `n`.
15
+ */
16
+ export declare function charsForTokens(tokens: number): number;
17
+ //# sourceMappingURL=token-estimate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimate.d.ts","sourceRoot":"","sources":["../../src/lib/token-estimate.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AACpC,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,24 @@
1
+ // ALI-845 Phase 0: no token-estimation helper existed anywhere in the CLI, so every
2
+ // prompt was assembled by concatenating decision text with no cap. This is the
3
+ // conservative estimator for that phase - a real per-family table is ALI-852's job.
4
+ /**
5
+ * Chars per token, measured (2026-09-03 research doc) with Anthropic's count_tokens against a
6
+ * rendered decision corpus: 2.56 on 4.7+ models, 3.43 on older ones. The SMALLER ratio is the
7
+ * conservative one - it estimates MORE tokens per char - so Phase 0 uses it for every family.
8
+ * Never chars/4: that under-counts our corpus by ~36% and the under-count is silent.
9
+ * The per-family table is ALI-852.
10
+ */
11
+ export const CHARS_PER_TOKEN = 2.56;
12
+ export const ESTIMATE_MARGIN = 1.1;
13
+ /** Conservative token estimate for a string: rounds UP, and adds a 10% margin on top. */
14
+ export function estimateTokens(text) {
15
+ return Math.ceil((text.length / CHARS_PER_TOKEN) * ESTIMATE_MARGIN);
16
+ }
17
+ /**
18
+ * The char budget that fits `tokens`, inverse of estimateTokens. Rounds DOWN, so a caller
19
+ * that slices text to `charsForTokens(n)` characters never re-estimates above `n`.
20
+ */
21
+ export function charsForTokens(tokens) {
22
+ return Math.floor((tokens * CHARS_PER_TOKEN) / ESTIMATE_MARGIN);
23
+ }
24
+ //# sourceMappingURL=token-estimate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimate.js","sourceRoot":"","sources":["../../src/lib/token-estimate.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,+EAA+E;AAC/E,oFAAoF;AAEpF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAC;AAEnC,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,GAAG,eAAe,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,GAAG,eAAe,CAAC,CAAC;AAClE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aligndottech/cli",
3
- "version": "0.34.1",
3
+ "version": "0.36.0",
4
4
  "mcpName": "io.github.aligndottech/cli",
5
5
  "type": "module",
6
6
  "description": "Align CLI - capture decisions, check alignment, and manage connectors",
@@ -65,6 +65,15 @@
65
65
  "optionalDependencies": {
66
66
  "@huggingface/transformers": "^4.2.0"
67
67
  },
68
+ "overrides": {
69
+ "hono": "4.13.7",
70
+ "@hono/node-server": "1.19.17",
71
+ "undici": "6.28.1",
72
+ "fast-uri": "3.1.7",
73
+ "ip-address": "10.7.0",
74
+ "qs": "6.16.0",
75
+ "body-parser": "2.3.0"
76
+ },
68
77
  "engines": {
69
78
  "node": ">=22.16"
70
79
  },