@aligndottech/cli 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +151 -54
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +125 -0
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +76 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/import/confluence.d.ts.map +1 -1
- package/dist/commands/import/confluence.js +25 -6
- package/dist/commands/import/confluence.js.map +1 -1
- package/dist/commands/import/git.js +1 -1
- package/dist/commands/import/jira.d.ts.map +1 -1
- package/dist/commands/import/jira.js +26 -6
- package/dist/commands/import/jira.js.map +1 -1
- package/dist/commands/links.js +1 -1
- package/dist/commands/links.js.map +1 -1
- package/dist/commands/local.d.ts +3 -0
- package/dist/commands/local.d.ts.map +1 -0
- package/dist/commands/local.js +71 -0
- package/dist/commands/local.js.map +1 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +5 -32
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/mcp.d.ts +2 -0
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +34 -12
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +609 -163
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/why.d.ts.map +1 -1
- package/dist/commands/why.js +46 -4
- package/dist/commands/why.js.map +1 -1
- package/dist/index.js +10 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/advisory-dedup.d.ts +3 -0
- package/dist/lib/advisory-dedup.d.ts.map +1 -0
- package/dist/lib/advisory-dedup.js +44 -0
- package/dist/lib/advisory-dedup.js.map +1 -0
- package/dist/lib/agent-rules.d.ts +10 -0
- package/dist/lib/agent-rules.d.ts.map +1 -0
- package/dist/lib/agent-rules.js +137 -0
- package/dist/lib/agent-rules.js.map +1 -0
- package/dist/lib/cli-oauth.d.ts +11 -0
- package/dist/lib/cli-oauth.d.ts.map +1 -0
- package/dist/lib/cli-oauth.js +71 -0
- package/dist/lib/cli-oauth.js.map +1 -0
- package/dist/lib/config.d.ts +10 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +36 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/errors.d.ts +5 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +9 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/fetchers/confluence.d.ts +4 -2
- package/dist/lib/fetchers/confluence.d.ts.map +1 -1
- package/dist/lib/fetchers/confluence.js +68 -12
- package/dist/lib/fetchers/confluence.js.map +1 -1
- package/dist/lib/fetchers/git.d.ts.map +1 -1
- package/dist/lib/fetchers/git.js +2 -0
- package/dist/lib/fetchers/git.js.map +1 -1
- package/dist/lib/fetchers/github.d.ts.map +1 -1
- package/dist/lib/fetchers/github.js +2 -0
- package/dist/lib/fetchers/github.js.map +1 -1
- package/dist/lib/fetchers/jira.d.ts +4 -2
- package/dist/lib/fetchers/jira.d.ts.map +1 -1
- package/dist/lib/fetchers/jira.js +30 -15
- package/dist/lib/fetchers/jira.js.map +1 -1
- package/dist/lib/fetchers/linear.d.ts.map +1 -1
- package/dist/lib/fetchers/linear.js +6 -1
- package/dist/lib/fetchers/linear.js.map +1 -1
- package/dist/lib/fetchers/notion.d.ts.map +1 -1
- package/dist/lib/fetchers/notion.js +29 -0
- package/dist/lib/fetchers/notion.js.map +1 -1
- package/dist/lib/fetchers/slack.d.ts.map +1 -1
- package/dist/lib/fetchers/slack.js +26 -0
- package/dist/lib/fetchers/slack.js.map +1 -1
- package/dist/lib/fetchers/teams.d.ts.map +1 -1
- package/dist/lib/fetchers/teams.js +3 -0
- package/dist/lib/fetchers/teams.js.map +1 -1
- package/dist/lib/fetchers/zoom.d.ts.map +1 -1
- package/dist/lib/fetchers/zoom.js +5 -0
- package/dist/lib/fetchers/zoom.js.map +1 -1
- package/dist/lib/format-date.d.ts +7 -0
- package/dist/lib/format-date.d.ts.map +1 -0
- package/dist/lib/format-date.js +26 -0
- package/dist/lib/format-date.js.map +1 -0
- package/dist/lib/gateway-client.d.ts +27 -2
- package/dist/lib/gateway-client.d.ts.map +1 -1
- package/dist/lib/gateway-client.js +39 -3
- package/dist/lib/gateway-client.js.map +1 -1
- package/dist/lib/git.d.ts.map +1 -1
- package/dist/lib/git.js +33 -16
- package/dist/lib/git.js.map +1 -1
- package/dist/lib/hook-payload.d.ts +20 -0
- package/dist/lib/hook-payload.d.ts.map +1 -0
- package/dist/lib/hook-payload.js +30 -0
- package/dist/lib/hook-payload.js.map +1 -0
- package/dist/lib/local-db.d.ts +51 -0
- package/dist/lib/local-db.d.ts.map +1 -0
- package/dist/lib/local-db.js +89 -0
- package/dist/lib/local-db.js.map +1 -0
- package/dist/lib/local-embeddings.d.ts +3 -0
- package/dist/lib/local-embeddings.d.ts.map +1 -0
- package/dist/lib/local-embeddings.js +20 -0
- package/dist/lib/local-embeddings.js.map +1 -0
- package/dist/lib/local-gateway-client.d.ts +98 -0
- package/dist/lib/local-gateway-client.d.ts.map +1 -0
- package/dist/lib/local-gateway-client.js +151 -0
- package/dist/lib/local-gateway-client.js.map +1 -0
- package/dist/lib/local-mode.d.ts +7 -0
- package/dist/lib/local-mode.d.ts.map +1 -0
- package/dist/lib/local-mode.js +39 -0
- package/dist/lib/local-mode.js.map +1 -0
- package/dist/lib/local-relationship-classifier.d.ts +14 -0
- package/dist/lib/local-relationship-classifier.d.ts.map +1 -0
- package/dist/lib/local-relationship-classifier.js +100 -0
- package/dist/lib/local-relationship-classifier.js.map +1 -0
- package/dist/lib/login-flow.d.ts +5 -0
- package/dist/lib/login-flow.d.ts.map +1 -0
- package/dist/lib/login-flow.js +64 -0
- package/dist/lib/login-flow.js.map +1 -0
- package/dist/lib/personal-import.d.ts +4 -0
- package/dist/lib/personal-import.d.ts.map +1 -1
- package/dist/lib/personal-import.js +133 -27
- package/dist/lib/personal-import.js.map +1 -1
- package/package.json +31 -12
- package/dist/lib/why-normalise.d.ts +0 -2
- package/dist/lib/why-normalise.d.ts.map +0 -1
- package/dist/lib/why-normalise.js +0 -39
- package/dist/lib/why-normalise.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
# Align CLI
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@aligndottech/cli)
|
|
4
|
+
[](https://github.com/aligndottech/align-cli/actions/workflows/ci.yml)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](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,
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
85
|
+
```bash
|
|
86
|
+
align ask src/auth/session.ts
|
|
87
|
+
```
|
|
46
88
|
|
|
47
|
-
|
|
89
|
+
### AI provider for conversational answers
|
|
48
90
|
|
|
49
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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_...
|
|
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` | `
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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"
|
|
165
|
-
align decisions list
|
|
166
|
-
align decisions list --space backend
|
|
167
|
-
align decisions
|
|
168
|
-
align
|
|
169
|
-
align
|
|
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
|
-
##
|
|
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
|
|
178
|
-
align check --
|
|
238
|
+
align check # check the staged diff
|
|
239
|
+
align check --all # check the full working-tree diff vs HEAD
|
|
179
240
|
```
|
|
180
241
|
|
|
181
|
-
|
|
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 --
|
|
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
|
|
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
|
|
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 <
|
|
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
|
|
272
|
-
align check Check
|
|
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
|
|
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;
|
|
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"}
|
package/dist/commands/check.js
CHANGED
|
@@ -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,8 +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')
|
|
25
|
+
.option('--resolve <resolution>', 'Record resolution for a conflict: <decision_id>:<type> where type is honored|overridden|context_changed')
|
|
17
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
|
+
}
|
|
18
34
|
if (!await isGitRepo()) {
|
|
19
35
|
if (!opts.ci)
|
|
20
36
|
console.error(chalk.red('Not in a git repository'));
|
|
@@ -83,6 +99,22 @@ export function registerCheckCommand(program) {
|
|
|
83
99
|
console.log(chalk.dim(` ${c.url}`));
|
|
84
100
|
console.log('');
|
|
85
101
|
}
|
|
102
|
+
if (opts.resolve) {
|
|
103
|
+
const colonIdx = opts.resolve.indexOf(':');
|
|
104
|
+
const decisionId = colonIdx > 0 ? opts.resolve.slice(0, colonIdx) : opts.resolve;
|
|
105
|
+
const resolutionType = colonIdx > 0 ? opts.resolve.slice(colonIdx + 1) : 'honored';
|
|
106
|
+
try {
|
|
107
|
+
await client.resolveConflict({
|
|
108
|
+
decision_id: decisionId,
|
|
109
|
+
resolution_type: resolutionType,
|
|
110
|
+
context: `align check on branch ${branch}`,
|
|
111
|
+
});
|
|
112
|
+
console.log(chalk.green(`\n Resolution recorded for ${decisionId} (${resolutionType})\n`));
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
console.log(chalk.dim(' (Could not record resolution - continuing)'));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
86
118
|
const hasCritical = conflicts.some(c => c.severity === 'critical');
|
|
87
119
|
if (opts.hook && !hasCritical)
|
|
88
120
|
process.exit(0);
|
|
@@ -101,4 +133,97 @@ export function registerCheckCommand(program) {
|
|
|
101
133
|
}
|
|
102
134
|
});
|
|
103
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
|
+
}
|
|
104
229
|
//# sourceMappingURL=check.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAgB,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAExF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4EAA4E,CAAC;SACzF,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC;SACpC,MAAM,CAAC,OAAO,EAAE,+CAA+C,CAAC;SAChE,MAAM,CAAC,QAAQ,EAAE,wEAAwE,CAAC;SAC1F,MAAM,CAAC,MAAM,EAAE,mDAAmD,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,IAAgE,EAAE,EAAE;QACjF,IAAI,CAAC,MAAM,SAAS,EAAE,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;YAC3B,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAA8B;YACzE,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,OAAO,GAAY,UAAU,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;QAEnE,IAAI,IAAI,GAAG,MAAM,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,GAAG,MAAM,WAAW,EAAE,CAAC;QAEzD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAExD,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAG,IAAI,CAAC,CAAC;gBACtD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAG,GAAa,CAAC,OAAO,EAAE,CAAG,IAAI,CAAC,CAAC;gBACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAC/D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACtD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC5D,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACd,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;wBAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBACnF,CAAC;oBACD,IAAI,CAAC,CAAC,GAAG;wBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;iBAAM,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,8BAA8B,CAAC,CAAC,CAAC;gBACzH,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,KAAK,UAAU;wBACrC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;wBACjC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBACvC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAClD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACd,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;wBAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC1F,CAAC;oBACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,0CAA0C,EAAE,CAAC;wBACxE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACtD,CAAC;oBACD,IAAI,CAAC,CAAC,GAAG;wBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;oBACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;gBACD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;gBACnE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW;oBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC5F,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAChD,yDAAyD;YACzD,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/commands/check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqD5D"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import { createConfigStore } from '../lib/config.js';
|
|
4
|
+
import { resolveEnv } from '../lib/resolve-env.js';
|
|
5
|
+
import { createGatewayClient } from '../lib/gateway-client.js';
|
|
6
|
+
function formatBrief(decisions) {
|
|
7
|
+
console.log(chalk.bold(`\n Decision Brief - ${new Date().toLocaleDateString()}\n`));
|
|
8
|
+
console.log(chalk.dim(` ${decisions.length} decision(s)\n`));
|
|
9
|
+
for (const d of decisions) {
|
|
10
|
+
const statusColor = d.status === 'active' ? chalk.green : d.status === 'superseded' ? chalk.dim : chalk.yellow;
|
|
11
|
+
console.log(` ${chalk.bold(d.title)} ${statusColor(d.status ?? 'unknown')}`);
|
|
12
|
+
if (d.summary) {
|
|
13
|
+
const snippet = d.summary.slice(0, 200).replace(/\n/g, ' ');
|
|
14
|
+
console.log(chalk.dim(` ${snippet}${d.summary.length > 200 ? '...' : ''}`));
|
|
15
|
+
}
|
|
16
|
+
const parts = [];
|
|
17
|
+
if (d.platform)
|
|
18
|
+
parts.push(d.platform);
|
|
19
|
+
if (d.created_at)
|
|
20
|
+
parts.push(new Date(d.created_at).toLocaleDateString());
|
|
21
|
+
if (parts.length > 0)
|
|
22
|
+
console.log(chalk.dim(` ${parts.join(' | ')}`));
|
|
23
|
+
console.log('');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function registerExportCommand(program) {
|
|
27
|
+
program
|
|
28
|
+
.command('export [topic]')
|
|
29
|
+
.description('Export decisions as a structured brief. Optionally filter by topic.')
|
|
30
|
+
.option('--env <env>', 'Environment')
|
|
31
|
+
.option('--format <fmt>', 'Output format: brief or json', 'brief')
|
|
32
|
+
.option('--limit <n>', 'Max decisions to include', '50')
|
|
33
|
+
.action(async (topic, opts) => {
|
|
34
|
+
const config = createConfigStore();
|
|
35
|
+
const client = createGatewayClient(config.getEnvironment(resolveEnv(opts.env)));
|
|
36
|
+
const limit = Math.max(1, parseInt(opts.limit, 10) || 50);
|
|
37
|
+
const spinner = ora(topic ? `Searching for "${topic}"...` : 'Fetching decisions...').start();
|
|
38
|
+
try {
|
|
39
|
+
let decisions;
|
|
40
|
+
if (topic) {
|
|
41
|
+
const result = await client.searchDecisions(topic, limit);
|
|
42
|
+
decisions = result.results.map(r => ({
|
|
43
|
+
id: r.id,
|
|
44
|
+
title: r.title,
|
|
45
|
+
summary: r.summary,
|
|
46
|
+
platform: r['platform'] ?? 'unknown',
|
|
47
|
+
status: r.status,
|
|
48
|
+
similarity: r.similarity,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const raw = await client.listDecisions({ limit });
|
|
53
|
+
decisions = (Array.isArray(raw) ? raw : []);
|
|
54
|
+
}
|
|
55
|
+
spinner.stop();
|
|
56
|
+
if (decisions.length === 0) {
|
|
57
|
+
console.log(chalk.dim('\n No decisions found in your graph.\n'));
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (opts.format === 'json') {
|
|
61
|
+
process.stdout.write(JSON.stringify({
|
|
62
|
+
decisions,
|
|
63
|
+
count: decisions.length,
|
|
64
|
+
exported_at: new Date().toISOString(),
|
|
65
|
+
}, null, 2));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
formatBrief(decisions);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
spinner.fail(chalk.red(err.message));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=export.js.map
|