Intent Galaxy
Turn one vague goal into a galaxy: a central thesis, 4 adversarial experts and 12 thought nodes. Diverge first to see your blind spots, converge in about a minute with the keyboard,
then a zero-LLM pure-function compiler produces a deterministic LOCKED INTENT AST and injects it straight into Claude Code or an AI chat box.
Three ways to use it
How it works
flowchart LR
A["One vague goal"] --> B["AI generates the galaxy<br/>thesis + 4 quadrants × 3 nodes"]
B --> C["Diverge<br/>12 nodes and ✦ blind spots<br/>no edges"]
C --> D["Converge<br/>1/2/3 strategy cards + keyboard tweaks"]
D --> E["compileIntent<br/>pure function, zero LLM, ~1ms"]
E --> F["LOCKED INTENT AST"]
F --> G["Inject into Claude Code<br/>or an AI chat box"]
F --> H[".intent.lock.json<br/>(local CLI)"]
H --> I["Kill-gate post-mortem after 14 days"]
Quick start
Requires Node ≥ 22.18. Generating a galaxy also needs one of the Supported AI below (a signed-in CLI or an API key).
cd ~/code/some-repo
npx @stephen.taipei/intent-galaxy
Open http://127.0.0.1:4787, type a goal and press Enter to generate a galaxy.
Supported AI
API providers
Model lists for API providers are fetched live from the provider. CLIs run in read-only / plan mode and never modify files.
Register as MCP
Works with Claude Code, Codex, Gemini CLI and agy:
claude mcp add intent-galaxy -- npx -y @stephen.taipei/intent-galaxy
codex mcp add intent-galaxy -- npx -y @stephen.taipei/intent-galaxy
gemini mcp add intent-galaxy npx -y @stephen.taipei/intent-galaxy
agy mcp add intent-galaxy npx -y @stephen.taipei/intent-galaxy
Ask it to "analyze this goal with intent galaxy". The AI you're already using (Claude Code, Codex, …) generates the galaxy itself; no other model is called:
sequenceDiagram
actor U as You
participant H as Your current AI
participant M as intent-galaxy MCP
participant B as Galaxy in browser
U->>H: Analyze this goal with intent galaxy
H->>M: intent_spawner_prompt
M-->>H: Generation rules
H->>H: Writes the 12-node JSON itself
H->>M: intent_open_galaxy(JSON)
M->>B: Opens the galaxy
U->>B: Converge, then press Enter
B-->>M: LOCKED INTENT AST
M-->>H: AST back in the chat
14-day kill-gate
npx @stephen.taipei/intent-galaxy init-hook
flowchart LR
S["Sign<br/>.intent.lock.json"] --> Q["Days 0–14<br/>completely silent"]
Q --> X{"Commit after expiry<br/>touches scopePaths?"}
X -- No --> P["Allow"]
X -- Yes --> T{"Has the three<br/>Intent trailers?"}
T -- Yes --> P
T -- No --> R["Block commit"]
After expiry, a commit touching scopePaths must carry:
Intent-Lock: <specHash>
Intent-Kill: alive|dead|unobservable
Intent-Kill-Evidence: <at least 12 chars: the number you saw, or the number you're missing>
Keyboard
Works with IMEs (Chinese, Japanese, Korean) turned on, because keys are read from
e.code.
Browser extension
npm run build:ext # sync into apps/extension and apps/extension-firefox, ready for "Load unpacked"
npm run pack:ext # also produce dist-ext/intent-galaxy-{chrome,firefox}-<version>.zip for store upload
Type something you're torn about in the chat box, then click iG (or the toolbar icon, Cmd/Ctrl+Shift+G):
flowchart LR
A["Click iG"] --> B{"Generated in this<br/>conversation before?"}
B -- Yes --> C["Show the galaxy"]
B -- No --> D["Prompt goes into the chat box<br/>you press send"]
D --> E["Site AI replies with JSON"]
E --> F["Galaxy is drawn<br/>prompt and reply fold into one line"]
B -. Local CLI online .-> G["Or press 'Use local AI'<br/>no prompt in the chat"]
G --> F
Development
Architecture and data structures follow INTENT-SPEC-FINAL.md.
The README comes in five languages; when you change one, update all of README.md, README.zh-TW.md, README.zh-CN.md, README.ja.md and README.ko.md (npm test checks their structure matches).
Releasing
- Bump the version in
package.json, add a## X.Y.Z — datesection toCHANGELOG.md, runnpm run build:extso the extension manifests follow (npm testchecks), and merge tomain npm publish --access publiconmaingit tag vX.Y.Z && git push origin vX.Y.Z: the Release workflow checks the tag,package.jsonand npm agree, then creates the GitHub Release from that CHANGELOG section (it never publishes to npm)

