@passioncode-ai/passioncode 0.2.55 → 0.2.57

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/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.2.57 - 2026-11-03
4
+
5
+ ### Fixed
6
+
7
+ - A terminal `setup` that declined every offer (PC-91) exits by its checks, 1 when a check still
8
+ fails, whether or not it named a release train (PC-93). Before, naming a train other than the
9
+ saved one made it exit 0 as a plan does, and otherwise it exited by its checks, though in both
10
+ the person changed nothing. A run that only returns a plan (`--dry-run`, or no terminal and no
11
+ `--yes` when it would change something) still exits 0.
12
+
13
+ ## 0.2.56 - 2026-11-03
14
+
15
+ ### Fixed
16
+
17
+ - `setup` in a terminal that asked, changed nothing and left install offers untaken, such as Fabric
18
+ offered without Docker (an offer that defaults to no), says "Nothing was changed: Fabric was
19
+ offered and not installed. The checks below still stand." instead of "Everything this command can
20
+ set up is in place" (PC-92). It does not say "declined": pressing Enter on an offer that defaults
21
+ to no is not declining (PC-89, as its test `a run nobody agreed to saves no train` holds). A run that answered no to every offer, at least one of them
22
+ defaulting to yes, still says "You declined every offer" (PC-91).
23
+
3
24
  ## 0.2.55 - 2026-11-03
4
25
 
5
26
  ### Fixed
@@ -93,7 +93,7 @@ async function setupOrDoctor(cmd, rest) {
93
93
  noOpen: o.flags.has('--no-open'), dryRun: o.flags.has('--dry-run'), repairOnly, online, ask: json ? null : asker(), log, train: o.train,
94
94
  });
95
95
  process.stdout.write(json ? JSON.stringify(r, null, 2) + '\n' : S.render(r, { repairOnly }) + '\n');
96
- return r.planOnly ? 0 : r.ok ? 0 : 1;
96
+ return S.exitCode(r);
97
97
  }
98
98
 
