create-agentic-workspace 0.9.0 → 0.9.1
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 +1 -1
- package/src/pluginRefresh.mjs +29 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-agentic-workspace",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.1",
|
|
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.9.
|
|
37
|
+
"plugin_version": "1.9.1",
|
|
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.9.
|
|
4
|
+
"generated_for_plugin_version": "1.9.1",
|
|
5
5
|
"entries": [
|
|
6
6
|
{
|
|
7
7
|
"rule": "Bash(~/.claude/plugins/cache/*/foundry/*/scripts/foundry-acceptance-contract-validate.py:*)",
|
package/src/pluginRefresh.mjs
CHANGED
|
@@ -201,13 +201,40 @@ export function migrationActions(trigger, { scope, marketplaceName, marketplaceR
|
|
|
201
201
|
* `before` carried survives with its ORIGINAL value except `extraKnownMarketplaces` — the one key
|
|
202
202
|
* the migration exists to change — and `enabledPlugins` is unconditionally guaranteed to still name
|
|
203
203
|
* the plugin, regardless of what either side carried. */
|
|
204
|
-
|
|
204
|
+
/** ALLOWLIST, not "everything except `source`". The migration replaces the whole registration
|
|
205
|
+
* entry, and Claude Code publishes no schema for what may live in it — so a skip-`source` denylist
|
|
206
|
+
* carries an UNKNOWN key forward by default, and the dangerous shape is a second pin-like key. The
|
|
207
|
+
* shipped `claude` binary carries `ref`, `commit`, `scope` and `lastUpdated` strings in marketplace
|
|
208
|
+
* context: restoring a stale `commit` would be pin resurrection under a different name, defeating
|
|
209
|
+
* the very migration this repair serves. So the carry-forward set is enumerated, and a key nobody
|
|
210
|
+
* anticipated is DROPPED rather than restored — the platform re-adds what it still wants. Adding a
|
|
211
|
+
* key here is a deliberate one-line decision with this paragraph attached. */
|
|
212
|
+
const CARRY_FORWARD = ['autoUpdate'];
|
|
213
|
+
|
|
214
|
+
export function repairScopeSettings(before, after, pluginKey, marketplaceName) {
|
|
205
215
|
const repaired = { ...after };
|
|
206
216
|
for (const key of Object.keys(before)) {
|
|
207
217
|
if (key === 'extraKnownMarketplaces') continue;
|
|
208
218
|
repaired[key] = before[key];
|
|
209
219
|
}
|
|
210
220
|
repaired.enabledPlugins = { ...(repaired.enabledPlugins || {}), [pluginKey]: true };
|
|
221
|
+
|
|
222
|
+
// `!Array.isArray` on both sides: `typeof [] === 'object'`, so an array in this slot would merge
|
|
223
|
+
// its INDICES in as keys (`{"0": "...", source: {...}}`). Only a plain object is a registration.
|
|
224
|
+
const isEntry = (v) => v && typeof v === 'object' && !Array.isArray(v);
|
|
225
|
+
const beforeEntry = (before || {}).extraKnownMarketplaces?.[marketplaceName];
|
|
226
|
+
const afterEntry = repaired.extraKnownMarketplaces?.[marketplaceName];
|
|
227
|
+
if (isEntry(beforeEntry) && isEntry(afterEntry)) {
|
|
228
|
+
const merged = { ...afterEntry };
|
|
229
|
+
for (const key of CARRY_FORWARD) {
|
|
230
|
+
if (!Object.prototype.hasOwnProperty.call(beforeEntry, key)) continue;
|
|
231
|
+
// hasOwnProperty.call, NOT `key in merged`: `in` is true for INHERITED names, so a key
|
|
232
|
+
// literally called `toString` / `constructor` would read as "the platform already declared
|
|
233
|
+
// it" and be skipped. Own-property is the question actually being asked.
|
|
234
|
+
if (!Object.prototype.hasOwnProperty.call(merged, key)) merged[key] = beforeEntry[key];
|
|
235
|
+
}
|
|
236
|
+
repaired.extraKnownMarketplaces = { ...repaired.extraKnownMarketplaces, [marketplaceName]: merged };
|
|
237
|
+
}
|
|
211
238
|
return repaired;
|
|
212
239
|
}
|
|
213
240
|
|
|
@@ -236,7 +263,7 @@ export function migrateScope({ scopeSnap, trigger, marketplaceName, marketplaceR
|
|
|
236
263
|
}
|
|
237
264
|
if (fs.existsSync(scopeSnap.settingsPath)) {
|
|
238
265
|
const after = readScopeSettings(scopeSnap).obj;
|
|
239
|
-
const repaired = repairScopeSettings(scopeSnap.obj, after, pluginKey);
|
|
266
|
+
const repaired = repairScopeSettings(scopeSnap.obj, after, pluginKey, marketplaceName);
|
|
240
267
|
writeTargetAtomically(scopeSnap.settingsPath, repaired);
|
|
241
268
|
}
|
|
242
269
|
if (caught) throw caught;
|