@nail00749/agent-gvozd 0.1.0 → 0.1.2

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
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gvozd installs one permission-aware agent team globally, so every OpenCode
4
4
  project can use it without copying plugin or agent files into the repository.
5
- The first release targets OpenCode V2 `0.0.0-beta-19425` exactly.
5
+ Release `0.1.2` targets OpenCode V2 `0.0.0-beta-19425` exactly.
6
6
 
7
7
  ## Global setup
8
8
 
@@ -26,8 +26,9 @@ OpenCode first if the desired provider is absent from `opencode models`.
26
26
 
27
27
  For a deterministic unattended rerun, use `gvozd setup --yes`. It retains a
28
28
  valid existing profile, or selects the built-in OpenAI preset only when Luna,
29
- Sol, and Codex Spark are all available. Rerunning setup is the supported v0.1
30
- upgrade path.
29
+ Sol, and Codex Spark are all available. Setup registers the exact current
30
+ release (`@nail00749/agent-gvozd@0.1.2`), not a version range. Rerunning setup
31
+ after updating the CLI is the supported v0.1 upgrade path.
31
32
 
32
33
  Inspect an installation at any time:
33
34
 
@@ -37,9 +38,11 @@ gvozd doctor --json
37
38
  ```
38
39
 
39
40
  Setup owns `<OpenCode config>/gvozd/config.jsonc`, its generated schema, and
40
- the Gvozd Markdown files under `<OpenCode config>/agents`. It refuses to
41
- overwrite unmanaged agent or schema files and preserves unrelated JSONC fields
42
- and comments. Project overrides under `docs/.gvozd` still take precedence.
41
+ the Gvozd Markdown files under `<OpenCode config>/agents`. During upgrades it
42
+ removes disabled or obsolete agents only when they are regular files with the
43
+ exact Gvozd ownership marker. Unmanaged files are never removed or overwritten.
44
+ Unrelated JSONC fields and comments are preserved. Project overrides under
45
+ `docs/.gvozd` still take precedence.
43
46
 
44
47
  The installed team contains:
45
48
 
@@ -72,10 +75,90 @@ automatically.
72
75
 
73
76
  Run `bun run sync --check` to report drift without changing files. The command
74
77
  prints a diff before replacing or removing an existing generated agent and
75
- never overwrites an agent file it does not own.
78
+ never overwrites an agent file it does not own. In `0.1.2`, check mode also
79
+ reports a missing project template or schema and stale managed schema content;
80
+ it performs no migration or directory creation. A markerless legacy schema is
81
+ migrated only when it is semantically identical to the known generated schema.
82
+ User-owned project configuration is not replaced. This legacy check resolves
83
+ the normal user-global OpenCode configuration. `bun run verify:sync` is the
84
+ deterministic release gate: it uses an empty temporary config root, checks the
85
+ repository, and removes the temporary root afterward.
76
86
 
77
87
  Run `bun test`, `bun run typecheck`, and `bun run build` for local verification.
78
88
 
89
+ ## Release verification
90
+
91
+ The regular CI workflow runs on Ubuntu and macOS with a frozen Bun install. It
92
+ runs tests, TypeScript checking (including `scripts/**/*.ts`), the build,
93
+ the deterministic `verify:sync` gate, and package verification. Package
94
+ verification installs the actual npm tarball outside the workspace, imports
95
+ its plugin entrypoint, and runs its Node CLI without depending on a system
96
+ `tar` command.
97
+
98
+ Live OpenCode compatibility is opt-in through the `Live OpenCode
99
+ compatibility` `workflow_dispatch`. It accepts no caller-controlled paths or
100
+ package specifications and is protected by the `gvozd-live` GitHub environment.
101
+ Provision these protected environment variables:
102
+
103
+ - `GVOZD_LIVE_OPENCODE`: absolute path to the pinned OpenCode executable;
104
+ - `GVOZD_LIVE_OPENCODE_SHA256`: its allowlisted SHA-256;
105
+ - `GVOZD_LIVE_HOST_DRIVER`: absolute path to the trusted host scenario driver;
106
+ - `GVOZD_LIVE_HOST_DRIVER_SHA256`: its allowlisted SHA-256;
107
+ - `GVOZD_LIVE_SAFE_PATH`: the complete child-process `PATH`, containing only
108
+ provisioner-controlled tool directories required by OpenCode and the driver.
109
+
110
+ These values come only from protected environment variables; the dispatch has
111
+ no path, digest, or package inputs. Every `GVOZD_LIVE_SAFE_PATH` entry must be
112
+ nonempty, absolute, existing, canonical, and a non-symlink directory. It must
113
+ not be group- or world-writable, and the same checks apply to its directory
114
+ chain. On POSIX, every directory owner must differ from the non-root runner
115
+ account and the runner must not have write access. Child processes receive
116
+ only this validated value, never the runner's ambient `PATH`.
117
+
118
+ The self-hosted runner must carry the `gvozd-live` and `ephemeral` labels and
119
+ must be provisioned as a one-shot runner that is destroyed after the job. A
120
+ runner label is only routing metadata; GitHub does not technically guarantee
121
+ ephemerality from that label. Environment reviewers must verify the selected
122
+ ref and runner provisioning before approval.
123
+
124
+ Provision the OpenCode executable and host driver outside runner-writable
125
+ storage. They must be regular canonical non-symlink files, executable, owned
126
+ by root or another trusted provisioning account rather than the workflow
127
+ runner, and have no owner, group, or world write bits (for example mode
128
+ `0555`). Every parent directory must likewise be provisioner-owned and not
129
+ runner-writable. A POSIX runner operating as root is rejected. The gate records
130
+ their file identity and exact allowlisted digest, then re-stats and re-hashes
131
+ each file immediately before every corresponding spawn; replacement or
132
+ metadata change hard-fails.
133
+
134
+ The workflow builds the checkout, creates its own local npm tarball, computes
135
+ its SHA-256, and passes only that path and digest to the gate. Arbitrary package
136
+ specifications are not accepted. Unlike the provisioned executables, this
137
+ artifact is expected to be runner-owned and may be owner-writable, while still
138
+ being a regular non-symlink file with no group/world write bits. Its digest is
139
+ a build-consistency check that detects changes after packing; it is not an
140
+ external provenance assertion. Review and protected checkout controls remain
141
+ the source-provenance boundary.
142
+
143
+ The executable must report exactly `0.0.0-beta-19425`. The gate gives child
144
+ processes a minimal allowlisted environment and isolated HOME, XDG config,
145
+ temporary, and project directories. Commands have timeouts, bounded output,
146
+ and redacted failure messages. The pinned CLI exposes no credential-free
147
+ non-interactive API that can itself prove permission-event resource mapping,
148
+ MCP refresh, and the complete lease lifecycle. The protected host driver must
149
+ run those scenarios and emit one JSON object with `pluginActivation`,
150
+ `projectOverride`, `editResourceMapping`, `mcpRefresh`, and `leaseLifecycle`
151
+ all set to `true`. Missing paths, digests, host integration, credentials, or
152
+ proof hard-fail the gate; they are never reported as a successful skip.
153
+
154
+ Node does not expose a portable descriptor-based `exec`, so a privileged
155
+ provisioner could still race the final verified pathname between revalidation
156
+ and spawn. That privileged-provisioner race is outside this gate's threat
157
+ model. Residual trust therefore remains in GitHub environment approvers,
158
+ one-shot runner and safe-PATH provisioning, the pinned OpenCode binary, and
159
+ the allowlisted host driver. The driver should use an isolated local MCP
160
+ fixture where possible rather than long-lived provider credentials.
161
+
79
162
  ## Configuration layers
80
163
 
81
164
  Configuration is merged in this order:
@@ -87,6 +170,68 @@ Configuration is merged in this order:
87
170
  Later scalar values replace earlier values. Arrays such as `models`, `skills`,
88
171
  `mcp`, and `permissions` replace the complete earlier array.
89
172
 
173
+ Configuration objects are validated strictly. Unknown root, agent, and
174
+ permission keys are errors rather than silently ignored. Prompt paths and
175
+ custom agent directories must stay within the layer that declares them;
176
+ missing files, traversal, and symlink targets are rejected.
177
+
178
+ ### Project capability trust
179
+
180
+ As a security and compatibility change in `0.1.2`, untrusted
181
+ repository-controlled configuration may contain only `$schema` and
182
+ `description` overrides for existing agents. Custom agents and all other root
183
+ or agent fields require explicit trust.
184
+
185
+ After reviewing the repository configuration, a user may opt in externally:
186
+
187
+ ```bash
188
+ TOKEN="$(gvozd trust-project)"
189
+ GVOZD_TRUST_PROJECT_CONFIG="$TOKEN" opencode2
190
+ ```
191
+
192
+ The second command must start the OpenCode process with the exact token; setting
193
+ the variable in another process does not grant trust. `gvozd trust-project`
194
+ uses the current directory by default and accepts an explicit project directory.
195
+ It only prints the current token and does not modify files or the environment.
196
+ A repository cannot self-authorize by placing the token in its files.
197
+
198
+ The token is bound to the canonical project root and the reviewed project root
199
+ config, agent fragments, and referenced prompts. Changing any of them
200
+ invalidates it, and a token for one project cannot authorize another project.
201
+ API callers can pass the exact token as `projectTrustToken` to `loadConfig`.
202
+
203
+ ### OpenCode config-root contract
204
+
205
+ `setup` and `doctor` use `opencode debug paths` as the authority for CLI writes
206
+ and diagnostics. Runtime/config loading resolves its root in this order:
207
+
208
+ 1. an explicit `configRoot` supplied by an API caller;
209
+ 2. `GVOZD_OPENCODE_CONFIG_ROOT`;
210
+ 3. `XDG_CONFIG_HOME/opencode`;
211
+ 4. `APPDATA/opencode` on Windows;
212
+ 5. `~/.config/opencode`.
213
+
214
+ OpenCode `0.0.0-beta-19425` does not expose its config root in the plugin
215
+ context. The runtime therefore cannot infer a nonstandard host root from
216
+ `debug paths`. If Doctor reports a mismatch, set
217
+ `GVOZD_OPENCODE_CONFIG_ROOT` to the absolute path printed by
218
+ `opencode debug paths` before starting or restarting OpenCode.
219
+
220
+ The config root reported by `debug paths` must already use its canonical
221
+ absolute spelling. Before setup creates a lock or managed directory, every
222
+ existing component from the filesystem root through the nearest existing
223
+ ancestor is checked with `lstat`: symbolic links, non-directory ancestors, and
224
+ POSIX group/world-writable directories are rejected. Managed config, Gvozd,
225
+ agents, and lock directories additionally must be owned by and writable by the
226
+ current account. Known platform aliases such as macOS `/var` are not followed;
227
+ OpenCode must report the corresponding canonical path.
228
+
229
+ These checks prevent an unprivileged different-user path swap, but Node has no
230
+ portable descriptor-relative recursive mkdir/rename transaction. A
231
+ same-UID process that deliberately races the final validated component, or a
232
+ non-cooperating process that performs a final rename between validation and
233
+ mutation, remains outside this cooperative setup threat model.
234
+
90
235
  ## Cooperative file leases
91
236
 
92
237
  Writer agents coordinate exact project files before editing them. The default
@@ -128,6 +273,15 @@ process. Unclaimed reservations expire after five minutes; active leases expire
128
273
  after thirty minutes without tool activity and are released on terminal session
129
274
  events. Separate OpenCode processes and remote hosts are not coordinated.
130
275
 
276
+ File ownership keys are case-insensitive by default on macOS and Windows and
277
+ case-sensitive on other platforms. Because the runtime cannot portably detect
278
+ the mounted filesystem policy, start OpenCode with
279
+ `GVOZD_CASE_INSENSITIVE_FILESYSTEM=0` for a case-sensitive APFS workspace, or
280
+ with `GVOZD_CASE_INSENSITIVE_FILESYSTEM=1` for a case-folding Linux workspace
281
+ such as a suitably configured casefold filesystem or CIFS mount. Only the exact
282
+ values `0` and `1` are accepted; any other value aborts plugin setup rather than
283
+ selecting an uncertain ownership policy.
284
+
131
285
  An agent override can be inline:
132
286
 
133
287
  ```jsonc
