agentsys 5.13.4 → 6.0.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.
- package/.claude-plugin/marketplace.json +28 -28
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +2 -3
- package/AGENTS.md +8 -8
- package/CHANGELOG.md +34 -0
- package/README.md +11 -116
- package/lib/binary/index.js +8 -2
- package/lib/binary/shared-helpers.js +160 -0
- package/lib/collectors/codebase.js +7 -2
- package/lib/collectors/documentation.js +8 -2
- package/lib/enhance/agent-patterns.js +17 -4
- package/lib/enhance/auto-suppression.js +19 -7
- package/lib/enhance/cross-file-analyzer.js +11 -4
- package/lib/enhance/docs-patterns.js +6 -2
- package/lib/enhance/fixer.js +22 -5
- package/lib/enhance/skill-patterns.js +5 -5
- package/lib/index.js +2 -0
- package/lib/repo-intel/cache.js +171 -0
- package/lib/repo-intel/converter.js +130 -0
- package/lib/repo-intel/embed/binary.js +242 -0
- package/lib/repo-intel/embed/index.js +26 -0
- package/lib/repo-intel/embed/orchestrator.js +239 -0
- package/lib/repo-intel/embed/preference.js +136 -0
- package/lib/repo-intel/enrich.js +198 -0
- package/lib/repo-intel/index.js +370 -0
- package/lib/repo-intel/installer.js +78 -0
- package/lib/repo-intel/queries.js +213 -13
- package/lib/repo-intel/updater.js +104 -0
- package/lib/repo-map/index.js +19 -254
- package/package.json +1 -1
- package/scripts/generate-docs.js +13 -18
- package/scripts/plugins.txt +2 -2
- package/site/assets/js/main.js +5 -13
- package/site/content.json +6 -23
- package/site/index.html +29 -77
- package/site/ux-spec.md +7 -7
- package/.kiro/agents/web-session.json +0 -12
- package/.kiro/skills/web-auth/SKILL.md +0 -177
- package/.kiro/skills/web-browse/SKILL.md +0 -516
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agentsys",
|
|
3
|
-
"description": "
|
|
4
|
-
"version": "
|
|
3
|
+
"description": "26 specialized plugins for AI workflow automation - task orchestration, PR workflow, slop detection, code review, drift detection, enhancement analysis, documentation sync, unified static analysis, durable memory, negative behavior memory, skill and system prompt curation, perf investigations, topic research, agent config linting, cross-tool AI consultation, structured AI debate, workflow pattern learning, codebase onboarding, contributor guidance, Zig language support, Mojo language support, and Ada/SPARK language support",
|
|
4
|
+
"version": "6.0.0",
|
|
5
5
|
"owner": {
|
|
6
6
|
"name": "Avi Fenesh",
|
|
7
7
|
"url": "https://github.com/avifenesh"
|
|
@@ -198,19 +198,6 @@
|
|
|
198
198
|
"category": "productivity",
|
|
199
199
|
"homepage": "https://github.com/agent-sh/learn"
|
|
200
200
|
},
|
|
201
|
-
{
|
|
202
|
-
"name": "axiom",
|
|
203
|
-
"source": {
|
|
204
|
-
"source": "url",
|
|
205
|
-
"url": "https://github.com/agent-sh/axiom.git",
|
|
206
|
-
"ref": "v0.6.1",
|
|
207
|
-
"commit": "ba77271a4ff7084d2d567cf3173204390be80f3b"
|
|
208
|
-
},
|
|
209
|
-
"description": "Personal agent-native knowledge base: load thin context, query durable memories, create project scaffolds, and propose approved records",
|
|
210
|
-
"version": "0.6.1",
|
|
211
|
-
"category": "productivity",
|
|
212
|
-
"homepage": "https://github.com/agent-sh/axiom"
|
|
213
|
-
},
|
|
214
201
|
{
|
|
215
202
|
"name": "banthis",
|
|
216
203
|
"source": {
|
|
@@ -262,19 +249,6 @@
|
|
|
262
249
|
"category": "productivity",
|
|
263
250
|
"homepage": "https://github.com/agent-sh/debate"
|
|
264
251
|
},
|
|
265
|
-
{
|
|
266
|
-
"name": "web-ctl",
|
|
267
|
-
"source": {
|
|
268
|
-
"source": "url",
|
|
269
|
-
"url": "https://github.com/agent-sh/web-ctl.git",
|
|
270
|
-
"commit": "345e44bc8a7b373728afce6c0d94ef067b5abc82",
|
|
271
|
-
"ref": "v1.1.0"
|
|
272
|
-
},
|
|
273
|
-
"description": "Browser automation and web testing toolkit for AI agents - headless browser control, persistent sessions, auth handoff, and prompt injection defense",
|
|
274
|
-
"version": "1.1.0",
|
|
275
|
-
"category": "automation",
|
|
276
|
-
"homepage": "https://github.com/agent-sh/web-ctl"
|
|
277
|
-
},
|
|
278
252
|
{
|
|
279
253
|
"name": "skillers",
|
|
280
254
|
"source": {
|
|
@@ -325,6 +299,32 @@
|
|
|
325
299
|
"version": "0.1.0",
|
|
326
300
|
"category": "development",
|
|
327
301
|
"homepage": "https://github.com/agent-sh/zig-lsp"
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"name": "mojo",
|
|
305
|
+
"source": {
|
|
306
|
+
"source": "url",
|
|
307
|
+
"url": "https://github.com/agent-sh/mojo.git",
|
|
308
|
+
"ref": "v0.2.0",
|
|
309
|
+
"commit": "4d6f5fe71e03380f8532a0a8419903f4f548a587"
|
|
310
|
+
},
|
|
311
|
+
"description": "Teach agents to write idiomatic, correct, performant, current Mojo (v1.0.0b1) - syntax, ownership and CPU/memory optimization (copies, SIMD, vectorize/parallelize), GPU kernels (DeviceContext/LayoutTensor), and Mojo/Python interop; prevents stale pre-2025 syntax",
|
|
312
|
+
"version": "0.2.0",
|
|
313
|
+
"category": "development",
|
|
314
|
+
"homepage": "https://github.com/agent-sh/mojo"
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"name": "ada-spark",
|
|
318
|
+
"source": {
|
|
319
|
+
"source": "url",
|
|
320
|
+
"url": "https://github.com/agent-sh/ada-spark.git",
|
|
321
|
+
"ref": "v0.1.0",
|
|
322
|
+
"commit": "d84e4efbd22165d3739dc5002c8385737637890c"
|
|
323
|
+
},
|
|
324
|
+
"description": "Teach agents to write idiomatic, correct, current Ada and SPARK (Ada 2022) - contracts (aspects, Pre'Class), the Alire ecosystem, SPARK proof (AoRTE, assurance levels, ownership/borrow), embedded (Ravenscar/Jorvik), and GNAT/GNAT SAS tooling; blocks stale pre-2022 advice (GNAT Community, pragma contracts, CodePeer)",
|
|
325
|
+
"version": "0.1.0",
|
|
326
|
+
"category": "development",
|
|
327
|
+
"homepage": "https://github.com/agent-sh/ada-spark"
|
|
328
328
|
}
|
|
329
329
|
]
|
|
330
330
|
}
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"skills": "./adapters/codex/skills",
|
|
5
5
|
"interface": {
|
|
6
6
|
"displayName": "agentsys",
|
|
7
|
-
"shortDescription": "AI agent orchestration with
|
|
8
|
-
"longDescription": "Professional-grade slash commands for AI-powered development workflows. Includes /next-task (task discovery to production), /
|
|
7
|
+
"shortDescription": "AI agent orchestration with 44 skills and 49 agents",
|
|
8
|
+
"longDescription": "Professional-grade slash commands for AI-powered development workflows. Includes /next-task (task discovery to production), /banthis (negative behavior memory), /skill-curator and /system-prompt-curator (agent configuration curation), /ship (commit to deploy), /audit-project (multi-agent code review), /deslop (AI slop cleanup), /perf (performance investigation), /enhance (config analysis), /consult (cross-tool AI consultation), and more.",
|
|
9
9
|
"developerName": "Avi Fenesh",
|
|
10
10
|
"category": "developer-tools",
|
|
11
11
|
"capabilities": [
|
|
@@ -20,7 +20,6 @@
|
|
|
20
20
|
"websiteUrl": "https://agent-sh.github.io/agent-sh.dev/",
|
|
21
21
|
"defaultPrompt": [
|
|
22
22
|
"What should I work on next?",
|
|
23
|
-
"Load my durable Axiom context",
|
|
24
23
|
"Review this codebase"
|
|
25
24
|
]
|
|
26
25
|
}
|
package/AGENTS.md
CHANGED
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
<!-- GEN:START:claude-architecture -->
|
|
77
77
|
```
|
|
78
78
|
lib/ → Shared library (vendored to plugins)
|
|
79
|
-
plugins/ → 24 plugins, 49 agents (39 file-based + 10 role-based),
|
|
79
|
+
plugins/ → 24 plugins, 49 agents (39 file-based + 10 role-based), 44 skills
|
|
80
80
|
adapters/ → Platform adapters (opencode-plugin/, opencode/, codex/)
|
|
81
81
|
checklists/ → Action checklists (9 files)
|
|
82
82
|
bin/cli.js → npm CLI installer
|
|
@@ -93,21 +93,21 @@ bin/cli.js → npm CLI installer
|
|
|
93
93
|
| drift-detect | 1 | 1 | Plan drift detection |
|
|
94
94
|
| enhance | 8 | 9 | Code quality analyzers |
|
|
95
95
|
| sync-docs | 1 | 1 | Documentation sync |
|
|
96
|
-
| repo-intel |
|
|
97
|
-
| axiom | 0 | 1 | Durable agent-native memory |
|
|
96
|
+
| repo-intel | 3 | 1 | Unified static analysis |
|
|
98
97
|
| banthis | 0 | 1 | Durable negative behavior memory |
|
|
99
98
|
| perf | 6 | 8 | Performance investigation |
|
|
100
99
|
| learn | 1 | 1 | Topic research and learning guides |
|
|
101
|
-
| agnix |
|
|
100
|
+
| agnix | 0 | 1 | Agent config linting |
|
|
102
101
|
| consult | 1 | 1 | Cross-tool AI consultation |
|
|
103
102
|
| debate | 1 | 1 | Multi-perspective debate analysis |
|
|
104
|
-
| web-ctl | 1 | 2 | Browser automation for AI agents |
|
|
105
103
|
| skill-curator | 0 | 1 | Skill authoring and review |
|
|
106
104
|
| system-prompt-curator | 0 | 1 | System prompt curation |
|
|
107
105
|
| skillers | 2 | 2 | Workflow pattern learning |
|
|
108
106
|
| onboard | 1 | 1 | Codebase onboarding |
|
|
109
107
|
| can-i-help | 1 | 1 | Contributor guidance |
|
|
110
108
|
| zig-lsp | 0 | 0 | |
|
|
109
|
+
| mojo | 0 | 1 | |
|
|
110
|
+
| ada-spark | 0 | 1 | |
|
|
111
111
|
<!-- GEN:END:claude-architecture -->
|
|
112
112
|
|
|
113
113
|
**Pattern**: `Command → Agent → Skill` (orchestration → invocation → implementation)
|
|
@@ -176,7 +176,7 @@ agentsys # Run installer
|
|
|
176
176
|
<agents>
|
|
177
177
|
## Agents
|
|
178
178
|
|
|
179
|
-
49 agents across 24 plugins (
|
|
179
|
+
49 agents across 24 plugins (16 have agents; gate-and-ship is commands-only; banthis, skill-curator, system-prompt-curator, and agnix are skill/command-only; zig-lsp is config-only with no commands or agents; mojo and ada-spark are skill-only). Key agents by model:
|
|
180
180
|
|
|
181
181
|
| Model | Agents | Use Case |
|
|
182
182
|
|-------|--------|----------|
|
|
@@ -190,7 +190,7 @@ See [README.md](./README.md#command-details) and [docs/reference/AGENTS.md](./do
|
|
|
190
190
|
<skills>
|
|
191
191
|
## Skills
|
|
192
192
|
|
|
193
|
-
|
|
193
|
+
44 skills across plugins. Agents invoke skills for reusable implementation.
|
|
194
194
|
|
|
195
195
|
| Category | Key Skills |
|
|
196
196
|
|----------|------------|
|
|
@@ -198,7 +198,7 @@ See [README.md](./README.md#command-details) and [docs/reference/AGENTS.md](./do
|
|
|
198
198
|
| Enhancement | `enhance-*` (9 skills for plugins, agents, docs, prompts, hooks), `skill-curator`, `system-prompt-curator` |
|
|
199
199
|
| Performance | `baseline`, `benchmark`, `profile`, `theory-tester` |
|
|
200
200
|
| Cleanup | `deslop`, `sync-docs`, `drift-analysis`, `repo-intel` |
|
|
201
|
-
| Memory | `
|
|
201
|
+
| Memory | `banthis` |
|
|
202
202
|
|
|
203
203
|
See [README.md](./README.md#skills) for full skill list.
|
|
204
204
|
</skills>
|
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [6.0.0] - 2026-05-29
|
|
13
|
+
|
|
14
|
+
### Removed
|
|
15
|
+
- **BREAKING: Dropped the `axiom` and `web-ctl` plugins from the marketplace** (#365). Both repositories were retired; their marketplace entries, `plugins.txt` rows, `.kiro` mirrors (`web-auth`, `web-browse`, `web-session`), and all site/docs references were scrubbed. Installable plugin count is now 24 (was 26). Users who previously installed `axiom` or `web-ctl` from the marketplace must remove them; they will no longer resolve.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **Unified `repo-intel` core library** synced from agent-core (#373). The vendored `lib/repo-intel/` now exposes a single surface that folds the former `repo-map` lifecycle and the embedder into one module: `init`/`update`/`status`/`load`/`loadRaw`/`exists`, typed `queries.*`, LLM-augmentation write-path (`applyDescriptors`/`applySummary`), and an opt-in `embed` submodule (orchestrator, preference, binary resolver) for semantic search and duplicate detection. `lib/repo-map` remains as a deprecated compatibility shim. `lib/index.js` now exports `repoIntel` alongside `repoMap`.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
- `skill-patterns` `side_effect_without_disable` now accepts both the YAML boolean `true` and the quoted string `"true"` for `disable-model-invocation`, so a frontmatter value of `"true"` is no longer wrongly re-flagged.
|
|
22
|
+
- Bounded 19 polynomial-ReDoS regexes and closed 2 prototype-pollution sinks across the synced `collectors`/`enhance` lib (match semantics preserved; verified by equivalence testing).
|
|
23
|
+
- Removed the stale `aiRatio` query test - the analyzer dropped AI-authorship attribution and the query no longer exists (#372).
|
|
24
|
+
|
|
25
|
+
## [5.14.0] - 2026-05-21
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
- Registered the `ada-spark` skill plugin (`agent-sh/ada-spark` v0.1.0, pinned `v0.1.0` / `d84e4ef`) in the marketplace. Teaches agents to write idiomatic, correct, current Ada and SPARK (Ada 2022) - contracts (aspects, `Pre'Class`), the Alire ecosystem, SPARK proof (AoRTE, assurance levels, ownership/borrow), embedded (Ravenscar/Jorvik), and GNAT/GNAT SAS tooling; blocks stale pre-2022 advice (GNAT Community, pragma contracts, CodePeer). Mapped to the `Languages` skill category.
|
|
29
|
+
- Registered the `mojo` skill plugin (`agent-sh/mojo` v0.2.0, pinned `v0.2.0` / `4d6f5fe`) in the marketplace. Teaches agents to write idiomatic, current Mojo (v1.0.0b1) - syntax, ownership and CPU/memory optimization, GPU kernels, and Mojo/Python interop; prevents stale pre-2025 syntax. Mapped to the `Languages` skill category.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
- Synced plugin/skill count surfaces across `README.md`, `AGENTS.md`, `docs/reference/AGENTS.md`, `docs/ARCHITECTURE.md`, `docs/CROSS_PLATFORM.md`, `site/content.json`, `site/index.html`, and `site/ux-spec.md` for the two new language plugins: plugins `24 -> 26`, skills `45 -> 47` (agents unchanged at 50). Added `ada-spark` and `mojo` to `STATIC_PLUGIN_AGENT_COUNTS`, `CATEGORY_MAP`, and `STATIC_SKILLS` in `scripts/generate-docs.js`, and to `scripts/plugins.txt`.
|
|
33
|
+
|
|
34
|
+
## [5.13.5] - 2026-05-18
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
- Updated `axiom` marketplace pin to `v0.6.2`, which ships the `SessionStart` plugin hook (`hooks/hooks.json` + `hooks/session-start.mjs`), the read-only `axiom before-any --detect-only` mode, an OpenCode `session.created` plugin scaffold, and the `BeforeAnyError` library refactor.
|
|
38
|
+
|
|
39
|
+
### Fixed
|
|
40
|
+
- Synced agent / skill / test / rule counts across `README.md`, `AGENTS.md`, `docs/reference/AGENTS.md`, `.codex-plugin/plugin.json`, `site/content.json`, `site/ux-spec.md`, and `site/index.html`. File-based agent count corrected `39 → 40` (total `49 → 50`), test count refreshed `3,513 → 3,518`, agnix references refreshed `399 → 423` rules and `126 → 129` auto-fixable. Updated `STATIC_PLUGIN_AGENT_COUNTS` in `scripts/generate-docs.js`: `repo-intel 1 → 3`, `agnix 1 → 0`.
|
|
41
|
+
- Updated the `/axiom` section in `README.md` to document the new SessionStart hook, `--detect-only` flag, Codex plugin-hooks opt-in (`[features].plugin_hooks = true`), and the OpenCode scaffold limitation pending [sst/opencode#5409](https://github.com/sst/opencode/issues/5409).
|
|
42
|
+
|
|
43
|
+
### Tests
|
|
44
|
+
- Updated `__tests__/marketplace-standalone-contract.test.js` to pin the `axiom` expected version, ref, and commit at `v0.6.2 / e3f3fab`.
|
|
45
|
+
|
|
12
46
|
## [5.13.4] - 2026-05-18
|
|
13
47
|
|
|
14
48
|
### Changed
|
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
21
|
<p align="center">
|
|
22
|
-
<b>24 plugins · 49 agents ·
|
|
22
|
+
<b>24 plugins · 49 agents · 44 skills (across all repos) · 30k lines of lib code · 3,518 tests · 5 platforms</b><br>
|
|
23
23
|
<em>Plugins distributed as standalone repos under <a href="https://github.com/agent-sh">agent-sh</a> org - agentsys is the marketplace & installer</em>
|
|
24
24
|
</p>
|
|
25
25
|
|
|
@@ -41,11 +41,11 @@
|
|
|
41
41
|
AI models can write code. That's not the hard part anymore. The hard part is everything around it - task selection, branch management, code review, artifact cleanup, CI, PR comments, deployment. **AgentSys is the runtime that orchestrates agents to handle all of it** - structured pipelines, gated phases, specialized agents, and persistent state that survives session boundaries.
|
|
42
42
|
|
|
43
43
|
---
|
|
44
|
-
> Building custom skills, agents, hooks, or MCP tools? [agnix](https://github.com/agent-sh/agnix) is the CLI + LSP linter that catches config errors before they fail silently - real-time IDE validation, auto suggestions, auto-fix, and
|
|
44
|
+
> Building custom skills, agents, hooks, or MCP tools? [agnix](https://github.com/agent-sh/agnix) is the CLI + LSP linter that catches config errors before they fail silently - real-time IDE validation, auto suggestions, auto-fix, and 423 rules for Claude Code, Codex, OpenCode, Cursor, Kiro, Copilot, Gemini CLI, Cline, Windsurf, Roo Code, Amp, and more.
|
|
45
45
|
|
|
46
46
|
## What This Is
|
|
47
47
|
|
|
48
|
-
An agent orchestration system - 24 plugins, 49 agents (39 file-based + 10 role-based specialists in audit-project), and
|
|
48
|
+
An agent orchestration system - 24 plugins, 49 agents (39 file-based + 10 role-based specialists in audit-project), and 44 skills that compose into structured pipelines for software development. Each plugin lives in its own standalone repo under the [agent-sh](https://github.com/agent-sh) org. agentsys is the marketplace and installer that ties them together.
|
|
49
49
|
|
|
50
50
|
Each agent has a single responsibility, a specific model assignment, and defined inputs/outputs. Pipelines enforce phase gates so agents can't skip steps. State persists across sessions so work survives interruptions.
|
|
51
51
|
|
|
@@ -118,9 +118,8 @@ The investment shifts from model spend to pipeline design. Better prompts, riche
|
|
|
118
118
|
| [`/next-task`](#next-task) | Task workflow: discovery, implementation, PR, merge |
|
|
119
119
|
| [`/prepare-delivery`](#prepare-delivery) | Pre-ship quality gates: deslop, review, validation, docs sync |
|
|
120
120
|
| [`/gate-and-ship`](#gate-and-ship) | Quality gates then ship (/prepare-delivery + /ship) |
|
|
121
|
-
| [`/axiom`](#axiom) | Durable memory: load, query, list, bootstrap projects, and record approved knowledge |
|
|
122
121
|
| [`/banthis`](#banthis) | Durable negative memory: persist banned agent behaviors |
|
|
123
|
-
| [`/agnix`](#agnix) | Lint agent configurations (
|
|
122
|
+
| [`/agnix`](#agnix) | Lint agent configurations (423 rules) |
|
|
124
123
|
| [`/ship`](#ship) | PR creation, CI monitoring, merge |
|
|
125
124
|
| [`/deslop`](#deslop) | Clean AI slop patterns |
|
|
126
125
|
| [`/perf`](#perf) | Performance investigation with baselines and profiling |
|
|
@@ -132,7 +131,6 @@ The investment shifts from model spend to pipeline design. Better prompts, riche
|
|
|
132
131
|
| [`/learn`](#learn) | Research topics, create learning guides |
|
|
133
132
|
| [`/consult`](#consult) | Cross-tool AI consultation |
|
|
134
133
|
| [`/debate`](#debate) | Structured debate between AI tools |
|
|
135
|
-
| [`/web-ctl`](#web-ctl) | Browser automation for AI agents |
|
|
136
134
|
| [`/release`](#release) | Versioned release with ecosystem detection |
|
|
137
135
|
| [`/skillers`](#skillers) | Workflow pattern learning and automation |
|
|
138
136
|
| [`/skill-curator`](#skill-curator) | Create and improve reliable SKILL.md files |
|
|
@@ -146,7 +144,7 @@ Each command works standalone. Together, they compose into end-to-end pipelines.
|
|
|
146
144
|
|
|
147
145
|
## Skills
|
|
148
146
|
|
|
149
|
-
|
|
147
|
+
44 skills included across the plugins:
|
|
150
148
|
|
|
151
149
|
| Category | Skills |
|
|
152
150
|
|----------|--------|
|
|
@@ -158,10 +156,9 @@ Each command works standalone. Together, they compose into end-to-end pipelines.
|
|
|
158
156
|
| **Code Review** | `audit-project` |
|
|
159
157
|
| **AI Collaboration** | `consult`, `debate`, `learn`, `recommend`, `skillers-compact` |
|
|
160
158
|
| **Onboarding** | `can-i-help`, `onboard` |
|
|
161
|
-
| **Web** | `web-auth`, `web-browse` |
|
|
162
159
|
| **Release** | `release` |
|
|
163
160
|
| **Analysis** | `drift-analysis`, `repo-intel` |
|
|
164
|
-
| **Memory** | `
|
|
161
|
+
| **Memory** | `banthis` |
|
|
165
162
|
| **Linting** | `agnix` |
|
|
166
163
|
|
|
167
164
|
**External skill plugins** (standalone repos, installed separately):
|
|
@@ -169,6 +166,8 @@ Each command works standalone. Together, they compose into end-to-end pipelines.
|
|
|
169
166
|
| Category | Skills | Plugin |
|
|
170
167
|
|----------|--------|--------|
|
|
171
168
|
| **Message Queues** | `glide-mq`, `glide-mq-migrate-bullmq`, `glide-mq-migrate-bee` | [agent-sh/glidemq](https://github.com/agent-sh/glidemq) |
|
|
169
|
+
| **Languages** | `mojo` | [agent-sh/mojo](https://github.com/agent-sh/mojo) |
|
|
170
|
+
| **Languages** | `ada-spark` | [agent-sh/ada-spark](https://github.com/agent-sh/ada-spark) |
|
|
172
171
|
|
|
173
172
|
Skills are the reusable implementation units. Agents invoke skills; commands orchestrate agents. When you install a plugin, its skills become available to all agents in that session.
|
|
174
173
|
|
|
@@ -181,7 +180,7 @@ Skills are the reusable implementation units. Agents invoke skills; commands orc
|
|
|
181
180
|
| [The Approach](#the-approach) | Why it's built this way |
|
|
182
181
|
| [Benchmarks](#benchmarks) | Sonnet + agentsys vs raw Opus |
|
|
183
182
|
| [Commands](#commands) | All 24 commands overview |
|
|
184
|
-
| [Skills](#skills) |
|
|
183
|
+
| [Skills](#skills) | 44 skills across plugins |
|
|
185
184
|
| [Skill-Only Plugins](#skill-only-plugins) | glide-mq and other non-command plugins |
|
|
186
185
|
| [Command Details](#command-details) | Deep dive into each command |
|
|
187
186
|
| [How Commands Work Together](#how-commands-work-together) | Standalone vs integrated |
|
|
@@ -312,35 +311,6 @@ Each piece runs independently - use `/prepare-delivery` alone to review before d
|
|
|
312
311
|
|
|
313
312
|
---
|
|
314
313
|
|
|
315
|
-
### /axiom
|
|
316
|
-
|
|
317
|
-
**Purpose:** Durable, queryable memory for agents. Load the smallest useful context, query project or global knowledge, and propose new records without bloating `AGENTS.md`.
|
|
318
|
-
|
|
319
|
-
**[axiom](https://github.com/agent-sh/axiom)** is a standalone plugin and CLI. It creates a private `axiom-based` knowledge repo after explicit approval, keeps only thin context loaded automatically, and stores durable decisions, memories, preferences, and project notes in queryable files.
|
|
320
|
-
|
|
321
|
-
**What it does:**
|
|
322
|
-
|
|
323
|
-
| Command | Use |
|
|
324
|
-
|---------|-----|
|
|
325
|
-
| `axiom before-any --quiet` | Load global thin context at the start of meaningful work |
|
|
326
|
-
| `axiom before-any --project <slug>` | Load project context and create missing project scaffolds |
|
|
327
|
-
| `axiom query "<keyword>" --project <slug>` | Retrieve focused, source-backed project knowledge |
|
|
328
|
-
| `axiom list --topics --project <slug>` | Explore what knowledge exists before querying |
|
|
329
|
-
| `axiom record ...` | Propose a durable record through a temp clone, diff, and human approval |
|
|
330
|
-
|
|
331
|
-
**Usage:**
|
|
332
|
-
|
|
333
|
-
```bash
|
|
334
|
-
/axiom before-any --quiet
|
|
335
|
-
/axiom before-any --project flowfabric
|
|
336
|
-
/axiom query "lease based" --project flowfabric
|
|
337
|
-
/axiom record --project flowfabric --kind decision "Lease-based claiming v2" "We switched because it gives stronger safety during restarts."
|
|
338
|
-
```
|
|
339
|
-
|
|
340
|
-
**External tool:** Requires the [axiom CLI](https://github.com/agent-sh/axiom) from the plugin package.
|
|
341
|
-
|
|
342
|
-
---
|
|
343
|
-
|
|
344
314
|
### /banthis
|
|
345
315
|
|
|
346
316
|
**Purpose:** Durable negative memory for repeated agent mistakes. Turn a user's "stop doing this" correction into a persistent rule in `CLAUDE.md` or `AGENTS.md`.
|
|
@@ -389,7 +359,7 @@ agnix catches these issues before they cause problems.
|
|
|
389
359
|
| **Best Practices** | Tool restrictions, model selection, trigger phrase quality |
|
|
390
360
|
| **Cross-Platform** | Compatibility across Claude Code, Codex, OpenCode, Cursor, Kiro, Copilot, Gemini CLI, Cline, Windsurf, Roo Code, Amp, and more |
|
|
391
361
|
|
|
392
|
-
**
|
|
362
|
+
**423 validation rules** (129 auto-fixable) derived from:
|
|
393
363
|
- Official tool specifications (Claude Code, Codex CLI, OpenCode, Cursor, Kiro, GitHub Copilot, Gemini CLI, Cline, Windsurf, Roo Code, Amp, and more)
|
|
394
364
|
- Research papers on agent reliability and prompt injection
|
|
395
365
|
- Real-world testing across 500+ repositories
|
|
@@ -895,81 +865,6 @@ agent-knowledge/
|
|
|
895
865
|
|
|
896
866
|
**Agent:** debate-orchestrator (opus model for orchestration)
|
|
897
867
|
|
|
898
|
-
### /web-ctl
|
|
899
|
-
|
|
900
|
-
**Purpose:** Browser automation for AI agents - navigate, authenticate, and interact with web pages.
|
|
901
|
-
|
|
902
|
-
**How it works:**
|
|
903
|
-
|
|
904
|
-
Each invocation is a single Node.js process using Playwright. No daemon, no MCP server. Session state persists via Chrome's userDataDir with AES-256-GCM encrypted storage.
|
|
905
|
-
|
|
906
|
-
```
|
|
907
|
-
Agent calls skill -> node scripts/web-ctl.js <args> -> Playwright API -> JSON result
|
|
908
|
-
```
|
|
909
|
-
|
|
910
|
-
**Session lifecycle:**
|
|
911
|
-
|
|
912
|
-
1. `session start <name>` - Create session (encrypted profile directory)
|
|
913
|
-
2. `session auth <name> --url <login-url>` - Opens headed Chrome for human login (2FA, CAPTCHAs). Polls for success URL/selector, encrypts cookies on completion
|
|
914
|
-
3. `run <name> <action>` - Headless actions using persisted cookies
|
|
915
|
-
4. `session end <name>` - Cleanup
|
|
916
|
-
|
|
917
|
-
**Actions:**
|
|
918
|
-
|
|
919
|
-
| Action | Description | Key flag |
|
|
920
|
-
|--------|-------------|----------|
|
|
921
|
-
| `goto <url>` | Navigate to URL | |
|
|
922
|
-
| `snapshot` | Get accessibility tree (primary page inspection) | |
|
|
923
|
-
| `click <sel>` | Click element | `--wait-stable` |
|
|
924
|
-
| `click-wait <sel>` | Click and wait for DOM + network stability | `--timeout <ms>` |
|
|
925
|
-
| `type <sel> <text>` | Type with human-like delays | |
|
|
926
|
-
| `read <sel>` | Read element text content | |
|
|
927
|
-
| `fill <sel> <value>` | Clear field and set value | |
|
|
928
|
-
| `wait <sel>` | Wait for element to appear | `--timeout <ms>` |
|
|
929
|
-
| `evaluate <js>` | Execute JS in page context | `--allow-evaluate` |
|
|
930
|
-
| `screenshot` | Full-page screenshot | `--path <file>` |
|
|
931
|
-
| `network` | Capture network requests | `--filter <pattern>` |
|
|
932
|
-
| `checkpoint` | Open headed browser for user (CAPTCHAs) | `--timeout <sec>` |
|
|
933
|
-
|
|
934
|
-
`click-wait` waits for network idle + no DOM mutations for 500ms before returning. Cuts SPA interactions from multiple agent turns to one.
|
|
935
|
-
|
|
936
|
-
**Error handling:**
|
|
937
|
-
|
|
938
|
-
All errors return classified codes with actionable recovery suggestions:
|
|
939
|
-
|
|
940
|
-
| Code | Recovery suggestion |
|
|
941
|
-
|------|-------------------|
|
|
942
|
-
| `element_not_found` | Snapshot included in response for selector discovery |
|
|
943
|
-
| `timeout` | Increase `--timeout` |
|
|
944
|
-
| `browser_closed` | `session start <name>` |
|
|
945
|
-
| `network_error` | Check URL; verify cookies with `session status` |
|
|
946
|
-
| `no_display` | Use `--vnc` flag |
|
|
947
|
-
| `session_expired` | Re-authenticate |
|
|
948
|
-
|
|
949
|
-
**Security:** Output sanitization (cookies/tokens redacted), prompt injection defense (`[PAGE_CONTENT: ...]` delimiters), AES-256-GCM encryption at rest, anti-bot measures (`webdriver=false`, random delays), read-only agent (no Write/Edit tools).
|
|
950
|
-
|
|
951
|
-
**Selector syntax:** `role=button[name='Submit']`, `css=div.class`, `text=Click here`, `#id`
|
|
952
|
-
|
|
953
|
-
**Usage:**
|
|
954
|
-
|
|
955
|
-
```bash
|
|
956
|
-
/web-ctl goto https://example.com
|
|
957
|
-
/web-ctl auth twitter --url https://x.com/i/flow/login
|
|
958
|
-
/web-ctl # describe what you want to do, agent orchestrates it
|
|
959
|
-
```
|
|
960
|
-
|
|
961
|
-
**Install:**
|
|
962
|
-
|
|
963
|
-
```bash
|
|
964
|
-
agentsys install web-ctl
|
|
965
|
-
npm install playwright
|
|
966
|
-
npx playwright install chromium
|
|
967
|
-
```
|
|
968
|
-
|
|
969
|
-
**Agent:** web-session (sonnet model)
|
|
970
|
-
|
|
971
|
-
**Skills:** web-auth (human-in-the-loop auth), web-browse (headless actions)
|
|
972
|
-
|
|
973
868
|
### /release
|
|
974
869
|
|
|
975
870
|
> Versioned release with automatic ecosystem and tooling detection
|
|
@@ -1327,7 +1222,7 @@ The system is built on research, not guesswork.
|
|
|
1327
1222
|
- Instruction following reliability
|
|
1328
1223
|
|
|
1329
1224
|
**Testing:**
|
|
1330
|
-
- 3,
|
|
1225
|
+
- 3,518 tests passing
|
|
1331
1226
|
- Drift-detect validated on 1,000+ repositories
|
|
1332
1227
|
- E2E workflow testing across all commands
|
|
1333
1228
|
- Cross-platform validation (Claude Code, OpenCode, Codex CLI, Cursor, Kiro)
|
package/lib/binary/index.js
CHANGED
|
@@ -48,6 +48,12 @@ const { promisify } = require('util');
|
|
|
48
48
|
|
|
49
49
|
const execFileAsync = promisify(cp.execFile);
|
|
50
50
|
|
|
51
|
+
// repo-intel artifacts grow with history: a mature repo's JSON can exceed 20 MB
|
|
52
|
+
// (agnix measured ~21 MB). Node's execFile default maxBuffer is 1 MB, which
|
|
53
|
+
// silently fails init/update/query on any real repo with "stdout maxBuffer length
|
|
54
|
+
// exceeded". Cap generously; callers can override via options.maxBuffer.
|
|
55
|
+
const ANALYZER_MAX_BUFFER = 256 * 1024 * 1024;
|
|
56
|
+
|
|
51
57
|
const { ANALYZER_MIN_VERSION, BINARY_NAME, GITHUB_REPO } = require('./version');
|
|
52
58
|
|
|
53
59
|
const PLATFORM_MAP = {
|
|
@@ -957,7 +963,7 @@ function ensureBinarySync(options) {
|
|
|
957
963
|
*/
|
|
958
964
|
function runAnalyzer(args, options) {
|
|
959
965
|
const binPath = ensureBinarySync();
|
|
960
|
-
const opts = Object.assign({ encoding: 'utf8', windowsHide: true }, options);
|
|
966
|
+
const opts = Object.assign({ encoding: 'utf8', windowsHide: true, maxBuffer: ANALYZER_MAX_BUFFER }, options);
|
|
961
967
|
if (!opts.stdio) opts.stdio = ['pipe', 'pipe', 'pipe'];
|
|
962
968
|
const result = cp.execFileSync(binPath, args, opts);
|
|
963
969
|
return typeof result === 'string' ? result : result.toString('utf8');
|
|
@@ -971,7 +977,7 @@ function runAnalyzer(args, options) {
|
|
|
971
977
|
*/
|
|
972
978
|
async function runAnalyzerAsync(args, options) {
|
|
973
979
|
const binPath = await ensureBinary();
|
|
974
|
-
const opts = Object.assign({ encoding: 'utf8', windowsHide: true }, options);
|
|
980
|
+
const opts = Object.assign({ encoding: 'utf8', windowsHide: true, maxBuffer: ANALYZER_MAX_BUFFER }, options);
|
|
975
981
|
const result = await execFileAsync(binPath, args, opts);
|
|
976
982
|
return result.stdout;
|
|
977
983
|
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Shared HTTP + archive helpers used by both binary resolvers
|
|
5
|
+
* (`lib/binary/index.js` for `agent-analyzer`, `lib/embed/binary.js`
|
|
6
|
+
* for `agent-analyzer-embed`).
|
|
7
|
+
*
|
|
8
|
+
* Extracted to keep the two resolvers from drifting on HTTP redirect
|
|
9
|
+
* handling, GitHub auth, and archive extraction details — a single
|
|
10
|
+
* fix to e.g. the timeout policy or the redirect cap lands once and
|
|
11
|
+
* applies to both binaries.
|
|
12
|
+
*
|
|
13
|
+
* @module lib/binary/shared-helpers
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const os = require('os');
|
|
19
|
+
const https = require('https');
|
|
20
|
+
const cp = require('child_process');
|
|
21
|
+
|
|
22
|
+
const DEFAULT_DOWNLOAD_TIMEOUT_MS = 30000;
|
|
23
|
+
const MAX_REDIRECTS = 5;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Fetch a URL into an in-memory Buffer following up to 5 redirects.
|
|
27
|
+
*
|
|
28
|
+
* Honors `GITHUB_TOKEN` / `GH_TOKEN` for authenticated requests
|
|
29
|
+
* (raises rate limit, lets private-repo asset URLs work). Stalled
|
|
30
|
+
* connections are killed by the per-request timeout — without this
|
|
31
|
+
* a stuck socket would hang the process indefinitely.
|
|
32
|
+
*
|
|
33
|
+
* @param {string} url
|
|
34
|
+
* @param {Object} [options]
|
|
35
|
+
* @param {string} [options.userAgent='agent-sh/binary-resolver']
|
|
36
|
+
* @param {number} [options.timeoutMs=30000] - per-request timeout
|
|
37
|
+
* @returns {Promise<Buffer>}
|
|
38
|
+
*/
|
|
39
|
+
function downloadToBuffer(url, options) {
|
|
40
|
+
const opts = options || {};
|
|
41
|
+
const userAgent = opts.userAgent || 'agent-sh/binary-resolver';
|
|
42
|
+
const timeoutMs = opts.timeoutMs || DEFAULT_DOWNLOAD_TIMEOUT_MS;
|
|
43
|
+
|
|
44
|
+
return new Promise(function (resolve, reject) {
|
|
45
|
+
const ghToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;
|
|
46
|
+
|
|
47
|
+
function request(reqUrl, redirectCount) {
|
|
48
|
+
if (redirectCount > MAX_REDIRECTS) {
|
|
49
|
+
reject(new Error('Too many redirects fetching from ' + url));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const headers = {
|
|
53
|
+
'User-Agent': userAgent,
|
|
54
|
+
'Accept': 'application/octet-stream'
|
|
55
|
+
};
|
|
56
|
+
if (ghToken) headers['Authorization'] = 'Bearer ' + ghToken;
|
|
57
|
+
|
|
58
|
+
const req = https.get(reqUrl, { headers: headers, timeout: timeoutMs }, function (res) {
|
|
59
|
+
const sc = res.statusCode;
|
|
60
|
+
if (sc === 301 || sc === 302 || sc === 307 || sc === 308) {
|
|
61
|
+
res.resume();
|
|
62
|
+
var loc = res.headers.location;
|
|
63
|
+
if (loc && !loc.startsWith('https://')) {
|
|
64
|
+
reject(new Error('Refusing non-HTTPS redirect to ' + loc));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
request(loc, redirectCount + 1);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (sc !== 200) {
|
|
71
|
+
res.resume();
|
|
72
|
+
const hint = sc === 403 ? ' (rate limited - set GITHUB_TOKEN env var)' : '';
|
|
73
|
+
reject(new Error('HTTP ' + sc + hint + ' fetching ' + reqUrl));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const chunks = [];
|
|
77
|
+
res.on('data', function (chunk) { chunks.push(chunk); });
|
|
78
|
+
res.on('end', function () { resolve(Buffer.concat(chunks)); });
|
|
79
|
+
res.on('error', reject);
|
|
80
|
+
});
|
|
81
|
+
req.on('error', reject);
|
|
82
|
+
req.on('timeout', function () {
|
|
83
|
+
req.destroy();
|
|
84
|
+
reject(new Error('Timeout (' + timeoutMs + 'ms) fetching ' + reqUrl));
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
request(url, 0);
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Extract a `.tar.gz` Buffer into `destDir` using the system `tar`.
|
|
94
|
+
* Available on Linux, macOS, and Windows (built into recent Win10/11).
|
|
95
|
+
*
|
|
96
|
+
* @param {Buffer} buf
|
|
97
|
+
* @param {string} destDir
|
|
98
|
+
* @returns {Promise<void>}
|
|
99
|
+
*/
|
|
100
|
+
function extractTarGz(buf, destDir) {
|
|
101
|
+
return new Promise(function (resolve, reject) {
|
|
102
|
+
const tarDest = process.platform === 'win32' ? destDir.replace(/\\/g, '/') : destDir;
|
|
103
|
+
const tar = cp.spawn('tar', ['xz', '-C', tarDest], {
|
|
104
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
105
|
+
});
|
|
106
|
+
let stderr = '';
|
|
107
|
+
tar.stderr.on('data', function (d) { stderr += d; });
|
|
108
|
+
tar.stdin.write(buf);
|
|
109
|
+
tar.stdin.end();
|
|
110
|
+
tar.on('close', function (code) {
|
|
111
|
+
if (code !== 0) {
|
|
112
|
+
reject(new Error('tar extraction failed (code ' + code + '): ' + stderr));
|
|
113
|
+
} else {
|
|
114
|
+
resolve();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
tar.on('error', reject);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Extract a `.zip` Buffer into `destDir` using PowerShell's
|
|
123
|
+
* `Expand-Archive` (Windows-only).
|
|
124
|
+
*
|
|
125
|
+
* @param {Buffer} buf
|
|
126
|
+
* @param {string} destDir
|
|
127
|
+
* @param {string} binaryName - used as the temp-dir prefix
|
|
128
|
+
* @returns {Promise<void>}
|
|
129
|
+
*/
|
|
130
|
+
function extractZip(buf, destDir, binaryName) {
|
|
131
|
+
return new Promise(function (resolve, reject) {
|
|
132
|
+
var tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), binaryName + '-'));
|
|
133
|
+
var tmpZip = path.join(tmpDir, 'archive.zip');
|
|
134
|
+
fs.writeFileSync(tmpZip, buf);
|
|
135
|
+
var ps = cp.spawn(
|
|
136
|
+
'powershell',
|
|
137
|
+
['-NoProfile', '-NonInteractive', '-Command',
|
|
138
|
+
'Expand-Archive', '-Path', tmpZip, '-DestinationPath', destDir, '-Force'],
|
|
139
|
+
{ stdio: ['ignore', 'pipe', 'pipe'] }
|
|
140
|
+
);
|
|
141
|
+
var stderr = '';
|
|
142
|
+
ps.stderr.on('data', function (d) { stderr += d; });
|
|
143
|
+
ps.on('close', function (code) {
|
|
144
|
+
try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch (e) { /* ignore */ }
|
|
145
|
+
if (code !== 0) {
|
|
146
|
+
reject(new Error('zip extraction failed (code ' + code + '): ' + stderr));
|
|
147
|
+
} else {
|
|
148
|
+
resolve();
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
ps.on('error', reject);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
module.exports = {
|
|
156
|
+
downloadToBuffer,
|
|
157
|
+
extractTarGz,
|
|
158
|
+
extractZip,
|
|
159
|
+
DEFAULT_DOWNLOAD_TIMEOUT_MS
|
|
160
|
+
};
|
|
@@ -126,7 +126,10 @@ function extractSymbols(content) {
|
|
|
126
126
|
symbols.functions.push(match[1]);
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
|
|
129
|
+
// ReDoS fix: bound the unbounded \s* / async runs and the parameter list so the
|
|
130
|
+
// matcher cannot backtrack polynomially on pathological input. Bounds are large
|
|
131
|
+
// enough that all realistic source matches identically to the prior \s*/[^)]* form.
|
|
132
|
+
const arrowPattern = /(?:const|let)\s{1,1000}([a-zA-Z_$][a-zA-Z0-9_$]*)\s{0,1000}=\s{0,1000}(?:async\s{0,1000})?\([^)]{0,2000}\)\s{0,1000}=>/g;
|
|
130
133
|
while ((match = arrowPattern.exec(content)) !== null) {
|
|
131
134
|
symbols.functions.push(match[1]);
|
|
132
135
|
}
|
|
@@ -141,7 +144,9 @@ function extractSymbols(content) {
|
|
|
141
144
|
symbols.exports.push(match[1]);
|
|
142
145
|
}
|
|
143
146
|
|
|
144
|
-
|
|
147
|
+
// ReDoS fix: bound the \s* runs and capture length so the matcher stays linear;
|
|
148
|
+
// bounds exceed any realistic module.exports declaration so matches are unchanged.
|
|
149
|
+
const moduleExportsPattern = /module\.exports\s{0,1000}=\s{0,1000}\{([^}]{1,100000})\}/;
|
|
145
150
|
const moduleMatch = content.match(moduleExportsPattern);
|
|
146
151
|
if (moduleMatch) {
|
|
147
152
|
const keys = moduleMatch[1].split(',').map(k => k.trim().split(':')[0].trim());
|