@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 Align Technologies Ltd
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # Align CLI
2
+
3
+ Capture decisions, check alignment, and query your decision graph from the terminal.
4
+
5
+ ```
6
+ npm install -g @aligndottech/cli
7
+ ```
8
+
9
+ Node 20+ required.
10
+
11
+ ## Quick start
12
+
13
+ ```bash
14
+ # 1. Log in (opens your browser to generate an API token)
15
+ align login
16
+
17
+ # 2. Populate your graph from local git history
18
+ align import git
19
+
20
+ # 3. Search decisions
21
+ align search "authentication strategy"
22
+
23
+ # 4. Browse recent decisions
24
+ align decisions list
25
+ ```
26
+
27
+ That's it. No admin setup, no connectors required - `align import git` works anywhere you have a git repo.
28
+
29
+ ## Authentication
30
+
31
+ ```bash
32
+ align login # opens browser → paste token
33
+ align login --token algt_... # non-interactive, good for CI
34
+ align whoami # verify current session
35
+ align logout # clear stored credentials
36
+ ```
37
+
38
+ Tokens are stored locally in your OS config directory. To create one manually, go to **Settings → API Tokens** in the Align web app.
39
+
40
+ ## Importing decisions
41
+
42
+ Pull your existing work into the decision graph.
43
+
44
+ ```bash
45
+ # Git commits (no credentials needed)
46
+ align import git
47
+ align import git --limit 200 --from 2024-01-01 --branch main
48
+ align import git --approve # skip confirmation prompt
49
+
50
+ # Personal connectors (use your own credentials, no admin required)
51
+ align import github --token ghp_...
52
+ align import gitlab --token glpat-...
53
+ align import linear --token lin_api_...
54
+ align import jira --domain yourco.atlassian.net --email you@co.com --token ...
55
+ align import confluence --domain yourco.atlassian.net --email you@co.com --token ...
56
+ align import slack --token xoxp-...
57
+ align import notion --token secret_...
58
+ ```
59
+
60
+ All import commands preview what will be imported and ask for confirmation before sending anything.
61
+
62
+ ## Capturing decisions
63
+
64
+ ```bash
65
+ # Capture a URL (Slack thread, GitHub PR, Jira ticket, ...)
66
+ align capture https://github.com/org/repo/pull/42
67
+
68
+ # Capture with explicit platform
69
+ align capture https://yourco.atlassian.net/browse/ENG-123 --platform jira
70
+ ```
71
+
72
+ ## Searching and browsing
73
+
74
+ ```bash
75
+ align search "why did we choose postgres"
76
+ align decisions list
77
+ align decisions list --space backend
78
+ align decisions get <id>
79
+ align links list # view decision relationships
80
+ align drift # decisions that may be out of date
81
+ ```
82
+
83
+ ## CI alignment check
84
+
85
+ ```bash
86
+ align check # check staged diff against decision graph
87
+ align check --branch main # check current branch vs main
88
+ ```
89
+
90
+ Returns exit code 1 when alignment issues are found, making it easy to fail a pipeline step.
91
+
92
+ Example GitHub Actions step:
93
+
94
+ ```yaml
95
+ - name: Check alignment
96
+ run: align check --branch ${{ github.base_ref }}
97
+ env:
98
+ ALIGN_TOKEN: ${{ secrets.ALIGN_TOKEN }}
99
+ ```
100
+
101
+ Pass the token via `ALIGN_TOKEN` env var or `--token` flag.
102
+
103
+ ## MCP server
104
+
105
+ Run Align as an MCP server so AI assistants (Claude, Cursor, etc.) can query your decision graph directly.
106
+
107
+ ```bash
108
+ align mcp
109
+ ```
110
+
111
+ Add to your MCP client config:
112
+
113
+ ```json
114
+ {
115
+ "mcpServers": {
116
+ "align": {
117
+ "command": "align",
118
+ "args": ["mcp"],
119
+ "env": { "ALIGN_TOKEN": "algt_..." }
120
+ }
121
+ }
122
+ }
123
+ ```
124
+
125
+ ## Environments
126
+
127
+ By default the CLI targets `prod` (`api.align.tech`). Use `--env` or set a sticky default:
128
+
129
+ ```bash
130
+ align env set preview # stick to preview for this machine
131
+ align env get # show current default
132
+ align --env local <command> # one-off override
133
+ ```
134
+
135
+ ## Environment variables
136
+
137
+ | Variable | Purpose |
138
+ |---|---|
139
+ | `ALIGN_TOKEN` | API token (alternative to `align login`) |
140
+ | `ALIGN_ENV` | Default environment (`prod`, `preview`, `local`) |
141
+ | `ALIGN_GATEWAY_URL` | Override gateway URL (self-hosted) |
142
+ | `ALIGN_TENANT_ID` | Override tenant ID (self-hosted / CI) |
143
+
144
+ ## Self-hosted
145
+
146
+ Point the CLI at your own instance:
147
+
148
+ ```bash
149
+ align login --env local --token algt_...
150
+ # or
151
+ ALIGN_GATEWAY_URL=https://api.yourco.com align decisions list
152
+ ```
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerCaptureCommand(program: Command): void;
3
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8C7D"}
@@ -0,0 +1,74 @@
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 { resolveAppUrl } from '../lib/env-resolver.js';
7
+ // Display label only - gateway's registry.resolveUrl() handles real detection
8
+ function labelFromUrl(input) {
9
+ if (/slack\.com/.test(input))
10
+ return 'slack';
11
+ if (/atlassian\.net\/browse/.test(input))
12
+ return 'jira';
13
+ if (/atlassian\.net\/wiki/.test(input))
14
+ return 'confluence';
15
+ if (/github\.com/.test(input))
16
+ return 'github';
17
+ if (/teams\.microsoft\.com/.test(input))
18
+ return 'teams';
19
+ if (/zoom\.us/.test(input))
20
+ return 'zoom';
21
+ if (/linear\.app/.test(input))
22
+ return 'linear';
23
+ return 'web';
24
+ }
25
+ function isUrl(input) {
26
+ try {
27
+ new URL(input);
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ export function registerCaptureCommand(program) {
35
+ program
36
+ .command('capture <url>')
37
+ .description('Capture a decision from a URL (Slack/Jira/GitHub/Confluence/etc.)')
38
+ .option('--env <env>', 'Environment')
39
+ .action(async (input, opts) => {
40
+ if (!isUrl(input)) {
41
+ console.error(chalk.red('capture requires a URL. Raw text capture is not yet supported.'));
42
+ process.exit(1);
43
+ }
44
+ const config = createConfigStore();
45
+ const env = config.getEnvironment(resolveEnv(opts.env));
46
+ const client = createGatewayClient(env);
47
+ const platform = labelFromUrl(input);
48
+ const spinner = ora(`Fetching from ${platform} and extracting decisions...`).start();
49
+ try {
50
+ const decision = await client.captureDecision(input, platform);
51
+ spinner.succeed(chalk.green('Decision captured'));
52
+ console.log('');
53
+ console.log(` ${chalk.bold('ID:')} ${decision.id}`);
54
+ console.log(` ${chalk.bold('Title:')} ${decision.title}`);
55
+ console.log(` ${chalk.bold('Summary:')} ${decision.summary}`);
56
+ console.log(` ${chalk.bold('Platform:')} ${decision.platform}`);
57
+ if (decision.ai?.risks?.length) {
58
+ console.log(` ${chalk.bold('Risks:')} ${decision.ai.risks.slice(0, 2).join('; ')}`);
59
+ }
60
+ console.log('');
61
+ console.log(chalk.dim(`View: ${resolveAppUrl(env)}/decisions/${decision.id}`));
62
+ console.log('');
63
+ }
64
+ catch (err) {
65
+ const msg = err.message;
66
+ spinner.fail(chalk.red(msg));
67
+ if (msg.includes('503') || msg.includes('connector') || msg.includes('token')) {
68
+ console.log(chalk.dim(`\nMake sure the ${platform} connector is enabled: ${chalk.bold(`align connector enable ${platform} --env ${opts.env}`)}`));
69
+ }
70
+ process.exit(1);
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerCheckCommand(program: Command): void;
3
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiF3D"}
@@ -0,0 +1,94 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { existsSync, readFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import { createConfigStore } from '../lib/config.js';
6
+ import { resolveEnv } from '../lib/resolve-env.js';
7
+ import { createGatewayClient } from '../lib/gateway-client.js';
8
+ import { getCurrentBranch, getHeadDiff, getStagedDiff, isGitRepo } from '../lib/git.js';
9
+ export function registerCheckCommand(program) {
10
+ program
11
+ .command('check')
12
+ .description('Check current changes against the decision graph (exit 1 = conflict found)')
13
+ .option('--env <env>', 'Environment')
14
+ .option('--all', 'Check full HEAD diff, not just staged changes')
15
+ .option('--hook', 'Pre-commit mode: silent on no context, only fail on critical conflicts')
16
+ .option('--ci', 'CI mode: JSON output to stdout for GitHub Actions')
17
+ .action(async (opts) => {
18
+ if (!await isGitRepo()) {
19
+ if (!opts.ci)
20
+ console.error(chalk.red('Not in a git repository'));
21
+ process.exit(1);
22
+ }
23
+ const rcPath = join(process.cwd(), '.alignrc');
24
+ const rc = existsSync(rcPath)
25
+ ? JSON.parse(readFileSync(rcPath, 'utf-8'))
26
+ : {};
27
+ const envName = resolveEnv(opts.env ?? rc.defaultEnv);
28
+ const config = createConfigStore();
29
+ const client = createGatewayClient(config.getEnvironment(envName));
30
+ let diff = await getStagedDiff();
31
+ if (!diff.trim() || opts.all)
32
+ diff = await getHeadDiff();
33
+ if (!diff.trim()) {
34
+ if (!opts.hook && !opts.ci)
35
+ console.log(chalk.dim('No changes to check.'));
36
+ process.exit(0);
37
+ }
38
+ const branch = await getCurrentBranch().catch(() => '');
39
+ if (opts.ci) {
40
+ try {
41
+ const result = await client.checkAlignment(diff, branch);
42
+ process.stdout.write(`${JSON.stringify(result)}\n`);
43
+ process.exit(result.status === 'conflicting' ? 1 : 0);
44
+ }
45
+ catch (err) {
46
+ process.stdout.write(`${JSON.stringify({ status: 'error', message: err.message })}\n`);
47
+ process.exit(0);
48
+ }
49
+ }
50
+ const spinner = ora('Checking alignment...').start();
51
+ try {
52
+ const result = await client.checkAlignment(diff, branch);
53
+ spinner.stop();
54
+ if (result.status === 'aligned') {
55
+ console.log(chalk.green('\nAligned with decision graph.\n'));
56
+ for (const d of result.relevant_decisions.slice(0, 3)) {
57
+ console.log(chalk.dim(` - ${d.title} (${d.id})`));
58
+ }
59
+ if (result.relevant_decisions.length)
60
+ console.log('');
61
+ }
62
+ else if (result.status === 'conflicting') {
63
+ console.log(chalk.red('\nConflicts with decision graph:\n'));
64
+ for (const c of result.conflicts ?? []) {
65
+ const icon = c.severity === 'critical'
66
+ ? chalk.bgRed.white(' CRITICAL ')
67
+ : chalk.yellow(' WARNING ');
68
+ console.log(` ${icon} ${c.title}`);
69
+ console.log(chalk.dim(` ${c.reason}`));
70
+ if (c.suggested_resolution) {
71
+ console.log(chalk.dim(` Suggestion: ${c.suggested_resolution}`));
72
+ }
73
+ console.log('');
74
+ }
75
+ const hasCritical = result.conflicts?.some(c => c.severity === 'critical');
76
+ // Hook mode only blocks on critical conflicts to avoid false positives
77
+ if (opts.hook && !hasCritical)
78
+ process.exit(0);
79
+ process.exit(1);
80
+ }
81
+ else {
82
+ if (!opts.hook)
83
+ console.log(chalk.dim('\nNo related decisions found.\n'));
84
+ }
85
+ }
86
+ catch (err) {
87
+ spinner.fail(chalk.red(err.message));
88
+ // Hook mode: never block commits if Align is unreachable
89
+ if (!opts.hook)
90
+ process.exit(1);
91
+ }
92
+ });
93
+ }
94
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerConnectorCommands(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/connector/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2IhE"}
@@ -0,0 +1,145 @@
1
+ import { resolveEnv } from '../../lib/resolve-env.js';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import open from 'open';
5
+ import * as p from '@clack/prompts';
6
+ import { createConfigStore } from '../../lib/config.js';
7
+ import { createGatewayClient } from '../../lib/gateway-client.js';
8
+ import { renderTable } from '../../lib/table.js';
9
+ import { streamDockerLogs, streamKubectlLogs } from '../../lib/process.js';
10
+ export function registerConnectorCommands(program) {
11
+ const connector = program
12
+ .command('connector')
13
+ .description('Manage connectors (Slack, Jira, GitHub, etc.)');
14
+ connector
15
+ .command('list')
16
+ .description('List all connectors and their status')
17
+ .option('--env <env>', 'Environment')
18
+ .action(async (opts) => {
19
+ const config = createConfigStore();
20
+ const client = createGatewayClient(config.getEnvironment(resolveEnv(opts.env)));
21
+ const spinner = ora('Fetching connectors...').start();
22
+ try {
23
+ const connectors = await client.listConnectors();
24
+ spinner.stop();
25
+ if (!connectors.length) {
26
+ console.log(chalk.dim('\nNo connectors configured.\n'));
27
+ return;
28
+ }
29
+ console.log(chalk.bold(`\nConnectors (${opts.env})\n`));
30
+ renderTable([
31
+ { header: 'KEY', width: 20 },
32
+ { header: 'NAME', width: 24 },
33
+ {
34
+ header: 'STATUS', width: 12,
35
+ color: (v) => {
36
+ const t = v.trim();
37
+ if (t === 'active')
38
+ return chalk.green(v);
39
+ if (t === 'error')
40
+ return chalk.red(v);
41
+ return chalk.dim(v);
42
+ },
43
+ },
44
+ { header: 'CONFIGURED', width: 12 },
45
+ ], connectors.map(c => [c.key, c.name, c.status, c.configured ? 'yes' : 'no']));
46
+ }
47
+ catch (err) {
48
+ spinner.fail(chalk.red(err.message));
49
+ process.exit(1);
50
+ }
51
+ });
52
+ connector
53
+ .command('enable <name>')
54
+ .description('Enable a connector by initiating OAuth')
55
+ .option('--env <env>', 'Environment')
56
+ .action(async (name, opts) => {
57
+ const config = createConfigStore();
58
+ const client = createGatewayClient(config.getEnvironment(resolveEnv(opts.env)));
59
+ const spinner = ora(`Starting OAuth for ${name}...`).start();
60
+ try {
61
+ const { authUrl } = await client.startOAuth(name);
62
+ spinner.stop();
63
+ console.log(chalk.dim(`\nOpening browser to authorize ${name}...\n`));
64
+ console.log(chalk.bold('Authorization URL:'));
65
+ console.log(authUrl);
66
+ console.log('');
67
+ await open(authUrl).catch(() => {
68
+ console.log(chalk.dim('(Could not open browser - copy the URL above)'));
69
+ });
70
+ p.log.info(`After authorizing, run: align connector status ${name} --env ${opts.env}`);
71
+ }
72
+ catch (err) {
73
+ spinner.fail(chalk.red(err.message));
74
+ process.exit(1);
75
+ }
76
+ });
77
+ connector
78
+ .command('disable <name>')
79
+ .description('Disable a connector')
80
+ .option('--env <env>', 'Environment')
81
+ .action(async (name, opts) => {
82
+ const config = createConfigStore();
83
+ const client = createGatewayClient(config.getEnvironment(resolveEnv(opts.env)));
84
+ const confirmed = await p.confirm({
85
+ message: `Disable ${name} connector in ${opts.env}?`,
86
+ });
87
+ if (!confirmed || p.isCancel(confirmed)) {
88
+ p.cancel('Cancelled.');
89
+ return;
90
+ }
91
+ const spinner = ora(`Disabling ${name}...`).start();
92
+ try {
93
+ await client.disableConnector(name);
94
+ spinner.succeed(chalk.green(`${name} disabled`));
95
+ }
96
+ catch (err) {
97
+ spinner.fail(chalk.red(err.message));
98
+ process.exit(1);
99
+ }
100
+ });
101
+ connector
102
+ .command('status <name>')
103
+ .description('Show health and OAuth status for a connector')
104
+ .option('--env <env>', 'Environment')
105
+ .action(async (name, opts) => {
106
+ const config = createConfigStore();
107
+ const client = createGatewayClient(config.getEnvironment(resolveEnv(opts.env)));
108
+ const spinner = ora(`Checking ${name}...`).start();
109
+ try {
110
+ const health = await client.getConnectorHealth(name);
111
+ spinner.stop();
112
+ const statusColor = health.status === 'healthy' ? chalk.green : chalk.red;
113
+ console.log(`\n ${chalk.bold('Connector:')} ${name}`);
114
+ console.log(` ${chalk.bold('Status:')} ${statusColor(health.status)}`);
115
+ console.log(` ${chalk.bold('Env:')} ${opts.env}`);
116
+ console.log('');
117
+ }
118
+ catch (err) {
119
+ spinner.fail(chalk.red(err.message));
120
+ process.exit(1);
121
+ }
122
+ });
123
+ connector
124
+ .command('logs <name>')
125
+ .description('Stream logs for a connector (requires kubectl or docker)')
126
+ .option('--env <env>', 'Environment')
127
+ .option('--namespace <ns>', 'Kubernetes namespace', 'align-local')
128
+ .option('--docker', 'Use docker logs instead of kubectl')
129
+ .action(async (name, opts) => {
130
+ console.log(chalk.dim(`Streaming logs for ${name} (Ctrl+C to stop)...\n`));
131
+ try {
132
+ if (opts.docker) {
133
+ await streamDockerLogs(`mcp-${name}`);
134
+ }
135
+ else {
136
+ await streamKubectlLogs(name, opts.namespace);
137
+ }
138
+ }
139
+ catch (err) {
140
+ console.error(chalk.red(err.message));
141
+ process.exit(1);
142
+ }
143
+ });
144
+ }
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/connector/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerDecisionsCommand(program: Command): void;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/decisions/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQzC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF/D"}
@@ -0,0 +1,91 @@
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
+ import { resolveAppUrl } from '../../lib/env-resolver.js';
8
+ export function registerDecisionsCommand(program) {
9
+ const decisions = program
10
+ .command('decisions')
11
+ .description('Browse and inspect decisions in the graph');
12
+ decisions
13
+ .command('list')
14
+ .description('List decisions')
15
+ .option('--env <env>', 'Environment')
16
+ .option('--platform <p>', 'Filter by platform (slack, jira, github, etc.)')
17
+ .option('--status <s>', 'Filter by status (active, superseded, archived)')
18
+ .option('--space <slug>', 'Filter by space slug')
19
+ .option('--limit <n>', 'Max results', '20')
20
+ .action(async (opts) => {
21
+ const config = createConfigStore();
22
+ const client = createGatewayClient(config.getEnvironment(resolveEnv(opts.env)));
23
+ const spinner = ora('Fetching decisions...').start();
24
+ try {
25
+ const params = { limit: parseInt(opts.limit, 10) };
26
+ if (opts.platform)
27
+ params['platform'] = opts.platform;
28
+ if (opts.status)
29
+ params['status'] = opts.status;
30
+ if (opts.space)
31
+ params['space'] = opts.space;
32
+ const decisions = await client.listDecisions(params);
33
+ spinner.stop();
34
+ if (!decisions.length) {
35
+ console.log(chalk.dim('\nNo decisions found.\n'));
36
+ return;
37
+ }
38
+ console.log(chalk.bold(`\nDecisions (${opts.env})\n`));
39
+ renderTable([
40
+ { header: 'ID', width: 38 },
41
+ { header: 'TITLE', width: 50 },
42
+ { header: 'PLATFORM', width: 14 },
43
+ { header: 'STATUS', width: 12 },
44
+ ], decisions.map(d => [d.id, d.title, d.platform, d.status ?? '']));
45
+ }
46
+ catch (err) {
47
+ spinner.fail(chalk.red(err.message));
48
+ process.exit(1);
49
+ }
50
+ });
51
+ decisions
52
+ .command('show <id>')
53
+ .description('Show full detail for a decision')
54
+ .option('--env <env>', 'Environment')
55
+ .action(async (id, opts) => {
56
+ const config = createConfigStore();
57
+ const env = config.getEnvironment(resolveEnv(opts.env));
58
+ const client = createGatewayClient(env);
59
+ const spinner = ora(`Loading decision ${id}...`).start();
60
+ try {
61
+ const d = await client.getDecision(id);
62
+ spinner.stop();
63
+ console.log('');
64
+ console.log(` ${chalk.bold('ID:')} ${d.id}`);
65
+ console.log(` ${chalk.bold('Title:')} ${d.title}`);
66
+ console.log(` ${chalk.bold('Summary:')} ${d.summary}`);
67
+ console.log(` ${chalk.bold('Platform:')} ${d.platform}`);
68
+ if (d.ai?.risks?.length) {
69
+ console.log(`\n ${chalk.bold('Risks:')}`);
70
+ for (const r of d.ai.risks)
71
+ console.log(` - ${r}`);
72
+ }
73
+ if (d.ai?.actions?.length) {
74
+ console.log(`\n ${chalk.bold('Actions:')}`);
75
+ for (const a of d.ai.actions)
76
+ console.log(` - ${a.text}`);
77
+ }
78
+ if (d.spaces?.length) {
79
+ console.log(`\n ${chalk.bold('Spaces:')} ${d.spaces.map(s => s.name).join(', ')}`);
80
+ }
81
+ console.log('');
82
+ console.log(chalk.dim(`View: ${resolveAppUrl(env)}/decisions/${d.id}`));
83
+ console.log('');
84
+ }
85
+ catch (err) {
86
+ spinner.fail(chalk.red(err.message));
87
+ process.exit(1);
88
+ }
89
+ });
90
+ }
91
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/decisions/index.ts"],"names":[],"mappings":"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"}