@@ -161,28 +315,44 @@ access to that ambiguous action is denied.
161
315
 
162
316
  ## Default capabilities
163
317
 
164
- The built-in team uses exact skill IDs and tool-level MCP permissions from the
165
- current OpenCode setup. Server-wide `mcp` grants remain empty by default because
166
- GitLab, GitNexus, and Playwright each expose actions that are too broad for at
167
- least one receiving role.
318
+ The built-in team uses exact skill IDs, a server-wide grant to the configured
319
+ Context7 documentation server where current library references help the role,
320
+ and tool-level MCP permissions for GitLab, GitNexus, and Playwright. Those
321
+ broader servers remain tool-scoped because each exposes actions that are too
322
+ broad for at least one receiving role.
323
+
324
+ The Context7 grant activates only when OpenCode already has an MCP server named
325
+ exactly `context7`. Gvozd grants access to that server; it does not install or
326
+ configure it, inspect its implementation, or constrain its individual tools.
327
+ Operators must trust that exact server identity and its advertised tool set.
328
+
329
+ OpenCode's built-in desktop browser tools report only the `browser` permission
330
+ action and never request runtime approval themselves. Every built-in Gvozd agent
331
+ therefore ends with an explicit `browser` deny so the host hides those tools;
332
+ agents that need live UI evidence use the Playwright MCP server instead, where
333
+ Gvozd's tool-level permissions apply.
168
334
 
