create-agentic-workspace 0.17.1 → 0.17.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-agentic-workspace",
3
- "version": "0.17.1",
3
+ "version": "0.17.2",
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.17.1",
37
+ "plugin_version": "1.17.2",
38
38
  "pins_researched": "2026-08-02"
39
39
  }
40
40
  }
@@ -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.17.1",
4
+ "generated_for_plugin_version": "1.17.2",
5
5
  "entries": [
6
6
  {
7
7
  "rule": "Bash(~/.claude/plugins/cache/*/foundry/*/scripts/foundry-acceptance-contract-validate.py:*)",
package/src/update.mjs CHANGED
@@ -16,7 +16,7 @@ import {
16
16
  } from './floorReconcile.mjs';
17
17
  import { reconcileGitignorePlan, applyGitignorePlan, renderGitignoreRow } from './gitignoreReconcile.mjs';
18
18
  import { planAmendmentsBackfill, applyAmendmentsBackfill, renderAmendmentsRow } from './amendmentsBackfill.mjs';
19
- import { buildUpgradeReport, writeUpgradeReport, installedVersionBefore, NEXT_LINE } from './upgradeReport.mjs';
19
+ import { buildUpgradeReport, writeUpgradeReport, installedVersionBefore, versionOrNull, NEXT_LINE } from './upgradeReport.mjs';
20
20
  import { planStatuslineWiring, applyStatuslineWiring, renderStatuslineRows, statuslineChanged } from './statuslineWiring.mjs';
21
21
  import {
22
22
  ALLOWED_CLAUDE_SUBCOMMANDS, resolveClaudeOnPath, runClaude,
@@ -72,7 +72,7 @@ function isInstalledInScopeFactory(registry, pluginKey, cwd) {
72
72
  /** Run the update command end to end. Never throws — every failure path is caught and turned into
73
73
  * a refusal-shaped exit 1 (or, for a bug, exit 1 with the error message), matching run.mjs's own
74
74
  * contract. */
75
- export async function runUpdate(argv, { cwd, configDir, homeDir, pkgDir, output, spawnEnv = process.env }) {
75
+ export async function runUpdate(argv, { cwd, configDir, homeDir, pkgDir, output, spawnEnv = process.env, updaterVersion = null }) {
76
76
  const lines = [];
77
77
  const print = (s) => {
78
78
  lines.push(s);
@@ -103,7 +103,11 @@ export async function runUpdate(argv, { cwd, configDir, homeDir, pkgDir, output,
103
103
  return { exitCode: 0, output: lines.join('\n') };
104
104
  }
105
105
 
106
- const pins = JSON.parse(fs.readFileSync(path.join(pkgDir, 'package.json'), 'utf-8')).foundry;
106
+ const corePkg = JSON.parse(fs.readFileSync(path.join(pkgDir, 'package.json'), 'utf-8'));
107
+ const pins = corePkg.foundry;
108
+ // ER #228: say WHICH updater this is, first, every run — a stale npx-cached updater looked
109
+ // exactly like a broken backfill until the report and the log carried the version.
110
+ print(`update-agentic-workspace ${versionOrNull(updaterVersion) || 'unknown'} (core create-agentic-workspace ${versionOrNull(corePkg.version) || 'unknown'}, built for plugin ${versionOrNull(pins.plugin_version) || 'unknown'})`);
107
111
  const marketplaceName = pins.marketplace_name;
108
112
  const marketplaceRepo = pins.marketplace_repo;
109
113
  const pluginKey = `${pins.plugin_name}@${pins.marketplace_name}`;
@@ -339,6 +343,7 @@ export async function runUpdate(argv, { cwd, configDir, homeDir, pkgDir, output,
339
343
  // named in the LAST line so the operator's next step is never a guess.
340
344
  const report = buildUpgradeReport({
341
345
  installedBefore, afterEntry, toPluginVersion: pins.plugin_version, phases, filePlan, amendmentsPlan,
346
+ updaterVersion, coreVersion: corePkg.version, updaterPluginVersion: pins.plugin_version,
342
347
  });
343
348
  const reportPath = writeUpgradeReport(physicalRoot, report);
344
349
  print('');
@@ -31,6 +31,7 @@ export function versionOrNull(v) {
31
31
  * `amendmentsPlan` is the applied backfill plan (or null); `phases` is what renderSummary got. */
32
32
  export function buildUpgradeReport({
33
33
  installedBefore = null, afterEntry, toPluginVersion, phases, filePlan, amendmentsPlan, now = new Date(),
34
+ updaterVersion = null, coreVersion = null, updaterPluginVersion = null,
34
35
  }) {
35
36
  const seedRow = (filePlan || []).find((f) => f.seed);
36
37
  return {
@@ -42,10 +43,18 @@ export function buildUpgradeReport({
42
43
  // first install) makes the skill list only the current version's CHANGELOG section.
43
44
  from_plugin_version: versionOrNull(installedBefore),
44
45
  to_plugin_version: (afterEntry && versionOrNull(afterEntry.version)) || versionOrNull(toPluginVersion),
46
+ // ER #228 (v1.17.2): WHICH updater ran. A stale npx-cached updater was indistinguishable from a
47
+ // broken walk; the skill refuses a report whose updater was built for another plugin version.
48
+ updater_version: versionOrNull(updaterVersion),
49
+ core_version: versionOrNull(coreVersion),
50
+ updater_plugin_version: versionOrNull(updaterPluginVersion),
45
51
  phases: (phases || []).map((p) => ({ name: p.name, verdict: p.verdict, ...(p.reason ? { reason: p.reason } : {}) })),
52
+ // `total` is the walk's denominator (ER #228): backfilled + present + skipped == total, so a
53
+ // walk that never opened a file cannot read as a clean pass.
46
54
  amendments: amendmentsPlan
47
- ? { backfilled: amendmentsPlan.written ?? 0, present: amendmentsPlan.present, skipped: amendmentsPlan.skipped }
48
- : { backfilled: 0, present: 0, skipped: 0 },
55
+ ? { backfilled: amendmentsPlan.written ?? 0, present: amendmentsPlan.present, skipped: amendmentsPlan.skipped,
56
+ total: amendmentsPlan.total ?? ((amendmentsPlan.written ?? 0) + amendmentsPlan.present + amendmentsPlan.skipped) }
57
+ : { backfilled: 0, present: 0, skipped: 0, total: 0 },
49
58
  permissions_policy: seedRow ? (seedRow.action === 'create' ? 'created' : 'kept') : 'absent',
50
59
  drifted: (filePlan || []).filter((f) => f.action === 'drifted').map((f) => f.relPath),
51
60
  };