@aligndottech/cli 0.1.3 → 0.2.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 (122) hide show
  1. package/README.md +151 -54
  2. package/dist/commands/check.d.ts.map +1 -1
  3. package/dist/commands/check.js +108 -0
  4. package/dist/commands/check.js.map +1 -1
  5. package/dist/commands/links.js +1 -1
  6. package/dist/commands/links.js.map +1 -1
  7. package/dist/commands/local.d.ts +3 -0
  8. package/dist/commands/local.d.ts.map +1 -0
  9. package/dist/commands/local.js +71 -0
  10. package/dist/commands/local.js.map +1 -0
  11. package/dist/commands/login.d.ts.map +1 -1
  12. package/dist/commands/login.js +4 -54
  13. package/dist/commands/login.js.map +1 -1
  14. package/dist/commands/mcp.d.ts +2 -0
  15. package/dist/commands/mcp.d.ts.map +1 -1
  16. package/dist/commands/mcp.js +32 -11
  17. package/dist/commands/mcp.js.map +1 -1
  18. package/dist/commands/setup.d.ts.map +1 -1
  19. package/dist/commands/setup.js +583 -199
  20. package/dist/commands/setup.js.map +1 -1
  21. package/dist/commands/why.d.ts.map +1 -1
  22. package/dist/commands/why.js +46 -4
  23. package/dist/commands/why.js.map +1 -1
  24. package/dist/index.js +3 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/advisory-dedup.d.ts +3 -0
  27. package/dist/lib/advisory-dedup.d.ts.map +1 -0
  28. package/dist/lib/advisory-dedup.js +44 -0
  29. package/dist/lib/advisory-dedup.js.map +1 -0
  30. package/dist/lib/agent-rules.d.ts +10 -0
  31. package/dist/lib/agent-rules.d.ts.map +1 -0
  32. package/dist/lib/agent-rules.js +137 -0
  33. package/dist/lib/agent-rules.js.map +1 -0
  34. package/dist/lib/config.d.ts +4 -1
  35. package/dist/lib/config.d.ts.map +1 -1
  36. package/dist/lib/config.js +11 -0
  37. package/dist/lib/config.js.map +1 -1
  38. package/dist/lib/fetchers/confluence.d.ts +2 -0
  39. package/dist/lib/fetchers/confluence.d.ts.map +1 -1
  40. package/dist/lib/fetchers/confluence.js +10 -32
  41. package/dist/lib/fetchers/confluence.js.map +1 -1
  42. package/dist/lib/fetchers/git.d.ts +2 -0
  43. package/dist/lib/fetchers/git.d.ts.map +1 -1
  44. package/dist/lib/fetchers/git.js +5 -12
  45. package/dist/lib/fetchers/git.js.map +1 -1
  46. package/dist/lib/fetchers/github.d.ts +1 -0
  47. package/dist/lib/fetchers/github.d.ts.map +1 -1
  48. package/dist/lib/fetchers/github.js +3 -40
  49. package/dist/lib/fetchers/github.js.map +1 -1
  50. package/dist/lib/fetchers/gitlab.d.ts +1 -0
  51. package/dist/lib/fetchers/gitlab.d.ts.map +1 -1
  52. package/dist/lib/fetchers/gitlab.js +3 -21
  53. package/dist/lib/fetchers/gitlab.js.map +1 -1
  54. package/dist/lib/fetchers/jira.d.ts +2 -0
  55. package/dist/lib/fetchers/jira.d.ts.map +1 -1
  56. package/dist/lib/fetchers/jira.js +10 -51
  57. package/dist/lib/fetchers/jira.js.map +1 -1
  58. package/dist/lib/fetchers/linear.d.ts +1 -0
  59. package/dist/lib/fetchers/linear.d.ts.map +1 -1
  60. package/dist/lib/fetchers/linear.js +3 -55
  61. package/dist/lib/fetchers/linear.js.map +1 -1
  62. package/dist/lib/fetchers/notion.d.ts +1 -0
  63. package/dist/lib/fetchers/notion.d.ts.map +1 -1
  64. package/dist/lib/fetchers/notion.js +3 -44
  65. package/dist/lib/fetchers/notion.js.map +1 -1
  66. package/dist/lib/fetchers/slack.d.ts +1 -0
  67. package/dist/lib/fetchers/slack.d.ts.map +1 -1
  68. package/dist/lib/fetchers/slack.js +3 -59
  69. package/dist/lib/fetchers/slack.js.map +1 -1
  70. package/dist/lib/fetchers/teams.d.ts +1 -0
  71. package/dist/lib/fetchers/teams.d.ts.map +1 -1
  72. package/dist/lib/fetchers/teams.js +3 -59
  73. package/dist/lib/fetchers/teams.js.map +1 -1
  74. package/dist/lib/fetchers/zoom.d.ts +1 -0
  75. package/dist/lib/fetchers/zoom.d.ts.map +1 -1
  76. package/dist/lib/fetchers/zoom.js +3 -57
  77. package/dist/lib/fetchers/zoom.js.map +1 -1
  78. package/dist/lib/format-date.d.ts +7 -0
  79. package/dist/lib/format-date.d.ts.map +1 -0
  80. package/dist/lib/format-date.js +26 -0
  81. package/dist/lib/format-date.js.map +1 -0
  82. package/dist/lib/gateway-client.d.ts +9 -8
  83. package/dist/lib/gateway-client.d.ts.map +1 -1
  84. package/dist/lib/gateway-client.js +28 -3
  85. package/dist/lib/gateway-client.js.map +1 -1
  86. package/dist/lib/hook-payload.d.ts +20 -0
  87. package/dist/lib/hook-payload.d.ts.map +1 -0
  88. package/dist/lib/hook-payload.js +30 -0
  89. package/dist/lib/hook-payload.js.map +1 -0
  90. package/dist/lib/local-db.d.ts +51 -0
  91. package/dist/lib/local-db.d.ts.map +1 -0
  92. package/dist/lib/local-db.js +89 -0
  93. package/dist/lib/local-db.js.map +1 -0
  94. package/dist/lib/local-embeddings.d.ts +3 -0
  95. package/dist/lib/local-embeddings.d.ts.map +1 -0
  96. package/dist/lib/local-embeddings.js +20 -0
  97. package/dist/lib/local-embeddings.js.map +1 -0
  98. package/dist/lib/local-gateway-client.d.ts +98 -0
  99. package/dist/lib/local-gateway-client.d.ts.map +1 -0
  100. package/dist/lib/local-gateway-client.js +151 -0
  101. package/dist/lib/local-gateway-client.js.map +1 -0
  102. package/dist/lib/local-mode.d.ts +7 -0
  103. package/dist/lib/local-mode.d.ts.map +1 -0
  104. package/dist/lib/local-mode.js +39 -0
  105. package/dist/lib/local-mode.js.map +1 -0
  106. package/dist/lib/local-relationship-classifier.d.ts +14 -0
  107. package/dist/lib/local-relationship-classifier.d.ts.map +1 -0
  108. package/dist/lib/local-relationship-classifier.js +100 -0
  109. package/dist/lib/local-relationship-classifier.js.map +1 -0
  110. package/dist/lib/login-flow.d.ts +5 -0
  111. package/dist/lib/login-flow.d.ts.map +1 -0
  112. package/dist/lib/login-flow.js +64 -0
  113. package/dist/lib/login-flow.js.map +1 -0
  114. package/dist/lib/personal-import.d.ts +4 -0
  115. package/dist/lib/personal-import.d.ts.map +1 -1
  116. package/dist/lib/personal-import.js +133 -27
  117. package/dist/lib/personal-import.js.map +1 -1
  118. package/package.json +27 -15
  119. package/dist/lib/why-normalise.d.ts +0 -2
  120. package/dist/lib/why-normalise.d.ts.map +0 -1
  121. package/dist/lib/why-normalise.js +0 -39
  122. package/dist/lib/why-normalise.js.map +0 -1