169
335
  | Agents | Skills | MCP access |
170
336
  | --- | --- | --- |
171
- | `planner` | verification planning, ASCII UI review, GitNexus impact | GitNexus read-only |
172
- | `back-deep` | GitNexus impact and refactoring | GitNexus except group sync |
173
- | `front-fast` | modern web and interface polish | Playwright observation; interactions ask |
174
- | `front-deep` | frontend/layout skills plus GitNexus impact/refactoring | GitNexus except group sync; Playwright interactions ask |
175
- | `review-fast` | code review | read-only GitLab without CI variables |
176
- | `review-deep` | code review and GitNexus review/impact | read-only GitLab and GitNexus |
337
+ | `master` | none | none |
338
+ | `planner` | verification planning, ASCII UI review, GitNexus impact | Context7; GitNexus read-only |
339
+ | `back-fast` | none | Context7 |
340
+ | `back-deep` | GitNexus impact and refactoring | Context7; GitNexus except rename and group sync |
341
+ | `front-fast` | modern web and interface polish | Context7; Playwright observation; interactions ask |
342
+ | `front-deep` | frontend/layout skills plus GitNexus impact/refactoring | Context7; GitNexus except rename and group sync; Playwright interactions ask |
343
+ | `review-fast` | code review | Context7; read-only GitLab without CI variables |
344
+ | `review-deep` | code review and GitNexus review/impact | Context7; read-only GitLab and GitNexus |
345
+ | `researcher` | none | Context7 |
177
346
  | `explorer` | GitNexus exploration | GitNexus read-only |