99
99
  async function main(argv) {
package/lib/setup.js CHANGED
@@ -174,6 +174,15 @@ async function setup({
174
174
  // Said so in the report: an empty run after "no" to every offer is not a machine with nothing to set
175
175
  // up. Forgetting a train (`--train none`) is still a change, so that run is not "declined".
176
176
  if (declinedAll && !result.actions.length) result.declined = true;
177
+ // PC-92: a run that asked, changed nothing and was not "declined" left install offers untaken
178
+ // (each defaulting to no, like Fabric without Docker): it names them rather than calling the
179
+ // machine set up. Pressing Enter on a default-no offer is not declining (PC-89, the test beginning
180
+ // `PC-89: a run nobody agreed to`), so it says
181
+ // "not installed", not "declined".
182
+ if (asked && !result.declined && !result.actions.length && !items.some((i) => i.selected)) {
183
+ const untaken = items.filter((i) => i.kind === 'install' && !i.selected).map((i) => catalog.byId(i.product).name);
184
+ if (untaken.length) result.notTaken = untaken;
185
+ }
177
186
 
178
187
  const act = (kind, detail, product = null) => {
179
188
  const a = { kind, detail, product, outcome: 'done' };
@@ -274,7 +283,13 @@ function finish(result, home, checks) {
274
283
  return result;
275
284
  }
276
285
 
286
+ // The exit code of a setup or doctor --fix run. A plan exits 0 (nothing was agreed, nothing ran);
287
+ // a declined run (PC-91) is not a plan but the person's answer, so it exits by its checks like any
288
+ // run that changed nothing (PC-93): 1 when a check still fails, with or without a named train.
289
+ const exitCode = (r) => (r.planOnly && !r.declined ? 0 : r.ok ? 0 : 1);
290
+
277
291
  const DECLINED = 'You declined every offer; nothing was changed. The checks below still stand.';
292
+ const notTaken = (names) => `Nothing was changed: ${names.join(' and ')} ${names.length > 1 ? 'were' : 'was'} offered and not installed. The checks below still stand.`;
278
293
 
279
294
  function render(result, { repairOnly = false } = {}) {
280
295
  const lines = [];
@@ -288,7 +303,7 @@ function render(result, { repairOnly = false } = {}) {
288
303
  if (result.trainNotSaved) lines.push('', `The release train (${result.trainNotSaved}) was not saved${result.declined ? '.' : ': run it with --yes, or answer in a terminal.'}`);
289
304
  if (todo.length) lines.push('', 'Run it with --yes to apply, or in a terminal to answer one question per app.');
290
305
  } else if (!result.actions.length) {
291
- lines.push('', result.declined ? DECLINED : 'Everything this command can set up is in place; nothing was changed.');
306
+ lines.push('', result.declined ? DECLINED : result.notTaken ? notTaken(result.notTaken) : 'Everything this command can set up is in place; nothing was changed.');
292
307
  } else {
293
308
  lines.push('', 'Done:');
294
309
  for (const x of result.actions) lines.push(` ${x.outcome === 'failed' ? 'FAILED' : 'done '} ${x.detail}${x.error ? `\n ${x.error}` : ''}`);
@@ -321,4 +336,4 @@ function render(result, { repairOnly = false } = {}) {
321
336
  return lines.join('\n');
322
337
  }
323
338
 
324
- module.exports = { setup, plan, render };
339
+ module.exports = { setup, plan, render, exitCode };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@passioncode-ai/passioncode",
3
- "version": "0.2.55",
3
+ "version": "0.2.57",
4
4
  "description": "Set up PassionCode.ai on a computer with one command: the apps from their verified releases, their MCP servers for every coding agent and the PassionCode.ai skills. Check and repair it with the same command or `doctor`.",
5
5
  "bin": {
6
6
  "passioncode": "bin/passioncode.js"
@@ -35,7 +35,7 @@
35
35
  "name": "passioncode",
36
36
  "displayName": "PassionCode.ai",
37
37
  "source": "./plugins/passioncode",
38
- "version": "0.2.55",
38
+ "version": "0.2.57",
39
39
  "description": "Set up and check PassionCode.ai on a computer with one command (setting-up-passioncode), the organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
40
40
  "author": {
41
41
  "name": "PassionCode.ai",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "family": "passioncode",
3
- "version": "0.2.55",
3
+ "version": "0.2.57",
4
4
  "release": true,
5
5
  "members": [
6
6
  {
@@ -62,9 +62,9 @@
62
62
  "name": "passioncode",
63
63
  "displayName": "PassionCode.ai",
64
64
  "repo": "passioncode-ai/passioncode",
65
- "ref": "v0.2.55",
65
+ "ref": "v0.2.57",
66
66
  "commit": null,
67
- "version": "0.2.55",
67
+ "version": "0.2.57",
68
68
  "via": "this repository",
69
69
  "skills": [
70
70
  "setting-up-passioncode",
@@ -72,7 +72,7 @@
72
72
  ],
73
73
  "legacyPluginIds": [],
74
74
  "legacyMarketplaces": [],
75
- "contentHash": "sha256:52a667e167df1bdfaee95bdfcc45689c0b7366b96608f7c986a8c632be0e1516",
75
+ "contentHash": "sha256:30c81a7b07a8f7a83e2f700ac4a3ced780dd08b530c03e114b0b09fd796a5fbb",
76
76
  "description": "Set up and check PassionCode.ai on a computer with one command (setting-up-passioncode), the organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check that keeps the PassionCode.ai set current.",
77
77
  "author": {
78
78
  "name": "PassionCode.ai",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
3
  "name": "passioncode",
4
4
  "displayName": "PassionCode.ai",
5
- "version": "0.2.55",
5
+ "version": "0.2.57",
6
6
  "description": "Set up and check PassionCode.ai on a computer with one command (setting-up-passioncode), the organisation's working rules for every contributor's agent (working-in-passioncode), and a once-a-day check at session start that keeps the PassionCode.ai skill set current.",
7
7
  "author": {
8
8
  "name": "PassionCode.ai",