@getmarrow/install 0.1.15 → 0.1.17
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 +20 -0
- package/package.json +1 -1
- package/src/governed-runner.js +22 -6
package/README.md
CHANGED
|
@@ -11,6 +11,18 @@ npx @getmarrow/install --repair
|
|
|
11
11
|
npx @getmarrow/install doctor
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
+
## What's New in v0.1.17
|
|
15
|
+
|
|
16
|
+
v0.1.17 expands the Govern TUI harness addon coverage while preserving adaptive mode recommendations.
|
|
17
|
+
|
|
18
|
+
- `npx @getmarrow/install govern` now shows first-class rows for Codex, Claude Code, Cursor, Cline, Gemini CLI, Grok CLI, DeepSeek CLI, Minimax CLI, Kimi CLI, Hermes, GLM CLI, Qwen CLI, OpenCode, OpenClaw, MCP-compatible clients, CI scripts, and custom commands.
|
|
19
|
+
- Marrow remains a thin governance layer. It does not replace your model or harness; it wraps the command your agent already runs with pre-action risk gates, proof requirements, and automatic outcome closure.
|
|
20
|
+
- Detection stays recommendation-first. Marrow uses local config, instruction, CI, and MCP markers to suggest the safest path, then the user or owner accepts, overrides, or saves a policy profile.
|
|
21
|
+
- Cursor is treated as a development workflow surface. Marrow can govern Cursor-backed code review, edits, tests, deploys, and release steps through MCP setup, project rules, or the governed command wrapper.
|
|
22
|
+
- If a harness is not detected yet, use **Custom command** or `npx @getmarrow/install run -- <your-agent-command>` to govern it immediately.
|
|
23
|
+
|
|
24
|
+
Business value: teams can add Marrow to the agent stack they already use instead of migrating to a new agent host. Codex, Claude Code, Cursor, Cline, Gemini, Grok, DeepSeek, Minimax, Kimi/Moonshot, Hermes, GLM, Qwen, OpenClaw, OpenCode, MCP clients, and CI scripts can all be brought under the same governance loop.
|
|
25
|
+
|
|
14
26
|
## What's New in v0.1.14
|
|
15
27
|
|
|
16
28
|
v0.1.14 adds adaptive governance mode recommendations without silent auto-switching.
|
|
@@ -159,10 +171,18 @@ Marrow should answer with `proceed`, `warn`, `block`, or `owner_approval_require
|
|
|
159
171
|
- Codex/agent instruction files such as `AGENTS.md`
|
|
160
172
|
- Claude Code settings and hooks
|
|
161
173
|
- Cursor project folders
|
|
174
|
+
- Gemini, Grok, DeepSeek, Minimax, Kimi/Moonshot, Hermes, GLM, and Qwen project marker files when present
|
|
162
175
|
- MCP config files
|
|
176
|
+
- CI workflow/script markers
|
|
163
177
|
- Node projects
|
|
164
178
|
- Python projects
|
|
165
179
|
|
|
180
|
+
The detector is intentionally conservative. If Marrow cannot identify the harness from local files, it still supports the workflow through the custom command path:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
MARROW_API_KEY=mrw_live_xxx npx @getmarrow/install run --agent research-agent -- <your-agent-command>
|
|
184
|
+
```
|
|
185
|
+
|
|
166
186
|
## Install Modes
|
|
167
187
|
|
|
168
188
|
```bash
|
package/package.json
CHANGED
package/src/governed-runner.js
CHANGED
|
@@ -568,14 +568,29 @@ async function statusOnly(parsed) {
|
|
|
568
568
|
return requestJson(parsed.options, 'GET', '/v1/agent/status');
|
|
569
569
|
}
|
|
570
570
|
|
|
571
|
+
function existsAny(paths) {
|
|
572
|
+
return paths.some((candidate) => fs.existsSync(candidate));
|
|
573
|
+
}
|
|
574
|
+
|
|
571
575
|
function detectHarnesses(cwd = process.cwd()) {
|
|
576
|
+
const home = os.homedir();
|
|
572
577
|
const candidates = [
|
|
573
|
-
{ name: 'Codex', command: 'codex', detected:
|
|
574
|
-
{ name: 'Claude Code', command: 'claude -p', detected:
|
|
575
|
-
{ name: 'Cursor', command: 'cursor', detected:
|
|
576
|
-
{ name: '
|
|
577
|
-
{ name: '
|
|
578
|
-
{ name: '
|
|
578
|
+
{ name: 'Codex', command: 'codex', detected: existsAny([path.join(cwd, 'AGENTS.md'), path.join(cwd, '.codex'), path.join(home, '.codex')]) },
|
|
579
|
+
{ name: 'Claude Code', command: 'claude -p', detected: existsAny([path.join(cwd, 'CLAUDE.md'), path.join(cwd, '.claude'), path.join(home, '.claude.json')]) },
|
|
580
|
+
{ name: 'Cursor', command: 'cursor', detected: existsAny([path.join(cwd, '.cursor'), path.join(cwd, '.cursor', 'mcp.json'), path.join(cwd, '.cursor', 'rules'), path.join(home, '.cursor')]) },
|
|
581
|
+
{ name: 'Gemini CLI', command: 'gemini', detected: existsAny([path.join(cwd, 'GEMINI.md'), path.join(cwd, '.gemini'), path.join(home, '.gemini')]) },
|
|
582
|
+
{ name: 'Grok CLI', command: 'grok', detected: existsAny([path.join(cwd, 'GROK.md'), path.join(cwd, '.grok'), path.join(home, '.grok')]) },
|
|
583
|
+
{ name: 'DeepSeek CLI', command: 'deepseek', detected: existsAny([path.join(cwd, 'DEEPSEEK.md'), path.join(cwd, '.deepseek'), path.join(home, '.deepseek')]) },
|
|
584
|
+
{ name: 'Minimax CLI', command: 'minimax', detected: existsAny([path.join(cwd, 'MINIMAX.md'), path.join(cwd, '.minimax'), path.join(home, '.minimax')]) },
|
|
585
|
+
{ name: 'Kimi CLI', command: 'kimi', detected: existsAny([path.join(cwd, 'KIMI.md'), path.join(cwd, 'MOONSHOT.md'), path.join(cwd, '.kimi'), path.join(cwd, '.moonshot'), path.join(home, '.kimi'), path.join(home, '.moonshot')]) },
|
|
586
|
+
{ name: 'Hermes', command: 'hermes', detected: existsAny([path.join(cwd, 'HERMES.md'), path.join(cwd, 'hermes.json'), path.join(cwd, '.hermes'), path.join(home, '.hermes')]) },
|
|
587
|
+
{ name: 'GLM CLI', command: 'glm', detected: existsAny([path.join(cwd, 'GLM.md'), path.join(cwd, '.glm'), path.join(home, '.glm')]) },
|
|
588
|
+
{ name: 'Qwen CLI', command: 'qwen', detected: existsAny([path.join(cwd, 'QWEN.md'), path.join(cwd, '.qwen'), path.join(home, '.qwen')]) },
|
|
589
|
+
{ name: 'Cline', command: 'cline', detected: existsAny([path.join(cwd, '.cline'), path.join(cwd, 'CLINE.md'), path.join(home, '.cline')]) },
|
|
590
|
+
{ name: 'OpenCode', command: 'opencode', detected: existsAny([path.join(cwd, 'opencode.json'), path.join(cwd, '.opencode'), path.join(home, '.opencode')]) },
|
|
591
|
+
{ name: 'OpenClaw', command: 'openclaw agent', detected: existsAny([path.join(cwd, 'openclaw.json'), path.join(home, '.openclaw')]) },
|
|
592
|
+
{ name: 'MCP-compatible client', command: '<mcp-client>', detected: existsAny([path.join(cwd, '.mcp.json'), path.join(cwd, '.cursor', 'mcp.json'), path.join(cwd, '.claude', 'settings.json')]) },
|
|
593
|
+
{ name: 'CI scripts', command: 'npm test', detected: existsAny([path.join(cwd, '.github', 'workflows'), path.join(cwd, '.gitlab-ci.yml'), path.join(cwd, 'package.json')]) },
|
|
579
594
|
{ name: 'Custom command', command: '<your-agent-command>', detected: true },
|
|
580
595
|
];
|
|
581
596
|
return candidates;
|
|
@@ -1001,6 +1016,7 @@ module.exports = {
|
|
|
1001
1016
|
inferSurfaces,
|
|
1002
1017
|
commandForSelection,
|
|
1003
1018
|
buildGovernState,
|
|
1019
|
+
detectHarnesses,
|
|
1004
1020
|
detectProjectSignals,
|
|
1005
1021
|
recommendGovernanceMode,
|
|
1006
1022
|
recordGovernanceModeSelection,
|