178
347
  | `git` | none | GitLab reads; mutations ask; CI variables denied |
179
- | `verifier` | verification before completion | read-only GitNexus; Playwright interactions ask |
180
- | `debugger` | systematic debugging and GitNexus debugging/PDG | read-only GitNexus; Playwright interactions ask |
181
- | `security` | code review and GitNexus taint/PDG | read-only GitLab/GitNexus; Playwright interactions ask |
182
- | `devops` | verification before completion | GitLab reads and CI validation; mutations ask; CI variables denied |
348
+ | `docs` | none | Context7 |
349
+ | `verifier` | verification before completion | Context7; read-only GitNexus; Playwright interactions ask |
350
+ | `debugger` | systematic debugging and GitNexus debugging/PDG | Context7; read-only GitNexus; Playwright interactions ask |
351
+ | `security` | code review and GitNexus taint/PDG | Context7; read-only GitLab/GitNexus; Playwright interactions ask |
352
+ | `devops` | verification before completion | Context7; GitLab reads and CI validation; mutations ask; CI variables denied |
183
353
 
184
- `master`, `back-fast`, `researcher`, and `docs` intentionally keep their
185
- existing narrow capability sets. TDD skills are not enabled implicitly.
354
+ `master`, `explorer`, and `git` intentionally receive no Context7 grant. TDD
355
+ skills are not enabled implicitly.
186
356
 
187
357
  ## Model order
188
358
 
@@ -217,8 +387,9 @@ and shell access is denied.
217
387
  Verifier uses `openai/gpt-5.6-luna` with `openai/gpt-5.6-sol` as fallback.
218
388
  Debugger, Security, and DevOps use the reverse order. Verifier, Debugger, and
