@getmarrow/install 0.1.14 → 0.1.16

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 CHANGED
@@ -11,11 +11,22 @@ npx @getmarrow/install --repair
11
11
  npx @getmarrow/install doctor
12
12
  ```
13
13
 
14
+ ## What's New in v0.1.16
15
+
16
+ v0.1.16 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, Gemini CLI, Grok CLI, DeepSeek 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
+ - If a harness is not detected yet, use **Custom command** or `npx @getmarrow/install run -- <your-agent-command>` to govern it immediately.
22
+
23
+ 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, Gemini, Grok, DeepSeek, Hermes, GLM, Qwen, OpenClaw, OpenCode, MCP clients, and CI scripts can all be brought under the same governance loop.
24
+
14
25
  ## What's New in v0.1.14
15
26
 
16
27
  v0.1.14 adds adaptive governance mode recommendations without silent auto-switching.
17
28
 
18
- - `npx @getmarrow/install govern` now detects project signals such as `package.json`, deploy/publish scripts, `wrangler` config, GitHub workflows, migrations, Cursor/Codex/Claude files, and MCP config.
29
+ - `npx @getmarrow/install govern` now detects project signals such as `package.json`, deploy/publish scripts, platform config files, GitHub workflows, migrations, Cursor/Codex/Claude files, and MCP config.
19
30
  - When `MARROW_API_KEY` is present, the TUI asks Marrow for a recommended mode: `passive`, `pilot`, or `enforce`.
20
31
  - The TUI shows the exact reasons, confidence, and selected command before the user applies anything.
21
32
  - User choice is explicit. Marrow logs whether the recommendation was accepted or overridden, but it does not silently switch modes.
@@ -27,7 +38,7 @@ Example recommendation:
27
38
  Recommended mode: pilot
28
39
  Reason:
29
40
  - Node project detected
30
- - Cloudflare Worker detected
41
+ - Edge service detected
31
42
  - GitHub workflow detected
32
43
  - No owner approval policy configured yet
33
44
  ```
@@ -82,7 +93,7 @@ MARROW_API_KEY=mrw_live_xxx npx @getmarrow/install run --agent codex-prod --prof
82
93
  Gate a production action before the agent executes it:
83
94
 
84
95
  ```bash
85
- MARROW_API_KEY=mrw_live_xxx npx @getmarrow/install gate "deploy production worker after tests pass"
96
+ MARROW_API_KEY=mrw_live_xxx npx @getmarrow/install gate "deploy production service after tests pass"
86
97
  ```
87
98
 
88
99
  Wrap a real deploy, publish, merge, or migration command only after the agent has the required proof:
@@ -93,7 +104,7 @@ MARROW_API_KEY=mrw_live_xxx npx @getmarrow/install run \
93
104
  --type deploy \
94
105
  --profile production \
95
106
  --policy enforce \
96
- -- wrangler deploy
107
+ -- npm run deploy
97
108
  ```
98
109
 
99
110
  Use `--policy warn` for pilot mode and `--fail-open` only for non-production local workflows where Marrow should never block execution.
@@ -159,10 +170,18 @@ Marrow should answer with `proceed`, `warn`, `block`, or `owner_approval_require
159
170
  - Codex/agent instruction files such as `AGENTS.md`
160
171
  - Claude Code settings and hooks
161
172
  - Cursor project folders
173
+ - Gemini, Grok, DeepSeek, Hermes, GLM, and Qwen project marker files when present
162
174
  - MCP config files
175
+ - CI workflow/script markers
163
176
  - Node projects
164
177
  - Python projects
165
178
 
179
+ The detector is intentionally conservative. If Marrow cannot identify the harness from local files, it still supports the workflow through the custom command path:
180
+
181
+ ```bash
182
+ MARROW_API_KEY=mrw_live_xxx npx @getmarrow/install run --agent research-agent -- <your-agent-command>
183
+ ```
184
+
166
185
  ## Install Modes
167
186
 
168
187
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getmarrow/install",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "Universal installer for Marrow passive agent setup.",
5
5
  "bin": {
6
6
  "marrow-install": "bin/marrow-install.js"
@@ -568,14 +568,26 @@ 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: fs.existsSync(path.join(cwd, 'AGENTS.md')) || fs.existsSync(path.join(os.homedir(), '.codex')) },
574
- { name: 'Claude Code', command: 'claude -p', detected: fs.existsSync(path.join(cwd, 'CLAUDE.md')) || fs.existsSync(path.join(os.homedir(), '.claude.json')) },
575
- { name: 'Cursor', command: 'cursor', detected: fs.existsSync(path.join(cwd, '.cursor')) || fs.existsSync(path.join(os.homedir(), '.cursor')) },
576
- { name: 'OpenCode', command: 'opencode', detected: fs.existsSync(path.join(cwd, 'opencode.json')) || fs.existsSync(path.join(os.homedir(), '.opencode')) },
577
- { name: 'OpenClaw', command: 'openclaw agent', detected: fs.existsSync(path.join(os.homedir(), '.openclaw')) },
578
- { name: 'CI script', command: 'npm test', detected: fs.existsSync(path.join(cwd, 'package.json')) },
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: 'Hermes', command: 'hermes', detected: existsAny([path.join(cwd, 'HERMES.md'), path.join(cwd, 'hermes.json'), path.join(cwd, '.hermes'), path.join(home, '.hermes')]) },
585
+ { name: 'GLM CLI', command: 'glm', detected: existsAny([path.join(cwd, 'GLM.md'), path.join(cwd, '.glm'), path.join(home, '.glm')]) },
586
+ { name: 'Qwen CLI', command: 'qwen', detected: existsAny([path.join(cwd, 'QWEN.md'), path.join(cwd, '.qwen'), path.join(home, '.qwen')]) },
587
+ { name: 'OpenCode', command: 'opencode', detected: existsAny([path.join(cwd, 'opencode.json'), path.join(cwd, '.opencode'), path.join(home, '.opencode')]) },
588
+ { name: 'OpenClaw', command: 'openclaw agent', detected: existsAny([path.join(cwd, 'openclaw.json'), path.join(home, '.openclaw')]) },
589
+ { 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')]) },
590
+ { 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
591
  { name: 'Custom command', command: '<your-agent-command>', detected: true },
580
592
  ];
581
593
  return candidates;
@@ -1001,6 +1013,7 @@ module.exports = {
1001
1013
  inferSurfaces,
1002
1014
  commandForSelection,
1003
1015
  buildGovernState,
1016
+ detectHarnesses,
1004
1017
  detectProjectSignals,
1005
1018
  recommendGovernanceMode,
1006
1019
  recordGovernanceModeSelection,