create-agentic-workspace 0.4.1 → 0.5.0
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/package.json +2 -2
- package/permission-floor.json +6 -1
- package/src/run.mjs +21 -10
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-agentic-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "The pre-session bootstrap wizard for an Agentic Foundry workspace: declares (never grants) the permission floor, absorbs foundry-bootstrap.sh's out-of-session identity wiring, and scaffolds a seven-file schema-valid workspace. Zero dependencies, no lifecycle scripts, no telemetry.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"marketplace_name": "agentic-foundry",
|
|
35
35
|
"marketplace_repo": "lukasrepublic/agentic-foundry",
|
|
36
36
|
"plugin_name": "foundry",
|
|
37
|
-
"plugin_version": "1.
|
|
37
|
+
"plugin_version": "1.5.0",
|
|
38
38
|
"pins_researched": "2026-08-02"
|
|
39
39
|
}
|
|
40
40
|
}
|
package/permission-floor.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema_version": 1,
|
|
3
3
|
"plugin_root_glob": "~/.claude/plugins/cache/*/foundry/*",
|
|
4
|
-
"generated_for_plugin_version": "1.
|
|
4
|
+
"generated_for_plugin_version": "1.5.0",
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"rule": "Bash(~/.claude/plugins/cache/*/foundry/*/scripts/foundry-acceptance-contract-validate.py:*)",
|
|
@@ -263,6 +263,11 @@
|
|
|
263
263
|
"tier": "ask",
|
|
264
264
|
"rationale": "ceremony: --create arrives after other args, not prefix-keyable, so the whole script is ask"
|
|
265
265
|
},
|
|
266
|
+
{
|
|
267
|
+
"rule": "Bash(~/.claude/plugins/cache/*/foundry/*/scripts/foundry_command_deck.py:*)",
|
|
268
|
+
"tier": "allow",
|
|
269
|
+
"rationale": "read-only programme resolution + ready-set/idle/wake derivation; writes nothing (asserted byte-level over a whole fixture tree by AC-CDW-6) and issues no merge, dispatch, or authorization. NOT write-free means side-effect-free: via foundry_release it runs read-only git plumbing (log/rev-parse) in a repo dir, and it exec_module's the in-tree wave planner. Manifest-named spec_ref/contract_ref are confinement-checked BEFORE any derivation. NOT covered: the dir git runs in comes from the contract's own target_repo via _resolve_repo, whose unrecognized-key fallback can leave the corpus - pre-existing shipped behaviour, reached only through an already-confined, authorized contract"
|
|
270
|
+
},
|
|
266
271
|
{
|
|
267
272
|
"rule": "Bash(~/.claude/plugins/cache/*/foundry/*/scripts/foundry_release.py accept:*)",
|
|
268
273
|
"tier": "ask",
|
package/src/run.mjs
CHANGED
|
@@ -168,19 +168,15 @@ export async function runCli(argv, { cwd, isTTY, input, output, homeDir, pkgDir
|
|
|
168
168
|
|
|
169
169
|
print(renderPreview({ plan, machineScopeWrites, map }));
|
|
170
170
|
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
//
|
|
176
|
-
const { effective, unreadable } = readEffectiveRules(physicalRoot);
|
|
171
|
+
// Resolved HERE — before the write phase and before the dry-run return — because the reconcile
|
|
172
|
+
// below must know what it would add in order to decide whether to write at all, and --dry-run
|
|
173
|
+
// must be able to report those rules. That requirement is carried by the TRACKED classification
|
|
174
|
+
// a few lines down; the union classification the advisory report needs is derived after the
|
|
175
|
+
// write instead, for the reason stated there.
|
|
177
176
|
const pluginRootExpansion = expandPluginRootGlob(map.plugin_root_glob, homeDir);
|
|
178
|
-
const findings = classifyDrift(map, effective, {
|
|
179
|
-
pluginRootExpansion, unreadableOrigins: unreadable, home: homeDir,
|
|
180
|
-
});
|
|
181
177
|
|
|
182
178
|
// The reconcile classifies against the TRACKED settings.json alone. A floor rule carried only
|
|
183
|
-
// in the untracked settings.local.json reads as covered in the union
|
|
179
|
+
// in the untracked settings.local.json reads as covered in the union report below, so the tracked file
|
|
184
180
|
// would stay incomplete while the report said converged — and the repo would then ship to every
|
|
185
181
|
// other clone and to CI without it.
|
|
186
182
|
let floorPlan = null;
|
|
@@ -256,6 +252,21 @@ export async function runCli(argv, { cwd, isTTY, input, output, homeDir, pkgDir
|
|
|
256
252
|
wireIdentity({ slug, name: identity.name, email: identity.email, targetRoot: physicalRoot, homeDir });
|
|
257
253
|
}
|
|
258
254
|
|
|
255
|
+
// The advisory report describes the state the operator is LEFT in, so it is classified from the
|
|
256
|
+
// files as they now stand — AFTER applyPlan and after any reconcile write. Classifying it up
|
|
257
|
+
// front instead makes it name rules that exist by the time it prints: on the reconcile path
|
|
258
|
+
// that is every rule just added, so the run reported `added allow=42, ask=16` and then listed
|
|
259
|
+
// all 58 as absent, which reads as the write having silently failed. The create path had the
|
|
260
|
+
// same defect whenever it wrote settings.json itself. Deriving it here cannot contradict the
|
|
261
|
+
// write above it, at the cost of re-reading two small files on the write path.
|
|
262
|
+
//
|
|
263
|
+
// This is only the UNION (settings.json + settings.local.json) report. The reconcile's own
|
|
264
|
+
// classification stays above the write and over the tracked file alone — consent has to be
|
|
265
|
+
// informed by what WILL be written, which is a different question from what remains after.
|
|
266
|
+
const { effective, unreadable } = readEffectiveRules(physicalRoot);
|
|
267
|
+
const findings = classifyDrift(map, effective, {
|
|
268
|
+
pluginRootExpansion, unreadableOrigins: unreadable, home: homeDir,
|
|
269
|
+
});
|
|
259
270
|
if (findings.length > 0) {
|
|
260
271
|
print('');
|
|
261
272
|
print(`Permission-floor report (advisory, ${findings.length} finding(s)):`);
|