219
389
  Security are read-only and require approval for shell commands. DevOps can edit
220
- common CI, Docker, and infrastructure paths; other edits and every shell or
221
- external mutation require approval.
390
+ common CI, Docker, and infrastructure paths; other edits require approval, shell
391
+ is denied for the writer role, and every external mutation requires explicit
392
+ task authorization.
222
393
 
223
394
  This pre-release change replaces the earlier single-tier agent IDs. Existing
224
395
  global or project overrides must be split explicitly:
@@ -11,10 +11,12 @@
11
11
  "gitnexus-impact-analysis",
12
12
  "gitnexus-refactoring"
13
13
  ],
14
- "mcp": [],
14
+ "mcp": ["context7"],
15
15
  "permissions": [
16
16
  { "action": "subagent", "resource": "*", "effect": "deny" },
17
17
  { "action": "gitnexus_*", "resource": "*", "effect": "allow" },
18
- { "action": "gitnexus_group_sync", "resource": "*", "effect": "deny" }
18
+ { "action": "gitnexus_rename", "resource": "*", "effect": "deny" },
19
+ { "action": "gitnexus_group_sync", "resource": "*", "effect": "deny" },
20
+ { "action": "browser", "resource": "*", "effect": "deny" }
19
21
  ]
20
22
  }
@@ -8,8 +8,9 @@
8
8
  ],
9
9
  "prompt": "../prompts/back-fast.md",
10
10
  "skills": [],
11
- "mcp": [],
11
+ "mcp": ["context7"],
12
12
  "permissions": [
13
- { "action": "subagent", "resource": "*", "effect": "deny" }
13
+ { "action": "subagent", "resource": "*", "effect": "deny" },
14
+ { "action": "browser", "resource": "*", "effect": "deny" }
14
15
  ]
15
16
  }
@@ -12,7 +12,7 @@
12
12
  "gitnexus-debugging",
13
13
  "gitnexus-pdg-query"
14
14
  ],
15
- "mcp": [],
15
+ "mcp": ["context7"],
16
16
  "permissions": [
17
17
  { "action": "*", "resource": "*", "effect": "deny" },
18
18
  { "action": "read", "resource": "*", "effect": "allow" },
@@ -10,7 +10,7 @@
10
10
  "skills": [
11
11
  "verification-before-completion"
12
12
  ],
13
- "mcp": [],
13
+ "mcp": ["context7"],
14
14
  "permissions": [
15
15
  { "action": "*", "resource": "*", "effect": "deny" },
16
16
  { "action": "read", "resource": "*", "effect": "allow" },
@@ -21,6 +21,8 @@
21
21
  { "action": "edit", "resource": "Dockerfile.*", "effect": "allow" },
22
22
  { "action": "edit", "resource": "docker-compose*.yml", "effect": "allow" },
23
23
  { "action": "edit", "resource": "docker-compose*.yaml", "effect": "allow" },
24
+ { "action": "edit", "resource": "compose.yml", "effect": "allow" },
25
+ { "action": "edit", "resource": "compose.yaml", "effect": "allow" },
24
26
  { "action": "edit", "resource": ".github/workflows/*", "effect": "allow" },
25
27
  { "action": "edit", "resource": ".gitlab-ci.yml", "effect": "allow" },
26
28
  { "action": "edit", "resource": "deploy/*", "effect": "allow" },
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "prompt": "../prompts/docs.md",
10
10
  "skills": [],
11
- "mcp": [],
11
+ "mcp": ["context7"],
12
12
  "permissions": [
13
13
  { "action": "*", "resource": "*", "effect": "deny" },
14
14
  { "action": "read", "resource": "*", "effect": "allow" },
@@ -14,10 +14,11 @@
14
14
  "gitnexus-impact-analysis",
15
15
  "gitnexus-refactoring"
16
16
  ],
17
- "mcp": [],
17
+ "mcp": ["context7"],
18
18
  "permissions": [
19
19
  { "action": "subagent", "resource": "*", "effect": "deny" },
20
20
  { "action": "gitnexus_*", "resource": "*", "effect": "allow" },
21
+ { "action": "gitnexus_rename", "resource": "*", "effect": "deny" },
21
22
  { "action": "gitnexus_group_sync", "resource": "*", "effect": "deny" },
22
23
  { "action": "playwright_*", "resource": "*", "effect": "ask" },
23
24
  { "action": "playwright_browser_get_config", "resource": "*", "effect": "allow" },
@@ -29,6 +30,7 @@
29
30
  { "action": "playwright_browser_find", "resource": "*", "effect": "allow" },
30
31
  { "action": "playwright_browser_generate_locator", "resource": "*", "effect": "allow" },
31
32
  { "action": "playwright_browser_verify_*", "resource": "*", "effect": "allow" },
32
- { "action": "playwright_browser_run_code_unsafe", "resource": "*", "effect": "deny" }
33
+ { "action": "playwright_browser_run_code_unsafe", "resource": "*", "effect": "deny" },
34
+ { "action": "browser", "resource": "*", "effect": "deny" }
33
35
  ]
34
36
  }
@@ -11,7 +11,7 @@
11
11
  "modern-web-guidance",
12
12
  "make-interfaces-feel-better"
13
13
  ],
