martin-loop 0.1.4 → 0.1.5
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/LICENSE +21 -21
- package/README.md +398 -362
- package/demo/seeded-workspace/README.md +35 -0
- package/demo/seeded-workspace/TASKS.md +29 -0
- package/demo/seeded-workspace/martin.config.yaml +11 -0
- package/demo/seeded-workspace/package.json +8 -0
- package/demo/seeded-workspace/src/invoice-summary.js +11 -0
- package/demo/seeded-workspace/test/invoice-summary.test.js +20 -0
- package/dist/vendor/adapters/claude-cli.d.ts +19 -4
- package/dist/vendor/adapters/claude-cli.js +55 -24
- package/dist/vendor/adapters/cli-bridge.d.ts +1 -0
- package/dist/vendor/adapters/cli-bridge.js +154 -28
- package/dist/vendor/adapters/index.d.ts +1 -0
- package/dist/vendor/adapters/index.js +1 -0
- package/dist/vendor/adapters/verifier-only.d.ts +7 -0
- package/dist/vendor/adapters/verifier-only.js +57 -0
- package/dist/vendor/cli/index.d.ts +6 -1
- package/dist/vendor/cli/index.js +124 -7
- package/dist/vendor/contracts/index.d.ts +3 -1
- package/dist/vendor/core/compiler.d.ts +2 -0
- package/dist/vendor/core/compiler.js +10 -4
- package/dist/vendor/core/context-integrity.d.ts +26 -0
- package/dist/vendor/core/context-integrity.js +56 -0
- package/dist/vendor/core/index.d.ts +5 -2
- package/dist/vendor/core/index.js +186 -54
- package/dist/vendor/core/policy.d.ts +6 -0
- package/docs/distribution/DIRECTORY-SUBMISSIONS.md +89 -0
- package/docs/distribution/INTEGRATION-OUTREACH.md +61 -0
- package/docs/distribution/UNDER-3-CHALLENGE.md +65 -0
- package/docs/oss/CLAUDE-CODE-WALKTHROUGH.md +142 -0
- package/docs/oss/EXAMPLES.md +134 -126
- package/docs/oss/OSS-BOUNDARY-REPORT.json +109 -113
- package/docs/oss/OSS-BOUNDARY-REPORT.md +48 -48
- package/docs/oss/QUICKSTART.md +165 -135
- package/docs/oss/RALPH-LOOP-SAFETY.md +113 -0
- package/docs/oss/README.md +96 -93
- package/docs/oss/RELEASE-SURFACE-REPORT.json +45 -45
- package/docs/oss/RELEASE-SURFACE-REPORT.md +35 -35
- package/package.json +19 -11
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Claude Code Walkthrough
|
|
2
|
+
|
|
3
|
+
This walkthrough shows how to put MartinLoop around a Claude Code-driven coding task so the run has a budget, a verifier gate, an explicit stop reason, and an inspectable run record.
|
|
4
|
+
|
|
5
|
+
Back to the repo overview: [README.md](../../README.md)
|
|
6
|
+
|
|
7
|
+
## What MartinLoop adds around Claude Code
|
|
8
|
+
|
|
9
|
+
Claude Code is the coding engine. MartinLoop is the governance layer around it.
|
|
10
|
+
|
|
11
|
+
- **Budget**: hard USD, token, and iteration limits decide how far the run can go.
|
|
12
|
+
- **Verifier**: the run only counts as complete when the post-run verification command passes.
|
|
13
|
+
- **Stop reason**: MartinLoop records why the run stopped, such as `completed`, `budget_exit`, or `human_escalation`.
|
|
14
|
+
- **Run record**: each run appends a JSONL record under `~/.martin/runs/` so you can inspect it later.
|
|
15
|
+
|
|
16
|
+
## Prerequisites
|
|
17
|
+
|
|
18
|
+
- Node.js 20+
|
|
19
|
+
- `pnpm` 10.x if you are running from this repo
|
|
20
|
+
- Claude Code CLI installed and authenticated
|
|
21
|
+
- A repo you want Claude Code to work in
|
|
22
|
+
|
|
23
|
+
## Install MartinLoop
|
|
24
|
+
|
|
25
|
+
For the published CLI:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npm install -g martin-loop
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
For repo-local development in this monorepo:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpm install
|
|
35
|
+
pnpm build
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Simple local run
|
|
39
|
+
|
|
40
|
+
Run MartinLoop with the default Claude adapter and a verifier command:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
martin run "fix the auth regression" \
|
|
44
|
+
--engine claude \
|
|
45
|
+
--budget 3.00 \
|
|
46
|
+
--verify "pnpm test"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
What happens:
|
|
50
|
+
|
|
51
|
+
- MartinLoop hands the objective to Claude Code
|
|
52
|
+
- Claude Code attempts the work
|
|
53
|
+
- MartinLoop runs the verifier command
|
|
54
|
+
- the loop only finishes as `completed` when the agent result and verifier both pass
|
|
55
|
+
|
|
56
|
+
## Budget example
|
|
57
|
+
|
|
58
|
+
Use a hard cap and a smaller iteration budget when you want Claude Code to stay tightly bounded:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
martin run "tighten the login retry handling" \
|
|
62
|
+
--engine claude \
|
|
63
|
+
--budget 2.00 \
|
|
64
|
+
--soft-limit-usd 1.25 \
|
|
65
|
+
--max-iterations 2 \
|
|
66
|
+
--max-tokens 20000 \
|
|
67
|
+
--verify "pnpm --filter @martin/core test"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
This is the key MartinLoop value-add for Claude Code workflows: the agent can keep trying, but only inside a contract you can review before the spend drifts.
|
|
71
|
+
|
|
72
|
+
## Verifier example
|
|
73
|
+
|
|
74
|
+
Use a verifier that matches the exact scope of the change:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
martin run "update the OSS quickstart wording" \
|
|
78
|
+
--engine claude \
|
|
79
|
+
--cwd . \
|
|
80
|
+
--allow-path README.md \
|
|
81
|
+
--allow-path docs/oss/** \
|
|
82
|
+
--deny-path apps/control-plane/** \
|
|
83
|
+
--accept "Only documentation files may change" \
|
|
84
|
+
--verify "pnpm --filter @martin/core test"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
The verifier gate matters because Claude Code producing a patch is not the same thing as the repo being in a valid state.
|
|
88
|
+
|
|
89
|
+
## Inspect example
|
|
90
|
+
|
|
91
|
+
After a run, inspect the persisted JSONL record:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
martin inspect --file ~/.martin/runs/<workspaceId>.jsonl
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Look for:
|
|
98
|
+
|
|
99
|
+
- the final lifecycle state and stop reason
|
|
100
|
+
- budget and token totals
|
|
101
|
+
- verifier outcome
|
|
102
|
+
- attempt count and failure classification
|
|
103
|
+
|
|
104
|
+
## Safe repo-local dry run
|
|
105
|
+
|
|
106
|
+
If you want to validate the MartinLoop flow without real model spend, use stub mode first:
|
|
107
|
+
|
|
108
|
+
### PowerShell
|
|
109
|
+
|
|
110
|
+
```powershell
|
|
111
|
+
$env:MARTIN_LIVE='false'
|
|
112
|
+
$repoRoot = (Get-Location).Path
|
|
113
|
+
pnpm run:cli -- run `
|
|
114
|
+
--cwd $repoRoot `
|
|
115
|
+
--objective "Summarize the current runtime state" `
|
|
116
|
+
--verify "pnpm --filter @martin/core test"
|
|
117
|
+
Remove-Item Env:MARTIN_LIVE
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
This does not invoke Claude Code, and it will usually end with a recorded non-success stop reason because no live provider request was attempted. That is still the fastest way to confirm the loop, persistence, and verifier path are wired correctly before you switch to a live Claude run.
|
|
121
|
+
|
|
122
|
+
## Common errors and troubleshooting
|
|
123
|
+
|
|
124
|
+
### `claude` is not found
|
|
125
|
+
|
|
126
|
+
MartinLoop can only use the Claude adapter when the Claude Code CLI is installed and available on `PATH`. Confirm the CLI itself works before you debug MartinLoop.
|
|
127
|
+
|
|
128
|
+
### The run stops with `budget_exit`
|
|
129
|
+
|
|
130
|
+
The configured budget, iteration limit, or token ceiling was too tight for the requested task. Either narrow the task or raise the budget intentionally.
|
|
131
|
+
|
|
132
|
+
### The verifier fails even though Claude Code produced a patch
|
|
133
|
+
|
|
134
|
+
That means MartinLoop did its job. The patch was attempted, but the repo did not reach a verified state. Tighten the scope, change the verifier, or ask Claude Code to address the failing checks directly.
|
|
135
|
+
|
|
136
|
+
### The run exits with `human_escalation`
|
|
137
|
+
|
|
138
|
+
That usually means MartinLoop detected a path that should not proceed unattended, such as an unsafe verifier or a control boundary that needs review.
|
|
139
|
+
|
|
140
|
+
### `martin inspect` cannot find the file
|
|
141
|
+
|
|
142
|
+
Run another task first, or point `inspect` at the correct JSONL file under `~/.martin/runs/`.
|
package/docs/oss/EXAMPLES.md
CHANGED
|
@@ -1,126 +1,134 @@
|
|
|
1
|
-
# Examples
|
|
2
|
-
|
|
3
|
-
These examples are grounded in the current CLI and MCP surfaces in this repo. Where an example depends on a real provider path, it is labeled that way explicitly.
|
|
4
|
-
|
|
5
|
-
These are still primarily repo-local RC examples. The root `martin-loop` package facade is now real and smoke-validated, but registry publication remains a later release step.
|
|
6
|
-
|
|
7
|
-
## 1. Stub-backed hello world
|
|
8
|
-
|
|
9
|
-
Use this when you want a safe first pass through the loop without real model spend.
|
|
10
|
-
|
|
11
|
-
### PowerShell
|
|
12
|
-
|
|
13
|
-
```powershell
|
|
14
|
-
$env:MARTIN_LIVE='false'
|
|
15
|
-
pnpm run:cli -- run `
|
|
16
|
-
--workspace ws_demo `
|
|
17
|
-
--project proj_demo `
|
|
18
|
-
--objective "Describe the current Martin run lifecycle in one paragraph" `
|
|
19
|
-
--verify "pnpm --filter @martin/core test"
|
|
20
|
-
Remove-Item Env:MARTIN_LIVE
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
Why this is useful:
|
|
24
|
-
|
|
25
|
-
- exercises `runMartin`
|
|
26
|
-
- writes a real loop record and artifacts
|
|
27
|
-
- avoids external provider dependencies
|
|
28
|
-
|
|
29
|
-
## 2. Repo-backed task with explicit scope
|
|
30
|
-
|
|
31
|
-
Use allow and deny paths so the task contract is narrow and reviewable.
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
pnpm run:cli -- run \
|
|
35
|
-
--cwd . \
|
|
36
|
-
--objective "Tighten README wording for the OSS quickstart" \
|
|
37
|
-
--verify "pnpm --filter @martin/core test" \
|
|
38
|
-
--allow-path README.md \
|
|
39
|
-
--allow-path docs/oss/** \
|
|
40
|
-
--deny-path apps/control-plane/** \
|
|
41
|
-
--accept "Only update documentation files" \
|
|
42
|
-
--accept "Do not modify runtime code"
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
What this demonstrates:
|
|
46
|
-
|
|
47
|
-
- repo root selection with `--cwd`
|
|
48
|
-
- scoped file-edit boundaries
|
|
49
|
-
- acceptance criteria injection into the task contract
|
|
50
|
-
|
|
51
|
-
## 3. Safety-block example
|
|
52
|
-
|
|
53
|
-
This example is expected to block before execution because the verifier command is unsafe.
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
pnpm run:cli -- run \
|
|
57
|
-
--objective "Try to run an unsafe verifier" \
|
|
58
|
-
--verify "rm -rf ."
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Expected behavior:
|
|
62
|
-
|
|
63
|
-
- the leash blocks the verifier command before adapter execution
|
|
64
|
-
- the run exits through a safety-oriented path rather than pretending the command was acceptable
|
|
65
|
-
- the attempt artifact set includes a persisted leash artifact when applicable
|
|
66
|
-
|
|
67
|
-
The point of this example is not that `rm` exists on every machine. The point is that the raw verifier text is evaluated before the process would be allowed to run.
|
|
68
|
-
|
|
69
|
-
## 4. Budget-constrained live run
|
|
70
|
-
|
|
71
|
-
This is a live-provider example. Only use it when you have the relevant CLI and credentials configured.
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
pnpm run:cli -- run \
|
|
75
|
-
--engine codex \
|
|
76
|
-
--model o3 \
|
|
77
|
-
--objective "Refactor the CLI argument parser for clarity" \
|
|
78
|
-
--verify "pnpm --filter @martin/cli test" \
|
|
79
|
-
--budget-usd 2 \
|
|
80
|
-
--soft-limit-usd 1 \
|
|
81
|
-
--max-iterations 2
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
What to review afterward:
|
|
85
|
-
|
|
86
|
-
- admission and settlement events in `ledger.jsonl`
|
|
87
|
-
- cost provenance labels in the run artifacts
|
|
88
|
-
- whether the loop stopped for completion, budget pressure, or lack of progress
|
|
89
|
-
|
|
90
|
-
## 5. MCP invocation shape
|
|
91
|
-
|
|
92
|
-
The MCP server exposes `martin_run`, `martin_inspect`, and `martin_status`.
|
|
93
|
-
|
|
94
|
-
Example `martin_run` payload:
|
|
95
|
-
|
|
96
|
-
```json
|
|
97
|
-
{
|
|
98
|
-
"objective": "Tighten the local dashboard copy",
|
|
99
|
-
"workingDirectory": ".",
|
|
100
|
-
"engine": "claude",
|
|
101
|
-
"verificationPlan": ["pnpm --filter @martin/control-plane test"],
|
|
102
|
-
"maxUsd": 5,
|
|
103
|
-
"maxIterations": 2,
|
|
104
|
-
"maxTokens": 20000,
|
|
105
|
-
"workspaceId": "ws_mcp",
|
|
106
|
-
"projectId": "proj_mcp"
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## 6.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
-
|
|
115
|
-
|
|
116
|
-
- `
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
-
|
|
121
|
-
|
|
122
|
-
- `
|
|
123
|
-
- `
|
|
124
|
-
- `
|
|
125
|
-
|
|
126
|
-
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
These examples are grounded in the current CLI and MCP surfaces in this repo. Where an example depends on a real provider path, it is labeled that way explicitly.
|
|
4
|
+
|
|
5
|
+
These are still primarily repo-local RC examples. The root `martin-loop` package facade is now real and smoke-validated, but registry publication remains a later release step.
|
|
6
|
+
|
|
7
|
+
## 1. Stub-backed hello world
|
|
8
|
+
|
|
9
|
+
Use this when you want a safe first pass through the loop without real model spend.
|
|
10
|
+
|
|
11
|
+
### PowerShell
|
|
12
|
+
|
|
13
|
+
```powershell
|
|
14
|
+
$env:MARTIN_LIVE='false'
|
|
15
|
+
pnpm run:cli -- run `
|
|
16
|
+
--workspace ws_demo `
|
|
17
|
+
--project proj_demo `
|
|
18
|
+
--objective "Describe the current Martin run lifecycle in one paragraph" `
|
|
19
|
+
--verify "pnpm --filter @martin/core test"
|
|
20
|
+
Remove-Item Env:MARTIN_LIVE
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Why this is useful:
|
|
24
|
+
|
|
25
|
+
- exercises `runMartin`
|
|
26
|
+
- writes a real loop record and artifacts
|
|
27
|
+
- avoids external provider dependencies
|
|
28
|
+
|
|
29
|
+
## 2. Repo-backed task with explicit scope
|
|
30
|
+
|
|
31
|
+
Use allow and deny paths so the task contract is narrow and reviewable.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
pnpm run:cli -- run \
|
|
35
|
+
--cwd . \
|
|
36
|
+
--objective "Tighten README wording for the OSS quickstart" \
|
|
37
|
+
--verify "pnpm --filter @martin/core test" \
|
|
38
|
+
--allow-path README.md \
|
|
39
|
+
--allow-path docs/oss/** \
|
|
40
|
+
--deny-path apps/control-plane/** \
|
|
41
|
+
--accept "Only update documentation files" \
|
|
42
|
+
--accept "Do not modify runtime code"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
What this demonstrates:
|
|
46
|
+
|
|
47
|
+
- repo root selection with `--cwd`
|
|
48
|
+
- scoped file-edit boundaries
|
|
49
|
+
- acceptance criteria injection into the task contract
|
|
50
|
+
|
|
51
|
+
## 3. Safety-block example
|
|
52
|
+
|
|
53
|
+
This example is expected to block before execution because the verifier command is unsafe.
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pnpm run:cli -- run \
|
|
57
|
+
--objective "Try to run an unsafe verifier" \
|
|
58
|
+
--verify "rm -rf ."
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Expected behavior:
|
|
62
|
+
|
|
63
|
+
- the leash blocks the verifier command before adapter execution
|
|
64
|
+
- the run exits through a safety-oriented path rather than pretending the command was acceptable
|
|
65
|
+
- the attempt artifact set includes a persisted leash artifact when applicable
|
|
66
|
+
|
|
67
|
+
The point of this example is not that `rm` exists on every machine. The point is that the raw verifier text is evaluated before the process would be allowed to run.
|
|
68
|
+
|
|
69
|
+
## 4. Budget-constrained live run
|
|
70
|
+
|
|
71
|
+
This is a live-provider example. Only use it when you have the relevant CLI and credentials configured.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pnpm run:cli -- run \
|
|
75
|
+
--engine codex \
|
|
76
|
+
--model o3 \
|
|
77
|
+
--objective "Refactor the CLI argument parser for clarity" \
|
|
78
|
+
--verify "pnpm --filter @martin/cli test" \
|
|
79
|
+
--budget-usd 2 \
|
|
80
|
+
--soft-limit-usd 1 \
|
|
81
|
+
--max-iterations 2
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
What to review afterward:
|
|
85
|
+
|
|
86
|
+
- admission and settlement events in `ledger.jsonl`
|
|
87
|
+
- cost provenance labels in the run artifacts
|
|
88
|
+
- whether the loop stopped for completion, budget pressure, or lack of progress
|
|
89
|
+
|
|
90
|
+
## 5. MCP invocation shape
|
|
91
|
+
|
|
92
|
+
The MCP server exposes `martin_run`, `martin_inspect`, and `martin_status`.
|
|
93
|
+
|
|
94
|
+
Example `martin_run` payload:
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"objective": "Tighten the local dashboard copy",
|
|
99
|
+
"workingDirectory": ".",
|
|
100
|
+
"engine": "claude",
|
|
101
|
+
"verificationPlan": ["pnpm --filter @martin/control-plane test"],
|
|
102
|
+
"maxUsd": 5,
|
|
103
|
+
"maxIterations": 2,
|
|
104
|
+
"maxTokens": 20000,
|
|
105
|
+
"workspaceId": "ws_mcp",
|
|
106
|
+
"projectId": "proj_mcp"
|
|
107
|
+
}
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 6. GitHub Actions budget gate example
|
|
111
|
+
|
|
112
|
+
See [`examples/github-actions-budget-gate/`](../../examples/github-actions-budget-gate/) for a CI-safe example that runs MartinLoop with a budget cap, an explicit verifier, and an uploaded JSONL run record artifact.
|
|
113
|
+
|
|
114
|
+
## 7. OpenCode-style adapter example
|
|
115
|
+
|
|
116
|
+
If you want a runnable, no-credentials-required adapter sketch for another coding runtime, see [`examples/opencode-adapter/`](../../examples/opencode-adapter/). It shows how to keep MartinLoop's budget, verifier, and JSONL record shape stable around an OpenCode-style workflow without claiming a native adapter already exists.
|
|
117
|
+
|
|
118
|
+
## 8. What to inspect in artifacts
|
|
119
|
+
|
|
120
|
+
For a repo-backed attempt, look at:
|
|
121
|
+
|
|
122
|
+
- `contract.json`
|
|
123
|
+
- `state.json`
|
|
124
|
+
- `ledger.jsonl`
|
|
125
|
+
- `artifacts/attempt-XXX/compiled-context.json`
|
|
126
|
+
- `artifacts/attempt-XXX/diff.patch`
|
|
127
|
+
- `artifacts/attempt-XXX/grounding-scan.json`
|
|
128
|
+
- `artifacts/attempt-XXX/leash.json`
|
|
129
|
+
- `artifacts/attempt-XXX/patch-score.json`
|
|
130
|
+
- `artifacts/attempt-XXX/patch-decision.json`
|
|
131
|
+
- `artifacts/attempt-XXX/rollback-boundary.json`
|
|
132
|
+
- `artifacts/attempt-XXX/rollback-outcome.json`
|
|
133
|
+
|
|
134
|
+
Those files are the evidence trail that backs the runtime’s claims.
|
|
@@ -1,113 +1,109 @@
|
|
|
1
|
-
{
|
|
2
|
-
"generatedAt": "2026-
|
|
3
|
-
"verdict": "go",
|
|
4
|
-
"publicSurface": {
|
|
5
|
-
"packageName": "martin-loop",
|
|
6
|
-
"canonicalPackageManager": "npm",
|
|
7
|
-
"installCommand": "npm install martin-loop",
|
|
8
|
-
"npxCommand": "npx martin-loop",
|
|
9
|
-
"sdkImportPath": "martin-loop",
|
|
10
|
-
"supportsNpxCommand": true,
|
|
11
|
-
"supportsSdkImport": true
|
|
12
|
-
},
|
|
13
|
-
"ossCorePackages": [
|
|
14
|
-
{
|
|
15
|
-
"name": "@martin/contracts",
|
|
16
|
-
"path": "packages/contracts",
|
|
17
|
-
"private": true,
|
|
18
|
-
"publishAccess": null,
|
|
19
|
-
"workspaceDependencies": [],
|
|
20
|
-
"classification": "oss_core",
|
|
21
|
-
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
"name": "@martin/core",
|
|
25
|
-
"path": "packages/core",
|
|
26
|
-
"private": true,
|
|
27
|
-
"publishAccess": null,
|
|
28
|
-
"workspaceDependencies": [
|
|
29
|
-
"@martin/contracts"
|
|
30
|
-
],
|
|
31
|
-
"classification": "oss_core",
|
|
32
|
-
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"name": "@martin/adapters",
|
|
36
|
-
"path": "packages/adapters",
|
|
37
|
-
"private": true,
|
|
38
|
-
"publishAccess": null,
|
|
39
|
-
"workspaceDependencies": [
|
|
40
|
-
"@martin/core"
|
|
41
|
-
],
|
|
42
|
-
"classification": "oss_core",
|
|
43
|
-
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"name": "@martin/cli",
|
|
47
|
-
"path": "packages/cli",
|
|
48
|
-
"private": false,
|
|
49
|
-
"publishAccess": "public",
|
|
50
|
-
"workspaceDependencies": [
|
|
51
|
-
"@martin/adapters",
|
|
52
|
-
"@martin/contracts",
|
|
53
|
-
"@martin/core"
|
|
54
|
-
],
|
|
55
|
-
"classification": "oss_core",
|
|
56
|
-
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"name": "@
|
|
60
|
-
"path": "packages/mcp",
|
|
61
|
-
"private": false,
|
|
62
|
-
"publishAccess": "public",
|
|
63
|
-
"workspaceDependencies": [
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
"
|
|
107
|
-
"
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
"privateOssCoreCount": 3,
|
|
111
|
-
"publishReadyOssCoreCount": 2
|
|
112
|
-
}
|
|
113
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"generatedAt": "2026-05-11T21:47:36.834Z",
|
|
3
|
+
"verdict": "go",
|
|
4
|
+
"publicSurface": {
|
|
5
|
+
"packageName": "martin-loop",
|
|
6
|
+
"canonicalPackageManager": "npm",
|
|
7
|
+
"installCommand": "npm install martin-loop",
|
|
8
|
+
"npxCommand": "npx martin-loop",
|
|
9
|
+
"sdkImportPath": "martin-loop",
|
|
10
|
+
"supportsNpxCommand": true,
|
|
11
|
+
"supportsSdkImport": true
|
|
12
|
+
},
|
|
13
|
+
"ossCorePackages": [
|
|
14
|
+
{
|
|
15
|
+
"name": "@martin/contracts",
|
|
16
|
+
"path": "packages/contracts",
|
|
17
|
+
"private": true,
|
|
18
|
+
"publishAccess": null,
|
|
19
|
+
"workspaceDependencies": [],
|
|
20
|
+
"classification": "oss_core",
|
|
21
|
+
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "@martin/core",
|
|
25
|
+
"path": "packages/core",
|
|
26
|
+
"private": true,
|
|
27
|
+
"publishAccess": null,
|
|
28
|
+
"workspaceDependencies": [
|
|
29
|
+
"@martin/contracts"
|
|
30
|
+
],
|
|
31
|
+
"classification": "oss_core",
|
|
32
|
+
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "@martin/adapters",
|
|
36
|
+
"path": "packages/adapters",
|
|
37
|
+
"private": true,
|
|
38
|
+
"publishAccess": null,
|
|
39
|
+
"workspaceDependencies": [
|
|
40
|
+
"@martin/core"
|
|
41
|
+
],
|
|
42
|
+
"classification": "oss_core",
|
|
43
|
+
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "@martin/cli",
|
|
47
|
+
"path": "packages/cli",
|
|
48
|
+
"private": false,
|
|
49
|
+
"publishAccess": "public",
|
|
50
|
+
"workspaceDependencies": [
|
|
51
|
+
"@martin/adapters",
|
|
52
|
+
"@martin/contracts",
|
|
53
|
+
"@martin/core"
|
|
54
|
+
],
|
|
55
|
+
"classification": "oss_core",
|
|
56
|
+
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "@martinloop/mcp",
|
|
60
|
+
"path": "packages/mcp",
|
|
61
|
+
"private": false,
|
|
62
|
+
"publishAccess": "public",
|
|
63
|
+
"workspaceDependencies": [],
|
|
64
|
+
"classification": "oss_core",
|
|
65
|
+
"classificationReason": "Intended Phase 13 OSS core surface."
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"nonOssWorkspacePackages": [
|
|
69
|
+
{
|
|
70
|
+
"name": "@martin/control-plane",
|
|
71
|
+
"path": "apps/control-plane",
|
|
72
|
+
"private": true,
|
|
73
|
+
"publishAccess": null,
|
|
74
|
+
"workspaceDependencies": [
|
|
75
|
+
"@martin/contracts"
|
|
76
|
+
],
|
|
77
|
+
"classification": "non_oss_workspace",
|
|
78
|
+
"classificationReason": "Managed or RC-only workspace surface that stays out of the initial OSS boundary."
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "@martin/benchmarks",
|
|
82
|
+
"path": "benchmarks",
|
|
83
|
+
"private": true,
|
|
84
|
+
"publishAccess": null,
|
|
85
|
+
"workspaceDependencies": [
|
|
86
|
+
"@martin/adapters",
|
|
87
|
+
"@martin/contracts",
|
|
88
|
+
"@martin/core"
|
|
89
|
+
],
|
|
90
|
+
"classification": "non_oss_workspace",
|
|
91
|
+
"classificationReason": "Managed or RC-only workspace surface that stays out of the initial OSS boundary."
|
|
92
|
+
}
|
|
93
|
+
],
|
|
94
|
+
"localOnlySurfaces": [
|
|
95
|
+
{
|
|
96
|
+
"path": "apps/local-dashboard",
|
|
97
|
+
"reason": "Local read-model viewer that is not yet packaged as a publishable OSS workspace."
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"dependencyLeaks": [],
|
|
101
|
+
"summary": {
|
|
102
|
+
"ossCoreCount": 5,
|
|
103
|
+
"nonOssWorkspaceCount": 2,
|
|
104
|
+
"localOnlySurfaceCount": 1,
|
|
105
|
+
"dependencyLeakCount": 0,
|
|
106
|
+
"privateOssCoreCount": 3,
|
|
107
|
+
"publishReadyOssCoreCount": 2
|
|
108
|
+
}
|
|
109
|
+
}
|