@aligndottech/cli 0.1.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 (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +152 -0
  3. package/dist/commands/capture.d.ts +3 -0
  4. package/dist/commands/capture.d.ts.map +1 -0
  5. package/dist/commands/capture.js +74 -0
  6. package/dist/commands/capture.js.map +1 -0
  7. package/dist/commands/check.d.ts +3 -0
  8. package/dist/commands/check.d.ts.map +1 -0
  9. package/dist/commands/check.js +94 -0
  10. package/dist/commands/check.js.map +1 -0
  11. package/dist/commands/connector/index.d.ts +3 -0
  12. package/dist/commands/connector/index.d.ts.map +1 -0
  13. package/dist/commands/connector/index.js +145 -0
  14. package/dist/commands/connector/index.js.map +1 -0
  15. package/dist/commands/decisions/index.d.ts +3 -0
  16. package/dist/commands/decisions/index.d.ts.map +1 -0
  17. package/dist/commands/decisions/index.js +91 -0
  18. package/dist/commands/decisions/index.js.map +1 -0
  19. package/dist/commands/dev/index.d.ts +3 -0
  20. package/dist/commands/dev/index.d.ts.map +1 -0
  21. package/dist/commands/dev/index.js +226 -0
  22. package/dist/commands/dev/index.js.map +1 -0
  23. package/dist/commands/drift.d.ts +3 -0
  24. package/dist/commands/drift.d.ts.map +1 -0
  25. package/dist/commands/drift.js +51 -0
  26. package/dist/commands/drift.js.map +1 -0
  27. package/dist/commands/env.d.ts +3 -0
  28. package/dist/commands/env.d.ts.map +1 -0
  29. package/dist/commands/env.js +28 -0
  30. package/dist/commands/env.js.map +1 -0
  31. package/dist/commands/import/confluence.d.ts +3 -0
  32. package/dist/commands/import/confluence.d.ts.map +1 -0
  33. package/dist/commands/import/confluence.js +43 -0
  34. package/dist/commands/import/confluence.js.map +1 -0
  35. package/dist/commands/import/git.d.ts +3 -0
  36. package/dist/commands/import/git.d.ts.map +1 -0
  37. package/dist/commands/import/git.js +59 -0
  38. package/dist/commands/import/git.js.map +1 -0
  39. package/dist/commands/import/github.d.ts +3 -0
  40. package/dist/commands/import/github.d.ts.map +1 -0
  41. package/dist/commands/import/github.js +36 -0
  42. package/dist/commands/import/github.js.map +1 -0
  43. package/dist/commands/import/gitlab.d.ts +3 -0
  44. package/dist/commands/import/gitlab.d.ts.map +1 -0
  45. package/dist/commands/import/gitlab.js +37 -0
  46. package/dist/commands/import/gitlab.js.map +1 -0
  47. package/dist/commands/import/jira.d.ts +3 -0
  48. package/dist/commands/import/jira.d.ts.map +1 -0
  49. package/dist/commands/import/jira.js +43 -0
  50. package/dist/commands/import/jira.js.map +1 -0
  51. package/dist/commands/import/linear.d.ts +3 -0
  52. package/dist/commands/import/linear.d.ts.map +1 -0
  53. package/dist/commands/import/linear.js +36 -0
  54. package/dist/commands/import/linear.js.map +1 -0
  55. package/dist/commands/import/notion.d.ts +3 -0
  56. package/dist/commands/import/notion.d.ts.map +1 -0
  57. package/dist/commands/import/notion.js +41 -0
  58. package/dist/commands/import/notion.js.map +1 -0
  59. package/dist/commands/import/slack.d.ts +3 -0
  60. package/dist/commands/import/slack.d.ts.map +1 -0
  61. package/dist/commands/import/slack.js +46 -0
  62. package/dist/commands/import/slack.js.map +1 -0
  63. package/dist/commands/import.d.ts +3 -0
  64. package/dist/commands/import.d.ts.map +1 -0
  65. package/dist/commands/import.js +285 -0
  66. package/dist/commands/import.js.map +1 -0
  67. package/dist/commands/links.d.ts +3 -0
  68. package/dist/commands/links.d.ts.map +1 -0
  69. package/dist/commands/links.js +59 -0
  70. package/dist/commands/links.js.map +1 -0
  71. package/dist/commands/login.d.ts +3 -0
  72. package/dist/commands/login.d.ts.map +1 -0
  73. package/dist/commands/login.js +90 -0
  74. package/dist/commands/login.js.map +1 -0
  75. package/dist/commands/mcp.d.ts +3 -0
  76. package/dist/commands/mcp.d.ts.map +1 -0
  77. package/dist/commands/mcp.js +162 -0
  78. package/dist/commands/mcp.js.map +1 -0
  79. package/dist/commands/search.d.ts +3 -0
  80. package/dist/commands/search.d.ts.map +1 -0
  81. package/dist/commands/search.js +42 -0
  82. package/dist/commands/search.js.map +1 -0
  83. package/dist/commands/spaces.d.ts +3 -0
  84. package/dist/commands/spaces.d.ts.map +1 -0
  85. package/dist/commands/spaces.js +39 -0
  86. package/dist/commands/spaces.js.map +1 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +43 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/lib/config.d.ts +18 -0
  92. package/dist/lib/config.d.ts.map +1 -0
  93. package/dist/lib/config.js +49 -0
  94. package/dist/lib/config.js.map +1 -0
  95. package/dist/lib/env-resolver.d.ts +5 -0
  96. package/dist/lib/env-resolver.d.ts.map +1 -0
  97. package/dist/lib/env-resolver.js +14 -0
  98. package/dist/lib/env-resolver.js.map +1 -0
  99. package/dist/lib/fetchers/confluence.d.ts +8 -0
  100. package/dist/lib/fetchers/confluence.d.ts.map +1 -0
  101. package/dist/lib/fetchers/confluence.js +27 -0
  102. package/dist/lib/fetchers/confluence.js.map +1 -0
  103. package/dist/lib/fetchers/github.d.ts +6 -0
  104. package/dist/lib/fetchers/github.d.ts.map +1 -0
  105. package/dist/lib/fetchers/github.js +43 -0
  106. package/dist/lib/fetchers/github.js.map +1 -0
  107. package/dist/lib/fetchers/gitlab.d.ts +7 -0
  108. package/dist/lib/fetchers/gitlab.d.ts.map +1 -0
  109. package/dist/lib/fetchers/gitlab.js +24 -0
  110. package/dist/lib/fetchers/gitlab.js.map +1 -0
  111. package/dist/lib/fetchers/jira.d.ts +8 -0
  112. package/dist/lib/fetchers/jira.d.ts.map +1 -0
  113. package/dist/lib/fetchers/jira.js +45 -0
  114. package/dist/lib/fetchers/jira.js.map +1 -0
  115. package/dist/lib/fetchers/linear.d.ts +6 -0
  116. package/dist/lib/fetchers/linear.d.ts.map +1 -0
  117. package/dist/lib/fetchers/linear.js +58 -0
  118. package/dist/lib/fetchers/linear.js.map +1 -0
  119. package/dist/lib/fetchers/notion.d.ts +6 -0
  120. package/dist/lib/fetchers/notion.d.ts.map +1 -0
  121. package/dist/lib/fetchers/notion.js +47 -0
  122. package/dist/lib/fetchers/notion.js.map +1 -0
  123. package/dist/lib/fetchers/slack.d.ts +7 -0
  124. package/dist/lib/fetchers/slack.d.ts.map +1 -0
  125. package/dist/lib/fetchers/slack.js +62 -0
  126. package/dist/lib/fetchers/slack.js.map +1 -0
  127. package/dist/lib/gateway-client.d.ts +205 -0
  128. package/dist/lib/gateway-client.d.ts.map +1 -0
  129. package/dist/lib/gateway-client.js +187 -0
  130. package/dist/lib/gateway-client.js.map +1 -0
  131. package/dist/lib/git.d.ts +23 -0
  132. package/dist/lib/git.d.ts.map +1 -0
  133. package/dist/lib/git.js +92 -0
  134. package/dist/lib/git.js.map +1 -0
  135. package/dist/lib/personal-import.d.ts +8 -0
  136. package/dist/lib/personal-import.d.ts.map +1 -0
  137. package/dist/lib/personal-import.js +64 -0
  138. package/dist/lib/personal-import.js.map +1 -0
  139. package/dist/lib/process.d.ts +7 -0
  140. package/dist/lib/process.d.ts.map +1 -0
  141. package/dist/lib/process.js +48 -0
  142. package/dist/lib/process.js.map +1 -0
  143. package/dist/lib/resolve-env.d.ts +3 -0
  144. package/dist/lib/resolve-env.d.ts.map +1 -0
  145. package/dist/lib/resolve-env.js +13 -0
  146. package/dist/lib/resolve-env.js.map +1 -0
  147. package/dist/lib/table.d.ts +7 -0
  148. package/dist/lib/table.d.ts.map +1 -0
  149. package/dist/lib/table.js +16 -0
  150. package/dist/lib/table.js.map +1 -0
  151. package/dist/types.d.ts +4 -0
  152. package/dist/types.d.ts.map +1 -0
  153. package/dist/types.js +25 -0
  154. package/dist/types.js.map +1 -0
  155. package/package.json +43 -0
@@ -0,0 +1,90 @@
1
+ import { resolveEnv } from '../lib/resolve-env.js';
2
+ import * as p from '@clack/prompts';
3
+ import chalk from 'chalk';
4
+ import open from 'open';
5
+ import { createConfigStore } from '../lib/config.js';
6
+ import { createGatewayClient } from '../lib/gateway-client.js';
7
+ import { resolveAppUrl } from '../lib/env-resolver.js';
8
+ export function registerLoginCommands(program) {
9
+ program
10
+ .command('login')
11
+ .description('Authenticate with Align')
12
+ .option('--env <env>', 'Environment (local, preview, prod)')
13
+ .option('--token <token>', 'Use a token directly (for CI / self-hosted)')
14
+ .action(async (opts) => {
15
+ const config = createConfigStore();
16
+ const envName = resolveEnv(opts.env);
17
+ const env = config.getEnvironment(envName);
18
+ if (opts.token) {
19
+ config.setAuthToken(envName, opts.token);
20
+ p.log.success(`Token saved for ${envName}`);
21
+ return;
22
+ }
23
+ p.intro(chalk.bgMagenta.white(' align login '));
24
+ const appUrl = resolveAppUrl(env);
25
+ const loginUrl = `${appUrl}/settings?tab=api-tokens`;
26
+ p.note(`To authenticate:\n1. Visit ${chalk.bold(loginUrl)}\n2. Click "Generate token", copy the token\n3. Paste it below`, 'Get your token');
27
+ await open(loginUrl).catch(() => {
28
+ // Browser open is best-effort
29
+ });
30
+ const token = await p.password({
31
+ message: 'Paste your API token:',
32
+ validate: (v) => v.length < 10 ? 'Token too short' : undefined,
33
+ });
34
+ if (p.isCancel(token)) {
35
+ p.cancel('Cancelled.');
36
+ process.exit(0);
37
+ }
38
+ const spinner = p.spinner();
39
+ spinner.start('Verifying token...');
40
+ try {
41
+ const client = createGatewayClient({ ...env, authToken: token });
42
+ const me = await client.whoami();
43
+ config.setAuthToken(envName, token);
44
+ if (me.tenant?.id)
45
+ config.setTenantId(envName, me.tenant.id);
46
+ spinner.stop(`Logged in as ${me.user.email} (${me.tenant.name}) [${envName}]`);
47
+ p.outro(chalk.green('Ready. Run: align whoami'));
48
+ }
49
+ catch {
50
+ spinner.stop('Could not verify token - token saved anyway');
51
+ p.log.warn('Check the gateway is reachable with: align dev status');
52
+ config.setAuthToken(envName, token);
53
+ }
54
+ });
55
+ program
56
+ .command('logout')
57
+ .description('Clear stored credentials')
58
+ .option('--env <env>', 'Environment')
59
+ .action((opts) => {
60
+ const envName = resolveEnv(opts.env);
61
+ createConfigStore().clear(envName);
62
+ console.log(chalk.green(`Logged out of ${envName}`));
63
+ });
64
+ program
65
+ .command('whoami')
66
+ .description('Show current authenticated user and tenant')
67
+ .option('--env <env>', 'Environment')
68
+ .action(async (opts) => {
69
+ const config = createConfigStore();
70
+ const envName = resolveEnv(opts.env);
71
+ const env = config.getEnvironment(envName);
72
+ if (!env.authToken && env.mode !== 'demo') {
73
+ console.log(chalk.yellow(`Not logged in to ${envName}. Run: align login --env ${envName}`));
74
+ process.exit(1);
75
+ }
76
+ try {
77
+ const me = await createGatewayClient(env).whoami();
78
+ console.log(`\n Email: ${me.user.email}`);
79
+ console.log(` Role: ${me.user.role}`);
80
+ console.log(` Tenant: ${me.tenant.name} (${me.tenant.id})`);
81
+ console.log(` Env: ${envName}`);
82
+ console.log('');
83
+ }
84
+ catch (err) {
85
+ console.log(chalk.red(err.message));
86
+ process.exit(1);
87
+ }
88
+ });
89
+ }
90
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerMcpCommand(program: Command): void;
3
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuFzD"}
@@ -0,0 +1,162 @@
1
+ import { resolveEnv } from '../lib/resolve-env.js';
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
5
+ import { createConfigStore } from '../lib/config.js';
6
+ import { createGatewayClient } from '../lib/gateway-client.js';
7
+ const TOOL_SCHEMAS = [
8
+ {
9
+ name: 'align_search',
10
+ description: 'Search the Align decision graph for relevant decisions, architectural choices, and past resolutions',
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ query: { type: 'string', description: 'Search query' },
15
+ limit: { type: 'number', description: 'Max results (default: 10)', default: 10 },
16
+ },
17
+ required: ['query'],
18
+ },
19
+ },
20
+ {
21
+ name: 'align_capture',
22
+ description: 'Capture a new decision. Accepts a URL (Slack/Jira/GitHub/Confluence/etc.) or raw text.',
23
+ inputSchema: {
24
+ type: 'object',
25
+ properties: {
26
+ input: { type: 'string', description: 'URL or text content of the decision to capture' },
27
+ },
28
+ required: ['input'],
29
+ },
30
+ },
31
+ {
32
+ name: 'align_check_alignment',
33
+ description: 'Check if a git diff or proposed change conflicts with existing decisions in the graph',
34
+ inputSchema: {
35
+ type: 'object',
36
+ properties: {
37
+ diff: { type: 'string', description: 'Git diff or description of proposed change' },
38
+ context: { type: 'string', description: 'Additional context (branch name, PR title)' },
39
+ },
40
+ required: ['diff'],
41
+ },
42
+ },
43
+ {
44
+ name: 'align_check_drift',
45
+ description: 'Check if code or configuration has drifted from a specific decision',
46
+ inputSchema: {
47
+ type: 'object',
48
+ properties: {
49
+ decision_id: { type: 'string', description: 'ID of the decision to check against' },
50
+ content: { type: 'string', description: 'Code or config content to compare' },
51
+ source_type: { type: 'string', description: 'Type of content: code, config, documentation' },
52
+ },
53
+ required: ['decision_id', 'content'],
54
+ },
55
+ },
56
+ {
57
+ name: 'align_get_impact',
58
+ description: 'Get the upstream and downstream impact of a decision',
59
+ inputSchema: {
60
+ type: 'object',
61
+ properties: {
62
+ decision_id: { type: 'string', description: 'Decision ID to analyze' },
63
+ },
64
+ required: ['decision_id'],
65
+ },
66
+ },
67
+ {
68
+ name: 'align_get_conflicts',
69
+ description: 'List all active conflicts and contradictions in the decision graph',
70
+ inputSchema: {
71
+ type: 'object',
72
+ properties: {},
73
+ },
74
+ },
75
+ {
76
+ name: 'align_get_related_decisions',
77
+ description: 'Find decisions related to a file path, module, or code context',
78
+ inputSchema: {
79
+ type: 'object',
80
+ properties: {
81
+ file_path: { type: 'string', description: 'File path or module name' },
82
+ context: { type: 'string', description: 'Additional code context' },
83
+ },
84
+ required: ['file_path'],
85
+ },
86
+ },
87
+ ];
88
+ export function registerMcpCommand(program) {
89
+ program
90
+ .command('mcp')
91
+ .description('Run Align as an MCP server for Claude Code, Cursor, or Windsurf')
92
+ .option('--env <env>', 'Environment')
93
+ .addHelpText('after', `
94
+ Claude Code config (~/.claude.json or workspace .mcp.json):
95
+ {
96
+ "mcpServers": {
97
+ "align": { "command": "align", "args": ["mcp"] }
98
+ }
99
+ }
100
+ `)
101
+ .action(async (opts) => {
102
+ const config = createConfigStore();
103
+ const env = config.getEnvironment(resolveEnv(opts.env));
104
+ const client = createGatewayClient(env);
105
+ const server = new Server({ name: 'align', version: '0.1.0' }, { capabilities: { tools: {} } });
106
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOL_SCHEMAS }));
107
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
108
+ const { name, arguments: args } = request.params;
109
+ let result;
110
+ switch (name) {
111
+ case 'align_search':
112
+ result = await client.searchDecisions(args?.['query'], args?.['limit']);
113
+ break;
114
+ case 'align_capture': {
115
+ const input = args?.['input'];
116
+ let platform = 'web';
117
+ try {
118
+ const url = new URL(input);
119
+ if (/slack\.com/.test(url.hostname))
120
+ platform = 'slack';
121
+ else if (/atlassian\.net\/browse/.test(input))
122
+ platform = 'jira';
123
+ else if (/atlassian\.net\/wiki/.test(input))
124
+ platform = 'confluence';
125
+ else if (/github\.com/.test(url.hostname))
126
+ platform = 'github';
127
+ else if (/linear\.app/.test(url.hostname))
128
+ platform = 'linear';
129
+ }
130
+ catch {
131
+ throw new Error('align_capture requires a URL. Raw text capture is not supported.');
132
+ }
133
+ result = await client.captureDecision(input, platform);
134
+ break;
135
+ }
136
+ case 'align_check_alignment':
137
+ result = await client.checkAlignment(args?.['diff'], args?.['context']);
138
+ break;
139
+ case 'align_check_drift':
140
+ result = await client.checkDrift(args?.['decision_id'], args?.['content'], args?.['source_type']);
141
+ break;
142
+ case 'align_get_impact':
143
+ result = await client.getImpact(args?.['decision_id']);
144
+ break;
145
+ case 'align_get_conflicts':
146
+ result = await client.getConflicts();
147
+ break;
148
+ case 'align_get_related_decisions':
149
+ result = await client.searchDecisions(`${args?.['file_path']} ${args?.['context'] ?? ''}`, 5);
150
+ break;
151
+ default:
152
+ throw new Error(`Unknown tool: ${name}`);
153
+ }
154
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
155
+ });
156
+ // MCP protocol requires clean stdout; log startup to stderr
157
+ process.stderr.write(`align mcp server started (env: ${opts.env}, gateway: ${env.gatewayUrl})\n`);
158
+ const transport = new StdioServerTransport();
159
+ await server.connect(transport);
160
+ });
161
+ }
162
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSearchCommand(program: Command): void;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsC5D"}
@@ -0,0 +1,42 @@
1
+ import { resolveEnv } from '../lib/resolve-env.js';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { createConfigStore } from '../lib/config.js';
5
+ import { createGatewayClient } from '../lib/gateway-client.js';
6
+ export function registerSearchCommand(program) {
7
+ program
8
+ .command('search <query>')
9
+ .description('Search the decision graph')
10
+ .option('--env <env>', 'Environment')
11
+ .option('--limit <n>', 'Max results', '10')
12
+ .option('--space <slug>', 'Filter by space')
13
+ .action(async (query, opts) => {
14
+ const config = createConfigStore();
15
+ const client = createGatewayClient(config.getEnvironment(resolveEnv(opts.env)));
16
+ const spinner = ora(`Searching "${query}"...`).start();
17
+ try {
18
+ const results = await client.searchDecisions(query, parseInt(opts.limit, 10));
19
+ spinner.stop();
20
+ if (!results.results.length) {
21
+ console.log(chalk.dim('\nNo decisions found.\n'));
22
+ return;
23
+ }
24
+ console.log(chalk.bold(`\n${results.count} result(s) [${results.strategy}]\n`));
25
+ console.log(chalk.dim(`${'TITLE'.padEnd(52) + 'STATUS'.padEnd(12)}SCORE`));
26
+ console.log(chalk.dim('-'.repeat(72)));
27
+ for (const d of results.results) {
28
+ const title = d.title.length > 50 ? `${d.title.slice(0, 47)}...` : d.title;
29
+ const status = d.status === 'active' ? chalk.green(d.status) : chalk.dim(d.status);
30
+ const score = d.similarity ? chalk.dim(d.similarity.toFixed(2)) : chalk.dim('n/a');
31
+ console.log(`${title.padEnd(52)}${status.padEnd(22)}${score}`);
32
+ console.log(chalk.dim(` ${d.id}`));
33
+ }
34
+ console.log('');
35
+ }
36
+ catch (err) {
37
+ spinner.fail(chalk.red(err.message));
38
+ process.exit(1);
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSpacesCommand(program: Command): void;
3
+ //# sourceMappingURL=spaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaces.d.ts","sourceRoot":"","sources":["../../src/commands/spaces.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkC5D"}
@@ -0,0 +1,39 @@
1
+ import { resolveEnv } from '../lib/resolve-env.js';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { createConfigStore } from '../lib/config.js';
5
+ import { createGatewayClient } from '../lib/gateway-client.js';
6
+ import { renderTable } from '../lib/table.js';
7
+ export function registerSpacesCommand(program) {
8
+ const spaces = program
9
+ .command('spaces')
10
+ .description('Manage spaces (project scopes for organizing decisions)');
11
+ spaces
12
+ .command('list')
13
+ .description('List all spaces')
14
+ .option('--env <env>', 'Environment')
15
+ .action(async (opts) => {
16
+ const client = createGatewayClient(createConfigStore().getEnvironment(resolveEnv(opts.env)));
17
+ const spinner = ora('Fetching spaces...').start();
18
+ try {
19
+ const list = await client.listSpaces();
20
+ spinner.stop();
21
+ if (!list.length) {
22
+ console.log(chalk.dim('\nNo spaces yet. Create one at the web app.\n'));
23
+ return;
24
+ }
25
+ console.log(chalk.bold('\nSpaces\n'));
26
+ renderTable([
27
+ { header: 'SLUG', width: 24 },
28
+ { header: 'NAME', width: 32 },
29
+ { header: 'TYPE', width: 16 },
30
+ { header: 'ID', width: 38 },
31
+ ], list.map(s => [s.slug, s.name, s.space_type, s.id]));
32
+ }
33
+ catch (err) {
34
+ spinner.fail(chalk.red(err.message));
35
+ process.exit(1);
36
+ }
37
+ });
38
+ }
39
+ //# sourceMappingURL=spaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spaces.js","sourceRoot":"","sources":["../../src/commands/spaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,KAAK,EAAE,IAAuB,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;YACvC,OAAO,CAAC,IAAI,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC,CAAC;gBACxE,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACtC,WAAW,CACT;gBACE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC7B,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC7B,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBAC7B,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;aAC5B,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACpD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerLoginCommands } from './commands/login.js';
4
+ import { registerCaptureCommand } from './commands/capture.js';
5
+ import { registerImportCommand } from './commands/import.js';
6
+ import { registerSearchCommand } from './commands/search.js';
7
+ import { registerCheckCommand } from './commands/check.js';
8
+ import { registerMcpCommand } from './commands/mcp.js';
9
+ import { registerDecisionsCommand } from './commands/decisions/index.js';
10
+ import { registerConnectorCommands } from './commands/connector/index.js';
11
+ import { registerDevCommands } from './commands/dev/index.js';
12
+ import { registerSpacesCommand } from './commands/spaces.js';
13
+ import { registerLinksCommand } from './commands/links.js';
14
+ import { registerDriftCommand } from './commands/drift.js';
15
+ import { registerEnvCommand } from './commands/env.js';
16
+ const program = new Command();
17
+ program
18
+ .name('align')
19
+ .description('Align CLI - capture decisions, check alignment, and manage connectors')
20
+ .version('0.1.0');
21
+ // Environment targeting
22
+ registerEnvCommand(program);
23
+ // Auth
24
+ registerLoginCommands(program);
25
+ // Customer: decision capture + import
26
+ registerCaptureCommand(program);
27
+ registerImportCommand(program);
28
+ // Customer: search + browse
29
+ registerSearchCommand(program);
30
+ registerDecisionsCommand(program);
31
+ registerSpacesCommand(program);
32
+ registerLinksCommand(program);
33
+ registerDriftCommand(program);
34
+ // Customer: CI/alignment check
35
+ registerCheckCommand(program);
36
+ // Customer: MCP server
37
+ registerMcpCommand(program);
38
+ // Internal: connector management
39
+ registerConnectorCommands(program);
40
+ // Internal: local dev
41
+ registerDevCommands(program);
42
+ program.parse();
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,uEAAuE,CAAC;KACpF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,wBAAwB;AACxB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAE5B,OAAO;AACP,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,sCAAsC;AACtC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,4BAA4B;AAC5B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,+BAA+B;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAE9B,uBAAuB;AACvB,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAE5B,iCAAiC;AACjC,yBAAyB,CAAC,OAAO,CAAC,CAAC;AAEnC,sBAAsB;AACtB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAE7B,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,18 @@
1
+ export type EnvName = 'local' | 'preview' | 'prod';
2
+ export interface EnvironmentConfig {
3
+ gatewayUrl: string;
4
+ authToken: string | null;
5
+ tenantId: string | null;
6
+ ngrokUrl?: string;
7
+ mode: 'demo' | 'auth';
8
+ }
9
+ export declare function createConfigStore(): {
10
+ getEnvironment(env: EnvName): EnvironmentConfig;
11
+ setAuthToken(env: EnvName, token: string): void;
12
+ setTenantId(env: EnvName, tenantId: string): void;
13
+ setNgrokUrl(url: string): void;
14
+ setDefaultEnv(env: EnvName): void;
15
+ getDefaultEnv(): EnvName;
16
+ clear(env: EnvName): void;
17
+ };
18
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAQD,wBAAgB,iBAAiB;wBAST,OAAO,GAAG,iBAAiB;sBAc7B,OAAO,SAAS,MAAM;qBAIvB,OAAO,YAAY,MAAM;qBAIzB,MAAM;uBAIJ,OAAO;qBACT,OAAO;eACb,OAAO;EAMrB"}
@@ -0,0 +1,49 @@
1
+ import Conf from 'conf';
2
+ const DEFAULTS = {
3
+ local: { gatewayUrl: 'http://localhost:8080', authToken: null, tenantId: null, mode: 'demo' },
4
+ preview: { gatewayUrl: 'https://api.preview.align.tech', authToken: null, tenantId: null, mode: 'auth' },
5
+ prod: { gatewayUrl: 'https://api.align.tech', authToken: null, tenantId: null, mode: 'auth' },
6
+ };
7
+ export function createConfigStore() {
8
+ const store = new Conf({
9
+ projectName: 'align-cli',
10
+ defaults: { environments: {}, defaultEnv: 'prod' },
11
+ });
12
+ const getEnvs = () => store.get('environments');
13
+ return {
14
+ getEnvironment(env) {
15
+ const base = { ...DEFAULTS[env], ...(getEnvs()[env] ?? {}) };
16
+ // Env var overrides - useful for CI and self-hosted deployments
17
+ if (!base.authToken && process.env['ALIGN_TOKEN']) {
18
+ base.authToken = process.env['ALIGN_TOKEN'];
19
+ }
20
+ if (!base.tenantId && process.env['ALIGN_TENANT_ID']) {
21
+ base.tenantId = process.env['ALIGN_TENANT_ID'];
22
+ }
23
+ if (process.env['ALIGN_GATEWAY_URL']) {
24
+ base.gatewayUrl = process.env['ALIGN_GATEWAY_URL'];
25
+ }
26
+ return base;
27
+ },
28
+ setAuthToken(env, token) {
29
+ const envs = getEnvs();
30
+ store.set('environments', { ...envs, [env]: { ...(envs[env] ?? {}), authToken: token } });
31
+ },
32
+ setTenantId(env, tenantId) {
33
+ const envs = getEnvs();
34
+ store.set('environments', { ...envs, [env]: { ...(envs[env] ?? {}), tenantId } });
35
+ },
36
+ setNgrokUrl(url) {
37
+ const envs = getEnvs();
38
+ store.set('environments', { ...envs, local: { ...(envs['local'] ?? {}), ngrokUrl: url } });
39
+ },
40
+ setDefaultEnv(env) { store.set('defaultEnv', env); },
41
+ getDefaultEnv() { return store.get('defaultEnv'); },
42
+ clear(env) {
43
+ const envs = getEnvs();
44
+ const { [env]: _, ...rest } = envs;
45
+ store.set('environments', rest);
46
+ },
47
+ };
48
+ }
49
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { EnvironmentConfig } from './config.js';
2
+ export declare function resolveOAuthRedirectUri(connectorKey: string, env: EnvironmentConfig): string;
3
+ export declare function resolveWebhookUrl(connectorKey: string, env: EnvironmentConfig): string;
4
+ export declare function resolveAppUrl(env: EnvironmentConfig): string;
5
+ //# sourceMappingURL=env-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/env-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAG5F;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAGtF;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM,CAG5D"}
@@ -0,0 +1,14 @@
1
+ export function resolveOAuthRedirectUri(connectorKey, env) {
2
+ const base = env.ngrokUrl ?? env.gatewayUrl;
3
+ return `${base}/oauth/callback/${connectorKey}`;
4
+ }
5
+ export function resolveWebhookUrl(connectorKey, env) {
6
+ const base = env.ngrokUrl ?? env.gatewayUrl;
7
+ return `${base}/webhook/${connectorKey}/events`;
8
+ }
9
+ export function resolveAppUrl(env) {
10
+ if (env.gatewayUrl.includes('localhost'))
11
+ return 'http://localhost:5173';
12
+ return env.gatewayUrl.replace('://api.', '://app.');
13
+ }
14
+ //# sourceMappingURL=env-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-resolver.js","sourceRoot":"","sources":["../../src/lib/env-resolver.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,uBAAuB,CAAC,YAAoB,EAAE,GAAsB;IAClF,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC;IAC5C,OAAO,GAAG,IAAI,mBAAmB,YAAY,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,GAAsB;IAC5E,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC;IAC5C,OAAO,GAAG,IAAI,YAAY,YAAY,SAAS,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAsB;IAClD,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,uBAAuB,CAAC;IACzE,OAAO,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { PersonalImportItem } from '../personal-import.js';
2
+ export declare function fetchConfluenceItems(opts: {
3
+ email: string;
4
+ token: string;
5
+ domain: string;
6
+ limit?: number;
7
+ }): Promise<PersonalImportItem[]>;
8
+ //# sourceMappingURL=confluence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/confluence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAYhE,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAwBhC"}
@@ -0,0 +1,27 @@
1
+ function stripHtml(html) {
2
+ return html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
3
+ }
4
+ export async function fetchConfluenceItems(opts) {
5
+ const base = `https://${opts.domain}/wiki`;
6
+ const auth = Buffer.from(`${opts.email}:${opts.token}`).toString('base64');
7
+ const headers = { Authorization: `Basic ${auth}`, Accept: 'application/json' };
8
+ const limit = opts.limit ?? 50;
9
+ const cql = encodeURIComponent('creator = currentUser() AND type = page ORDER BY lastModified DESC');
10
+ const url = `${base}/rest/api/content/search?cql=${cql}&limit=${limit}&expand=body.storage,version`;
11
+ const res = await fetch(url, { headers });
12
+ if (!res.ok)
13
+ throw new Error(`Confluence API failed (${res.status}). Check your email, token, and domain.`);
14
+ const data = await res.json();
15
+ return data.results.map(page => {
16
+ const bodyHtml = page.body?.storage?.value ?? '';
17
+ const bodyText = stripHtml(bodyHtml).slice(0, 2000);
18
+ const pageUrl = `https://${opts.domain}/wiki${page._links?.webui ?? ''}`;
19
+ return {
20
+ source_url: pageUrl,
21
+ platform: 'confluence',
22
+ raw_text: [page.title, bodyText].filter(Boolean).join('\n\n'),
23
+ title: page.title,
24
+ };
25
+ });
26
+ }
27
+ //# sourceMappingURL=confluence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence.js","sourceRoot":"","sources":["../../../src/lib/fetchers/confluence.ts"],"names":[],"mappings":"AAEA,SAAS,SAAS,CAAC,IAAY;IAC7B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AACnE,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAK1C;IACC,MAAM,IAAI,GAAG,WAAW,IAAI,CAAC,MAAM,OAAO,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,EAAE,aAAa,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAE/E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,kBAAkB,CAAC,oEAAoE,CAAC,CAAC;IACrG,MAAM,GAAG,GAAG,GAAG,IAAI,gCAAgC,GAAG,UAAU,KAAK,8BAA8B,CAAC;IAEpG,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,yCAAyC,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAmC,CAAC;IAE/D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,WAAW,IAAI,CAAC,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QACzE,OAAO;YACL,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YAC7D,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PersonalImportItem } from '../personal-import.js';
2
+ export declare function fetchGitHubItems(opts: {
3
+ token: string;
4
+ limit?: number;
5
+ }): Promise<PersonalImportItem[]>;
6
+ //# sourceMappingURL=github.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../src/lib/fetchers/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAmDhC"}