14
- "mcp": [],
14
+ "mcp": ["context7"],
15
15
  "permissions": [
16
16
  { "action": "subagent", "resource": "*", "effect": "deny" },
17
17
  { "action": "playwright_*", "resource": "*", "effect": "ask" },
@@ -24,6 +24,7 @@
24
24
  { "action": "playwright_browser_find", "resource": "*", "effect": "allow" },
25
25
  { "action": "playwright_browser_generate_locator", "resource": "*", "effect": "allow" },
26
26
  { "action": "playwright_browser_verify_*", "resource": "*", "effect": "allow" },
27
- { "action": "playwright_browser_run_code_unsafe", "resource": "*", "effect": "deny" }
27
+ { "action": "playwright_browser_run_code_unsafe", "resource": "*", "effect": "deny" },
28
+ { "action": "browser", "resource": "*", "effect": "deny" }
28
29
  ]
29
30
  }
@@ -25,6 +25,7 @@
25
25
  { "action": "subagent", "resource": "verifier", "effect": "allow" },
26
26
  { "action": "subagent", "resource": "debugger", "effect": "allow" },
27
27
  { "action": "subagent", "resource": "security", "effect": "allow" },
28
- { "action": "subagent", "resource": "devops", "effect": "allow" }
28
+ { "action": "subagent", "resource": "devops", "effect": "allow" },
29
+ { "action": "browser", "resource": "*", "effect": "deny" }
29
30
  ]
30
31
  }
@@ -12,13 +12,14 @@
12
12
  "ascii-ui-review",
13
13
  "gitnexus-impact-analysis"
14
14
  ],
15
- "mcp": [],
15
+ "mcp": ["context7"],
16
16
  "permissions": [
17
17
  { "action": "edit", "resource": "*", "effect": "deny" },
18
18
  { "action": "subagent", "resource": "*", "effect": "deny" },
19
19
  { "action": "shell", "resource": "*", "effect": "ask" },
20
20
  { "action": "gitnexus_*", "resource": "*", "effect": "allow" },
21
21
  { "action": "gitnexus_rename", "resource": "*", "effect": "deny" },
22
- { "action": "gitnexus_group_sync", "resource": "*", "effect": "deny" }
22
+ { "action": "gitnexus_group_sync", "resource": "*", "effect": "deny" },
23
+ { "action": "browser", "resource": "*", "effect": "deny" }
23
24
  ]
24
25
  }
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "prompt": "../prompts/researcher.md",
10
10
  "skills": [],
11
- "mcp": [],
11
+ "mcp": ["context7"],
12
12
  "permissions": [
13
13
  { "action": "*", "resource": "*", "effect": "deny" },
14
14
  { "action": "websearch", "resource": "*", "effect": "allow" },
@@ -11,7 +11,7 @@
11
11
  "code-review-excellence",
12
12
  "gitnexus-impact-analysis"
13
13
  ],
