pumuki 6.3.105 → 6.3.106

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
@@ -6,6 +6,13 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [6.3.106] - 2026-04-22
10
+
11
+ ### Fixed
12
+
13
+ - **Activación advisory de SDD/PRE_WRITE fijada al runtime diagnosticado:** `sdd validate` deja de devolver `activation_command` con `pumuki@latest` cuando el namespace experimental está desactivado por defecto.
14
+ - **Session guidance reproducible en SDD:** las instrucciones de `session --refresh` y `session --open` también quedan fijadas a la versión efectiva del runtime en lugar de depender de `latest`.
15
+
9
16
  ## [6.3.105] - 2026-04-22
10
17
 
11
18
  ### Fixed
package/VERSION CHANGED
@@ -1 +1 @@
1
- v6.3.105
1
+ v6.3.106
@@ -6,6 +6,12 @@ This file keeps only the operational highlights and rollout notes that matter wh
6
6
 
7
7
  ## 2026-04 (CLI stability and macOS notifications)
8
8
 
9
+ ### 2026-04-22 (v6.3.106)
10
+
11
+ - **Cierre útil del literal residual en RuralGo:** `sdd validate --stage=PRE_WRITE --json` ya no recomienda activar SDD con `pumuki@latest`; devuelve el mismo runtime versionado que está diagnosticando.
12
+ - **Guía de sesión SDD alineada:** `session --refresh` y `session --open` quedan versionados para evitar drift en repos consumidores.
13
+ - **Rollout recomendado:** publicar `pumuki@6.3.106`, repin inmediato en `RuralGo` y revalidar `sdd validate --stage=PRE_WRITE --json` comprobando `activation_command` fijo a `6.3.106`.
14
+
9
15
  ### 2026-04-22 (v6.3.105)
10
16
 
11
17
  - **Remediación reproducible en la línea publicada:** las rutas bloqueantes de `PRE_WRITE` dejan de sugerir `pumuki@latest` y fijan la versión efectiva del runtime al construir `next_action.command`.
@@ -1670,10 +1670,19 @@ export type PreWriteOpenSpecBootstrapTrace = {
1670
1670
  details?: string;
1671
1671
  };
1672
1672
 
1673
- export const PRE_WRITE_ENABLE_ADVISORY_COMMAND =
1674
- 'PUMUKI_EXPERIMENTAL_PRE_WRITE=advisory npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json';
1675
- export const buildSddExperimentalEnableAdvisoryCommand = (stage: SddStage): string =>
1676
- `PUMUKI_EXPERIMENTAL_SDD=advisory npx --yes --package pumuki@latest pumuki sdd validate --stage=${stage} --json`;
1673
+ export const buildPreWriteExperimentalEnableAdvisoryCommand = (
1674
+ repoRoot: string = process.cwd()
1675
+ ): string =>
1676
+ `PUMUKI_EXPERIMENTAL_PRE_WRITE=advisory ${buildPinnedPumukiNpxCommand(
1677
+ getCurrentPumukiVersion({ repoRoot })
1678
+ )} sdd validate --stage=PRE_WRITE --json`;
1679
+ export const buildSddExperimentalEnableAdvisoryCommand = (
1680
+ stage: SddStage,
1681
+ repoRoot: string = process.cwd()
1682
+ ): string =>
1683
+ `PUMUKI_EXPERIMENTAL_SDD=advisory ${buildPinnedPumukiNpxCommand(
1684
+ getCurrentPumukiVersion({ repoRoot })
1685
+ )} sdd validate --stage=${stage} --json`;
1677
1686
  const buildAnalyticsExperimentalEnableCommand = (action: AnalyticsHotspotsCommand): string =>
1678
1687
  `PUMUKI_EXPERIMENTAL_ANALYTICS=advisory npx --yes --package pumuki@latest pumuki analytics hotspots ${action} --json`;
1679
1688
  const SAAS_INGESTION_ENABLE_ADVISORY_COMMAND =
@@ -36,7 +36,7 @@ import {
36
36
  buildPreWriteExperimentalDisabledResult,
37
37
  buildSddExperimentalEnableAdvisoryCommand,
38
38
  runRawPreWriteAiGateCheck,
39
- PRE_WRITE_ENABLE_ADVISORY_COMMAND,
39
+ buildPreWriteExperimentalEnableAdvisoryCommand,
40
40
  } from './cli';
41
41
 
42
42
  export const runSddCommand = async (parsed: ParsedArgs, activeDependencies: LifecycleCliDependencies): Promise<number> => {
@@ -106,7 +106,7 @@ export const runSddCommand = async (parsed: ParsedArgs, activeDependencies: Life
106
106
  },
107
107
  next_action: {
108
108
  reason: 'PRE_WRITE_EXPERIMENTAL_DISABLED',
109
- command: PRE_WRITE_ENABLE_ADVISORY_COMMAND,
109
+ command: buildPreWriteExperimentalEnableAdvisoryCommand(process.cwd()),
110
110
  },
111
111
  },
