@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.
- package/LICENSE +21 -0
- package/README.md +152 -0
- package/dist/commands/capture.d.ts +3 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +74 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +94 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/connector/index.d.ts +3 -0
- package/dist/commands/connector/index.d.ts.map +1 -0
- package/dist/commands/connector/index.js +145 -0
- package/dist/commands/connector/index.js.map +1 -0
- package/dist/commands/decisions/index.d.ts +3 -0
- package/dist/commands/decisions/index.d.ts.map +1 -0
- package/dist/commands/decisions/index.js +91 -0
- package/dist/commands/decisions/index.js.map +1 -0
- package/dist/commands/dev/index.d.ts +3 -0
- package/dist/commands/dev/index.d.ts.map +1 -0
- package/dist/commands/dev/index.js +226 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/drift.d.ts +3 -0
- package/dist/commands/drift.d.ts.map +1 -0
- package/dist/commands/drift.js +51 -0
- package/dist/commands/drift.js.map +1 -0
- package/dist/commands/env.d.ts +3 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +28 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/import/confluence.d.ts +3 -0
- package/dist/commands/import/confluence.d.ts.map +1 -0
- package/dist/commands/import/confluence.js +43 -0
- package/dist/commands/import/confluence.js.map +1 -0
- package/dist/commands/import/git.d.ts +3 -0
- package/dist/commands/import/git.d.ts.map +1 -0
- package/dist/commands/import/git.js +59 -0
- package/dist/commands/import/git.js.map +1 -0
- package/dist/commands/import/github.d.ts +3 -0
- package/dist/commands/import/github.d.ts.map +1 -0
- package/dist/commands/import/github.js +36 -0
- package/dist/commands/import/github.js.map +1 -0
- package/dist/commands/import/gitlab.d.ts +3 -0
- package/dist/commands/import/gitlab.d.ts.map +1 -0
- package/dist/commands/import/gitlab.js +37 -0
- package/dist/commands/import/gitlab.js.map +1 -0
- package/dist/commands/import/jira.d.ts +3 -0
- package/dist/commands/import/jira.d.ts.map +1 -0
- package/dist/commands/import/jira.js +43 -0
- package/dist/commands/import/jira.js.map +1 -0
- package/dist/commands/import/linear.d.ts +3 -0
- package/dist/commands/import/linear.d.ts.map +1 -0
- package/dist/commands/import/linear.js +36 -0
- package/dist/commands/import/linear.js.map +1 -0
- package/dist/commands/import/notion.d.ts +3 -0
- package/dist/commands/import/notion.d.ts.map +1 -0
- package/dist/commands/import/notion.js +41 -0
- package/dist/commands/import/notion.js.map +1 -0
- package/dist/commands/import/slack.d.ts +3 -0
- package/dist/commands/import/slack.d.ts.map +1 -0
- package/dist/commands/import/slack.js +46 -0
- package/dist/commands/import/slack.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +285 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/links.d.ts +3 -0
- package/dist/commands/links.d.ts.map +1 -0
- package/dist/commands/links.js +59 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +90 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +162 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +42 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/spaces.d.ts +3 -0
- package/dist/commands/spaces.d.ts.map +1 -0
- package/dist/commands/spaces.js +39 -0
- package/dist/commands/spaces.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +18 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +49 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/env-resolver.d.ts +5 -0
- package/dist/lib/env-resolver.d.ts.map +1 -0
- package/dist/lib/env-resolver.js +14 -0
- package/dist/lib/env-resolver.js.map +1 -0
- package/dist/lib/fetchers/confluence.d.ts +8 -0
- package/dist/lib/fetchers/confluence.d.ts.map +1 -0
- package/dist/lib/fetchers/confluence.js +27 -0
- package/dist/lib/fetchers/confluence.js.map +1 -0
- package/dist/lib/fetchers/github.d.ts +6 -0
- package/dist/lib/fetchers/github.d.ts.map +1 -0
- package/dist/lib/fetchers/github.js +43 -0
- package/dist/lib/fetchers/github.js.map +1 -0
- package/dist/lib/fetchers/gitlab.d.ts +7 -0
- package/dist/lib/fetchers/gitlab.d.ts.map +1 -0
- package/dist/lib/fetchers/gitlab.js +24 -0
- package/dist/lib/fetchers/gitlab.js.map +1 -0
- package/dist/lib/fetchers/jira.d.ts +8 -0
- package/dist/lib/fetchers/jira.d.ts.map +1 -0
- package/dist/lib/fetchers/jira.js +45 -0
- package/dist/lib/fetchers/jira.js.map +1 -0
- package/dist/lib/fetchers/linear.d.ts +6 -0
- package/dist/lib/fetchers/linear.d.ts.map +1 -0
- package/dist/lib/fetchers/linear.js +58 -0
- package/dist/lib/fetchers/linear.js.map +1 -0
- package/dist/lib/fetchers/notion.d.ts +6 -0
- package/dist/lib/fetchers/notion.d.ts.map +1 -0
- package/dist/lib/fetchers/notion.js +47 -0
- package/dist/lib/fetchers/notion.js.map +1 -0
- package/dist/lib/fetchers/slack.d.ts +7 -0
- package/dist/lib/fetchers/slack.d.ts.map +1 -0
- package/dist/lib/fetchers/slack.js +62 -0
- package/dist/lib/fetchers/slack.js.map +1 -0
- package/dist/lib/gateway-client.d.ts +205 -0
- package/dist/lib/gateway-client.d.ts.map +1 -0
- package/dist/lib/gateway-client.js +187 -0
- package/dist/lib/gateway-client.js.map +1 -0
- package/dist/lib/git.d.ts +23 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +92 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/personal-import.d.ts +8 -0
- package/dist/lib/personal-import.d.ts.map +1 -0
- package/dist/lib/personal-import.js +64 -0
- package/dist/lib/personal-import.js.map +1 -0
- package/dist/lib/process.d.ts +7 -0
- package/dist/lib/process.d.ts.map +1 -0
- package/dist/lib/process.js +48 -0
- package/dist/lib/process.js.map +1 -0
- package/dist/lib/resolve-env.d.ts +3 -0
- package/dist/lib/resolve-env.d.ts.map +1 -0
- package/dist/lib/resolve-env.js +13 -0
- package/dist/lib/resolve-env.js.map +1 -0
- package/dist/lib/table.d.ts +7 -0
- package/dist/lib/table.d.ts.map +1 -0
- package/dist/lib/table.js +16 -0
- package/dist/lib/table.js.map +1 -0
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":"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;AAE/D,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAC1C,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAqD,EAAE,EAAE;QACrF,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC;QAEvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,KAAK,gBAAgB,OAAO,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC;YACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAG,OAAO,CAAC,CAAC,CAAC;YAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC7E,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACnF,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBACnF,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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"}
|