14
- "mcp": [],
14
+ "mcp": ["context7"],
15
15
  "permissions": [
16
16
  { "action": "edit", "resource": "*", "effect": "deny" },
17
17
  { "action": "subagent", "resource": "*", "effect": "deny" },
@@ -28,6 +28,7 @@
28
28
  { "action": "gitlab_get_project_variable", "resource": "*", "effect": "deny" },
29
29
  { "action": "gitlab_get_group_variable", "resource": "*", "effect": "deny" },
30
30
  { "action": "gitlab_list_project_variables", "resource": "*", "effect": "deny" },
31
- { "action": "gitlab_list_group_variables", "resource": "*", "effect": "deny" }
31
+ { "action": "gitlab_list_group_variables", "resource": "*", "effect": "deny" },
32
+ { "action": "browser", "resource": "*", "effect": "deny" }
32
33
  ]
33
34
  }
@@ -10,7 +10,7 @@
10
10
  "skills": [
11
11
  "code-review-excellence"
12
12
  ],
13
- "mcp": [],
13
+ "mcp": ["context7"],
14
14
  "permissions": [
15
15
  { "action": "edit", "resource": "*", "effect": "deny" },
16
16
  { "action": "subagent", "resource": "*", "effect": "deny" },
@@ -24,6 +24,7 @@
24
24
  { "action": "gitlab_get_project_variable", "resource": "*", "effect": "deny" },
25
25
  { "action": "gitlab_get_group_variable", "resource": "*", "effect": "deny" },
26
26
  { "action": "gitlab_list_project_variables", "resource": "*", "effect": "deny" },
27
- { "action": "gitlab_list_group_variables", "resource": "*", "effect": "deny" }
27
+ { "action": "gitlab_list_group_variables", "resource": "*", "effect": "deny" },
28
+ { "action": "browser", "resource": "*", "effect": "deny" }
28
29
  ]
29
30
  }
@@ -12,7 +12,7 @@
12
12
  "gitnexus-taint-analysis",
13
13
  "gitnexus-pdg-query"
14
14
  ],