112
112
  null,
@@ -127,7 +127,7 @@ export const runSddCommand = async (parsed: ParsedArgs, activeDependencies: Life
127
127
  `[pumuki][sdd] pre-write enforcement: mode=${preWriteEnforcement.mode} source=${preWriteEnforcement.source} blocking=no`
128
128
  );
129
129
  writeInfo(
130
- `[pumuki][sdd] next action (PRE_WRITE_EXPERIMENTAL_DISABLED): ${PRE_WRITE_ENABLE_ADVISORY_COMMAND}`
130
+ `[pumuki][sdd] next action (PRE_WRITE_EXPERIMENTAL_DISABLED): ${buildPreWriteExperimentalEnableAdvisoryCommand(process.cwd())}`
131
131
  );
132
132
  }
133
133
  return 0;
@@ -209,7 +209,7 @@ export const runSddCommand = async (parsed: ParsedArgs, activeDependencies: Life
209
209
  !aiGate && result.decision.code === 'SDD_EXPERIMENTAL_DISABLED'
210
210
  ? {
211
211
  reason: 'SDD_EXPERIMENTAL_DISABLED',
212
- command: buildSddExperimentalEnableAdvisoryCommand(result.stage),
212
+ command: buildSddExperimentalEnableAdvisoryCommand(result.stage, process.cwd()),
213
213
  }
214
214
  : undefined;
215
215
  if (parsed.json) {
@@ -13,6 +13,7 @@ import {
13
13
  refreshSddSession,
14
14
  } from './sessionStore';
15
15
  import { resolveDegradedMode } from '../gate/degradedMode';
16
+ import { getCurrentPumukiVersion } from '../lifecycle/packageInfo';
16
17
  import { resolveSddCompletenessEnforcement } from '../policy/sddCompletenessEnforcement';
17
18
  import { resolveSddExperimentalFeature } from '../policy/experimentalFeatures';
18
19
  import type {
@@ -22,16 +23,20 @@ import type {
22
23
  SddStatusPayload,
23
24
  } from './types';
24
25
 
25
- const SDD_SESSION_REFRESH_COMMAND =
26
- 'npx --yes --package pumuki@latest pumuki sdd session --refresh --ttl-minutes=90';
27
- const SDD_SESSION_OPEN_AUTO_COMMAND =
28
- 'npx --yes --package pumuki@latest pumuki sdd session --open --change=auto';
29
- const SDD_SESSION_OPEN_EXPLICIT_COMMAND =
30
- 'npx --yes --package pumuki@latest pumuki sdd session --open --change=<id>';
31
26
  const SDD_COMPLETENESS_CONTRACT_VERSION = '1.0';
32
27
 
33
- const buildSddExperimentalEnableCommand = (stage: SddStage): string =>
34
- `PUMUKI_EXPERIMENTAL_SDD=advisory npx --yes --package pumuki@latest pumuki sdd validate --stage=${stage} --json`;
28
+ const buildPinnedPumukiNpxCommand = (version: string): string =>
29
+ `npx --yes --package pumuki@${version} pumuki`;
30
+ const buildSddSessionRefreshCommand = (repoRoot: string): string =>
31
+ `${buildPinnedPumukiNpxCommand(getCurrentPumukiVersion({ repoRoot }))} sdd session --refresh --ttl-minutes=90`;
32
+ const buildSddSessionOpenAutoCommand = (repoRoot: string): string =>
33
+ `${buildPinnedPumukiNpxCommand(getCurrentPumukiVersion({ repoRoot }))} sdd session --open --change=auto`;
34
+ const buildSddSessionOpenExplicitCommand = (repoRoot: string): string =>
35
+ `${buildPinnedPumukiNpxCommand(getCurrentPumukiVersion({ repoRoot }))} sdd session --open --change=<id>`;
36
+ const buildSddExperimentalEnableCommand = (stage: SddStage, repoRoot: string): string =>
37
+ `PUMUKI_EXPERIMENTAL_SDD=advisory ${buildPinnedPumukiNpxCommand(
38
+ getCurrentPumukiVersion({ repoRoot })
39
+ )} sdd validate --stage=${stage} --json`;
35
40
 
36
41
  const resolveMissingSessionGuidance = (repoRoot: string): {
37
42
  message: string;
@@ -40,15 +45,17 @@ const resolveMissingSessionGuidance = (repoRoot: string): {
40
45
  suggestedChangeId?: string;
41
46
  availableChangeIds: ReadonlyArray<string>;
42
47
  } => {
48
+ const sessionOpenAutoCommand = buildSddSessionOpenAutoCommand(repoRoot);
49
+ const sessionOpenExplicitCommand = buildSddSessionOpenExplicitCommand(repoRoot);
43
50
  const availableChangeIds = listActiveOpenSpecChangeIds(repoRoot);
44
51
  if (availableChangeIds.length === 1) {
45
52
  const suggestedChangeId = availableChangeIds[0] ?? '';
46
53
  const command =
47
- `npx --yes --package pumuki@latest pumuki sdd session --open --change=${suggestedChangeId}`;
54
+ `${buildPinnedPumukiNpxCommand(getCurrentPumukiVersion({ repoRoot }))} sdd session --open --change=${suggestedChangeId}`;
48
55
  return {
49
56
  message: `SDD session is not active. Run \`${command}\` and retry.`,
50
57
  command,
51
- fallbackCommand: SDD_SESSION_OPEN_AUTO_COMMAND,
58
+ fallbackCommand: sessionOpenAutoCommand,
52
59
  suggestedChangeId,
53
60
  availableChangeIds,
54
61
  };
@@ -56,17 +63,17 @@ const resolveMissingSessionGuidance = (repoRoot: string): {
56
63
  if (availableChangeIds.length > 1) {
57
64
  return {
58
65
  message:
59
- `SDD session is not active. Run \`${SDD_SESSION_OPEN_EXPLICIT_COMMAND}\` ` +
66
+ `SDD session is not active. Run \`${sessionOpenExplicitCommand}\` ` +
60
67
  `with one active change id. Active changes: ${availableChangeIds.join(', ')}.`,
61
- command: SDD_SESSION_OPEN_EXPLICIT_COMMAND,
62
- fallbackCommand: SDD_SESSION_OPEN_EXPLICIT_COMMAND,
68
+ command: sessionOpenExplicitCommand,
69
+ fallbackCommand: sessionOpenExplicitCommand,
63
70
  availableChangeIds,
64
71
  };
65
72
  }
66
73
  return {
67
- message: `SDD session is not active. Run \`${SDD_SESSION_OPEN_AUTO_COMMAND}\` and retry.`,
68
- command: SDD_SESSION_OPEN_AUTO_COMMAND,
69
- fallbackCommand: SDD_SESSION_OPEN_AUTO_COMMAND,
74
+ message: `SDD session is not active. Run \`${sessionOpenAutoCommand}\` and retry.`,
75
+ command: sessionOpenAutoCommand,
76
+ fallbackCommand: sessionOpenAutoCommand,
70
77
  availableChangeIds,
71
78
  };
72
79
  };
@@ -181,8 +188,9 @@ const evaluateSessionRequirements = (params: {
181
188
  );
182
189
  }
183
190
  if (!status.session.valid || !status.session.changeId) {
191
+ const refreshCommand = buildSddSessionRefreshCommand(params.repoRoot);
184
192
  const details: Record<string, string | boolean> = {
185
- command: SDD_SESSION_REFRESH_COMMAND,
193
+ command: refreshCommand,
186
194
  autoRefreshEnabled: params.autoRefreshEnabled,
187
195
  autoRefreshAttempted: params.autoRefreshAttempted,
188
196
  };
@@ -191,8 +199,8 @@ const evaluateSessionRequirements = (params: {
191
199
  }
192
200
  const message =
193
201
  params.autoRefreshAttempted && params.autoRefreshError
194
- ? `SDD session is invalid or expired. Auto-refresh failed (${params.autoRefreshError}). Run \`${SDD_SESSION_REFRESH_COMMAND}\` or reopen it.`
195
- : `SDD session is invalid or expired. Run \`${SDD_SESSION_REFRESH_COMMAND}\` or reopen it.`;
202
+ ? `SDD session is invalid or expired. Auto-refresh failed (${params.autoRefreshError}). Run \`${refreshCommand}\` or reopen it.`
203
+ : `SDD session is invalid or expired. Run \`${refreshCommand}\` or reopen it.`;
196
204
  return blocked(
197
205
  'SDD_SESSION_INVALID',
198
206
  message,
@@ -327,7 +335,7 @@ export const evaluateSddPolicy = (params: {
327
335
  experimentalSource: sddExperimentalFeature.source,
328
336
  activation_env: sddExperimentalFeature.activationVariable,
329
337
  legacy_activation_env: sddExperimentalFeature.legacyActivationVariable,
330
- activation_command: buildSddExperimentalEnableCommand(params.stage),
338
+ activation_command: buildSddExperimentalEnableCommand(params.stage, params.repoRoot),
331
339
  },
332
340
  },
333
341
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.105",
3
+ "version": "6.3.106",
4
4
  "description": "Enterprise-grade AST Intelligence System with multi-platform support (iOS, Android, Backend, Frontend) and Feature-First + DDD + Clean Architecture enforcement. Includes dynamic violations API for intelligent querying.",
5
5
  "main": "index.js",
6
6
  "bin": {