@jeger-ai/opengantry 2.2.2 → 2.2.4
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 +97 -78
- package/dist/cli/commands/arch.js +4 -4
- package/dist/cli/commands/check-imports.js +1 -1
- package/dist/cli/commands/onboarding.js +5 -5
- package/dist/cli/commands/perimeter.js +2 -2
- package/dist/cli/commands/runtime.js +1 -1
- package/dist/cli/commands/scan.js +2 -2
- package/dist/cli/commands/teacher.js +1 -1
- package/dist/cli/commands/verify.js +3 -3
- package/dist/cli/lib/architecture-credential.js +1 -1
- package/dist/cli/lib/architecture-pointer.js +1 -1
- package/dist/cli/lib/ast-discovery.js +1 -1
- package/dist/cli/lib/audience-output.js +7 -7
- package/dist/cli/lib/cli-io.js +1 -1
- package/dist/cli/lib/config-namespace.d.ts +18 -0
- package/dist/cli/lib/config-namespace.d.ts.map +1 -0
- package/dist/cli/lib/config-namespace.js +39 -0
- package/dist/cli/lib/config-namespace.js.map +1 -0
- package/dist/cli/lib/constants.d.ts +6 -5
- package/dist/cli/lib/constants.d.ts.map +1 -1
- package/dist/cli/lib/constants.js +6 -5
- package/dist/cli/lib/constants.js.map +1 -1
- package/dist/cli/lib/context-feed-store.d.ts +1 -1
- package/dist/cli/lib/context-feed-store.js +1 -1
- package/dist/cli/lib/dirty-missions.js +1 -1
- package/dist/cli/lib/doctor-core.d.ts.map +1 -1
- package/dist/cli/lib/doctor-core.js +8 -7
- package/dist/cli/lib/doctor-core.js.map +1 -1
- package/dist/cli/lib/doctor-integration.js +1 -1
- package/dist/cli/lib/doctor-substrate.js +4 -4
- package/dist/cli/lib/errors.d.ts.map +1 -1
- package/dist/cli/lib/errors.js +2 -1
- package/dist/cli/lib/errors.js.map +1 -1
- package/dist/cli/lib/file-merge-gxt.js +2 -2
- package/dist/cli/lib/fix-hints.js +9 -9
- package/dist/cli/lib/git-metrics.js +1 -1
- package/dist/cli/lib/git-proof.d.ts +1 -1
- package/dist/cli/lib/git-proof.d.ts.map +1 -1
- package/dist/cli/lib/git-proof.js +3 -2
- package/dist/cli/lib/git-proof.js.map +1 -1
- package/dist/cli/lib/init-interactive.js +2 -2
- package/dist/cli/lib/init-plan.js +6 -6
- package/dist/cli/lib/init-tutorial.js +10 -10
- package/dist/cli/lib/kpi-engine.js +3 -3
- package/dist/cli/lib/kpi-scan.js +3 -3
- package/dist/cli/lib/legislate.d.ts.map +1 -1
- package/dist/cli/lib/legislate.js +11 -5
- package/dist/cli/lib/legislate.js.map +1 -1
- package/dist/cli/lib/manifest.js +2 -2
- package/dist/cli/lib/manifest.js.map +1 -1
- package/dist/cli/lib/mcp-governance.d.ts.map +1 -1
- package/dist/cli/lib/mcp-governance.js +4 -3
- package/dist/cli/lib/mcp-governance.js.map +1 -1
- package/dist/cli/lib/mcp-tools-register.js +4 -4
- package/dist/cli/lib/missions/formatter.js +1 -1
- package/dist/cli/lib/missions/parser.d.ts.map +1 -1
- package/dist/cli/lib/missions/parser.js +7 -5
- package/dist/cli/lib/missions/parser.js.map +1 -1
- package/dist/cli/lib/missions/validator.js +1 -1
- package/dist/cli/lib/msn-allocate.js +2 -2
- package/dist/cli/lib/onboarding-flow.js +5 -5
- package/dist/cli/lib/perimeter.js +1 -1
- package/dist/cli/lib/register-proposals.js +1 -1
- package/dist/cli/lib/runtime-env.d.ts.map +1 -1
- package/dist/cli/lib/runtime-env.js +7 -4
- package/dist/cli/lib/runtime-env.js.map +1 -1
- package/dist/cli/lib/skill-key.d.ts +12 -0
- package/dist/cli/lib/skill-key.d.ts.map +1 -0
- package/dist/cli/lib/skill-key.js +28 -0
- package/dist/cli/lib/skill-key.js.map +1 -0
- package/dist/cli/lib/staged-tmvc-guard.js +1 -1
- package/dist/cli/lib/start-orchestration.js +5 -5
- package/dist/cli/lib/status-report.js +3 -3
- package/dist/cli/lib/substrate-version.js +2 -2
- package/dist/cli/lib/surgeons/typescript-workspace.d.ts +1 -1
- package/dist/cli/lib/surgeons/typescript-workspace.js +3 -3
- package/dist/cli/lib/teacher-identity.d.ts +1 -2
- package/dist/cli/lib/teacher-identity.d.ts.map +1 -1
- package/dist/cli/lib/teacher-identity.js +11 -15
- package/dist/cli/lib/teacher-identity.js.map +1 -1
- package/dist/cli/lib/tmvc-path.d.ts.map +1 -1
- package/dist/cli/lib/tmvc-path.js +5 -2
- package/dist/cli/lib/tmvc-path.js.map +1 -1
- package/dist/cli/lib/types.d.ts +1 -1
- package/dist/cli/lib/upgrade-apply.js +5 -5
- package/dist/cli/lib/upgrade-plan.d.ts +1 -1
- package/dist/cli/lib/upgrade-plan.js +4 -4
- package/dist/cli/lib/verify-failure-normalize.js +1 -1
- package/dist/cli/lib/verify-hints.js +9 -9
- package/dist/cli/lib/verify-run.d.ts.map +1 -1
- package/dist/cli/lib/verify-run.js +3 -2
- package/dist/cli/lib/verify-run.js.map +1 -1
- package/dist/cli/lib/version.gen.d.ts +1 -1
- package/dist/cli/lib/version.gen.js +1 -1
- package/dist/cli/program-core.js +2 -2
- package/package.json +9 -4
- package/templates/.cursor/hooks/gxt-before-shell.sh +2 -2
- package/templates/.cursor/hooks/gxt-session-start.sh +5 -5
- package/templates/.cursor/mcp.json +1 -1
- package/templates/.cursor/rules/opengantry-gxt-substrate.mdc +4 -4
- package/templates/.gitagent/config.json +15 -0
- package/templates/.gitagent/foreman/MANIFEST.json +2 -2
- package/templates/.gitagent/foreman/SUBSTRATE.version.json +1 -1
- package/templates/.gitagent/foreman/TEACHER.allowlist.example +1 -1
- package/templates/.gitagent/missions/README.md +3 -3
- package/templates/.gitagent/teacher/ARCHITECTURE-ACCESS.md +8 -8
- package/templates/.gitagent/teacher/KPI-REPORT.schema.yaml +1 -1
- package/templates/.gitagent/teacher/MISSION-ARCHITECT.md +5 -5
- package/templates/.gitagent/teacher/MISSION.schema.yaml +2 -2
- package/templates/.gitagent/teacher/RULES.md +2 -2
- package/templates/.githooks/pre-commit +4 -4
- package/templates/.githooks/pre-push +6 -6
- package/templates/.github/workflows/gxt-validate.yml +14 -13
- package/templates/AGENTS.md +1 -1
- package/templates/integrations/asset-catalog.json +2 -1
- package/templates/integrations/compatibility.json +1 -1
- package/templates/integrations/recipes/_footer.md +6 -6
- package/templates/integrations/recipes/_preamble.md +9 -9
- package/templates/integrations/recipes/aider.md +1 -1
- package/templates/integrations/recipes/antigravity.md +1 -1
- package/templates/integrations/recipes/claude-code.md +1 -1
- package/templates/integrations/recipes/codex-cli.md +2 -2
- package/templates/integrations/recipes/cursor.md +3 -3
- package/templates/scripts/dev-validate.sh +1 -1
- package/templates/scripts/gxt-manifest-lib.mjs +418 -3
- package/templates/scripts/gxt-resolve-mission.sh +2 -2
- package/templates/scripts/gxt-runtime-env.sh +4 -4
- package/templates/scripts/validate-gxt.sh +5 -1
- package/templates/scripts/verify-pr-missions.sh +12 -6
- package/templates/skills/{gapman.md → gantry.md} +2 -2
package/README.md
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
It is **not** a real-time conversational agent wrapper. Use OpenGantry when you need auditable, mission-scoped repository work with explicit Teacher approval and forensic trace.
|
|
6
6
|
|
|
7
|
+
> **Not [Gantry.io](https://gantry.io)?** **Open Source Gantry** is the **`gantry` CLI** for **local-first**, **vendor-neutral**, **git-native governance** in your repository — not a hosted observability dashboard. If you are looking for infrastructure monitoring, see [Gantry.io](https://gantry.io).
|
|
8
|
+
|
|
7
9
|
Use OpenGantry when you need:
|
|
8
10
|
|
|
9
11
|
- **Agent-assisted product delivery without silent scope creep:** keep velocity while forcing explicit mission scope and path boundaries.
|
|
@@ -13,10 +15,21 @@ Use OpenGantry when you need:
|
|
|
13
15
|
### What you get in production
|
|
14
16
|
|
|
15
17
|
- **Review before run:** workers do not complete the loop until a human-approved mission defines scope, gates, and trace rows.
|
|
16
|
-
- **No silent governance edits:** hooks and `
|
|
18
|
+
- **No silent governance edits:** hooks and `gantry verify` fail closed on law, manifest, and mission paths without a Teacher `[MSN-XXXX]` commit.
|
|
17
19
|
- **Audit in Git:** `git log --grep='MSN-0042'` plus `WORKER_LOG.md` quotes that verifiers must cite verbatim.
|
|
18
20
|
|
|
19
|
-
**Protocol (implementers):** under the hood, **GXT (Git-native eXecution and Trace)** binds law, Foreman routing, deterministic gates, and trace mapping to `WORKER_LOG.md`. This repository is both the **specimen** and the **template**. Run **`
|
|
21
|
+
**Protocol (implementers):** under the hood, **GXT (Git-native eXecution and Trace)** binds law, Foreman routing, deterministic gates, and trace mapping to `WORKER_LOG.md`. This repository is both the **specimen** and the **template**. Run **`gantry init`** (or **`gantry init --tutorial`**) in your repo and adapt it.
|
|
22
|
+
|
|
23
|
+
## Gantry CLI — local-first governance
|
|
24
|
+
|
|
25
|
+
**Open Source Gantry** ships as the **Gantry CLI** (`npm install -g @jeger-ai/opengantry`). Governance runs **in your repo** — missions, deterministic gates, and **Gantry Git hook** enforcement (`.githooks/`, IDE hooks) — without routing agent work through a vendor cloud dashboard.
|
|
26
|
+
|
|
27
|
+
| Goal | Read first |
|
|
28
|
+
|------|------------|
|
|
29
|
+
| **Install + first mission** | [Install](#install) → [`docs/ADOPTION.md`](docs/ADOPTION.md) → [`docs/KATA.md`](docs/KATA.md) |
|
|
30
|
+
| **Gantry CLI command reference** | [gantry CLI](#gantry-cli) |
|
|
31
|
+
| **Git hooks + enforcement** | [Enforcement boundary](#enforcement-boundary) · [`docs/ADOPTION.md`](docs/ADOPTION.md) § Prevent unreviewed edits |
|
|
32
|
+
| **Wire IDE agents** | [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) |
|
|
20
33
|
|
|
21
34
|
## Install
|
|
22
35
|
|
|
@@ -24,7 +37,7 @@ Requires **Node.js 24+**.
|
|
|
24
37
|
|
|
25
38
|
```bash
|
|
26
39
|
npm install -g @jeger-ai/opengantry
|
|
27
|
-
|
|
40
|
+
gantry init --tutorial
|
|
28
41
|
```
|
|
29
42
|
|
|
30
43
|
Or without a global install:
|
|
@@ -33,7 +46,7 @@ Or without a global install:
|
|
|
33
46
|
npx @jeger-ai/opengantry init --tutorial
|
|
34
47
|
```
|
|
35
48
|
|
|
36
|
-
Developing this repository from source: `npm ci && npm run build` — see [
|
|
49
|
+
Developing this repository from source: `npm ci && npm run build` — see [gantry CLI](#gantry-cli) and [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md).
|
|
37
50
|
|
|
38
51
|
*Want to see the ROI? Run `npm run examples:benchmark` to compare an orchestrator specimen (improvised agent glue) against OpenGantry's TMVC protocol.* (Requires clone + `npm run build` — see [`docs/ADOPTION.md`](docs/ADOPTION.md).)
|
|
39
52
|
|
|
@@ -41,6 +54,7 @@ Developing this repository from source: `npm ci && npm run build` — see [gapma
|
|
|
41
54
|
|
|
42
55
|
| Goal | Read first |
|
|
43
56
|
|------|------------|
|
|
57
|
+
| **Gantry CLI + local governance** | [Gantry CLI — local-first governance](#gantry-cli--local-first-governance) → [gantry CLI](#gantry-cli) |
|
|
44
58
|
| **Adopt in your repo (5 min)** | This README → [`docs/ADOPTION.md`](docs/ADOPTION.md) → [`docs/KATA.md`](docs/KATA.md) |
|
|
45
59
|
| **See benchmark ROI (3 min)** | [`examples/benchmark-agent/`](examples/benchmark-agent/) → [`docs/ADOPTION.md`](docs/ADOPTION.md) |
|
|
46
60
|
| **Wire IDE agents** | [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) |
|
|
@@ -54,30 +68,32 @@ Developing this repository from source: `npm ci && npm run build` — see [gapma
|
|
|
54
68
|
|
|
55
69
|
| Outcome | How OpenGantry delivers it |
|
|
56
70
|
|---------|---------------------------|
|
|
57
|
-
| **Lower onboarding friction** | `
|
|
71
|
+
| **Lower onboarding friction** | `gantry init --tutorial`, `gantry onboarding`, `gantry start "<intent>"`, `gantry status --json` |
|
|
58
72
|
| **No unreviewed agent scope** | Teacher reviews mission YAML **before** `runtime env` / worker execution; TMVC roots + forbidden zones enforce paths |
|
|
59
73
|
| **Audit-ready evidence** | `[MSN-XXXX]` commit subjects; verifier PASS requires a verbatim quote from `WORKER_LOG.md` |
|
|
60
74
|
| **Regulated / ISO-aligned workflows** | SOD, mission authorization, and Git-native trace — see [`docs/COMPLIANCE-ISO.md`](docs/COMPLIANCE-ISO.md) (27001 change control, 42001 AI governance) |
|
|
61
|
-
| **Faster recovery from failure** | Stable `GXT_*` error codes, `
|
|
75
|
+
| **Faster recovery from failure** | Stable `GXT_*` error codes, `gantry verify --fix`, role output via `--audience worker\|teacher\|verifier` |
|
|
62
76
|
|
|
63
|
-
**Protocol maturity:** substrate law **v0.5.0**; **`
|
|
77
|
+
**Protocol maturity:** substrate law **v0.5.0**; **`gantry` v2.2.4** — unified CLI naming (`gantry` primary; legacy `gapman` alias). Current npm publish: **v2.2.4**. See [.gitagent/teacher/RUNTIME.md](.gitagent/teacher/RUNTIME.md).
|
|
64
78
|
|
|
65
79
|
## Release timeline (latest first)
|
|
66
80
|
|
|
67
|
-
Current npm release in this repository: **`
|
|
81
|
+
Current npm release in this repository: **`gantry` v2.2.4**. Use [`docs/ADOPTION.md`](docs/ADOPTION.md) for the ordered runbook.
|
|
68
82
|
|
|
69
83
|
| Release | Highlights |
|
|
70
84
|
|---------|------------|
|
|
85
|
+
| **v2.2.4** | Unified gantry naming cutover ([#94](https://github.com/jeger-ai/opengantry/issues/94)); docs positioning — Gantry.io disambiguation, long-tail SEO (`Open Source Gantry`, `Gantry CLI`, `Gantry Git hook`), vendor-neutral local governance framing ([#95](https://github.com/jeger-ai/opengantry/issues/95)–[#97](https://github.com/jeger-ai/opengantry/issues/97)) |
|
|
86
|
+
| **v2.2.3** | Declarative `trusted_automation` policy in `.gitagent/config.json` — repository-legislated bot maintenance bypass with `max_net_loc <= 5` ([#92](https://github.com/jeger-ai/opengantry/issues/92)) |
|
|
71
87
|
| **v2.2.2** | Time-to-Scaffold benchmark — `npm run examples:benchmark`, measured LOC matrix, adoption discovery ([#79](https://github.com/jeger-ai/opengantry/issues/79)) |
|
|
72
88
|
| **v2.2.1** | Thermo remediation — unified `NormalizedVerifyFailure` contract across JSON/human/context-feed; race-safe remediation snapshot writes; canonical `verify-presentation` entrypoint |
|
|
73
|
-
| **v2.2.0** | `
|
|
89
|
+
| **v2.2.0** | `gantry context-feed`, `gantry audit-rigor`, `virtual_capture` ephemeral virtualization ([#68](https://github.com/jeger-ai/opengantry/issues/68)), product positioning, docs quality ([#66](https://github.com/jeger-ai/opengantry/issues/66)–[#69](https://github.com/jeger-ai/opengantry/issues/69), [#76](https://github.com/jeger-ai/opengantry/issues/76)) |
|
|
74
90
|
| **v2.1.0** | Import-layer Code Surgeon (`check-import-layers.mjs --json`, AST quarantine, `GXT_IMPORT_LAYER_VIOLATION`); workspace-resolved optional TypeScript for surgeons |
|
|
75
|
-
| **v2.0.0** | `
|
|
91
|
+
| **v2.0.0** | `gantry scan` + KPI gate, `register`, `check-imports`, `perimeter`; BYO `llm_verifiers`; KPI stale binding on `--pre-push`/`--ci` |
|
|
76
92
|
| **v1.1.2** | Verify pipeline close-out (MSN-0034–0035); typed verify phases, trace status at parse boundary |
|
|
77
93
|
| **v1.1.1** | Lib/command boundary, unified `runVerifyCore`, typed remediation, CommandReporter, mission YAML emitter |
|
|
78
94
|
| **v1.1.0** | Stale trace evidence, mission purity PR lock, CI target lock, `verify --json`, doctor substrate drift warn |
|
|
79
|
-
| **v1.0.0** | `
|
|
80
|
-
| **v0.9.0** | `
|
|
95
|
+
| **v1.0.0** | `gantry init --tutorial`, global `--audience` / `GXT_AUDIENCE`, adoption-first README + runbook |
|
|
96
|
+
| **v0.9.0** | `gantry start`, `verify --fix`, `status --json`, `onboarding`, GXT error codes |
|
|
81
97
|
|
|
82
98
|
## What you get
|
|
83
99
|
|
|
@@ -87,10 +103,10 @@ Current npm release in this repository: **`gapman` v2.2.2**. Use [`docs/ADOPTION
|
|
|
87
103
|
| **Routing map** (skills, roots, forbidden zones, path risks) | [`.gitagent/foreman/MANIFEST.json`](.gitagent/foreman/MANIFEST.json) |
|
|
88
104
|
| **Foreman** (cheap, manifest-only triage) | [`.gitagent/foreman/SOUL.md`](.gitagent/foreman/SOUL.md) |
|
|
89
105
|
| **Worker Runtime Contract** (env exports for IDE agents / scripts) | [`.gitagent/teacher/RUNTIME.md`](.gitagent/teacher/RUNTIME.md) |
|
|
90
|
-
| **Bootstrap** (zero-friction substrate install) | `
|
|
106
|
+
| **Bootstrap** (zero-friction substrate install) | `gantry init` + packaged [`templates/`](templates/) |
|
|
91
107
|
| **Architecture pointer** (where agents find code layout) | [`.gitagent/ARCHITECTURE.pointer.json`](.gitagent/ARCHITECTURE.pointer.json), [ARCHITECTURE-DISCOVERY.md](.gitagent/teacher/ARCHITECTURE-DISCOVERY.md) |
|
|
92
|
-
| **Work order + commit receipt** | YAML via `
|
|
93
|
-
| **
|
|
108
|
+
| **Work order + commit receipt** | YAML via `gantry legislate` + [`.gitagent/teacher/MISSION.example.yaml`](.gitagent/teacher/MISSION.example.yaml); Markdown reference: [`.gitagent/teacher/MISSION.template.md`](.gitagent/teacher/MISSION.template.md), [`.gitagent/teacher/commit-template.md`](.gitagent/teacher/commit-template.md) |
|
|
109
|
+
| **gantry CLI** | `npm install -g @jeger-ai/opengantry` or `npx @jeger-ai/opengantry` — see [gantry](#gantry-cli) |
|
|
94
110
|
| **Full orientation + workflow diagram** | [`.gitagent/README.md`](.gitagent/README.md) |
|
|
95
111
|
|
|
96
112
|
Core behaviors in plain language:
|
|
@@ -104,9 +120,9 @@ Core behaviors in plain language:
|
|
|
104
120
|
## Start here (5 minutes)
|
|
105
121
|
|
|
106
122
|
```bash
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
123
|
+
gantry init --tutorial # or: gantry init && gantry onboarding
|
|
124
|
+
gantry teacher set "$(git config user.email)"
|
|
125
|
+
gantry start "Your first change" --msn MSN-0001 --skill-key <manifest-key>
|
|
110
126
|
# Teacher: review mission scope/gates, then commit [MSN-0001] including the mission file
|
|
111
127
|
git log --grep='MSN-' --oneline
|
|
112
128
|
```
|
|
@@ -121,29 +137,29 @@ Treat the following as a **portable kit** you can drop into any Git repository (
|
|
|
121
137
|
|
|
122
138
|
### Enforcement boundary
|
|
123
139
|
|
|
124
|
-
**Prevents unreviewed edits where it matters.** IDE Agent Write/Edit is advisory TMVC; hard boundaries live in `runtime exec`, `
|
|
140
|
+
**Prevents unreviewed edits where it matters.** IDE Agent Write/Edit is advisory TMVC; hard boundaries live in `runtime exec`, `gantry verify`, and hooks.
|
|
125
141
|
|
|
126
142
|
| Tier | Mechanism | Enterprise control |
|
|
127
143
|
|------|-----------|-------------------|
|
|
128
|
-
| **Process-boundary** | `
|
|
144
|
+
| **Process-boundary** | `gantry runtime exec` | Agent cannot touch forbidden paths during orchestrated runs |
|
|
129
145
|
| **Deterministic hook** | Cursor `beforeShellExecution`, pre-push verify | Shell/hook writes to governance files require mission + verify |
|
|
130
146
|
| **Advisory** | IDE rules, `AGENTS.md`, sessionStart context | IDE suggestions alone do not count as approval |
|
|
131
147
|
|
|
132
148
|
Per-tool recipes: [`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md) (see **Enforcement boundary**).
|
|
133
149
|
|
|
134
|
-
### 1. Bootstrap with `
|
|
150
|
+
### 1. Bootstrap with `gantry init` (recommended)
|
|
135
151
|
|
|
136
|
-
From a built OpenGantry tree (or after copying the `
|
|
152
|
+
From a built OpenGantry tree (or after copying the `gantry` CLI + `templates/` into your toolchain):
|
|
137
153
|
|
|
138
154
|
```bash
|
|
139
|
-
npm ci && npm run build # in the OpenGantry repo, or use a globally linked
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
155
|
+
npm ci && npm run build # in the OpenGantry repo, or use a globally linked gantry
|
|
156
|
+
gantry init --tutorial # recommended first run; or gantry init (wizard / --yes)
|
|
157
|
+
gantry teacher set "$(git config user.email)" # repo-local (recommended)
|
|
158
|
+
gantry doctor
|
|
143
159
|
git config core.hooksPath .githooks
|
|
144
160
|
```
|
|
145
161
|
|
|
146
|
-
`
|
|
162
|
+
`gantry init` bootstraps a target git repository from packaged templates:
|
|
147
163
|
|
|
148
164
|
- **TTY:** interactive wizard (`@clack/prompts`) — select IDE/agent integrations, doc path, skills preset, hooks, CI, architecture pointer.
|
|
149
165
|
- **Non-TTY / CI:** auto-applies default profile (core + Cursor + hooks + CI) — no hang.
|
|
@@ -155,7 +171,7 @@ Asset lifecycles:
|
|
|
155
171
|
- `scaffold_only` files (for example `MANIFEST.json`, `RULES.md`, `skills/*.md`, IDE pointer files) are created when missing and preserved when customized.
|
|
156
172
|
- `managed_strict` runtime assets (workflow, validate script, hooks, schema/rules pointers) prompt before overwrite in an interactive terminal; use `--force` to skip the prompt.
|
|
157
173
|
|
|
158
|
-
Init also composes **`docs/INTEGRATIONS.md`** (or your chosen path) from `templates/integrations/compatibility.json`, scaffolds **`.gitagent/ARCHITECTURE.pointer.json`**, and installs runtime scripts (`gxt-runtime-env.sh`, `gxt-pin-mission.sh`, …). Store local tokens for protected architecture sources with **`
|
|
174
|
+
Init also composes **`docs/INTEGRATIONS.md`** (or your chosen path) from `templates/integrations/compatibility.json`, scaffolds **`.gitagent/ARCHITECTURE.pointer.json`**, and installs runtime scripts (`gxt-runtime-env.sh`, `gxt-pin-mission.sh`, …). Store local tokens for protected architecture sources with **`gantry arch cred set`** (stdin only; git-ignored under `.gitagent/history/credentials/`).
|
|
159
175
|
|
|
160
176
|
After `init`, customize your manifest and skills, then legislate. See [`docs/ADOPTION.md`](docs/ADOPTION.md) for the exact ordered runbook.
|
|
161
177
|
|
|
@@ -165,7 +181,7 @@ After `init`, customize your manifest and skills, then legislate. See [`docs/ADO
|
|
|
165
181
|
Set `path_risks`, `risk_keywords`, and each skill's `tmvc_roots`, `forbidden_zones`, and `trust_threshold` to match **your** directories and risk appetite.
|
|
166
182
|
- Align **[`.gitagent/teacher/RULES.md`](.gitagent/teacher/RULES.md)** with your review policy (tiers, who counts as "human audit", merge gates).
|
|
167
183
|
- Point **deterministic gates** in missions at **your** stack (`npm test`, `pytest`, `cargo test`, etc.).
|
|
168
|
-
- Store mission files you intend to **`
|
|
184
|
+
- Store mission files you intend to **`gantry verify`** under **`.gitagent/missions/`** and configure **Teacher allowlist** per repo (`gantry teacher set`, `.gitagent/foreman/TEACHER.allowlist.local`, or `git config gantry.teacherEmails`).
|
|
169
185
|
|
|
170
186
|
**Concrete gate example** (YAML fields in a mission file; adjust paths and commands):
|
|
171
187
|
|
|
@@ -174,11 +190,13 @@ gate_command: "npm test -- src/components/Button.test.tsx"
|
|
|
174
190
|
gate_success_substring: "Tests: 1 passed"
|
|
175
191
|
```
|
|
176
192
|
|
|
177
|
-
The gate is whatever command **fails closed** for your repo (lint, typecheck, integration suite). One explicit command beats a vague "run tests somewhere." Primary reference: [`.gitagent/teacher/MISSION.example.yaml`](.gitagent/teacher/MISSION.example.yaml). Markdown missions remain supported (`
|
|
193
|
+
The gate is whatever command **fails closed** for your repo (lint, typecheck, integration suite). One explicit command beats a vague "run tests somewhere." Primary reference: [`.gitagent/teacher/MISSION.example.yaml`](.gitagent/teacher/MISSION.example.yaml). Markdown missions remain supported (`gantry verify` parses both); [`.gitagent/teacher/MISSION.template.md`](.gitagent/teacher/MISSION.template.md) is a human-readable reference, not the `legislate` default.
|
|
194
|
+
|
|
195
|
+
### gantry CLI
|
|
178
196
|
|
|
179
|
-
|
|
197
|
+
The **Gantry CLI** (`gantry`) is the primary interface for **Open Source Gantry** — local, vendor-neutral, git-native governance in your repository.
|
|
180
198
|
|
|
181
|
-
Requires **Node.js 24+** (Active LTS line). Published as **`@jeger-ai/opengantry`** on npm; the `
|
|
199
|
+
Requires **Node.js 24+** (Active LTS line). Published as **`@jeger-ai/opengantry`** on npm; the `gantry` binary is registered via `package.json` `bin` (see [`package.json`](package.json)). The legacy `gapman` command remains a compatibility alias. Config namespaces: `GANTRY_*` env vars and `git config gantry.*` (legacy `GAPMAN_*` / `gapman.*` values are still read silently). From source: `npm ci && npm run build` → `dist/cli/index.js`.
|
|
182
200
|
|
|
183
201
|
**Developing OpenGantry:** dogfood the full stack — [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) (missions, hooks, verify, `npm run validate`). Layer rules: [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md). Adopters: [`docs/ADOPTION.md`](docs/ADOPTION.md). Roadmap: [`docs/BACKLOG.md`](docs/BACKLOG.md) · [Project board](https://github.com/orgs/jeger-ai/projects/2).
|
|
184
202
|
|
|
@@ -186,54 +204,54 @@ Requires **Node.js 24+** (Active LTS line). Published as **`@jeger-ai/opengantry
|
|
|
186
204
|
|
|
187
205
|
| Step | Command | Outcome |
|
|
188
206
|
|------|---------|---------|
|
|
189
|
-
| Onboard | `
|
|
190
|
-
| Scope + approve | `
|
|
191
|
-
| Prove work | `
|
|
207
|
+
| Onboard | `gantry init --tutorial` or `gantry onboarding` | Feel Teacher stamp + verify loop (~3 min) |
|
|
208
|
+
| Scope + approve | `gantry start` → Teacher `[MSN-…]` commit | Unreviewed stub cannot pass full verify |
|
|
209
|
+
| Prove work | `gantry verify` | Gate + log quotes + greppable history |
|
|
192
210
|
|
|
193
|
-
**Global output:** `
|
|
211
|
+
**Global output:** `gantry --audience worker\|teacher\|verifier\|platform <cmd>` (or `GXT_AUDIENCE=verifier` in CI — silence unless `[GXT_*]` errors).
|
|
194
212
|
|
|
195
213
|
| Command | Purpose |
|
|
196
214
|
|--------|---------|
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
200
|
-
| `
|
|
201
|
-
| `
|
|
202
|
-
| `
|
|
203
|
-
| `
|
|
204
|
-
| `
|
|
205
|
-
| `
|
|
206
|
-
| `
|
|
207
|
-
| `
|
|
208
|
-
| `
|
|
209
|
-
| `
|
|
210
|
-
| `
|
|
211
|
-
| `
|
|
212
|
-
| `
|
|
213
|
-
| `
|
|
214
|
-
| `
|
|
215
|
-
| `
|
|
216
|
-
| `
|
|
217
|
-
| `
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
| `
|
|
221
|
-
| `
|
|
222
|
-
| `
|
|
223
|
-
| `
|
|
215
|
+
| `gantry init` | Bootstrap substrate + IDE packs + hooks + CI. `--tutorial` runs guided first loop after scaffold. |
|
|
216
|
+
| `gantry upgrade` | Plan substrate updates (`gantry upgrade plan` / `--dry-run` for preview JSON). Stage with `gantry upgrade`; `gantry upgrade apply --mission …` after Teacher commit. |
|
|
217
|
+
| `gantry check` | Validate `MANIFEST.json` shape + **Rule 4.4** sync: every `manifest.skills` key must have `skills/<key>.md`, with no orphan skill files. |
|
|
218
|
+
| `gantry status` | GXT readiness dashboard (`--json`, `--verbose`, `--audience worker\|teacher\|verifier\|platform`). |
|
|
219
|
+
| `gantry start "<intent>"` | Goal-first orchestration: triage → legislate stub → runtime next steps (`--msn`, `--skill-key`, `--json`). |
|
|
220
|
+
| `gantry onboarding` | Interactive walkthrough of the strict mission loop. Blocks on corrupt configured integration state; allows pristine uninitialized repos. |
|
|
221
|
+
| `gantry doctor` | Active readiness check (manifest, Teacher email, bypass secret match, hooks, architecture pointer, integration staleness). Warnings exit 0. `--audience` tailors next steps. |
|
|
222
|
+
| `gantry triage "<intent>"` | Foreman-style routing ([`SOUL.md`](.gitagent/foreman/SOUL.md)). `--json` for machine output (may include non-binding `adr_hints` from [`.gitagent/out-of-scope/`](.gitagent/out-of-scope/README.md)). `--emit-mission --msn MSN-0007` writes `.gitagent/missions/ACTIVE_MISSION.md` by default on **DIRECT_EXECUTION** only. |
|
|
223
|
+
| `gantry teacher show\|set` | Repo-local Teacher git-proof allowlist (`.gitagent/foreman/TEACHER.allowlist.local`; avoids global `GANTRY_TEACHER_EMAILS` leaking across projects). |
|
|
224
|
+
| `gantry legislate "<intent>" --msn MSN-0007` | Emit stub **YAML** mission under `.gitagent/missions/` with explicit MSN (`--skill-key` when triage would escalate; `--gate-command` / `--gate-success-substring` for one-click handoff). Teacher still **`git commit`**-legislates from an allowlisted email. |
|
|
225
|
+
| `gantry mission validate --file <path>` | Validate a mission `.md` or `.yaml` (YAML checked against [`.gitagent/teacher/MISSION.schema.yaml`](.gitagent/teacher/MISSION.schema.yaml)). |
|
|
226
|
+
| `gantry mission snapshot --file <path>` | Write start-state JSON under `.gitagent/history/` (git HEAD, branch, dirty flag, manifest hash, hashes of files under the mission skill's `tmvc_roots`). |
|
|
227
|
+
| `gantry runtime env --mission <path>` | Worker Runtime Contract: emit `GXT_REPO_ROOT`, `GXT_MISSION_FILE`, `GXT_MSN_ID`, `GXT_SKILL_KEY`, `GXT_TMVC_ROOTS`, `GXT_FORBIDDEN_ZONES`, `GXT_WORKER_LOG`. Default: POSIX `export …` lines; `--json` for scripts. [.gitagent/teacher/RUNTIME.md](.gitagent/teacher/RUNTIME.md). |
|
|
228
|
+
| `gantry runtime exec --mission <path> -- <cmd…>` | Run worker command with mission env, telemetry capture, and forbidden-zone scan (strongest TMVC trap). |
|
|
229
|
+
| `gantry context-request --path <p…> --reason <text>` | Append a PENDING Context Request to `WORKER_LOG.md` (RULES §4 TMVC expansion). Uses pinned mission or `--mission`. `--stage-worker-log` opt-in stages the log. |
|
|
230
|
+
| `gantry tmvc guard [--strict]` | Pre-commit TMVC path guard: advisory warnings on staged paths outside mission `tmvc_roots` (stderr; exit 0). `--strict` or `GXT_TMVC_GUARD_STRICT=1` blocks. Skips when no pinned mission. |
|
|
231
|
+
| `gantry mcp serve` | Stdio MCP server exposing `gxt_*` tools (legislation, pin, runtime env, verify with `fix_hints`, `gxt_start_orchestration`, exec). `gxt_verify` uses the flat `--json` envelope — see [ADOPTION.md § MCP verify envelope](docs/ADOPTION.md). Configure via `.cursor/mcp.json`. |
|
|
232
|
+
| `gantry verify --mission <path>` | Teacher-approved mission commit + gate + trace. **`--json`** structured output (`status`, `phase`, `error_code`, `fix_hints`). **`--fix`** guided repair; when a **Code Surgeon** applies a quarantine mutation, logs `[SURGEON-MUTATION]` to `WORKER_LOG.md` and reruns full verify with fix disabled (never auto-PASS). CI: `--audience verifier` (errors only). Failures emit **`GXT_*`** codes. Optional **`kpi_gate`** phase reads committed [KPI report](.gitagent/teacher/KPI-REPORT.schema.yaml) (after gate, before trace). **`--ci`** / **`--pre-push`**: fail-closed on stale KPI evidence. |
|
|
233
|
+
| `gantry scan --mission <path>` | Run mission `llm_verifiers` (BYO commands) and write namespaced KPI report JSON for `kpi_gate`. |
|
|
234
|
+
| `gantry register <dir>` | AST discovery: propose skill scope from folder imports/exports (does not mutate `MANIFEST.json`). |
|
|
235
|
+
| `gantry check-imports <dir> --ban <spec…>` | Deterministic banned-import scan (usable as `gate_command`; no LLM). |
|
|
236
|
+
| `gantry perimeter [--base-ref <ref>] [--ci]` | Protected governance paths: local advisory; **`--ci`** requires verified commit signatures. |
|
|
237
|
+
| `gantry arch pointer` | Print architecture pointer summary for agents (`.gitagent/ARCHITECTURE.pointer.json`). |
|
|
238
|
+
| `gantry arch cred status\|set\|unset` | Git-ignored credential slots for authenticated external architecture sources (secrets via stdin only). |
|
|
239
|
+
| `gantry metrics [--json] [--ref main]` | Git-native governance rollup (`--json` includes `gxt_extension_metadata`). See [`docs/ADOPTION.md`](docs/ADOPTION.md). |
|
|
240
|
+
| `gantry context-feed [--json] [--clear]` | Read or atomically clear the latest verify remediation snapshot (`.gitagent/tmp/NEXT_REMEDIATION.json`) for IDE repair loops. |
|
|
241
|
+
| `gantry audit-rigor [--json] [--strict]` | Meta-governance audit: TypeScript strictness, coverage artifacts, MANIFEST wildcard hygiene. |
|
|
224
242
|
|
|
225
243
|
**Who can approve missions (Teacher allowlist):** only allowlisted identities can legislate missions that verify accepts. Precedence:
|
|
226
244
|
|
|
227
245
|
1. `.gitagent/foreman/TEACHER.allowlist` (+ optional gitignored `.local` merge)
|
|
228
|
-
2. `git config
|
|
229
|
-
3. `
|
|
246
|
+
2. `git config gantry.teacherEmails "a@x.com,b@y.com"`
|
|
247
|
+
3. `GANTRY_TEACHER_EMAILS` env (CI escape hatch only)
|
|
230
248
|
4. implicit `git config user.email` when nothing else is set
|
|
231
249
|
|
|
232
|
-
Use **`
|
|
250
|
+
Use **`gantry teacher set "$(git config user.email)"`** after clone — do not rely on a global shell export when you work across multiple projects.
|
|
233
251
|
|
|
234
252
|
### Worker Runtime quickstart
|
|
235
253
|
|
|
236
|
-
Agents (Cursor, Junie, local scripts) should not guess TMVC roots — read them from **`
|
|
254
|
+
Agents (Cursor, Junie, local scripts) should not guess TMVC roots — read them from **`gantry runtime env`**.
|
|
237
255
|
|
|
238
256
|
Each `--mission` path must refer to **an existing mission file** (ENOENT means the YAML or Markdown mission is missing). Split these into separate shell steps if you paste from docs.
|
|
239
257
|
|
|
@@ -250,7 +268,7 @@ node dist/cli/index.js runtime env --mission .gitagent/missions/example.verify.y
|
|
|
250
268
|
node dist/cli/index.js runtime exec --mission .gitagent/missions/example.verify.yaml -- <your-agent-command>
|
|
251
269
|
```
|
|
252
270
|
|
|
253
|
-
Inspect `GXT_TMVC_ROOTS`, `GXT_FORBIDDEN_ZONES`, and `GXT_WORKER_LOG`; write forensic trace quotes to **`WORKER_LOG.md`** (or `--worker-log` at verify time), then **`
|
|
271
|
+
Inspect `GXT_TMVC_ROOTS`, `GXT_FORBIDDEN_ZONES`, and `GXT_WORKER_LOG`; write forensic trace quotes to **`WORKER_LOG.md`** (or `--worker-log` at verify time), then **`gantry verify`** as usual.
|
|
254
272
|
|
|
255
273
|
**Legislate a stub mission (Teacher edits + commits — then wire `runtime env` to that file path):**
|
|
256
274
|
|
|
@@ -264,16 +282,16 @@ Details and variable semantics: [.gitagent/teacher/RUNTIME.md](.gitagent/teacher
|
|
|
264
282
|
|
|
265
283
|
### 3. Wire agents (and optionally CI)
|
|
266
284
|
|
|
267
|
-
- **[`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md)** — closed-loop agent integrations (enforcement boundary, remote handoff, per-tool recipes for Cursor, Claude Code, OpenAI Codex CLI, OpenCode, Junie, Antigravity, Cline, Aider, OpenHands). Installed by `
|
|
285
|
+
- **[`docs/INTEGRATIONS.md`](docs/INTEGRATIONS.md)** — closed-loop agent integrations (enforcement boundary, remote handoff, per-tool recipes for Cursor, Claude Code, OpenAI Codex CLI, OpenCode, Junie, Antigravity, Cline, Aider, OpenHands). Installed by `gantry init`.
|
|
268
286
|
- **[`AGENTS.md`](AGENTS.md)** tells agents to read **RULES** + **MANIFEST** before acting.
|
|
269
287
|
- **[`.cursor/rules/opengantry-gxt-substrate.mdc`](.cursor/rules/opengantry-gxt-substrate.mdc)** does the same for Cursor with `alwaysApply: true`.
|
|
270
288
|
- **CI:** this repo includes **[`.github/workflows/gxt-validate.yml`](.github/workflows/gxt-validate.yml)**:
|
|
271
289
|
- **PR governance (PR only):** mission PRs must target the **default branch** (`main` in this repo; `github.event.repository.default_branch` in init template, overridable via `GXT_INTEGRATION_BRANCH`) — prevents stacked mission merges.
|
|
272
|
-
- **
|
|
290
|
+
- **gantry:** `npm ci` / `npm run build`, then `gantry check`, `gantry doctor`, and unit tests.
|
|
273
291
|
- **Manifest (jq parity):** validates [`.gitagent/foreman/MANIFEST.json`](.gitagent/foreman/MANIFEST.json) via [`scripts/validate-gxt.sh`](scripts/validate-gxt.sh) `manifest`.
|
|
274
292
|
- **Changed-code quality (PR only):** ESLint complexity, import layers, line budgets on touched `src/cli/**/*.ts`.
|
|
275
293
|
- **MSN (PR only, path-scoped):** on **pull_request** only, any **non-merge** commit in the PR range that touches `.gitagent/`, repo-root `WORKER_LOG.md`, `.githooks/`, or [`.github/workflows/gxt-validate.yml`](.github/workflows/gxt-validate.yml) must have a subject starting with **`[MSN-NNNN]`** (four digits). Other paths (e.g. root `README.md` only) do not trigger this check.
|
|
276
|
-
- **Mission purity (PR only):** [`scripts/verify-pr-missions.sh`](scripts/verify-pr-missions.sh) requires exactly one `[MSN-NNNN]` in `${base}..${head}` commit subjects before full `
|
|
294
|
+
- **Mission purity (PR only):** [`scripts/verify-pr-missions.sh`](scripts/verify-pr-missions.sh) requires exactly one `[MSN-NNNN]` in `${base}..${head}` commit subjects before full `gantry verify` on changed missions.
|
|
277
295
|
- **Local (full stack):** [`scripts/dev-validate.sh`](scripts/dev-validate.sh) / `npm run validate` — superset of CI (includes changed-code + MSN vs `origin/main`).
|
|
278
296
|
|
|
279
297
|
```bash
|
|
@@ -294,10 +312,10 @@ Details and the workflow diagram: **[`.gitagent/README.md`](.gitagent/README.md)
|
|
|
294
312
|
|
|
295
313
|
### Advanced: manual vendoring
|
|
296
314
|
|
|
297
|
-
If you cannot run `
|
|
315
|
+
If you cannot run `gantry init`, copy at least:
|
|
298
316
|
|
|
299
317
|
- `.gitagent/` (entire tree)
|
|
300
|
-
- `skills/` (optional in minimal vendoring, but **required** for Rule 4.4: one `skills/<skill-key>.md` per manifest skill — enforced by `
|
|
318
|
+
- `skills/` (optional in minimal vendoring, but **required** for Rule 4.4: one `skills/<skill-key>.md` per manifest skill — enforced by `gantry check`)
|
|
301
319
|
- `.githooks/` (optional: creates an empty repo-root `WORKER_LOG.md` when you check out a feature branch)
|
|
302
320
|
- `AGENTS.md` (or merge its bullets into your existing agent instructions)
|
|
303
321
|
- Optionally `.cursor/rules/opengantry-gxt-substrate.mdc` if you use Cursor
|
|
@@ -317,10 +335,10 @@ Add to your **`.gitignore`** (if not already present):
|
|
|
317
335
|
|
|
318
336
|
```bash
|
|
319
337
|
npm install @jeger-ai/opengantry@latest
|
|
320
|
-
|
|
338
|
+
gantry upgrade
|
|
321
339
|
# Review .gitagent/.upgrade-tmp/; Teacher-commit the upgrade mission YAML
|
|
322
|
-
|
|
323
|
-
|
|
340
|
+
gantry upgrade --apply --mission .gitagent/missions/MSN-9001.upgrade-vX.Y.Z.yaml
|
|
341
|
+
gantry doctor
|
|
324
342
|
```
|
|
325
343
|
|
|
326
344
|
See [`docs/ADOPTION.md`](docs/ADOPTION.md) and [`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md#substrate-upgrade-loop-adopters--dogfood).
|
|
@@ -360,7 +378,8 @@ Always **review the diff** before commit; never bulk-overwrite a customized `MAN
|
|
|
360
378
|
|
|
361
379
|
| Pattern | Typical shape | Audit / production readiness |
|
|
362
380
|
|---------|----------------|------------------------------|
|
|
363
|
-
| **GXT / OpenGantry** | Git-native missions, manifest routing, deterministic gates, auditable log mapped to **`WORKER_LOG.md`**, human `[MSN-XXXX]` approval + SOD ([`RULES.md`](.gitagent/teacher/RULES.md)) | **Autonomous Repository Engineering** — scoped missions, not always-on chat. Greppable missions + gate output + log quotes. |
|
|
381
|
+
| **GXT / OpenGantry** | Git-native missions, manifest routing, deterministic gates, auditable log mapped to **`WORKER_LOG.md`**, human `[MSN-XXXX]` approval + SOD ([`RULES.md`](.gitagent/teacher/RULES.md)) | **Autonomous Repository Engineering** — scoped missions, not always-on chat. Greppable missions + gate output + log quotes. **Local-first**, **vendor-neutral** governance engine in your repo. |
|
|
382
|
+
| Cloud observability / agent dashboards | Hosted UI for metrics, traces, or agent session visibility | Strong for **fleet visibility**; per-repo change authorization and Git-native audit artifacts are typically layered separately |
|
|
364
383
|
| Agent "swarm" / choreography layers | Orchestrates model calls across services; emphasizes throughput and parallelism | Strong on **coverage** of tasks; lineage and per-change evidence depends on tooling above the swarm |
|
|
365
384
|
| Unstructured desktop assistants | Reactive help in-editor or OS-wide; informal plans | Lightweight for exploration; weakest default for **reproducible** production sign-off without additional discipline |
|
|
366
385
|
|
|
@@ -368,7 +387,7 @@ GXT deliberately trades "always-on improvisation" for a **narrow, inspectable en
|
|
|
368
387
|
|
|
369
388
|
## Relationship to this repository
|
|
370
389
|
|
|
371
|
-
**jeger-ai/opengantry** is the **canonical reference tree** for **GXT** (manifest `schema_version` **v0.5.0** law + **`
|
|
390
|
+
**jeger-ai/opengantry** is the **canonical reference tree** for **GXT** (manifest `schema_version` **v0.5.0** law + **`gantry` v2.2.4** CLI). Install the CLI with `npm install -g @jeger-ai/opengantry`, or fork this repo and run `gantry init` in your project.
|
|
372
391
|
|
|
373
392
|
## Security
|
|
374
393
|
|
|
@@ -8,7 +8,7 @@ export function runArchPointer(options = {}) {
|
|
|
8
8
|
repoRoot = getRepoRoot(options.cwd);
|
|
9
9
|
}
|
|
10
10
|
catch (e) {
|
|
11
|
-
logError(e instanceof Error ? e.message.replace("
|
|
11
|
+
logError(e instanceof Error ? e.message.replace("gantry: ", "") : String(e));
|
|
12
12
|
setExitCode(2);
|
|
13
13
|
return;
|
|
14
14
|
}
|
|
@@ -44,7 +44,7 @@ export async function runArchCredSet(options) {
|
|
|
44
44
|
try {
|
|
45
45
|
const values = parseCredentialValuesFromStdin(options.kind, stdin);
|
|
46
46
|
writeArchitectureCredential(repoRoot, options.slot, options.kind, values);
|
|
47
|
-
logInfo(`
|
|
47
|
+
logInfo(`gantry arch cred: stored slot=${options.slot} kind=${options.kind}`);
|
|
48
48
|
}
|
|
49
49
|
catch (e) {
|
|
50
50
|
logError(errorMessage(e));
|
|
@@ -63,11 +63,11 @@ export function runArchCredUnset(options) {
|
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
65
|
if (!removeArchitectureCredential(repoRoot, options.slot)) {
|
|
66
|
-
logError(`
|
|
66
|
+
logError(`gantry arch cred: slot ${options.slot} not found`);
|
|
67
67
|
setExitCode(2);
|
|
68
68
|
return;
|
|
69
69
|
}
|
|
70
|
-
logInfo(`
|
|
70
|
+
logInfo(`gantry arch cred: removed slot=${options.slot}`);
|
|
71
71
|
}
|
|
72
72
|
export function runArchCredStatus(options = {}) {
|
|
73
73
|
let repoRoot;
|
|
@@ -3,7 +3,7 @@ import { logError, setExitCode } from "../lib/cli-io.js";
|
|
|
3
3
|
import { loadWorkspace } from "../lib/workspace.js";
|
|
4
4
|
export function runCheckImports(options) {
|
|
5
5
|
if (options.ban.length === 0) {
|
|
6
|
-
logError("
|
|
6
|
+
logError("gantry check-imports: provide at least one --ban specifier");
|
|
7
7
|
setExitCode(2);
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
@@ -23,7 +23,7 @@ async function resolveOnboardingMissionPath(p, root, intent) {
|
|
|
23
23
|
logInfo(` ${onboardingVerifyHint(EXAMPLE_MISSION)}`);
|
|
24
24
|
return { missionPath, useExample };
|
|
25
25
|
}
|
|
26
|
-
p.log.step("Step 3 — Scaffold mission (
|
|
26
|
+
p.log.step("Step 3 — Scaffold mission (gantry start)");
|
|
27
27
|
const result = runStartOrchestration({
|
|
28
28
|
intent: intent.trim(),
|
|
29
29
|
writeMission: true,
|
|
@@ -59,7 +59,7 @@ export async function runOnboarding(options = {}) {
|
|
|
59
59
|
const { root } = loadWorkspace();
|
|
60
60
|
const manifestPath = path.join(root, ".gitagent", "foreman", "MANIFEST.json");
|
|
61
61
|
if (!fs.existsSync(manifestPath)) {
|
|
62
|
-
logError("Run
|
|
62
|
+
logError("Run gantry init first — substrate not found.");
|
|
63
63
|
setExitCode(2);
|
|
64
64
|
p.outro("Onboarding aborted");
|
|
65
65
|
return;
|
|
@@ -74,7 +74,7 @@ export async function runOnboarding(options = {}) {
|
|
|
74
74
|
p.log.step("Integration health");
|
|
75
75
|
for (const msg of blockers)
|
|
76
76
|
logWarn(` ${msg}`);
|
|
77
|
-
logError("Integration issues detected — run
|
|
77
|
+
logError("Integration issues detected — run gantry doctor or pass --force to continue.");
|
|
78
78
|
setExitCode(2);
|
|
79
79
|
p.outro("Onboarding aborted (integration gates)");
|
|
80
80
|
return;
|
|
@@ -88,8 +88,8 @@ export async function runOnboarding(options = {}) {
|
|
|
88
88
|
return;
|
|
89
89
|
}
|
|
90
90
|
p.log.step("Step 1 — Teacher allowlist");
|
|
91
|
-
logInfo('
|
|
92
|
-
p.log.step("Step 2 — Declare intent (
|
|
91
|
+
logInfo(' gantry teacher set "$(git config user.email)"');
|
|
92
|
+
p.log.step("Step 2 — Declare intent (gantry start)");
|
|
93
93
|
const intent = await p.text({
|
|
94
94
|
message: "What do you want to build?",
|
|
95
95
|
placeholder: "Fix login spinner on checkout",
|
|
@@ -36,10 +36,10 @@ export function runPerimeter(options) {
|
|
|
36
36
|
return;
|
|
37
37
|
}
|
|
38
38
|
if (result.violations.length > 0 && options.ci !== true) {
|
|
39
|
-
logInfo("
|
|
39
|
+
logInfo("gantry perimeter: advisory-only mode — no hard failures locally");
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
42
|
-
logInfo("
|
|
42
|
+
logInfo("gantry perimeter: OK");
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
catch (e) {
|
|
@@ -31,7 +31,7 @@ export function runRuntimeEnv(options) {
|
|
|
31
31
|
catch (e) {
|
|
32
32
|
const errno = typeof e === "object" && e !== null ? e.code : undefined;
|
|
33
33
|
if (errno === "ENOENT") {
|
|
34
|
-
logError(`runtime env: mission file not found: ${options.mission} (ENOENT). Use an existing mission path — e.g. .gitagent/missions/example.verify.yaml — or run
|
|
34
|
+
logError(`runtime env: mission file not found: ${options.mission} (ENOENT). Use an existing mission path — e.g. .gitagent/missions/example.verify.yaml — or run gantry legislate first, then pass that YAML path.`);
|
|
35
35
|
}
|
|
36
36
|
else {
|
|
37
37
|
logError(errorMessage(e));
|
|
@@ -4,7 +4,7 @@ import { logError, logInfo, setExitCode } from "../lib/cli-io.js";
|
|
|
4
4
|
import { loadWorkspace } from "../lib/workspace.js";
|
|
5
5
|
export function runScan(options) {
|
|
6
6
|
if (!options.mission) {
|
|
7
|
-
logError("
|
|
7
|
+
logError("gantry scan: --mission is required");
|
|
8
8
|
setExitCode(2);
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
@@ -16,7 +16,7 @@ export function runScan(options) {
|
|
|
16
16
|
process.stdout.write(`${JSON.stringify({ status: "ok", report_path: result.reportPath, report: result.report }, null, 2)}\n`);
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
logInfo(`
|
|
19
|
+
logInfo(`gantry scan: wrote ${result.reportPath}`);
|
|
20
20
|
logInfo(`metrics: ${Object.keys(result.report.metrics).length}`);
|
|
21
21
|
}
|
|
22
22
|
catch (e) {
|
|
@@ -19,7 +19,7 @@ export function runTeacherShow(options = {}) {
|
|
|
19
19
|
}
|
|
20
20
|
if (resolved.emails.length === 0) {
|
|
21
21
|
logInfo(`${CLI_NAME} teacher: no allowlist configured`);
|
|
22
|
-
logInfo(` Run:
|
|
22
|
+
logInfo(` Run: gantry teacher set "$(git config user.email)"`);
|
|
23
23
|
return;
|
|
24
24
|
}
|
|
25
25
|
logInfo(`${CLI_NAME} teacher: ${resolved.emails.join(", ")}`);
|
|
@@ -33,12 +33,12 @@ async function runVerifyChangedMissions(options) {
|
|
|
33
33
|
const baseRef = resolveChangedMissionsBaseRef(root, options.baseRef);
|
|
34
34
|
const missions = discoverChangedMissionFiles(root, baseRef);
|
|
35
35
|
if (missions.length === 0) {
|
|
36
|
-
logInfo(`
|
|
36
|
+
logInfo(`gantry verify: no changed mission files vs ${baseRef}`);
|
|
37
37
|
return;
|
|
38
38
|
}
|
|
39
39
|
let worstExit = 0;
|
|
40
40
|
for (const mission of missions) {
|
|
41
|
-
logInfo(`
|
|
41
|
+
logInfo(`gantry verify: ${mission} (changed vs ${baseRef})`);
|
|
42
42
|
const result = await runVerifyCore({ ...options, mission, changedMissions: false });
|
|
43
43
|
if (!result.ok && result.exitCode > worstExit) {
|
|
44
44
|
worstExit = result.exitCode;
|
|
@@ -78,7 +78,7 @@ export async function runVerify(options) {
|
|
|
78
78
|
return;
|
|
79
79
|
}
|
|
80
80
|
if (!options.mission) {
|
|
81
|
-
logError("
|
|
81
|
+
logError("gantry verify: --mission is required (or use --changed-missions)");
|
|
82
82
|
setExitCode(2);
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
@@ -6,7 +6,7 @@ const SLOT_PATTERN = /^[a-z0-9][a-z0-9/_-]{0,63}$/;
|
|
|
6
6
|
const VALID_KINDS = new Set(["bearer", "api_key", "basic", "custom"]);
|
|
7
7
|
export function parseArchitectureCredentialKind(raw) {
|
|
8
8
|
if (!VALID_KINDS.has(raw)) {
|
|
9
|
-
throw new Error(`
|
|
9
|
+
throw new Error(`gantry arch cred: kind must be one of ${[...VALID_KINDS].join(", ")}`);
|
|
10
10
|
}
|
|
11
11
|
return raw;
|
|
12
12
|
}
|
|
@@ -132,7 +132,7 @@ export function validateArchitecturePointer(raw) {
|
|
|
132
132
|
export function loadArchitecturePointer(repoRoot) {
|
|
133
133
|
const abs = architecturePointerPath(repoRoot);
|
|
134
134
|
if (!fs.existsSync(abs)) {
|
|
135
|
-
throw new Error(`${REL_ARCHITECTURE_POINTER} missing — run
|
|
135
|
+
throw new Error(`${REL_ARCHITECTURE_POINTER} missing — run gantry init or add the pointer manually`);
|
|
136
136
|
}
|
|
137
137
|
let parsed;
|
|
138
138
|
try {
|
|
@@ -44,7 +44,7 @@ function walkTypeScriptFiles(absDir) {
|
|
|
44
44
|
export function discoverFolderSignature(repoRoot, targetDir) {
|
|
45
45
|
const absDir = path.isAbsolute(targetDir) ? targetDir : path.join(repoRoot, targetDir);
|
|
46
46
|
if (!fs.existsSync(absDir) || !fs.statSync(absDir).isDirectory()) {
|
|
47
|
-
throw new Error(`
|
|
47
|
+
throw new Error(`gantry register: not a directory: ${targetDir}`);
|
|
48
48
|
}
|
|
49
49
|
const folderRel = toPosixRel(repoRoot, absDir);
|
|
50
50
|
const allImports = new Set();
|
|
@@ -36,23 +36,23 @@ export function formatAudienceNextStep(step, audience) {
|
|
|
36
36
|
return step;
|
|
37
37
|
}
|
|
38
38
|
const DEFAULT_NEXT_STEPS = [
|
|
39
|
-
{ audience: "teacher", step: '
|
|
39
|
+
{ audience: "teacher", step: 'gantry legislate "<intent>" --msn MSN-0001 --skill-key <key>' },
|
|
40
40
|
{ audience: "teacher", step: "Teacher: git commit -m \"[MSN-0001] legislate …\" including mission file" },
|
|
41
|
-
{ audience: "worker", step: "eval \"$(
|
|
41
|
+
{ audience: "worker", step: "eval \"$(gantry runtime env --mission .gitagent/missions/<file>.yaml)\"" },
|
|
42
42
|
{ audience: "worker", step: "Append gate evidence to WORKER_LOG.md" },
|
|
43
|
-
{ audience: "verifier", step: "
|
|
44
|
-
{ audience: "platform", step: "git config core.hooksPath .githooks &&
|
|
43
|
+
{ audience: "verifier", step: "gantry verify --mission .gitagent/missions/<file>.yaml" },
|
|
44
|
+
{ audience: "platform", step: "git config core.hooksPath .githooks && gantry doctor" },
|
|
45
45
|
];
|
|
46
46
|
function stepMatchesAudience(step, audience) {
|
|
47
47
|
switch (audience) {
|
|
48
48
|
case "teacher":
|
|
49
49
|
return /legislate|Teacher:|git commit -m "\[MSN-/i.test(step);
|
|
50
50
|
case "worker":
|
|
51
|
-
return /runtime env|WORKER_LOG|gate evidence|eval "\$\(
|
|
51
|
+
return /runtime env|WORKER_LOG|gate evidence|eval "\$\(gantry runtime|execute worker/i.test(step);
|
|
52
52
|
case "verifier":
|
|
53
|
-
return /
|
|
53
|
+
return /gantry verify/i.test(step);
|
|
54
54
|
case "platform":
|
|
55
|
-
return /hooksPath|
|
|
55
|
+
return /hooksPath|gantry doctor|gantry init/i.test(step);
|
|
56
56
|
default: {
|
|
57
57
|
const _exhaustive = audience;
|
|
58
58
|
return _exhaustive;
|