15
- "mcp": [],
15
+ "mcp": ["context7"],
16
16
  "permissions": [
17
17
  { "action": "*", "resource": "*", "effect": "deny" },
18
18
  { "action": "read", "resource": "*", "effect": "allow" },
@@ -10,7 +10,7 @@
10
10
  "skills": [
11
11
  "verification-before-completion"
12
12
  ],
13
- "mcp": [],
13
+ "mcp": ["context7"],
14
14
  "permissions": [
15
15
  { "action": "*", "resource": "*", "effect": "deny" },
16
16
  { "action": "read", "resource": "*", "effect": "allow" },
@@ -1,5 +1,6 @@
1
1
  {
2
- // Built-in baseline. User and project layers may override any field.
2
+ // Built-in baseline. Project overrides beyond $schema and descriptions of
3
+ // existing agents require an external, content-bound project trust token.
3
4
  "defaultAgent": "master",
4
5
  "agents": {}
5
6
  }
@@ -4,4 +4,4 @@ Before the first file mutation, call `gvozd_claim` with the `leaseId` supplied b
4
4
 
5
5
  Pay particular attention to migrations, concurrency, authentication, authorization, external integrations, failure handling, and data integrity when they are in scope. Report the changed files, key decisions, concrete verification evidence, and remaining uncertainty.
6
6
 
7
- Use GitNexus for cross-module impact or coordinated refactoring when the graph is current and materially useful; source and runtime evidence remain authoritative.
7
+ Use GitNexus for cross-module impact and refactoring analysis when the graph is current and materially useful; the GitNexus rename tool is unavailable, so apply renames through structured edits inside the leased files. Source and runtime evidence remain authoritative.
@@ -2,6 +2,6 @@ You are DevOps. Implement focused CI, Docker, infrastructure, deployment, and re
2
2
 
3
3
  Before the first file mutation, call `gvozd_claim` with the `leaseId` supplied by Master. Modify only the exact leased files and use structured mutation tools; shell is unavailable while acting as a writer. If the task has no lease ID or requires another file, stop before changing it and report the exact missing path to Master for scope extension.
4
4
 
5
- Modify only the assigned infrastructure scope and do not delegate work. Request approval before every shell command. Never deploy, publish, push, rotate secrets, delete resources, or mutate an external environment unless the delegated request explicitly authorizes that exact action. Report changed files, commands that were approved and executed, observed state, and remaining deployment uncertainty.
5
+ Modify only the assigned infrastructure scope and do not delegate work. Shell is denied while you act as a writer, so do not attempt shell commands; report the exact commands that still need to run so Master can route them to Verifier or the user after the leases are released. Never deploy, publish, push, rotate secrets, delete resources, or mutate an external environment unless the delegated request explicitly authorizes that exact action. Report changed files, observed state, commands that were not run, and remaining deployment uncertainty.
6
6
 
7
7
  GitLab reads and CI validation are available. Other GitLab actions require approval and exact task authorization; CI variables remain unavailable.
@@ -2,4 +2,4 @@ You are Explorer. Find the files, symbols, dependencies, and execution paths rel
2
2
 
3
3
  Do not modify files, run shell commands, browse the internet, or delegate work. Stop when the requested code location or flow is established; unresolved architecture decisions belong to Master.
4
4
 
5
- Use GitNexus only when the correct checkout has a current index and graph evidence materially improves the answer; no graph result is proof only of the indexed snapshot.
5
+ Use GitNexus only when the correct checkout has a current index and graph evidence materially improves the answer; a graph result proves nothing beyond the indexed snapshot.
@@ -4,4 +4,4 @@ Before the first file mutation, call `gvozd_claim` with the `leaseId` supplied b
4
4
 
5
5
  Resolve difficult interaction and integration details within the assigned architecture. Report the changed files, key decisions, concrete verification evidence, and remaining uncertainty.
6
6
 
7
- Use GitNexus only for material cross-module impact and use the supplied web and interface skills when their trigger applies. Use ASCII layout comparison only when an unresolved layout choice materially changes navigation, information hierarchy, or the user journey. Playwright observation is available for UI evidence; interactive browser actions require approval.
7
+ Use GitNexus only for material cross-module impact; its rename tool is unavailable, so apply renames through structured edits inside the leased files. Use the supplied web and interface skills when their trigger applies. Use ASCII layout comparison only when an unresolved layout choice materially changes navigation, information hierarchy, or the user journey. Playwright observation is available for UI evidence; interactive browser actions require approval.
@@ -12,10 +12,10 @@ If backend and frontend scopes are independent, they may be delegated separately
12
12
 
13
13
  Before delegating work to more than one writer, use Explorer to identify the exact existing and planned files for each independent work package. Reserve each non-overlapping exact file set with `gvozd_lease` using operation `reserve`, then include the returned `leaseId` in that writer's task. If reservation reports an overlap, change the split or serialize the work; never dispatch overlapping writers.
14
14
 
15
- Every writer, including Master when editing directly, needs a reserved and claimed lease. If a writer reports that another file is required, use `gvozd_lease` operation `extend` only after checking the added file does not conflict. Release abandoned reservations explicitly. Wait for all writer leases to finish before sending work to Verifier or asking another agent to run approval-gated shell commands.
15
+ Every writer, including Master when editing directly, needs a reserved and claimed lease. If a writer reports that another file is required, use `gvozd_lease` operation `extend` only after checking the added file does not conflict. Release abandoned reservations explicitly. Before sending work to Verifier or asking another agent to run approval-gated shell commands, check with `gvozd_lease` operation `status` that every writer lease has been released; active writer leases pause approval-gated shell work, so wait or release first.
16
16
 
17
17
  Use Researcher for current external information that requires internet sources. Use Explorer for focused, read-only discovery of files, symbols, dependencies, and execution paths in the local workspace. Use Git for repository status, history, diffs, branches, staging, commits, and other explicitly authorized Git operations. Use Docs for focused documentation, examples, and migration notes. Do not delegate a task merely to restate work that is already clear from the current context.
18
18
 
19
19
  Use Verifier after implementation when independent runtime, build, typecheck, or manual scenario evidence is needed. Use Debugger when a failure is unclear and the root cause must be established before choosing a fix. Use Security for an independent security-focused review when authentication, authorization, secrets, untrusted input, external requests, data exposure, or another trust boundary is material. Use DevOps for CI, Docker, infrastructure, deployment, and release configuration; keep deployment and other external mutations subject to explicit user authorization.
20
20
 
21
- Do not write automated tests unless the user explicitly asks for them. Prefer direct typechecking, builds, runtime smoke checks, and manual scenario verification.
21
+ Write only the narrowest regression tests when tests are explicitly required by the task, its acceptance criteria, or CI/release verification. Otherwise prefer direct typechecking, builds, runtime smoke checks, and manual scenarios; do not expand test scope without user agreement.