package/README.md CHANGED
@@ -1,16 +1,21 @@
1
1
  # Align CLI
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@aligndottech/cli.svg)](https://www.npmjs.com/package/@aligndottech/cli)
4
+ [![CI](https://github.com/aligndottech/align-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/aligndottech/align-cli/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
6
+ [![Node](https://img.shields.io/node/v/@aligndottech/cli.svg)](https://nodejs.org)
7
+
3
8
  **AI agents are shipping code from decisions they can't see.**
4
9
 
5
- [Align](https://align.tech) captures the reasoning behind every engineering choice - across Git, Jira, Linear, Slack, Notion, Confluence, GitHub, and GitLab - links them into a decision graph, and surfaces that context to every agent and engineer on your team.
10
+ [Align](https://align.tech) captures the reasoning behind every engineering choice - across Git, GitHub, GitLab, Jira, Confluence, Linear, Slack, Microsoft Teams, Zoom, and Notion - links them into a cross-tool decision graph, and surfaces that context to every agent and engineer on your team.
6
11
 
7
- The CLI lets you import your decision history, query it in plain English, and run Align as a local MCP server so your AI assistants have authoritative context inline.
12
+ The CLI lets you import your decision history, query it in plain English, and run Align as a local [MCP](https://modelcontextprotocol.io) server so your AI assistants have authoritative context inline - and check their changes against it automatically.
8
13
 
9
14
  ```
10
15
  npm install -g @aligndottech/cli
11
16
  ```
12
17
 
13
- Node 20+ required.
18
+ Node 20+ required. MIT licensed.
14
19
 
15
20
  ## Quick start
16
21
 
@@ -18,15 +23,50 @@ Node 20+ required.
18
23
  align setup
19
24
  ```
20
25
 
21
- Guided onboarding: login check, source selection, token collection, imports, AI provider setup, cross-tool relationship detection, and MCP configuration - all in one command.
26
+ One guided command: login (or local-only mode), connect your tools via read-only OAuth, seed the graph from your git history, configure your editors' MCP, and wire up automatic alignment checks for AI agents.
22
27
 
23
28
  Or step by step:
24
29
 
25
30
  ```bash
26
31
  align login # authenticate
32
+ align setup # connect tools (read-only OAuth) + configure MCP
27
33
  align import git # pull commit history - no token needed
28
34
  align ask "how does our auth work" # natural language answer from your graph
29
- align import linear --token lin_api_... # add more sources for richer context
35
+ ```
36
+
37
+ ## How it works
38
+
39
+ ```
40
+ Your tools Align Your agents & you
41
+ ────────── ─────────── ───────────────────
42
+ Git, GitHub, GitLab ─┐ ┌─ align ask "why…"
43
+ Jira, Confluence ├─▶ import ─▶ decision graph ─┐ ├─ MCP server (inline)
44
+ Linear, Notion │ (read-only) (what/why/who) ├─┤ PostToolUse hook
45
+ Slack, Teams, Zoom ─┘ + relationships┘ └─ align check (CI)
46
+ ```
47
+
48
+ 1. **Import** pulls the decisions out of the tools you already use - read-only, nothing is modified.
49
+ 2. Align links them into a **cross-tool decision graph**: what was decided, why, who decided it, and how decisions relate (supersedes, conflicts with, depends on).
50
+ 3. Your agents and you **query and check against** that graph - over MCP, a Claude Code hook, CI, or plain `align ask`.
51
+
52
+ The CLI and MCP server are open source (this repo). The hosted graph + relationship detection is a separate commercial gateway; you can also run fully local with `--local`.
53
+
54
+ ## Auto-alignment for AI agents
55
+
56
+ When you run `align setup`, Align makes itself available to your AI agents three ways, so the context fires whether or not the model thinks to ask for it:
57
+
58
+ 1. **MCP server** - your assistant (Claude Code, Cursor, Claude Desktop, Windsurf) can query the decision graph inline. The server ships with instructions telling the agent to check alignment *before* making non-trivial changes.
59
+ 2. **Claude Code hook** - setup writes a `PostToolUse` hook (matcher `Write|Edit`) into the project's `.claude/settings.json`. After the agent edits a file, the hook runs `align check --advisory` and injects any conflicting decisions straight into the agent's context. It is **non-blocking and fail-open**: it never denies an edit, and if Align is slow or unreachable it exits silently.
60
+ 3. **Editor rules** - a managed, marker-delimited block in your `CLAUDE.md` and a `.cursor/rules/align.md` file (Cursor doesn't honor Claude Code hooks) nudge agents to consult the graph.
61
+
62
+ The hook and rule files are committed to the repo, so the whole team's agents get the same guardrail. Re-running `align setup` updates them in place (idempotent - no duplicate hooks or blocks).
63
+
64
+ > **Heads up:** the first time Claude Code loads a project with a committed hook, it shows a one-time "approve hooks" prompt. Accept it to enable automatic alignment.
65
+
66
+ You can also run the advisory check yourself - it always exits 0 and prints the Claude Code hook JSON on a conflict:
67
+
68
+ ```bash
69
+ align check --advisory
30
70
  ```
31
71
 
32
72
  ## Asking questions
@@ -40,45 +80,53 @@ align ask "what was decided about caching"
40
80
  align ask "do we use redis"
41
81
  ```
42
82
 
43
- Question prefixes are normalised automatically - `align ask "why do we use postgres"` and `align ask "use postgres"` search the same way.
83
+ Ask in plain English - the graph picks keyword or semantic search automatically based on your phrasing, so full questions ("why do we use postgres") work as well as short terms ("postgres"). Pass a file path instead of a question to find decisions related to that file:
44
84
 
45
- ### AI provider for align ask
85
+ ```bash
86
+ align ask src/auth/session.ts
87
+ ```
46
88
 
47
- `align ask` needs an AI model to synthesise answers. It tries the following in order:
89
+ ### AI provider for conversational answers
48
90
 
49
- 1. Provider configured via `align config ai set` (stored locally)
50
- 2. `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY`, `GROQ_API_KEY`, or `MISTRAL_API_KEY` env vars
51
- 3. Ollama running locally (auto-detected)
52
- 4. Align's hosted AI (for users on a paid Align plan)
53
- 5. Formatted decision summaries (always works - no AI required)
91
+ To synthesise a conversational answer, `align ask` uses **your own AI provider**. It looks, in order, for:
54
92
 
55
- **Note:** A Claude.ai or ChatGPT subscription is not the same as an API key. You need a separate API account. [Groq](https://console.groq.com/keys) offers a free tier with no credit card required and is the fastest option.
93
+ 1. An API key in the environment: `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, `GEMINI_API_KEY` (or `GOOGLE_API_KEY`), `GROQ_API_KEY`, or `MISTRAL_API_KEY`.
94
+ 2. [Ollama](https://ollama.com) running locally (auto-detected on `localhost:11434`).
56
95
 
57
- Configure a provider interactively:
96
+ If none is available, `align ask` still works - it prints a ranked list of the matching decisions instead of a synthesised paragraph. No key is ever required.
58
97
 
59
- ```bash
60
- align config ai set # pick a provider and paste your key
61
- align config ai # show current provider
62
- align config ai clear # remove stored key
63
- ```
98
+ **Note:** A Claude.ai or ChatGPT subscription is not the same as an API key - you need a separate API account. [Groq](https://console.groq.com/keys) offers a free tier with no credit card and is the fastest option.
64
99
 
65
- Or run `align setup` - it includes this step automatically.
100
+ The retrieval itself (search over your graph) always runs against Align - the API key is only used locally to phrase the answer.
66
101
 
67
102
  ## Authentication
68
103
 
69
104
  ```bash
70
105
  align login # opens browser, paste token when prompted
71
- align login --token algt_... # non-interactive, good for CI
106
+ align login --token algt_... # non-interactive, good for CI / self-hosted
72
107
  align whoami # verify current session
73
108
  align logout # clear stored credentials
74
109
  ```
75
110
 
76
111
  Tokens are stored locally in your OS config directory. To create one manually, go to **Settings > API Tokens** in the Align web app.
77
112
 
113
+ ## Cloud vs local mode
114
+
115
+ `align setup` offers two modes:
116
+
117
+ - **Personal cloud** (default) - your decision graph is hosted at Align: synced across machines, backed up, and upgradeable to a shared team workspace. Connectors connect via **read-only browser OAuth** (no tokens to paste), and `align ask` retrieval runs server-side. Nothing you connect can be modified by the CLI - it only reads.
118
+ - **Local-only** (`align setup --local`) - fully **private and offline**: no account, no cloud, nothing leaves your machine. The graph, embeddings, and search all live in a local database. Seeds from your git history out of the box; other sources connect by pasting a **read-only personal token** (OAuth needs the hosted callback, so it isn't available offline). Run `align local status` to inspect it, `align local reset` to wipe it.
119
+
120
+ Pick cloud for sync + team upgrade, local for maximum privacy. You can always start local and move to cloud later.
121
+
78
122
  ## Importing decisions
79
123
 
80
124
  Pull your existing work into the decision graph. The more sources you add, the richer the cross-tool relationship detection.
81
125
 
126
+ **Easiest way: `align setup`.** It connects each source via a **read-only browser OAuth** consent - no tokens to create or paste. The CLI only ever *reads*; it can't modify your tools (write access lives only in the team/org bot apps). GitHub, Jira, Confluence, Slack, Microsoft Teams, Zoom, Linear, GitLab (gitlab.com), and Notion all use OAuth. Self-managed GitLab (a custom domain) uses a read-only token you paste.
127
+
128
+ The `align import <source> --token ...` forms below are the manual / CI alternative (and how to connect self-managed hosts). Every import previews what will be imported and asks for confirmation before sending anything (use `--approve` to skip the prompt).
129
+
82
130
  ### Git
83
131
 
84
132
  ```bash
@@ -87,7 +135,7 @@ align import git
87
135
 
88
136
  | Flag | Default | Description |
89
137
  |------|---------|-------------|
90
- | `--limit` | `100` | Max commits to import |
138
+ | `--limit` | `500` | Max commits to import |
91
139
  | `--branch` | current branch | Git branch to scan |
92
140
  | `--from` | - | Start date (ISO, e.g. `2025-01-01`) |
93
141
  | `--to` | - | End date (ISO) |
@@ -95,9 +143,11 @@ align import git
95
143
 
96
144
  ### GitHub / GitLab
97
145
 
146
+ Prefer `align setup` - GitHub and gitlab.com connect via read-only OAuth (no token to create). Manual / self-managed alternative:
147
+
98
148
  ```bash
99
- align import github --token ghp_...
100
- align import gitlab --token glpat-...
149
+ align import github --token ghp_... # or connect via `align setup` (read-only OAuth)
150
+ align import gitlab --token glpat-... # self-managed GitLab: create a read_api (read-only) token
101
151
  ```
102
152
 
103
153
  ### Jira
@@ -111,6 +161,8 @@ align import jira \
111
161
 
112
162
  ### Linear
113
163
 
164
+ Prefer `align setup` - Linear connects via read-only OAuth (scope `read`). Manual alternative:
165
+
114
166
  ```bash
115
167
  align import linear --token lin_api_...
116
168
  ```
@@ -126,7 +178,9 @@ align import confluence \
126
178
 
127
179
  ### Slack (experimental)
128
180
 
129
- > **Note:** `align import slack` requires a Slack **user** token (`xoxp-...`), not a bot token.
181
+ Prefer `align setup` - Slack connects via read-only OAuth (read scopes only, no `chat:write`). Note: the Slack app must have public distribution enabled, or you authorize from its home workspace.
182
+
183
+ > **Manual alternative:** `align import slack` requires a Slack **user** token (`xoxp-...`), not a bot token.
130
184
  >
131
185
  > To get one: go to [api.slack.com/apps](https://api.slack.com/apps), create an app, add these User Token Scopes under OAuth & Permissions: `channels:read`, `channels:history`, `groups:read`, `groups:history`. Install to your workspace and copy the OAuth User Token.
132
186
 
@@ -141,55 +195,77 @@ align import slack --token xoxp-<your-slack-user-token>
141
195
 
142
196
  ### Notion
143
197
 
198
+ Create an internal integration with **only "Read content"** capability (no insert/update), then paste its secret:
199
+
144
200
  ```bash
145
201
  align import notion --token <your-notion-integration-token>
146
202
  ```
147
203
 
148
- All import commands preview what will be imported and ask for confirmation before sending anything.
204
+ ### Microsoft Teams / Zoom
205
+
206
+ Connect these through `align setup` (OAuth) - they have no read-only personal token to paste, so they are cloud-only.
149
207
 
150
208
  ## Capturing decisions
151
209
 
152
210
  ```bash
153
- # Capture a URL (Slack thread, GitHub PR, Jira ticket, ...)
211
+ # Capture a decision from a URL - the platform is detected automatically
154
212
  align capture https://github.com/org/repo/pull/42
155
-
156
- # Capture with explicit platform
157
- align capture https://yourco.atlassian.net/browse/ENG-123 --platform jira
213
+ align capture https://yourco.atlassian.net/browse/ENG-123
214
+ align capture https://yourco.slack.com/archives/C123/p1700000000000000
158
215
  ```
159
216
 
160
217
  ## Searching and browsing
161
218
 
162
219
  ```bash
163
220
  align ask "any question in plain English" # natural language answer
164
- align search "authentication strategy" # keyword/semantic search - returns a list
165
- align decisions list
166
- align decisions list --space backend
167
- align decisions show <id>
168
- align links list # cross-tool decision relationships
169
- align drift # decisions that may be out of date
221
+ align search "authentication strategy" # keyword/semantic search - returns a list
222
+ align decisions list # browse the graph
223
+ align decisions list --space backend # filter by space
224
+ align decisions list --platform jira # filter by source platform
225
+ align decisions show <id> # full detail for one decision
226
+ align links list # cross-tool decision relationships
227
+ align drift # decisions that may be out of date
228
+ align export # export decisions as a structured brief
170
229
  ```
171
230
 
172
231
  `align ask` synthesises an answer. `align search` returns a ranked list - useful when you want to browse.
173
232
 
174
- ## CI alignment check
233
+ ## Alignment check
234
+
235
+ Check your current changes against the decision graph. Exit code `1` means a conflict was found.
175
236
 
176
237
  ```bash
177
- align check # check staged diff against decision graph
178
- align check --branch main # check current branch vs main
238
+ align check # check the staged diff
239
+ align check --all # check the full working-tree diff vs HEAD
179
240
  ```
180
241
 
181
- Returns exit code 1 when alignment issues are found.
242
+ Modes:
243
+
244
+ | Mode | Behavior |
245
+ |------|----------|
246
+ | (default) | Human-readable output; exits `1` on any conflict. |
247
+ | `--hook` | Pre-commit mode: silent when there's no context, only fails on **critical** conflicts. |
248
+ | `--advisory` | PostToolUse hook mode: **always exits 0**, emits conflicting decisions as Claude Code `additionalContext` JSON. Fail-open. |
249
+ | `--ci` | Emits JSON to stdout for CI; exits `1` on conflict. |
250
+
251
+ In CI:
182
252
 
183
253
  ```yaml
184
254
  - name: Check alignment
185
- run: align check --branch ${{ github.base_ref }}
255
+ run: align check --all --ci
186
256
  env:
187
257
  ALIGN_TOKEN: ${{ secrets.ALIGN_TOKEN }}
188
258
  ```
189
259
 
260
+ Resolve a flagged conflict (records the resolution so it stops surfacing):
261
+
262
+ ```bash
263
+ align check --resolve <decision_id>:honored # or overridden | context_changed
264
+ ```
265
+
190
266
  ## MCP server
191
267
 
192
- Run Align as a local [Model Context Protocol](https://modelcontextprotocol.io) server so AI assistants (Claude, Cursor, Windsurf) can query your decision graph inline.
268
+ Run Align as a local [Model Context Protocol](https://modelcontextprotocol.io) server so AI assistants (Claude Code, Claude Desktop, Cursor, Windsurf) can query your decision graph inline.
193
269
 
194
270
  ```bash
195
271
  align mcp --setup # auto-configure detected editors
@@ -224,7 +300,18 @@ align mcp # start the server directly
224
300
 
225
301
  **Cursor** - `~/.cursor/mcp.json` (same format as Claude Code above).
226
302
 
227
- Once configured, your AI assistant can call `align_search`, `align_ask`, `align_capture`, `align_check_drift`, and `align_get_related_decisions` to query and update your decision graph in context.
303
+ Once configured, your assistant can call these tools to query and update your decision graph in context:
304
+
305
+ | Tool | Purpose |
306
+ |------|---------|
307
+ | `align_ask` | Natural-language question about past decisions |
308
+ | `align_search` | Search the decision graph |
309
+ | `align_capture` | Capture a decision from a URL or text |
310
+ | `align_check_alignment` | Check a proposed change for conflicts with prior decisions |
311
+ | `align_check_drift` | Check whether code/config has drifted from a decision |
312
+ | `align_get_related_decisions` | Decisions related to a file or module |
313
+ | `align_get_conflicts` | Active conflicts in the graph |
314
+ | `align_get_impact` | Upstream/downstream impact of a decision |
228
315
 
229
316
  ## Environments
230
317
 
@@ -251,6 +338,8 @@ align --env local <command> # one-off override
251
338
  | `MISTRAL_API_KEY` | Mistral API key for `align ask` synthesis |
252
339
  | `OLLAMA_HOST` | Ollama host (default: `http://localhost:11434`) |
253
340
 
341
+ Advanced: override the model per provider with `ALIGN_ANTHROPIC_MODEL`, `ALIGN_OPENAI_MODEL`, `ALIGN_GEMINI_MODEL`, `ALIGN_GROQ_MODEL`, or `ALIGN_MISTRAL_MODEL`.
342
+
254
343
  ## Self-hosted
255
344
 
256
345
  ```bash
@@ -262,31 +351,39 @@ ALIGN_GATEWAY_URL=https://api.yourco.com align decisions list
262
351
  ## Command reference
263
352
 
264
353
  ```
265
- align setup Guided onboarding: connect tools, configure AI + MCP
354
+ align setup Guided onboarding: connect tools, configure MCP + auto-alignment
266
355
  align login Authenticate with Align
267
356
  align logout Remove stored credentials
268
- align whoami Show current authenticated user
269
- align ask <question> Ask a natural language question - get a synthesised answer
357
+ align whoami Show current authenticated user and tenant
358
+ align ask <query> Ask a natural language question (or pass a file path)
270
359
  align search <query> Keyword/semantic search - returns a ranked list
271
- align capture Capture a decision from a URL
272
- align check Check alignment against existing decisions
273
- align import git Import from Git commit history
360
+ align capture <url> Capture a decision from a URL (platform auto-detected)
361
+ align check Check current changes against the decision graph
362
+ align import git Import from Git commit history (no auth)
274
363
  align import github Import from GitHub
275
364
  align import gitlab Import from GitLab
276
365
  align import jira Import from Jira
277
366
  align import linear Import from Linear
278
367
  align import confluence Import from Confluence
279
368
  align import slack Import from Slack (experimental)
369
+ align import teams Import from Microsoft Teams
370
+ align import zoom Import from Zoom recording transcripts
280
371
  align import notion Import from Notion
281
372
  align decisions list List decisions in your graph
373
+ align decisions show <id> Show full detail for a decision
374
+ align export Export decisions as a structured brief
282
375
  align drift Show decisions that may be out of date
283
376
  align links list Show cross-tool decision relationships
284
- align spaces Manage decision spaces
377
+ align spaces list List spaces (project scopes)
285
378
  align env set <name> Set default environment
286
379
  align env get Show current environment
287
- align config ai Show configured AI provider
288
- align config ai set Configure an AI provider for align ask
289
- align config ai clear Remove stored AI provider
290
380
  align mcp Start local MCP server
291
381
  align mcp --setup Auto-configure editors to use Align as MCP server
382
+ align local start Initialize a local decision graph
383
+ align local status Show local graph statistics
384
+ align local reset Wipe the local graph
292
385
  ```
386
+
387
+ ## License
388
+
389
+ MIT - see [LICENSE](./LICENSE). The CLI and MCP server are open source; the hosted gateway is a separate commercial service.
@@ -1 +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,CA0G3D"}
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoH3D"}
@@ -6,6 +6,12 @@ import { createConfigStore } from '../lib/config.js';
6
6
  import { resolveEnv } from '../lib/resolve-env.js';
7
7
  import { createGatewayClient } from '../lib/gateway-client.js';
8
8
  import { getCurrentBranch, getHeadDiff, getStagedDiff, isGitRepo } from '../lib/git.js';
9
+ import { readHookPayload } from '../lib/hook-payload.js';
10
+ import { markSurfaced, recentlySurfaced } from '../lib/advisory-dedup.js';
11
+ // Advisory (PostToolUse hook) mode keeps a tight budget: a Write/Edit hook fires on
12
+ // every agent file change, so a slow gateway must never stall the edit. If the check
13
+ // hasn't answered within this window we fail open (exit 0, no output).
14
+ const ADVISORY_TIMEOUT_MS = 8000;
9
15
  export function registerCheckCommand(program) {
10
16
  program
11
17
  .command('check')
@@ -13,9 +19,18 @@ export function registerCheckCommand(program) {
13
19
  .option('--env <env>', 'Environment')
14
20
  .option('--all', 'Check full HEAD diff, not just staged changes')
15
21
  .option('--hook', 'Pre-commit mode: silent on no context, only fail on critical conflicts')
22
+ .option('--advisory', 'Claude Code hook mode: always exit 0, emit conflicting decisions as additionalContext JSON. Detects Pre vs PostToolUse from the hook payload on stdin')
23
+ .option('--block-on-critical', 'Advisory PreToolUse hook: deny an edit only on a CRITICAL conflict (default: never block, just surface context)')
16
24
  .option('--ci', 'CI mode: JSON output to stdout for GitHub Actions')
17
25
  .option('--resolve <resolution>', 'Record resolution for a conflict: <decision_id>:<type> where type is honored|overridden|context_changed')
18
26
  .action(async (opts) => {
27
+ // Advisory mode is the deterministic auto-alignment path (ALI-121/ALI-122):
28
+ // non-blocking, fail-open, machine-readable. It owns the whole flow, never
29
+ // touching the human-facing spinner/console output below.
30
+ if (opts.advisory) {
31
+ await runAdvisory(opts.env, { blockOnCritical: opts.blockOnCritical });
32
+ return;
33
+ }
19
34
  if (!await isGitRepo()) {
20
35
  if (!opts.ci)
21
36
  console.error(chalk.red('Not in a git repository'));
@@ -118,4 +133,97 @@ export function registerCheckCommand(program) {
118
133
  }
119
134
  });
120
135
  }
136
+ // Advisory (Claude Code hook) mode. Contract: ALWAYS exit 0 (never error out an
137
+ // edit), and on a conflict print the hook JSON so the conflicting decisions land in
138
+ // the agent's context. One entrypoint serves both hook events, detected from the
139
+ // payload Claude Code pipes on stdin:
140
+ // - PreToolUse -> check the PROPOSED edit before it is written (ALI-122)
141
+ // - PostToolUse -> check the landed working-tree diff (ALI-121); also the path for
142
+ // a manual `align check --advisory` run with no piped payload.
143
+ // Anything else (no repo, no diff, gateway down/slow, aligned) stays silent.
144
+ // Fail-open is the whole point - a hook that blocks or errors on every edit gets disabled.
145
+ async function runAdvisory(env, opts = {}) {
146
+ try {
147
+ const payload = await readHookPayload();
148
+ const pre = payload?.hook_event_name === 'PreToolUse';
149
+ let text;
150
+ let context;
151
+ if (pre) {
152
+ text = proposedChangeText(payload?.tool_input);
153
+ if (!text.trim())
154
+ process.exit(0);
155
+ context = payload?.tool_input?.file_path ?? '';
156
+ }
157
+ else {
158
+ if (!(await isGitRepo()))
159
+ process.exit(0);
160
+ text = await getHeadDiff();
161
+ if (!text.trim())
162
+ process.exit(0);
163
+ context = await getCurrentBranch().catch(() => '');
164
+ }
165
+ const envName = resolveEnv(env);
166
+ const config = createConfigStore();
167
+ const client = createGatewayClient(config.getEnvironment(envName));
168
+ // Race the check against a tight timeout so a slow gateway never stalls the edit.
169
+ const result = await Promise.race([
170
+ client.checkAlignment(text, context),
171
+ new Promise((resolve) => setTimeout(() => resolve(null), ADVISORY_TIMEOUT_MS)),
172
+ ]);
173
+ if (result?.status === 'conflicting' && result.conflicts?.length) {
174
+ // Drop conflicts the sibling hook already showed the agent moments ago.
175
+ const cwd = process.cwd();
176
+ const seen = recentlySurfaced(cwd);
177
+ const fresh = result.conflicts.filter((c) => !(c.decision_id && seen.has(c.decision_id)));
178
+ if (fresh.length) {
179
+ markSurfaced(cwd, fresh.map((c) => c.decision_id).filter((id) => Boolean(id)));
180
+ const output = pre
181
+ ? buildPreToolUseOutput(fresh, opts.blockOnCritical ?? false)
182
+ : buildPostToolUseOutput(fresh);
183
+ process.stdout.write(`${JSON.stringify(output)}\n`);
184
+ }
185
+ }
186
+ }
187
+ catch {
188
+ // Fail open: swallow everything (gateway error, network, bad config).
189
+ }
190
+ process.exit(0);
191
+ }
192
+ // The proposed change from a PreToolUse payload: Write sends the full content, Edit a
193
+ // new_string, MultiEdit a list of edits. We check the new text against the graph.
194
+ function proposedChangeText(input) {
195
+ if (!input)
196
+ return '';
197
+ if (typeof input.content === 'string')
198
+ return input.content;
199
+ if (Array.isArray(input.edits))
200
+ return input.edits.map((e) => e.new_string ?? '').join('\n');
201
+ if (typeof input.new_string === 'string')
202
+ return input.new_string;
203
+ return '';
204
+ }
205
+ // Render conflicts as a concise, actionable nudge for the agent's context.
206
+ function conflictContext(conflicts, closing) {
207
+ const lines = conflicts.map((c) => {
208
+ const reason = c.reason && c.reason !== 'Conflicts with an existing team decision' ? ` - ${c.reason}` : '';
209
+ const url = c.url ? ` (${c.url})` : '';
210
+ return `- [${c.severity}] ${c.title}${reason}${url}`;
211
+ });
212
+ return [
213
+ `Align decision graph: this change may conflict with ${conflicts.length} prior decision${conflicts.length > 1 ? 's' : ''}:`,
214
+ ...lines,
215
+ closing,
216
+ ].join('\n');
217
+ }
218
+ function buildPostToolUseOutput(conflicts) {
219
+ const additionalContext = conflictContext(conflicts, 'Reconcile with these decisions or confirm with the user before continuing.');
220
+ return { hookSpecificOutput: { hookEventName: 'PostToolUse', additionalContext } };
221
+ }
222
+ function buildPreToolUseOutput(conflicts, blockOnCritical) {
223
+ const summary = conflictContext(conflicts, 'Reconcile with these decisions or confirm with the user before writing this change.');
224
+ if (blockOnCritical && conflicts.some((c) => c.severity === 'critical')) {
225
+ return { hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'deny', permissionDecisionReason: summary } };
226
+ }
227
+ return { hookSpecificOutput: { hookEventName: 'PreToolUse', additionalContext: summary } };
228
+ }
121
229
  //# sourceMappingURL=check.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
@@ -46,7 +46,7 @@ export function registerLinksCommand(program) {
46
46
  l.from_decision.title,
47
47
  color(l.relation),
48
48
  l.to_decision.title,
49
- l.confidence.toFixed(1),
49
+ Number(l.confidence ?? 0).toFixed(1),
50
50
  ];
51
51
  }));
52
52
  if (items.length >= 5) {
@@ -1 +1 @@
1
- {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/commands/links.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/commands/links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerLocalCommand(program: Command): void;
3
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkE3D"}
@@ -0,0 +1,71 @@
1
+ import chalk from 'chalk';
2
+ import { createConfigStore } from '../lib/config.js';
3
+ import { createLocalDb } from '../lib/local-db.js';
4
+ import { getLocalDbPath, initLocalMode } from '../lib/local-mode.js';
5
+ export function registerLocalCommand(program) {
6
+ const local = program
7
+ .command('local')
8
+ .description('Manage your local decision graph (no account needed)');
9
+ local
10
+ .command('start')
11
+ .description('Initialize local decision graph')
12
+ .action(async () => {
13
+ const { intro, outro, spinner } = await import('@clack/prompts');
14
+ intro(chalk.bold('Align - Local Mode'));
15
+ const s = spinner();
16
+ s.start('Setting up local graph...');
17
+ const { dbPath } = await initLocalMode();
18
+ s.stop('Local graph ready');
19
+ outro(`${chalk.green('Your local Align graph is ready.')}\n` +
20
+ ` Graph stored at: ${chalk.dim(dbPath)}\n` +
21
+ ` No account needed. Data stays on your machine.\n\n` +
22
+ ` Run ${chalk.cyan('align mcp --setup')} to wire up your IDE, or\n` +
23
+ ` run ${chalk.cyan('ALIGN_ENV=local align mcp')} to start the MCP server.`);
24
+ });
25
+ local
26
+ .command('status')
27
+ .description('Show local graph statistics')
28
+ .action(() => {
29
+ const config = createConfigStore();
30
+ const env = config.getEnvironment('local');
31
+ if (env.mode !== 'local-embedded') {
32
+ console.log('Local mode is not active. Run `align local start` first.');
33
+ return;
34
+ }
35
+ const db = createLocalDb(env.localDbPath ?? getLocalDbPath());
36
+ const stats = db.getStats();
37
+ db.close();
38
+ console.log(`Decisions: ${stats.decisions}`);
39
+ console.log(`Embeddings: ${stats.embeddings}`);
40
+ console.log(`Conflicts: ${stats.conflicts}`);
41
+ });
42
+ local
43
+ .command('reset')
44
+ .description('Wipe local graph and reset config')
45
+ .action(async () => {
46
+ const { confirm, intro } = await import('@clack/prompts');
47
+ intro('Reset local graph');
48
+ const ok = await confirm({ message: 'This will delete all local decisions. Continue?' });
49
+ if (!ok) {
50
+ console.log('Cancelled.');
51
+ return;
52
+ }
53
+ const config = createConfigStore();
54
+ const env = config.getEnvironment('local');
55
+ if (env.localDbPath) {
56
+ const db = createLocalDb(env.localDbPath);
57
+ db.dropAll();
58
+ db.close();
59
+ // Remove the DB file and its WAL sidecars (-wal/-shm) for a true wipe
60
+ const { existsSync, rmSync } = await import('node:fs');
61
+ for (const suffix of ['', '-wal', '-shm']) {
62
+ const f = `${env.localDbPath}${suffix}`;
63
+ if (existsSync(f))
64
+ rmSync(f);
65
+ }
66
+ }
67
+ config.clearLocalMode();
68
+ console.log('Local graph wiped. Run `align local start` to reinitialize.');
69
+ });
70
+ }
71
+ //# sourceMappingURL=local.js.map