atlias 0.0.0-stage → 4.0.1
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/.claude-plugin/marketplace.json +22 -0
- package/.claude-plugin/plugin.json +35 -0
- package/.codex-plugin/plugin.json +42 -0
- package/.mcp.json +6 -0
- package/CHANGELOG.md +7 -0
- package/LICENSE +21 -0
- package/README.md +58 -3
- package/assets/atlias-logo.svg +14 -0
- package/bin/atlias.mjs +83 -0
- package/docs/API-SUBHARNESS.md +36 -0
- package/hooks/hooks.json +118 -0
- package/lib/brief.mjs +168 -0
- package/lib/core.mjs +571 -0
- package/lib/dream.mjs +138 -0
- package/lib/gate.mjs +420 -0
- package/lib/graph.mjs +121 -0
- package/lib/guard.mjs +86 -0
- package/lib/hooks.mjs +79 -0
- package/lib/hosts-extra.mjs +114 -0
- package/lib/hosts.mjs +297 -0
- package/lib/integrity.mjs +325 -0
- package/lib/pointer.mjs +164 -0
- package/lib/proc.mjs +208 -0
- package/lib/progress.mjs +130 -0
- package/lib/provider.mjs +103 -0
- package/lib/resolve-command.mjs +16 -0
- package/lib/router.mjs +60 -0
- package/lib/settings.mjs +255 -0
- package/lib/shortcut.mjs +174 -0
- package/lib/skills.mjs +169 -0
- package/lib/subharness.mjs +176 -0
- package/lib/track.mjs +200 -0
- package/mcp/server.mjs +54 -0
- package/mcp/tools.mjs +137 -0
- package/package.json +47 -4
- package/test/install-sandbox.mjs +54 -0
- package/test/public-package.mjs +91 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json",
|
|
3
|
+
"name": "atlias",
|
|
4
|
+
"description": "sub-atlias: the free sub version of Atlias (not the full Atlias app) for shared memory, knowledge graphs, hooks, MCP tools, and verification.",
|
|
5
|
+
"owner": {
|
|
6
|
+
"name": "Gev",
|
|
7
|
+
"email": "app.ridelink@gmail.com"
|
|
8
|
+
},
|
|
9
|
+
"plugins": [
|
|
10
|
+
{
|
|
11
|
+
"name": "atlias",
|
|
12
|
+
"description": "sub-atlias, the free sub version of Atlias (not the full app): shared project memory, a knowledge graph, host hooks, MCP tools, and verification.",
|
|
13
|
+
"author": {
|
|
14
|
+
"name": "Gev"
|
|
15
|
+
},
|
|
16
|
+
"category": "productivity",
|
|
17
|
+
"source": "./",
|
|
18
|
+
"homepage": "https://github.com/ridelink0/atlias",
|
|
19
|
+
"version": "4.0.1"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
|
+
"name": "atlias",
|
|
4
|
+
"version": "4.0.1",
|
|
5
|
+
"description": "sub-atlias, the free sub version of Atlias (not the full app): shared project memory, a knowledge graph, host hooks, MCP tools, and verification.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Gev",
|
|
8
|
+
"url": "https://github.com/ridelink0"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://github.com/ridelink0/atlias",
|
|
11
|
+
"repository": "https://github.com/ridelink0/atlias",
|
|
12
|
+
"license": "MIT",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"agent harness",
|
|
15
|
+
"harness",
|
|
16
|
+
"sub-harness",
|
|
17
|
+
"claude code",
|
|
18
|
+
"codex",
|
|
19
|
+
"antigravity",
|
|
20
|
+
"gemini cli",
|
|
21
|
+
"nanobot",
|
|
22
|
+
"memory",
|
|
23
|
+
"knowledge graph",
|
|
24
|
+
"graphify",
|
|
25
|
+
"context engineering",
|
|
26
|
+
"hooks",
|
|
27
|
+
"mcp",
|
|
28
|
+
"verification",
|
|
29
|
+
"agent framework",
|
|
30
|
+
"coding agent",
|
|
31
|
+
"long-running agents",
|
|
32
|
+
"compaction",
|
|
33
|
+
"dream"
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "atlias",
|
|
3
|
+
"version": "4.0.1",
|
|
4
|
+
"description": "A sub-harness for shared project memory, a knowledge graph, host hooks, MCP tools, and verification.",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Gev",
|
|
7
|
+
"url": "https://github.com/ridelink0"
|
|
8
|
+
},
|
|
9
|
+
"homepage": "https://github.com/ridelink0/atlias",
|
|
10
|
+
"repository": "https://github.com/ridelink0/atlias",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"agent harness",
|
|
14
|
+
"sub-harness",
|
|
15
|
+
"coding agent",
|
|
16
|
+
"verification",
|
|
17
|
+
"memory",
|
|
18
|
+
"knowledge graph",
|
|
19
|
+
"context engineering",
|
|
20
|
+
"codex",
|
|
21
|
+
"claude code",
|
|
22
|
+
"mcp"
|
|
23
|
+
],
|
|
24
|
+
"interface": {
|
|
25
|
+
"displayName": "atlias",
|
|
26
|
+
"shortDescription": "Done means done: checks every claim of done against what really happened",
|
|
27
|
+
"longDescription": "atlias checks an agent's claim that it finished against the session itself: a pass claimed with no test run, a pass after a failing run, done with no check since the last edit, placeholders, weakened tests, new code nothing calls, files that do not parse, loops, and destructive commands. It adds a memory shared with every other harness and a knowledge graph that answers codebase questions before files are read. The hooks and the MCP server come from atlias install --codex, which points Codex at a launcher that survives updates.",
|
|
28
|
+
"developerName": "Gev",
|
|
29
|
+
"category": "Developer Tools",
|
|
30
|
+
"capabilities": [
|
|
31
|
+
"Read",
|
|
32
|
+
"Write"
|
|
33
|
+
],
|
|
34
|
+
"websiteURL": "https://github.com/ridelink0/atlias",
|
|
35
|
+
"defaultPrompt": [
|
|
36
|
+
"Double-check that the last change really works",
|
|
37
|
+
"What does atlias know about this project?",
|
|
38
|
+
"Set up atlias for this machine"
|
|
39
|
+
],
|
|
40
|
+
"brandColor": "#1d4ed8"
|
|
41
|
+
}
|
|
42
|
+
}
|
package/.mcp.json
ADDED
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 4.0.0
|
|
4
|
+
|
|
5
|
+
- Replaces the public package payload with the atlias host integration: install, native launch metering, hooks, MCP, shared memory, graph, and verification.
|
|
6
|
+
- Removes the standalone agent, private harness loop, evaluation corpora, internal reports, and benchmark runner from the package payload.
|
|
7
|
+
- Preserves the repository's existing Git history and MIT license.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gev
|
|
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
CHANGED
|
@@ -1,3 +1,58 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
This version
|
|
1
|
+
# sub-atlias
|
|
2
|
+
|
|
3
|
+
> **This is sub-atlias, the free sub version of Atlias, not Atlias itself.** It runs inside a coding host you already use (Claude Code, Codex, Antigravity or Gemini CLI) and adds to it. The full Atlias app, with its own agent loop (the one measured at 19.52x fewer tokens than plain Claude Code), is a separate paid product and is not in this repository. The command and plugin are still named `atlias`.
|
|
4
|
+
|
|
5
|
+
sub-atlias adds shared project memory, a knowledge graph, and verification hooks to the host. It leaves model choice and provider billing with you.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
Install the terminal package with Node.js 18 or newer:
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install --global github:ridelink0/atlias
|
|
13
|
+
atlias install --claude
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Choose the host you use: `--claude`, `--codex`, `--antigravity`, or `--gemini`. Run `atlias doctor` to check the install. `atlias uninstall --codex|--antigravity|--gemini` removes the entries atlias added for that host. Remove the Claude Code plugin with `/plugin uninstall atlias@atlias` inside Claude Code.
|
|
17
|
+
|
|
18
|
+
For Claude Code's plugin browser, add `ridelink0/atlias` as a marketplace and install `atlias`. Codex users can add the repository as a plugin marketplace, then run `atlias install --codex` to configure its MCP server and hooks.
|
|
19
|
+
|
|
20
|
+
## What it adds
|
|
21
|
+
|
|
22
|
+
- One project memory shared through host MCP tools.
|
|
23
|
+
- Knowledge graph queries and change-impact lookups when a graph is present.
|
|
24
|
+
- Hooks that track edits, check syntax and test evidence, keep a handoff note, and flag repeated or destructive commands.
|
|
25
|
+
- Optional native launcher for Claude Code or Codex using a provider profile you supply. The profile stores only the environment variable name for a credential; the credential itself stays in your environment. Usage receipts record provider-reported token counts and optional price estimates.
|
|
26
|
+
|
|
27
|
+
The launcher accepts Claude's Anthropic Messages API or Codex's Responses API. It does not provide subscription OAuth or promise that provider subscriptions cover API use. See [docs/API-SUBHARNESS.md](docs/API-SUBHARNESS.md) for profiles and receipts.
|
|
28
|
+
|
|
29
|
+
## Benchmarks
|
|
30
|
+
|
|
31
|
+
Measured on one PC with a local model (qwen3.5:9b through Ollama, 32,768-token window); a task counts as solved only when its hidden check passes.
|
|
32
|
+
|
|
33
|
+
| Run | Arms | Solved | Total tokens | Fewer tokens |
|
|
34
|
+
| --- | --- | --- | --- | --- |
|
|
35
|
+
| Ten-task smoke, 2026-10-16 (one run per arm) | Claude Code + this sub-harness / plain Claude Code | 8 / 10 and 8 / 10 | 250,143 and 659,112 | 2.63x |
|
|
36
|
+
|
|
37
|
+
- That trial build also carried two Claude Code mods (tool deferral and a short skill listing). This 4.0.1 package does not ship them, so the saving of a standard install is not measured.
|
|
38
|
+
- Not measured against a Claude plan's 5-hour limit. The session brief this package adds at session start counts toward it, so on a Claude subscription it can use more of that limit than plain Claude Code.
|
|
39
|
+
- Atlias's own agent (the full app, not this package) measured a pooled 19.52x fewer tokens than plain Claude Code over nine 120-run screens on the same model; see [the evidence page](https://atlias-ridelink.netlify.app/evidence.html).
|
|
40
|
+
|
|
41
|
+
## Free to use, open to contributors
|
|
42
|
+
|
|
43
|
+
This sub-harness is free to use, including commercially, under the MIT license. Contributions are welcome; see [Contributing](#contributing).
|
|
44
|
+
|
|
45
|
+
The exception is the Atlias harness itself: its standalone agent and private harness loop are not in this repository and are not free to use.
|
|
46
|
+
|
|
47
|
+
## Local development
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
npm test
|
|
51
|
+
npm run test:install
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The package has no third-party runtime dependencies. It is distributed under the MIT license; see [LICENSE](LICENSE).
|
|
55
|
+
|
|
56
|
+
## Contributing
|
|
57
|
+
|
|
58
|
+
If you're interested in contributing to sub-atlias, please read our [contributing guide](CONTRIBUTING.md) before submitting a pull request.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="1280" height="640" viewBox="0 0 1280 640" role="img" aria-label="atlias: a sub-harness, or an agent of its own">
|
|
2
|
+
<title>atlias</title>
|
|
3
|
+
<defs>
|
|
4
|
+
<radialGradient id="sky" cx="50%" cy="45%" r="75%"><stop offset="0" stop-color="#0b1a3d"/><stop offset="1" stop-color="#030712"/></radialGradient>
|
|
5
|
+
<linearGradient id="hull" x1="0" y1="0" x2="1" y2="0"><stop offset="0" stop-color="#bfdbfe"/><stop offset="1" stop-color="#3b82f6"/></linearGradient>
|
|
6
|
+
<filter id="glow" x="-20%" y="-40%" width="140%" height="180%"><feGaussianBlur stdDeviation="15.4"/></filter>
|
|
7
|
+
</defs>
|
|
8
|
+
<rect width="1280" height="640" rx="0" fill="url(#sky)"/>
|
|
9
|
+
<circle cx="764.2" cy="191.5" r="1.47" fill="#dbeafe" opacity="0.84"/><circle cx="860.4" cy="338.7" r="1.99" fill="#dbeafe" opacity="0.80"/><circle cx="95.4" cy="638.3" r="0.94" fill="#dbeafe" opacity="0.37"/><circle cx="1270.7" cy="37.8" r="1.21" fill="#dbeafe" opacity="0.27"/><circle cx="92.2" cy="431.2" r="2.08" fill="#dbeafe" opacity="0.74"/><circle cx="948.8" cy="40.8" r="1.59" fill="#dbeafe" opacity="0.55"/><circle cx="261.0" cy="571.1" r="0.71" fill="#dbeafe" opacity="0.73"/><circle cx="187.3" cy="17.4" r="1.75" fill="#dbeafe" opacity="0.69"/><circle cx="1104.9" cy="523.3" r="1.94" fill="#dbeafe" opacity="0.70"/><circle cx="46.3" cy="217.0" r="0.84" fill="#dbeafe" opacity="0.65"/><circle cx="490.3" cy="191.6" r="1.86" fill="#dbeafe" opacity="0.44"/><circle cx="1119.3" cy="357.2" r="0.92" fill="#dbeafe" opacity="0.53"/><circle cx="734.8" cy="265.7" r="1.08" fill="#dbeafe" opacity="0.75"/><circle cx="769.0" cy="226.1" r="1.75" fill="#dbeafe" opacity="0.60"/><circle cx="511.3" cy="367.2" r="0.98" fill="#dbeafe" opacity="0.30"/><circle cx="756.8" cy="336.0" r="1.33" fill="#dbeafe" opacity="0.43"/><circle cx="578.4" cy="51.0" r="1.83" fill="#dbeafe" opacity="0.37"/><circle cx="154.4" cy="544.1" r="1.57" fill="#dbeafe" opacity="0.62"/><circle cx="1193.2" cy="159.2" r="1.37" fill="#dbeafe" opacity="0.49"/><circle cx="808.4" cy="435.3" r="0.97" fill="#dbeafe" opacity="0.37"/><circle cx="790.2" cy="0.2" r="1.05" fill="#dbeafe" opacity="0.72"/><circle cx="980.9" cy="276.5" r="1.19" fill="#dbeafe" opacity="0.56"/><circle cx="325.0" cy="187.1" r="1.95" fill="#dbeafe" opacity="0.42"/><circle cx="761.2" cy="37.7" r="2.00" fill="#dbeafe" opacity="0.66"/><circle cx="574.1" cy="111.5" r="1.92" fill="#dbeafe" opacity="0.42"/><circle cx="283.4" cy="291.3" r="1.84" fill="#dbeafe" opacity="0.47"/><circle cx="1.3" cy="269.5" r="0.77" fill="#dbeafe" opacity="0.84"/><circle cx="355.4" cy="368.7" r="1.55" fill="#dbeafe" opacity="0.79"/><circle cx="923.0" cy="623.6" r="1.01" fill="#dbeafe" opacity="0.39"/><circle cx="634.2" cy="252.4" r="1.86" fill="#dbeafe" opacity="0.55"/><circle cx="1208.3" cy="498.4" r="1.41" fill="#dbeafe" opacity="0.80"/><circle cx="498.6" cy="374.0" r="2.02" fill="#dbeafe" opacity="0.53"/><circle cx="432.2" cy="476.2" r="2.04" fill="#dbeafe" opacity="0.77"/><circle cx="230.9" cy="157.4" r="1.15" fill="#dbeafe" opacity="0.28"/><circle cx="174.4" cy="423.4" r="1.90" fill="#dbeafe" opacity="0.39"/><circle cx="707.1" cy="182.7" r="0.90" fill="#dbeafe" opacity="0.61"/><circle cx="822.8" cy="587.0" r="2.06" fill="#dbeafe" opacity="0.40"/><circle cx="871.9" cy="76.2" r="1.92" fill="#dbeafe" opacity="0.45"/><circle cx="399.2" cy="443.8" r="0.78" fill="#dbeafe" opacity="0.76"/><circle cx="454.6" cy="176.4" r="1.58" fill="#dbeafe" opacity="0.53"/><circle cx="711.6" cy="596.4" r="1.32" fill="#dbeafe" opacity="0.84"/><circle cx="95.1" cy="374.1" r="1.64" fill="#dbeafe" opacity="0.35"/><circle cx="778.1" cy="490.8" r="1.54" fill="#dbeafe" opacity="0.28"/><circle cx="1146.3" cy="304.5" r="1.29" fill="#dbeafe" opacity="0.75"/><circle cx="967.5" cy="100.8" r="2.04" fill="#dbeafe" opacity="0.44"/><circle cx="124.5" cy="140.1" r="0.70" fill="#dbeafe" opacity="0.71"/><circle cx="980.4" cy="370.0" r="0.62" fill="#dbeafe" opacity="0.49"/><circle cx="1043.2" cy="284.2" r="0.89" fill="#dbeafe" opacity="0.38"/><circle cx="205.2" cy="383.1" r="1.53" fill="#dbeafe" opacity="0.44"/><circle cx="842.2" cy="79.0" r="1.97" fill="#dbeafe" opacity="0.32"/><circle cx="1267.4" cy="89.5" r="1.01" fill="#dbeafe" opacity="0.30"/><circle cx="883.8" cy="279.9" r="1.69" fill="#dbeafe" opacity="0.27"/><circle cx="78.2" cy="0.3" r="0.79" fill="#dbeafe" opacity="0.55"/><circle cx="78.8" cy="631.4" r="1.10" fill="#dbeafe" opacity="0.34"/><circle cx="272.1" cy="207.0" r="1.35" fill="#dbeafe" opacity="0.56"/><circle cx="1254.7" cy="454.4" r="1.56" fill="#dbeafe" opacity="0.34"/><circle cx="362.1" cy="507.8" r="1.80" fill="#dbeafe" opacity="0.55"/><circle cx="111.4" cy="464.6" r="1.79" fill="#dbeafe" opacity="0.29"/><circle cx="144.7" cy="204.0" r="0.95" fill="#dbeafe" opacity="0.41"/><circle cx="815.7" cy="356.4" r="1.97" fill="#dbeafe" opacity="0.57"/><circle cx="1101.2" cy="324.8" r="0.81" fill="#dbeafe" opacity="0.64"/><circle cx="656.3" cy="338.7" r="1.84" fill="#dbeafe" opacity="0.84"/><circle cx="794.0" cy="440.9" r="2.01" fill="#dbeafe" opacity="0.45"/><circle cx="1174.1" cy="319.5" r="2.00" fill="#dbeafe" opacity="0.83"/><circle cx="1196.8" cy="554.2" r="1.48" fill="#dbeafe" opacity="0.27"/><circle cx="901.9" cy="53.1" r="1.57" fill="#dbeafe" opacity="0.27"/><circle cx="1222.2" cy="7.8" r="1.96" fill="#dbeafe" opacity="0.76"/><circle cx="56.2" cy="280.5" r="0.77" fill="#dbeafe" opacity="0.56"/><circle cx="65.1" cy="218.9" r="0.94" fill="#dbeafe" opacity="0.50"/><circle cx="1001.9" cy="498.3" r="2.08" fill="#dbeafe" opacity="0.47"/><circle cx="1050.5" cy="346.9" r="1.42" fill="#dbeafe" opacity="0.33"/><circle cx="734.6" cy="337.1" r="0.75" fill="#dbeafe" opacity="0.41"/><circle cx="12.8" cy="108.1" r="1.11" fill="#dbeafe" opacity="0.43"/><circle cx="680.0" cy="630.6" r="1.45" fill="#dbeafe" opacity="0.60"/><circle cx="1162.8" cy="596.4" r="2.09" fill="#dbeafe" opacity="0.59"/><circle cx="950.0" cy="56.1" r="0.84" fill="#dbeafe" opacity="0.53"/><circle cx="1192.2" cy="416.1" r="0.63" fill="#dbeafe" opacity="0.37"/><circle cx="961.5" cy="502.3" r="1.76" fill="#dbeafe" opacity="0.72"/><circle cx="523.2" cy="26.1" r="0.95" fill="#dbeafe" opacity="0.65"/><circle cx="883.0" cy="286.2" r="1.59" fill="#dbeafe" opacity="0.39"/><circle cx="373.1" cy="8.5" r="2.01" fill="#dbeafe" opacity="0.81"/><circle cx="126.1" cy="251.7" r="1.13" fill="#dbeafe" opacity="0.71"/><circle cx="1129.0" cy="72.9" r="0.93" fill="#dbeafe" opacity="0.32"/><circle cx="866.3" cy="202.8" r="1.41" fill="#dbeafe" opacity="0.84"/><circle cx="316.7" cy="436.2" r="2.18" fill="#dbeafe" opacity="0.83"/><circle cx="829.5" cy="438.6" r="1.53" fill="#dbeafe" opacity="0.75"/><circle cx="820.3" cy="350.3" r="1.87" fill="#dbeafe" opacity="0.56"/><circle cx="136.6" cy="180.0" r="2.19" fill="#dbeafe" opacity="0.77"/><circle cx="1276.7" cy="420.5" r="0.84" fill="#dbeafe" opacity="0.65"/><circle cx="346.6" cy="636.4" r="1.62" fill="#dbeafe" opacity="0.37"/><circle cx="1215.9" cy="331.2" r="0.88" fill="#dbeafe" opacity="0.70"/>
|
|
10
|
+
<g filter="url(#glow)" opacity="0.55"><rect x="162" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="184" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="206" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="228" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="250" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="294" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="316" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="338" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="360" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="382" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="426" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="558" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="580" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="602" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="624" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="646" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="690" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="712" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="734" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="756" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="778" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="822" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="844" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="866" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="888" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="910" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="162" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="250" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="338" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="426" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="602" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="690" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="778" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="822" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="162" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="184" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="206" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="228" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="250" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="338" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="426" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="602" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="690" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="712" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="734" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="756" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="778" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="822" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="844" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="866" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="888" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="910" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="162" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="250" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="338" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="426" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="602" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="690" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="778" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="910" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="162" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="250" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="338" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="426" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="448" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="470" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="492" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="514" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="558" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="580" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="602" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="624" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="646" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="690" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="778" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="822" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="844" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="866" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="888" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="910" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/></g>
|
|
11
|
+
<rect x="162" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="184" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="206" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="228" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="250" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="294" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="316" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="338" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="360" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="382" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="426" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="558" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="580" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="602" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="624" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="646" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="690" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="712" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="734" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="756" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="778" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="822" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="844" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="866" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="888" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="910" y="245" width="19" height="19" rx="3" fill="#93c5fd"/><rect x="162" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="250" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="338" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="426" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="602" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="690" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="778" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="822" y="267" width="19" height="19" rx="3" fill="#60a5fa"/><rect x="162" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="184" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="206" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="228" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="250" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="338" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="426" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="602" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="690" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="712" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="734" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="756" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="778" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="822" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="844" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="866" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="888" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="910" y="289" width="19" height="19" rx="3" fill="#3b82f6"/><rect x="162" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="250" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="338" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="426" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="602" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="690" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="778" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="910" y="311" width="19" height="19" rx="3" fill="#2563eb"/><rect x="162" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="250" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="338" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="426" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="448" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="470" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="492" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="514" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="558" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="580" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="602" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="624" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="646" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="690" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="778" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="822" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="844" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="866" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="888" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/><rect x="910" y="333" width="19" height="19" rx="3" fill="#1d4ed8"/>
|
|
12
|
+
<g><path d="M967.2,286.8 L1013.2,272.8 L1037.2,276.8 L1045.2,286.8 L1037.2,296.8 L1013.2,300.8 Z" fill="url(#hull)"/><path d="M1007.2,274.8 L1025.2,252.8 L1035.2,254.8 L1029.2,276.8 Z" fill="#2563eb"/><path d="M1007.2,298.8 L1025.2,320.8 L1035.2,318.8 L1029.2,296.8 Z" fill="#1d4ed8"/><ellipse cx="997.2" cy="286.8" rx="11.0" ry="5.5" fill="#dbeafe" opacity="0.9"/><rect x="1047.2" y="283.8" width="26.0" height="6.0" rx="3.0" fill="#60a5fa"/><circle cx="1083.2" cy="286.8" r="3.20" fill="#93c5fd" opacity="0.90"/><circle cx="1097.2" cy="286.8" r="2.40" fill="#93c5fd" opacity="0.65"/><circle cx="1111.2" cy="286.8" r="1.60" fill="#93c5fd" opacity="0.40"/></g>
|
|
13
|
+
<text x="640" y="403.4" text-anchor="middle" font-family="'JetBrains Mono','Cascadia Code',Consolas,'SFMono-Regular',Menlo,monospace" font-size="23" fill="#bfdbfe" letter-spacing="1">a sub-harness, or an agent of its own</text>
|
|
14
|
+
</svg>
|
package/bin/atlias.mjs
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import { VERSION } from '../lib/core.mjs';
|
|
4
|
+
import * as hosts from '../lib/hosts.mjs';
|
|
5
|
+
import * as extras from '../lib/hosts-extra.mjs';
|
|
6
|
+
import * as provider from '../lib/provider.mjs';
|
|
7
|
+
import * as subharness from '../lib/subharness.mjs';
|
|
8
|
+
|
|
9
|
+
const args = process.argv.slice(2);
|
|
10
|
+
const command = args[0] || 'help';
|
|
11
|
+
const say = (value) => process.stdout.write(String(value) + '\n');
|
|
12
|
+
const help = `atlias ${VERSION} — shared memory, graph, and verification inside your existing coding host.
|
|
13
|
+
|
|
14
|
+
Commands:
|
|
15
|
+
atlias install [--claude|--codex|--antigravity|--gemini]
|
|
16
|
+
atlias uninstall [--claude|--codex|--antigravity|--gemini]
|
|
17
|
+
atlias sub --host claude|codex --profile provider.json [--log receipts.jsonl] [--executable cli] -- [native arguments]
|
|
18
|
+
atlias provider check provider.json
|
|
19
|
+
atlias provider usage receipts.jsonl
|
|
20
|
+
atlias doctor
|
|
21
|
+
atlias version`;
|
|
22
|
+
|
|
23
|
+
function selectedHosts(names) {
|
|
24
|
+
const selected = names.filter((name) => args.includes(`--${name}`));
|
|
25
|
+
const permitted = new Set([...names.map((name) => `--${name}`), ...(command === 'install' ? ['--gemini-hooks'] : [])]);
|
|
26
|
+
const invalid = args.slice(1).filter((arg) => !permitted.has(arg));
|
|
27
|
+
if (invalid.length) throw Error(`Unsupported host option: ${invalid[0]}.`);
|
|
28
|
+
if (!selected.length) throw Error(`Choose a host: ${names.map((name) => `--${name}`).join(', ')}.`);
|
|
29
|
+
if (args.includes('--gemini-hooks') && !selected.includes('gemini')) throw Error('--gemini-hooks requires --gemini.');
|
|
30
|
+
return selected;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
try {
|
|
34
|
+
if (['help', '--help', '-h'].includes(command)) say(help);
|
|
35
|
+
else if (command === 'version' || command === '--version' || command === '-v') say(`atlias ${VERSION}`);
|
|
36
|
+
else if (command === 'install') {
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const host of selectedHosts(['claude', 'codex', 'antigravity', 'gemini'])) {
|
|
39
|
+
if (host === 'claude') out.push(...hosts.installClaude());
|
|
40
|
+
if (host === 'codex') out.push(...hosts.installCodex());
|
|
41
|
+
if (host === 'antigravity') out.push(...hosts.installAntigravity());
|
|
42
|
+
if (host === 'gemini') out.push(...hosts.installGemini(args.includes('--gemini-hooks')));
|
|
43
|
+
}
|
|
44
|
+
say(out.join('\n'));
|
|
45
|
+
} else if (command === 'uninstall') {
|
|
46
|
+
const out = [];
|
|
47
|
+
for (const host of selectedHosts(['claude', 'codex', 'antigravity', 'gemini'])) {
|
|
48
|
+
if (host === 'claude') out.push('Claude Code plugin: use /plugin uninstall atlias@atlias inside Claude Code.');
|
|
49
|
+
if (host === 'codex') out.push(...hosts.uninstallCodex());
|
|
50
|
+
if (host === 'antigravity') out.push(...hosts.uninstallAntigravity());
|
|
51
|
+
if (host === 'gemini') out.push(...hosts.uninstallGemini());
|
|
52
|
+
}
|
|
53
|
+
say(out.join('\n'));
|
|
54
|
+
} else if (command === 'doctor') {
|
|
55
|
+
say(hosts.formatDoctor(hosts.doctor().concat(extras.doctorRows())));
|
|
56
|
+
} else if (command === 'provider') {
|
|
57
|
+
if (args[1] === 'check' && args[2] && args.length === 3) {
|
|
58
|
+
const profile = provider.load(args[2]);
|
|
59
|
+
say(`Valid ${profile.protocol} profile for model ${profile.model}. Pricing ${profile.pricing ? 'configured' : 'unknown'}; no API call made.`);
|
|
60
|
+
} else if (args[1] === 'usage' && args[2] && args.length === 3) {
|
|
61
|
+
const rows = fs.readFileSync(args[2], 'utf8').split(/\r?\n/).filter(Boolean).map((line) => JSON.parse(line));
|
|
62
|
+
say(JSON.stringify(provider.summarize(rows), null, 2));
|
|
63
|
+
} else throw Error('Use provider check <file> or provider usage <file>.');
|
|
64
|
+
} else if (command === 'sub') {
|
|
65
|
+
const split = args.indexOf('--');
|
|
66
|
+
const options = split < 0 ? args.slice(1) : args.slice(1, split);
|
|
67
|
+
const allowed = new Set(['--host', '--profile', '--log', '--executable']);
|
|
68
|
+
const opts = {};
|
|
69
|
+
for (let i = 0; i < options.length; i += 2) {
|
|
70
|
+
const key = options[i], value = options[i + 1];
|
|
71
|
+
if (!allowed.has(key) || !value || value.startsWith('--') || key in opts) throw Error('Use sub --help for launcher options; native arguments go after --.');
|
|
72
|
+
opts[key] = value;
|
|
73
|
+
}
|
|
74
|
+
if (!opts['--profile']) throw Error('--profile is required.');
|
|
75
|
+
process.exitCode = await subharness.launch({
|
|
76
|
+
host: opts['--host'], file: opts['--profile'], logFile: opts['--log'],
|
|
77
|
+
executable: opts['--executable'], args: split < 0 ? [] : args.slice(split + 1),
|
|
78
|
+
});
|
|
79
|
+
} else throw Error(`Unknown command: ${command}. Run atlias --help.`);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
process.stderr.write(`atlias: ${error.message}\n`);
|
|
82
|
+
process.exitCode = 2;
|
|
83
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Native launcher profiles
|
|
2
|
+
|
|
3
|
+
`atlias sub` wraps one Claude Code or Codex session with a local provider-usage meter. It forwards requests to the provider URL in your profile, records provider-reported usage, and then exits with the native CLI's status. It does not alter prompts or tools.
|
|
4
|
+
|
|
5
|
+
Create a JSON profile outside a public repository. Anthropic Messages example:
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"protocol": "anthropic",
|
|
10
|
+
"baseUrl": "https://api.anthropic.com/v1",
|
|
11
|
+
"model": "your-model-id",
|
|
12
|
+
"keyEnv": "ANTHROPIC_API_KEY"
|
|
13
|
+
}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
OpenAI Responses example:
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"protocol": "responses",
|
|
21
|
+
"baseUrl": "https://api.openai.com/v1",
|
|
22
|
+
"model": "your-model-id",
|
|
23
|
+
"keyEnv": "OPENAI_API_KEY"
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Set the named environment variable in your shell, then launch:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
atlias sub --host claude --profile provider.json -- --help
|
|
31
|
+
atlias sub --host codex --profile provider.json -- exec --help
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`keyEnv` stores a variable name only. The credential is read from the current process environment and is never copied into the profile or usage receipt. Remote endpoints must use HTTPS; HTTP is accepted only for loopback addresses. Provider prices are optional estimates entered by the user. Missing or incomplete usage stays unknown rather than being reported as zero.
|
|
35
|
+
|
|
36
|
+
To validate a profile without a network request, use `atlias provider check provider.json`. Summarize an existing receipt file with `atlias provider usage receipts.jsonl`.
|
package/hooks/hooks.json
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "atlias: links the session to the sub-harness at start (progress note, shared memory, graphify god nodes, companion skills), answers codebase questions from the graph before the model reads files, guards against repeated identical tool calls and destructive commands, tracks every changed file, says once a turn when a whole file was read that the graph could have answered and names the query that would have done it, runs a syntax and two-pass verification gate before the reply ends, writes a handoff note before compaction and re-injects it after, and hands each session to Dream for memory consolidation at exit.",
|
|
3
|
+
"hooks": {
|
|
4
|
+
"SessionStart": [
|
|
5
|
+
{
|
|
6
|
+
"hooks": [
|
|
7
|
+
{
|
|
8
|
+
"type": "command",
|
|
9
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" session-start",
|
|
10
|
+
"timeout": 45
|
|
11
|
+
}
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"UserPromptSubmit": [
|
|
16
|
+
{
|
|
17
|
+
"hooks": [
|
|
18
|
+
{
|
|
19
|
+
"type": "command",
|
|
20
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" prompt",
|
|
21
|
+
"timeout": 15
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"PreToolUse": [
|
|
27
|
+
{
|
|
28
|
+
"matcher": ".*",
|
|
29
|
+
"hooks": [
|
|
30
|
+
{
|
|
31
|
+
"type": "command",
|
|
32
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" pre-tool",
|
|
33
|
+
"timeout": 30
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"PostToolUse": [
|
|
39
|
+
{
|
|
40
|
+
"matcher": "Write|Edit|MultiEdit|NotebookEdit|apply_patch|write_file|replace|edit_file|create_file|Bash|PowerShell|shell|exec|exec_command|run_shell_command|run_terminal_cmd|local_shell|Read|read_file|readfile|read|view|view_file|open_file|cat|get_file_contents",
|
|
41
|
+
"hooks": [
|
|
42
|
+
{
|
|
43
|
+
"type": "command",
|
|
44
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" post-tool",
|
|
45
|
+
"timeout": 30
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"PostToolUseFailure": [
|
|
51
|
+
{
|
|
52
|
+
"matcher": "Bash|PowerShell|shell|exec|exec_command|run_shell_command|run_terminal_cmd|local_shell",
|
|
53
|
+
"hooks": [
|
|
54
|
+
{
|
|
55
|
+
"type": "command",
|
|
56
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" post-tool-failure",
|
|
57
|
+
"timeout": 30
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
],
|
|
62
|
+
"PreCompact": [
|
|
63
|
+
{
|
|
64
|
+
"hooks": [
|
|
65
|
+
{
|
|
66
|
+
"type": "command",
|
|
67
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" pre-compact",
|
|
68
|
+
"timeout": 15
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
],
|
|
73
|
+
"PostCompact": [
|
|
74
|
+
{
|
|
75
|
+
"hooks": [
|
|
76
|
+
{
|
|
77
|
+
"type": "command",
|
|
78
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" post-compact",
|
|
79
|
+
"timeout": 10
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"Stop": [
|
|
85
|
+
{
|
|
86
|
+
"hooks": [
|
|
87
|
+
{
|
|
88
|
+
"type": "command",
|
|
89
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" stop",
|
|
90
|
+
"timeout": 30
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
],
|
|
95
|
+
"SubagentStop": [
|
|
96
|
+
{
|
|
97
|
+
"hooks": [
|
|
98
|
+
{
|
|
99
|
+
"type": "command",
|
|
100
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" subagent-stop",
|
|
101
|
+
"timeout": 8
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"SessionEnd": [
|
|
107
|
+
{
|
|
108
|
+
"hooks": [
|
|
109
|
+
{
|
|
110
|
+
"type": "command",
|
|
111
|
+
"command": "node \"${CLAUDE_PLUGIN_ROOT}/lib/hooks.mjs\" session-end",
|
|
112
|
+
"timeout": 5
|
|
113
|
+
}
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
]
|
|
117
|
+
}
|
|
118
|
+
}
|