@aligndottech/cli 0.1.2 → 0.1.4

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 (133) hide show
  1. package/README.md +151 -54
  2. package/dist/commands/check.d.ts.map +1 -1
  3. package/dist/commands/check.js +125 -0
  4. package/dist/commands/check.js.map +1 -1
  5. package/dist/commands/export.d.ts +3 -0
  6. package/dist/commands/export.d.ts.map +1 -0
  7. package/dist/commands/export.js +76 -0
  8. package/dist/commands/export.js.map +1 -0
  9. package/dist/commands/import/confluence.d.ts.map +1 -1
  10. package/dist/commands/import/confluence.js +25 -6
  11. package/dist/commands/import/confluence.js.map +1 -1
  12. package/dist/commands/import/git.js +1 -1
  13. package/dist/commands/import/jira.d.ts.map +1 -1
  14. package/dist/commands/import/jira.js +26 -6
  15. package/dist/commands/import/jira.js.map +1 -1
  16. package/dist/commands/links.js +1 -1
  17. package/dist/commands/links.js.map +1 -1
  18. package/dist/commands/local.d.ts +3 -0
  19. package/dist/commands/local.d.ts.map +1 -0
  20. package/dist/commands/local.js +71 -0
  21. package/dist/commands/local.js.map +1 -0
  22. package/dist/commands/login.d.ts.map +1 -1
  23. package/dist/commands/login.js +5 -32
  24. package/dist/commands/login.js.map +1 -1
  25. package/dist/commands/mcp.d.ts +2 -0
  26. package/dist/commands/mcp.d.ts.map +1 -1
  27. package/dist/commands/mcp.js +34 -12
  28. package/dist/commands/mcp.js.map +1 -1
  29. package/dist/commands/setup.d.ts.map +1 -1
  30. package/dist/commands/setup.js +609 -163
  31. package/dist/commands/setup.js.map +1 -1
  32. package/dist/commands/why.d.ts.map +1 -1
  33. package/dist/commands/why.js +46 -4
  34. package/dist/commands/why.js.map +1 -1
  35. package/dist/index.js +10 -4
  36. package/dist/index.js.map +1 -1
  37. package/dist/lib/advisory-dedup.d.ts +3 -0
  38. package/dist/lib/advisory-dedup.d.ts.map +1 -0
  39. package/dist/lib/advisory-dedup.js +44 -0
  40. package/dist/lib/advisory-dedup.js.map +1 -0
  41. package/dist/lib/agent-rules.d.ts +10 -0
  42. package/dist/lib/agent-rules.d.ts.map +1 -0
  43. package/dist/lib/agent-rules.js +137 -0
  44. package/dist/lib/agent-rules.js.map +1 -0
  45. package/dist/lib/cli-oauth.d.ts +11 -0
  46. package/dist/lib/cli-oauth.d.ts.map +1 -0
  47. package/dist/lib/cli-oauth.js +71 -0
  48. package/dist/lib/cli-oauth.js.map +1 -0
  49. package/dist/lib/config.d.ts +10 -1
  50. package/dist/lib/config.d.ts.map +1 -1
  51. package/dist/lib/config.js +36 -1
  52. package/dist/lib/config.js.map +1 -1
  53. package/dist/lib/errors.d.ts +5 -0
  54. package/dist/lib/errors.d.ts.map +1 -0
  55. package/dist/lib/errors.js +9 -0
  56. package/dist/lib/errors.js.map +1 -0
  57. package/dist/lib/fetchers/confluence.d.ts +4 -2
  58. package/dist/lib/fetchers/confluence.d.ts.map +1 -1
  59. package/dist/lib/fetchers/confluence.js +68 -12
  60. package/dist/lib/fetchers/confluence.js.map +1 -1
  61. package/dist/lib/fetchers/git.d.ts.map +1 -1
  62. package/dist/lib/fetchers/git.js +2 -0
  63. package/dist/lib/fetchers/git.js.map +1 -1
  64. package/dist/lib/fetchers/github.d.ts.map +1 -1
  65. package/dist/lib/fetchers/github.js +2 -0
  66. package/dist/lib/fetchers/github.js.map +1 -1
  67. package/dist/lib/fetchers/jira.d.ts +4 -2
  68. package/dist/lib/fetchers/jira.d.ts.map +1 -1
  69. package/dist/lib/fetchers/jira.js +30 -15
  70. package/dist/lib/fetchers/jira.js.map +1 -1
  71. package/dist/lib/fetchers/linear.d.ts.map +1 -1
  72. package/dist/lib/fetchers/linear.js +6 -1
  73. package/dist/lib/fetchers/linear.js.map +1 -1
  74. package/dist/lib/fetchers/notion.d.ts.map +1 -1
  75. package/dist/lib/fetchers/notion.js +29 -0
  76. package/dist/lib/fetchers/notion.js.map +1 -1
  77. package/dist/lib/fetchers/slack.d.ts.map +1 -1
  78. package/dist/lib/fetchers/slack.js +26 -0
  79. package/dist/lib/fetchers/slack.js.map +1 -1
  80. package/dist/lib/fetchers/teams.d.ts.map +1 -1
  81. package/dist/lib/fetchers/teams.js +3 -0
  82. package/dist/lib/fetchers/teams.js.map +1 -1
  83. package/dist/lib/fetchers/zoom.d.ts.map +1 -1
  84. package/dist/lib/fetchers/zoom.js +5 -0
  85. package/dist/lib/fetchers/zoom.js.map +1 -1
  86. package/dist/lib/format-date.d.ts +7 -0
  87. package/dist/lib/format-date.d.ts.map +1 -0
  88. package/dist/lib/format-date.js +26 -0
  89. package/dist/lib/format-date.js.map +1 -0
  90. package/dist/lib/gateway-client.d.ts +27 -2
  91. package/dist/lib/gateway-client.d.ts.map +1 -1
  92. package/dist/lib/gateway-client.js +39 -3
  93. package/dist/lib/gateway-client.js.map +1 -1
  94. package/dist/lib/git.d.ts.map +1 -1
  95. package/dist/lib/git.js +33 -16
  96. package/dist/lib/git.js.map +1 -1
  97. package/dist/lib/hook-payload.d.ts +20 -0
  98. package/dist/lib/hook-payload.d.ts.map +1 -0
  99. package/dist/lib/hook-payload.js +30 -0
  100. package/dist/lib/hook-payload.js.map +1 -0
  101. package/dist/lib/local-db.d.ts +51 -0
  102. package/dist/lib/local-db.d.ts.map +1 -0
  103. package/dist/lib/local-db.js +89 -0
  104. package/dist/lib/local-db.js.map +1 -0
  105. package/dist/lib/local-embeddings.d.ts +3 -0
  106. package/dist/lib/local-embeddings.d.ts.map +1 -0
  107. package/dist/lib/local-embeddings.js +20 -0
  108. package/dist/lib/local-embeddings.js.map +1 -0
  109. package/dist/lib/local-gateway-client.d.ts +98 -0
  110. package/dist/lib/local-gateway-client.d.ts.map +1 -0
  111. package/dist/lib/local-gateway-client.js +151 -0
  112. package/dist/lib/local-gateway-client.js.map +1 -0
  113. package/dist/lib/local-mode.d.ts +7 -0
  114. package/dist/lib/local-mode.d.ts.map +1 -0
  115. package/dist/lib/local-mode.js +39 -0
  116. package/dist/lib/local-mode.js.map +1 -0
  117. package/dist/lib/local-relationship-classifier.d.ts +14 -0
  118. package/dist/lib/local-relationship-classifier.d.ts.map +1 -0
  119. package/dist/lib/local-relationship-classifier.js +100 -0
  120. package/dist/lib/local-relationship-classifier.js.map +1 -0
  121. package/dist/lib/login-flow.d.ts +5 -0
  122. package/dist/lib/login-flow.d.ts.map +1 -0
  123. package/dist/lib/login-flow.js +64 -0
  124. package/dist/lib/login-flow.js.map +1 -0
  125. package/dist/lib/personal-import.d.ts +4 -0
  126. package/dist/lib/personal-import.d.ts.map +1 -1
  127. package/dist/lib/personal-import.js +133 -27
  128. package/dist/lib/personal-import.js.map +1 -1
  129. package/package.json +31 -12
  130. package/dist/lib/why-normalise.d.ts +0 -2
  131. package/dist/lib/why-normalise.d.ts.map +0 -1
  132. package/dist/lib/why-normalise.js +0 -39
  133. package/dist/lib/why-normalise.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-db.js","sourceRoot":"","sources":["../../src/lib/local-db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function getEmbedding(text: string): Promise<Float32Array>;
2
+ export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
3
+ //# sourceMappingURL=local-embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-embeddings.d.ts","sourceRoot":"","sources":["../../src/lib/local-embeddings.ts"],"names":[],"mappings":"AAGA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAOtE;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CASzE"}
@@ -0,0 +1,20 @@
1
+ let _pipe = null;
2
+ export async function getEmbedding(text) {
3
+ if (!_pipe) {
4
+ const { pipeline } = await import('@xenova/transformers');
5
+ _pipe = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2'));
6
+ }
7
+ const output = await _pipe(text, { pooling: 'mean', normalize: true });
8
+ return output[0].data;
9
+ }
10
+ export function cosineSimilarity(a, b) {
11
+ let dot = 0, normA = 0, normB = 0;
12
+ for (let i = 0; i < a.length; i++) {
13
+ dot += a[i] * b[i];
14
+ normA += a[i] * a[i];
15
+ normB += b[i] * b[i];
16
+ }
17
+ const denom = Math.sqrt(normA) * Math.sqrt(normB);
18
+ return denom === 0 ? 0 : dot / denom;
19
+ }
20
+ //# sourceMappingURL=local-embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-embeddings.js","sourceRoot":"","sources":["../../src/lib/local-embeddings.ts"],"names":[],"mappings":"AACA,IAAI,KAAK,GAA6B,IAAI,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC1D,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAiC,CAAC;IAC5G,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC"}
@@ -0,0 +1,98 @@
1
+ export declare const CONFLICT_THRESHOLD = 0.65;
2
+ export declare const RELATES_THRESHOLD = 0.45;
3
+ export declare const DRIFT_THRESHOLD = 0.5;
4
+ export declare function createLocalGatewayClient(dbPath: string): {
5
+ whoami(): Promise<{
6
+ email: string;
7
+ tenantId: string;
8
+ mode: string;
9
+ }>;
10
+ captureDecision(input: string, platform?: string): Promise<{
11
+ id: string;
12
+ title: string;
13
+ summary: string;
14
+ sourceUrl: string | null;
15
+ platform: string;
16
+ conflicts: string[];
17
+ }>;
18
+ ingestBatch(items: Array<{
19
+ source_url?: string;
20
+ platform?: string;
21
+ raw_text: string;
22
+ title?: string;
23
+ }>): Promise<{
24
+ snapshots: {
25
+ id: string;
26
+ title: string;
27
+ summary: string;
28
+ analysis: {
29
+ relatedDecisions: {
30
+ id: string;
31
+ title: string;
32
+ relationship: string;
33
+ confidence: number;
34
+ }[];
35
+ };
36
+ }[];
37
+ }>;
38
+ searchDecisions(query: string, limit?: number): Promise<{
39
+ decisions: {
40
+ score: number;
41
+ id: string;
42
+ title: string;
43
+ summary: string;
44
+ sourceUrl: string | null;
45
+ platform: string;
46
+ createdAt: string;
47
+ }[];
48
+ }>;
49
+ checkAlignment(diff: string, _context?: string): Promise<{
50
+ status: "no_context";
51
+ conflicting_decisions: never[];
52
+ relevant_decisions: never[];
53
+ message: string;
54
+ } | {
55
+ status: "conflict" | "related";
56
+ conflicting_decisions: {
57
+ reason?: string | undefined;
58
+ id: string;
59
+ title: string;
60
+ platform: string;
61
+ source_url: string | null;
62
+ relationship: "supersedes" | "conflicts_with" | "contradicts" | "duplicates" | "refines" | "implements" | "depends_on" | "relates_to";
63
+ confidence: number;
64
+ typed: boolean;
65
+ }[];
66
+ relevant_decisions: {
67
+ reason?: string | undefined;
68
+ id: string;
69
+ title: string;
70
+ platform: string;
71
+ source_url: string | null;
72
+ relationship: "supersedes" | "conflicts_with" | "contradicts" | "duplicates" | "refines" | "implements" | "depends_on" | "relates_to";
73
+ confidence: number;
74
+ typed: boolean;
75
+ }[];
76
+ message: string;
77
+ }>;
78
+ checkDrift(decisionId: string, content: string, _sourceType?: string): Promise<{
79
+ decisionId: string;
80
+ score: null;
81
+ drifted: null;
82
+ note: string;
83
+ } | {
84
+ decisionId: string;
85
+ score: number;
86
+ drifted: boolean;
87
+ note?: undefined;
88
+ }>;
89
+ getImpact(decisionId: string): Promise<{
90
+ upstream: import("./local-db.js").LinkRow[];
91
+ downstream: import("./local-db.js").LinkRow[];
92
+ }>;
93
+ getConflicts(): Promise<{
94
+ links: import("./local-db.js").LinkRow[];
95
+ }>;
96
+ };
97
+ export type LocalGatewayClient = ReturnType<typeof createLocalGatewayClient>;
98
+ //# sourceMappingURL=local-gateway-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-gateway-client.d.ts","sourceRoot":"","sources":["../../src/lib/local-gateway-client.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAGvC,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAGtC,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM;;;;;;2BAyDtB,MAAM;;;;;;;;uBAKV,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;;;;;;;;;;;;;;;2BAwB/E,MAAM;;;;;;;;;;;yBAYR,MAAM,aAAa,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BA4CvB,MAAM,WAAW,MAAM,gBAAgB,MAAM;;;;;;;;;;;0BAQ9C,MAAM;;;;;;;EAYrC;AAED,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { createLocalDb } from './local-db.js';
2
+ import { cosineSimilarity, getEmbedding } from './local-embeddings.js';
3
+ import { classifyRelationship } from './local-relationship-classifier.js';
4
+ export const CONFLICT_THRESHOLD = 0.65;
5
+ // Embeddings flag a decision as a related CANDIDATE at/above this score; the
6
+ // relationship type is then assigned lazily by the LLM classifier.
7
+ export const RELATES_THRESHOLD = 0.45;
8
+ // Below this similarity between a decision and new content, the content is
9
+ // considered to have drifted from the decision.
10
+ export const DRIFT_THRESHOLD = 0.5;
11
+ export function createLocalGatewayClient(dbPath) {
12
+ const db = createLocalDb(dbPath);
13
+ async function findSimilar(embedding, topK, threshold = 0.0, excludeId) {
14
+ const all = db.getAllEmbeddings();
15
+ return all
16
+ .filter(e => e.decisionId !== excludeId)
17
+ .map(e => ({ decisionId: e.decisionId, score: cosineSimilarity(embedding, e.embedding) }))
18
+ .filter(e => e.score >= threshold)
19
+ .sort((a, b) => b.score - a.score)
20
+ .slice(0, topK);
21
+ }
22
+ // Shared ingest path: insert, embed (title + summary), detect conflicts.
23
+ // Used by both captureDecision (single, may parse a URL) and ingestBatch.
24
+ async function ingestOne(input, platform, opts = {}) {
25
+ let title = input.slice(0, 80);
26
+ let summary = input;
27
+ let sourceUrl = opts.sourceUrlOverride ?? null;
28
+ if (opts.sourceUrlOverride === undefined) {
29
+ try {
30
+ const url = new URL(input);
31
+ sourceUrl = url.href;
32
+ title = url.pathname.split('/').filter(Boolean).pop() ?? url.hostname;
33
+ summary = `Captured from ${url.hostname}`;
34
+ }
35
+ catch { /* plain text - use as-is */ }
36
+ }
37
+ if (opts.titleOverride)
38
+ title = opts.titleOverride.slice(0, 80);
39
+ const id = db.insertDecision({ title, summary, sourceUrl, platform });
40
+ // Embed title + summary so URL captures (whose summary is just "Captured
41
+ // from <host>") still carry the path-derived title's semantic content.
42
+ const embedText = title === summary ? summary : `${title}. ${summary}`;
43
+ const embedding = await getEmbedding(embedText);
44
+ db.setEmbedding(id, embedding);
45
+ const candidates = await findSimilar(embedding, 10, CONFLICT_THRESHOLD, id);
46
+ for (const c of candidates) {
47
+ db.insertLink({ sourceId: id, targetId: c.decisionId, relation: 'conflicts_with', confidence: c.score });
48
+ }
49
+ return { id, title, summary, sourceUrl, platform, conflicts: candidates };
50
+ }
51
+ return {
52
+ async whoami() {
53
+ return { email: 'local', tenantId: 'local', mode: 'local-embedded' };
54
+ },
55
+ async captureDecision(input, platform = 'cli') {
56
+ const r = await ingestOne(input, platform);
57
+ return { id: r.id, title: r.title, summary: r.summary, sourceUrl: r.sourceUrl, platform: r.platform, conflicts: r.conflicts.map(c => c.decisionId) };
58
+ },
59
+ async ingestBatch(items) {
60
+ const snapshots = [];
61
+ for (const item of items) {
62
+ const r = await ingestOne(item.raw_text, item.platform ?? 'cli', {
63
+ titleOverride: item.title,
64
+ sourceUrlOverride: item.source_url ?? null,
65
+ });
66
+ snapshots.push({
67
+ id: r.id,
68
+ title: r.title,
69
+ summary: r.summary,
70
+ analysis: {
71
+ relatedDecisions: r.conflicts.map(c => ({
72
+ id: c.decisionId,
73
+ title: db.getDecisionById(c.decisionId)?.title ?? '',
74
+ relationship: 'conflicts_with',
75
+ confidence: c.score,
76
+ })),
77
+ },
78
+ });
79
+ }
80
+ return { snapshots };
81
+ },
82
+ async searchDecisions(query, limit = 10) {
83
+ const embedding = await getEmbedding(query);
84
+ const similar = await findSimilar(embedding, limit, 0.1);
85
+ const decisions = similar
86
+ .map(s => {
87
+ const row = db.getDecisionById(s.decisionId);
88
+ return row ? { ...row, score: s.score } : null;
89
+ })
90
+ .filter((d) => d !== null);
91
+ return { decisions };
92
+ },
93
+ async checkAlignment(diff, _context) {
94
+ // Stage 1: embeddings find candidate related decisions (free, local).
95
+ const embedding = await getEmbedding(diff);
96
+ const similar = await findSimilar(embedding, 5, RELATES_THRESHOLD);
97
+ const candidates = similar
98
+ .map(s => {
99
+ const row = db.getDecisionById(s.decisionId);
100
+ return row ? { ...row, score: s.score } : null;
101
+ })
102
+ .filter((d) => d !== null);
103
+ if (!candidates.length) {
104
+ return { status: 'no_context', conflicting_decisions: [], relevant_decisions: [], message: 'No related decisions found in your local graph.' };
105
+ }
106
+ // Stage 2: type each candidate against the proposed change (LLM, user's key,
107
+ // lazy - only the few candidates we surface here). Degrades to untyped.
108
+ const subject = { title: 'Proposed change', summary: diff.slice(0, 2000) };
109
+ const relevant_decisions = [];
110
+ for (const c of candidates) {
111
+ const rel = await classifyRelationship(subject, { title: c.title, summary: c.summary });
112
+ relevant_decisions.push({
113
+ id: c.id,
114
+ title: c.title,
115
+ platform: c.platform,
116
+ source_url: c.sourceUrl,
117
+ relationship: rel?.type ?? 'relates_to',
118
+ confidence: rel?.confidence ?? c.score,
119
+ typed: rel !== null,
120
+ ...(rel?.reason ? { reason: rel.reason } : {}),
121
+ });
122
+ }
123
+ const conflicting_decisions = relevant_decisions.filter(d => d.relationship === 'conflicts_with' || d.relationship === 'contradicts');
124
+ const status = conflicting_decisions.length ? 'conflict' : 'related';
125
+ const anyTyped = relevant_decisions.some(d => d.typed);
126
+ const message = status === 'conflict'
127
+ ? `This change conflicts with ${conflicting_decisions.length} existing decision(s) across your tools - review before proceeding.`
128
+ : `Found ${relevant_decisions.length} related decision(s) to review${anyTyped ? '' : ' (set ANTHROPIC_API_KEY or OPENAI_API_KEY to type these relationships)'}.`;
129
+ return { status, conflicting_decisions, relevant_decisions, message };
130
+ },
131
+ async checkDrift(decisionId, content, _sourceType) {
132
+ const decisionEmbedding = db.getEmbedding(decisionId);
133
+ if (!decisionEmbedding)
134
+ return { decisionId, score: null, drifted: null, note: 'Decision not found or not yet embedded.' };
135
+ const contentEmbedding = await getEmbedding(content);
136
+ const score = cosineSimilarity(decisionEmbedding, contentEmbedding);
137
+ return { decisionId, score, drifted: score < DRIFT_THRESHOLD };
138
+ },
139
+ async getImpact(decisionId) {
140
+ const allLinks = db.listLinks({ decisionId });
141
+ const upstream = allLinks.filter(l => l.targetId === decisionId);
142
+ const downstream = allLinks.filter(l => l.sourceId === decisionId);
143
+ return { upstream, downstream };
144
+ },
145
+ async getConflicts() {
146
+ const links = db.listLinks({ relation: 'conflicts_with' });
147
+ return { links };
148
+ },
149
+ };
150
+ }
151
+ //# sourceMappingURL=local-gateway-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-gateway-client.js","sourceRoot":"","sources":["../../src/lib/local-gateway-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function getLocalDbPath(): string;
2
+ export declare function initLocalMode(opts?: {
3
+ quiet?: boolean;
4
+ }): Promise<{
5
+ dbPath: string;
6
+ }>;
7
+ //# sourceMappingURL=local-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mode.d.ts","sourceRoot":"","sources":["../../src/lib/local-mode.ts"],"names":[],"mappings":"AAMA,wBAAgB,cAAc,IAAI,MAAM,CAUvC;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO;;GAsBjE"}
@@ -0,0 +1,39 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { createConfigStore } from './config.js';
4
+ import { createLocalDb } from './local-db.js';
5
+ import { detectEditors, writeMcpConfig } from './mcp-setup.js';
6
+ export function getLocalDbPath() {
7
+ let configDir;
8
+ if (process.platform === 'darwin') {
9
+ configDir = path.join(os.homedir(), 'Library', 'Preferences', 'align-cli');
10
+ }
11
+ else if (process.platform === 'win32') {
12
+ configDir = path.join(process.env['APPDATA'] ?? os.homedir(), 'align-cli');
13
+ }
14
+ else {
15
+ configDir = path.join(os.homedir(), '.config', 'align-cli');
16
+ }
17
+ return path.join(configDir, 'local.db');
18
+ }
19
+ export async function initLocalMode(opts = {}) {
20
+ const dbPath = getLocalDbPath();
21
+ const config = createConfigStore();
22
+ config.setLocalMode(dbPath);
23
+ // Do NOT flip the global default env to 'local'. The MCP server is wired to
24
+ // local mode via the '--env local' flag written into each editor's MCP config
25
+ // (see writeMcpConfig below), so the agent uses local mode without hijacking
26
+ // every other `align` command - those would hit a local client that does not
27
+ // implement cloud-only methods and crash.
28
+ // Initialize schema (idempotent)
29
+ const db = createLocalDb(dbPath);
30
+ db.close();
31
+ if (!opts.quiet) {
32
+ const editors = detectEditors();
33
+ for (const target of editors) {
34
+ writeMcpConfig(target, 'local');
35
+ }
36
+ }
37
+ return { dbPath };
38
+ }
39
+ //# sourceMappingURL=local-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-mode.js","sourceRoot":"","sources":["../../src/lib/local-mode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,UAAU,cAAc;IAC5B,IAAI,SAAiB,CAAC;IACtB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA4B,EAAE;IAChE,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC5B,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,6EAA6E;IAC7E,0CAA0C;IAE1C,iCAAiC;IACjC,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACjC,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;QAChC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare const RELATIONSHIP_TYPES: readonly ["supersedes", "conflicts_with", "contradicts", "duplicates", "refines", "implements", "depends_on", "relates_to"];
2
+ export type RelationshipType = typeof RELATIONSHIP_TYPES[number];
3
+ export interface ClassifiedRelationship {
4
+ type: RelationshipType;
5
+ confidence: number;
6
+ reason?: string;
7
+ }
8
+ interface DecisionLite {
9
+ title: string;
10
+ summary: string;
11
+ }
12
+ export declare function classifyRelationship(subject: DecisionLite, candidate: DecisionLite): Promise<ClassifiedRelationship | null>;
13
+ export {};
14
+ //# sourceMappingURL=local-relationship-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-relationship-classifier.d.ts","sourceRoot":"","sources":["../../src/lib/local-relationship-classifier.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB,6HASrB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAEjE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAYD,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,YAAY,EACrB,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAIxC"}
@@ -0,0 +1,100 @@
1
+ // Stage 2 of local relationship detection: type a candidate edge (found cheaply
2
+ // via embeddings) using an LLM with the user's OWN key. Embedding similarity says
3
+ // two decisions are related; only an LLM reading both can say HOW (the taxonomy).
4
+ // Returns null when no key is configured, so callers degrade to an untyped edge.
5
+ export const RELATIONSHIP_TYPES = [
6
+ 'supersedes',
7
+ 'conflicts_with',
8
+ 'contradicts',
9
+ 'duplicates',
10
+ 'refines',
11
+ 'implements',
12
+ 'depends_on',
13
+ 'relates_to',
14
+ ];
15
+ const SYSTEM_PROMPT = "You classify how decision B relates to decision A in a software team's decision graph. " +
16
+ `Respond ONLY with compact JSON: {"type": one of [${RELATIONSHIP_TYPES.join(', ')}], "confidence": number 0-1, "reason": short string}. ` +
17
+ 'Use "conflicts_with" or "contradicts" ONLY when B genuinely opposes A - high textual similarity alone is NOT a conflict ' +
18
+ '(two decisions about the same topic often agree). Use "supersedes" when B replaces A, "relates_to" when merely related.';
19
+ function buildUserPrompt(a, b) {
20
+ return `Decision A: ${a.title}. ${a.summary}\n\nDecision B: ${b.title}. ${b.summary}`;
21
+ }
22
+ export async function classifyRelationship(subject, candidate) {
23
+ const raw = await callLlm(SYSTEM_PROMPT, buildUserPrompt(subject, candidate));
24
+ if (!raw)
25
+ return null;
26
+ return parseRelationship(raw);
27
+ }
28
+ function parseRelationship(text) {
29
+ const match = text.match(/\{[\s\S]*\}/);
30
+ if (!match)
31
+ return null;
32
+ try {
33
+ const obj = JSON.parse(match[0]);
34
+ if (typeof obj.type !== 'string' || !RELATIONSHIP_TYPES.includes(obj.type))
35
+ return null;
36
+ const confidence = typeof obj.confidence === 'number' ? Math.max(0, Math.min(1, obj.confidence)) : 0.5;
37
+ const result = { type: obj.type, confidence };
38
+ if (typeof obj.reason === 'string' && obj.reason.trim())
39
+ result.reason = obj.reason.trim();
40
+ return result;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ // Minimal provider call: Anthropic (Haiku) preferred, then OpenAI-compatible.
47
+ // Reuses the env-key convention of local-llm.ts; returns null on any failure.
48
+ async function callLlm(system, user) {
49
+ const anthropicKey = process.env['ANTHROPIC_API_KEY'];
50
+ if (anthropicKey)
51
+ return callAnthropic(system, user, anthropicKey);
52
+ const openaiKey = process.env['OPENAI_API_KEY'];
53
+ if (openaiKey)
54
+ return callOpenAi(system, user, openaiKey);
55
+ return null;
56
+ }
57
+ async function callAnthropic(system, user, key) {
58
+ try {
59
+ const res = await fetch('https://api.anthropic.com/v1/messages', {
60
+ method: 'POST',
61
+ headers: { 'Content-Type': 'application/json', 'x-api-key': key, 'anthropic-version': '2023-06-01' },
62
+ body: JSON.stringify({
63
+ model: process.env['ALIGN_ANTHROPIC_MODEL'] ?? 'claude-haiku-4-5-20251001',
64
+ max_tokens: 256,
65
+ system,
66
+ messages: [{ role: 'user', content: user }],
67
+ }),
68
+ signal: AbortSignal.timeout(15000),
69
+ });
70
+ if (!res.ok)
71
+ return null;
72
+ const data = await res.json();
73
+ return data.content?.[0]?.text?.trim() ?? null;
74
+ }
75
+ catch {
76
+ return null;
77
+ }
78
+ }
79
+ async function callOpenAi(system, user, key) {
80
+ try {
81
+ const res = await fetch('https://api.openai.com/v1/chat/completions', {
82
+ method: 'POST',
83
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${key}` },
84
+ body: JSON.stringify({
85
+ model: process.env['ALIGN_OPENAI_MODEL'] ?? 'gpt-4o-mini',
86
+ max_tokens: 256,
87
+ messages: [{ role: 'system', content: system }, { role: 'user', content: user }],
88
+ }),
89
+ signal: AbortSignal.timeout(15000),
90
+ });
91
+ if (!res.ok)
92
+ return null;
93
+ const data = await res.json();
94
+ return data.choices?.[0]?.message?.content?.trim() ?? null;
95
+ }
96
+ catch {
97
+ return null;
98
+ }
99
+ }
100
+ //# sourceMappingURL=local-relationship-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-relationship-classifier.js","sourceRoot":"","sources":["../../src/lib/local-relationship-classifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { createConfigStore, EnvironmentConfig, EnvName } from './config.js';
2
+ type ConfigStore = ReturnType<typeof createConfigStore>;
3
+ export declare function loginInteractive(env: EnvironmentConfig, envName: EnvName, config: ConfigStore): Promise<boolean>;
4
+ export {};
5
+ //# sourceMappingURL=login-flow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-flow.d.ts","sourceRoot":"","sources":["../../src/lib/login-flow.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEjF,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAMxD,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,iBAAiB,EACtB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAoDlB"}
@@ -0,0 +1,64 @@
1
+ import * as p from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import open from 'open';
4
+ import { createGatewayClient } from './gateway-client.js';
5
+ import { CLI_CALLBACK_PORTS, waitForCallback } from './cli-oauth.js';
6
+ // Browser-based CLI login. Starts a local callback server, opens the branded
7
+ // login page, exchanges the returned token, verifies it, and persists the
8
+ // token + tenant id. Returns true on success. Shared by `align login` and the
9
+ // inline login on the cloud `align setup` path.
10
+ export async function loginInteractive(env, envName, config) {
11
+ const spinner = p.spinner();
12
+ spinner.start('Opening browser for login...');
13
+ let loginUrl = '';
14
+ const callbackPromise = waitForCallback({
15
+ ports: CLI_CALLBACK_PORTS,
16
+ timeoutMs: 120_000,
17
+ onBound: async (port, nonce) => {
18
+ try {
19
+ const res = await fetch(`${env.gatewayUrl}/auth/cli-init?port=${port}&nonce=${nonce}`);
20
+ if (!res.ok)
21
+ throw new Error(`Gateway returned ${res.status}`);
22
+ const body = await res.json();
23
+ loginUrl = body.url;
24
+ await open(loginUrl).catch(() => { });
25
+ spinner.stop(`Browser opened. If nothing happened, visit:\n ${chalk.bold(loginUrl)}`);
26
+ p.log.info('Waiting for you to log in (2 min timeout)...');
27
+ }
28
+ catch (e) {
29
+ spinner.stop(`Could not open browser: ${e.message}`);
30
+ }
31
+ },
32
+ });
33
+ let result;
34
+ try {
35
+ result = await callbackPromise;
36
+ }
37
+ catch (e) {
38
+ p.log.error(`Login failed: ${e.message}`);
39
+ return false;
40
+ }
41
+ const token = result.data['token'];
42
+ if (!token) {
43
+ p.log.error('No token received. Try again or use: align login --token <token>');
44
+ return false;
45
+ }
46
+ const verifySpinner = p.spinner();
47
+ verifySpinner.start('Verifying token...');
48
+ try {
49
+ const client = createGatewayClient({ ...env, authToken: token });
50
+ const me = await client.whoami();
51
+ config.setAuthToken(envName, token);
52
+ if (me.tenant?.id)
53
+ config.setTenantId(envName, me.tenant.id);
54
+ verifySpinner.stop(`Logged in as ${me.user.email} (${me.tenant.name}) [${envName}]`);
55
+ return true;
56
+ }
57
+ catch {
58
+ verifySpinner.stop('Token saved (gateway unreachable for verification)');
59
+ config.setAuthToken(envName, token);
60
+ p.log.warn('Check the gateway is reachable with: align dev status');
61
+ return true;
62
+ }
63
+ }
64
+ //# sourceMappingURL=login-flow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-flow.js","sourceRoot":"","sources":["../../src/lib/login-flow.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,12 @@
1
1
  import type { BatchIngestItem, createGatewayClient } from './gateway-client.js';
2
2
  export type PersonalImportItem = BatchIngestItem;
3
+ export declare function runWithConcurrency<T>(tasks: Array<() => Promise<T>>, concurrency: number): Promise<PromiseSettledResult<T>[]>;
3
4
  export declare function runPersonalImport(items: PersonalImportItem[], client: ReturnType<typeof createGatewayClient>, opts: {
4
5
  label: string;
5
6
  approve?: boolean;
6
7
  appUrl: string;
8
+ quiet?: boolean;
9
+ deferEnrichment?: boolean;
10
+ local?: boolean;
7
11
  }): Promise<number>;
8
12
  //# sourceMappingURL=personal-import.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"personal-import.d.ts","sourceRoot":"","sources":["../../src/lib/personal-import.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAIjD,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,MAAM,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,EAC9C,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,MAAM,CAAC,CA+DjB"}
1
+ {"version":3,"file":"personal-import.d.ts","sourceRoot":"","sources":["../../src/lib/personal-import.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,MAAM,MAAM,kBAAkB,GAAG,eAAe,CAAC;AAoDjD,wBAAsB,kBAAkB,CAAC,CAAC,EACxC,KAAK,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAC9B,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAYpC;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,kBAAkB,EAAE,EAC3B,MAAM,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,EAC9C,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GACtH,OAAO,CAAC,MAAM,CAAC,CA0GjB"}