pumuki 6.3.103 → 6.3.105

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,21 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [6.3.105] - 2026-04-22
10
+
11
+ ### Fixed
12
+
13
+ - **Remediaciones PRE_WRITE fijadas a la versión diagnosticada:** `sdd validate`, `auto_execute_ai_start` y la remediación por defecto dejan de recomendar `pumuki@latest` y pasan a devolver comandos con la versión efectiva del runtime (`pumuki@6.3.105` en esta línea).
14
+ - **Backport útil de `PUMUKI-INC-089` a la línea publicada:** `main` mantiene la ruta reproducible para `install`, `policy reconcile --strict --json` y la revalidación `PRE_WRITE` sin exigir al consumer adivinar la versión correcta.
15
+
16
+ ## [6.3.104] - 2026-04-22
17
+
18
+ ### Fixed
19
+
20
+ - **Tracking canónico de RuralGo reconocido por el parser de repo-policy:** `appendTrackingActionableContext` ya inspecciona `docs/RURALGO_SEGUIMIENTO.md`, que es la ruta canónica real del consumer.
21
+ - **Filas `| 🚧 | TASK |` tratadas como entradas activas válidas:** el diagnóstico accionable cubre el formato de tabla usado por el hub de seguimiento de RuralGo además del backlog tabular de incidencias.
22
+ - **Cobertura de regresión para el hub canónico:** nuevas pruebas fijan parsing y priorización de `docs/RURALGO_SEGUIMIENTO.md` antes de otros archivos de tracking del consumer.
23
+
9
24
  ## [6.3.103] - 2026-04-22
10
25
 
11
26
  ### Fixed
package/VERSION CHANGED
@@ -1 +1 @@
1
- v6.3.103
1
+ v6.3.105
@@ -6,6 +6,18 @@ 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.105)
10
+
11
+ - **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`.
12
+ - **Cobertura MCP alineada:** `auto_execute_ai_start` devuelve las mismas remediaciones versionadas que `sdd validate` para evidence invalid/stale, `active_rule_ids` vacío y policy reconcile estricto.
13
+ - **Rollout recomendado:** publicar `pumuki@6.3.105`, repin inmediato en `RuralGo` y revalidar el command contract de `PRE_WRITE` en `sdd validate`, `auto_execute_ai_start` y hooks reales.
14
+
15
+ ### 2026-04-22 (v6.3.104)
16
+
17
+ - **RuralGo hub-aware diagnostics:** `TRACKING_CANONICAL_IN_PROGRESS_INVALID` pasa a enriquecer su mensaje usando `docs/RURALGO_SEGUIMIENTO.md` cuando ese hub es el board canónico del consumer.
18
+ - **Compatibilidad con tablas del hub:** el parser reconoce filas `| 🚧 | TASK_ID |` y las devuelve como entradas activas accionables.
19
+ - **Rollout recomendado:** publicar `pumuki@6.3.104`, repin inmediato en `RuralGo` y revalidar `status` / `doctor` / `pumuki-pre-write` con doble fila `🚧` temporal en el hub canónico.
20
+
9
21
  ### 2026-04-22 (v6.3.103)
10
22
 
11
23
  - **Tracking canónico accionable:** `status`, `doctor` y el gate repo-policy enriquecen `TRACKING_CANONICAL_IN_PROGRESS_INVALID` con referencias a las entradas activas detectadas en el board del consumer.
@@ -15,6 +15,7 @@ const REPO_POLICY_CODES = new Set<string>([
15
15
 
16
16
  const TRACKING_CANDIDATE_FILES = [
17
17
  'docs/technical/08-validation/refactor/pumuki-integration-feedback.md',
18
+ 'docs/RURALGO_SEGUIMIENTO.md',
18
19
  'docs/pumuki/PUMUKI_BUGS_MEJORAS.md',
19
20
  'docs/BUGS_Y_MEJORAS_PUMUKI.md',
20
21
  'PUMUKI-RESET-MASTER-PLAN.md',
@@ -32,6 +33,14 @@ export const collectTrackingActiveEntriesFromMarkdown = (
32
33
  const entries: TrackingActiveEntry[] = [];
33
34
  const lines = markdown.split(/\r?\n/u);
34
35
  for (const [index, line] of lines.entries()) {
36
+ const boardRowMatch = line.match(/^\|\s*🚧\s*\|\s*([A-Z0-9-]+)\s*\|/u);
37
+ if (boardRowMatch) {
38
+ entries.push({
39
+ taskId: boardRowMatch[1]!.trim(),
40
+ lineNumber: index + 1,
41
+ });
42
+ continue;
43
+ }
35
44
  const tableMatch = line.match(
36
45
  /^\|\s*\d+\s*\|\s*`([^`]+)`\s*\|.*\|\s*🚧(?:\s+reported\s+activo|\s+En construcción|\s+En construccion)?\s*\|/u
37
46
  );
@@ -11,6 +11,7 @@ import {
11
11
  } from './doctor';
12
12
  import { runLifecycleInstall } from './install';
13
13
  import { runLifecycleRemove } from './remove';
14
+ import { getCurrentPumukiVersion } from './packageInfo';
14
15
  import { readLifecycleStatus } from './status';
15
16
  import {
16
17
  readLifecycleExperimentalFeaturesSnapshot,
@@ -1615,10 +1616,26 @@ const printDoctorReport = (
1615
1616
  };
1616
1617
 
1617
1618
  const PRE_WRITE_TELEMETRY_CHAIN = 'pumuki->mcp->ai_gate->ai_evidence';
1618
- const PRE_WRITE_INSTALL_REMEDIATION_COMMAND =
1619
- 'npx --yes --package pumuki@latest pumuki install';
1620
- const PRE_WRITE_POLICY_RECONCILE_COMMAND =
1621
- 'npx --yes --package pumuki@latest pumuki policy reconcile --strict --json && npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json';
1619
+ const buildPinnedPumukiNpxCommand = (params: {
1620
+ repoRoot?: string;
1621
+ executableAndArgs: string;
1622
+ }): string =>
1623
+ `npx --yes --package pumuki@${getCurrentPumukiVersion({ repoRoot: params.repoRoot })} ${params.executableAndArgs}`;
1624
+ const buildPreWriteInstallRemediationCommand = (repoRoot?: string): string =>
1625
+ buildPinnedPumukiNpxCommand({ repoRoot, executableAndArgs: 'pumuki install' });
1626
+ const buildPreWriteValidateCommand = (params: {
1627
+ repoRoot?: string;
1628
+ stage: SddStage;
1629
+ }): string =>
1630
+ buildPinnedPumukiNpxCommand({
1631
+ repoRoot: params.repoRoot,
1632
+ executableAndArgs: `pumuki sdd validate --stage=${params.stage} --json`,
1633
+ });
1634
+ const buildPreWritePolicyReconcileCommand = (repoRoot?: string): string =>
1635
+ `${buildPinnedPumukiNpxCommand({
1636
+ repoRoot,
1637
+ executableAndArgs: 'pumuki policy reconcile --strict --json',
1638
+ })} && ${buildPreWriteValidateCommand({ repoRoot, stage: 'PRE_WRITE' })}`;
1622
1639
 
1623
1640
  type PreWriteValidationEnvelope = {
1624
1641
  sdd: SddEvaluateResult;
@@ -1813,8 +1830,11 @@ const PRE_WRITE_HINTS_BY_CODE: Readonly<Record<string, string>> = {
1813
1830
  MCP_ENTERPRISE_RECEIPT_REPO_ROOT_MISMATCH: 'Genera el recibo MCP en este mismo repositorio.',
1814
1831
  };
1815
1832
 
1816
- const PRE_WRITE_DEFAULT_REMEDIATION =
1817
- 'Corrige la causa bloqueante y vuelve a ejecutar: npx --yes --package pumuki@latest pumuki-pre-write';
1833
+ const buildPreWriteDefaultRemediation = (repoRoot?: string): string =>
1834
+ `Corrige la causa bloqueante y vuelve a ejecutar: ${buildPinnedPumukiNpxCommand({
1835
+ repoRoot,
1836
+ executableAndArgs: 'pumuki-pre-write',
1837
+ })}`;
1818
1838
 
1819
1839
  export const PRE_WRITE_OPENSPEC_AUTOREMEDIABLE_CODES = new Set<string>([
1820
1840
  'OPENSPEC_MISSING',
@@ -1838,7 +1858,7 @@ export const resolvePreWriteNextAction = (params: {
1838
1858
  if (!params.sdd.decision.allowed && PRE_WRITE_OPENSPEC_AUTOREMEDIABLE_CODES.has(params.sdd.decision.code)) {
1839
1859
  return {
1840
1860
  reason: params.sdd.decision.code,
1841
- command: PRE_WRITE_INSTALL_REMEDIATION_COMMAND,
1861
+ command: buildPreWriteInstallRemediationCommand(params.aiGate?.repo_state.repo_root),
1842
1862
  };
1843
1863
  }
1844
1864
  if (!params.aiGate || params.aiGate.allowed) {
@@ -1850,7 +1870,7 @@ export const resolvePreWriteNextAction = (params: {
1850
1870
  if (policyReconcileViolation) {
1851
1871
  return {
1852
1872
  reason: policyReconcileViolation.code,
1853
- command: PRE_WRITE_POLICY_RECONCILE_COMMAND,
1873
+ command: buildPreWritePolicyReconcileCommand(params.aiGate.repo_state.repo_root),
1854
1874
  };
1855
1875
  }
1856
1876
  const atomicSliceViolation = params.aiGate.violations.find((violation) =>
@@ -1866,7 +1886,10 @@ export const resolvePreWriteNextAction = (params: {
1866
1886
  return {
1867
1887
  reason: atomicSliceViolation.code,
1868
1888
  command:
1869
- `${firstSliceCommand} && npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json`,
1889
+ `${firstSliceCommand} && ${buildPreWriteValidateCommand({
1890
+ repoRoot: params.aiGate.repo_state.repo_root,
1891
+ stage: 'PRE_WRITE',
1892
+ })}`,
1870
1893
  };
1871
1894
  }
1872
1895
  const hasMcpViolation = params.aiGate.violations.some((violation) =>
@@ -1877,7 +1900,10 @@ export const resolvePreWriteNextAction = (params: {
1877
1900
  }
1878
1901
  return {
1879
1902
  reason: 'MCP_ENTERPRISE_RECEIPT',
1880
- command: 'npx --yes --package pumuki@latest pumuki-pre-write',
1903
+ command: buildPinnedPumukiNpxCommand({
1904
+ repoRoot: params.aiGate.repo_state.repo_root,
1905
+ executableAndArgs: 'pumuki-pre-write',
1906
+ }),
1881
1907
  };
1882
1908
  };
1883
1909
 
@@ -1888,7 +1914,7 @@ export const resolvePreWriteBlockedRemediation = (params: {
1888
1914
  if (params.nextAction?.command) {
1889
1915
  return params.nextAction.command;
1890
1916
  }
1891
- return PRE_WRITE_HINTS_BY_CODE[params.causeCode] ?? PRE_WRITE_DEFAULT_REMEDIATION;
1917
+ return PRE_WRITE_HINTS_BY_CODE[params.causeCode] ?? buildPreWriteDefaultRemediation();
1892
1918
  };
1893
1919
 
1894
1920
  const wrapPreWritePanelLine = (value: string, width: number): string[] => {
@@ -1,5 +1,6 @@
1
1
  import { evaluateAiGate, type AiGateStage, type AiGateViolation } from '../gate/evaluateAiGate';
2
2
  import { collectWorktreeAtomicSlices } from '../git/worktreeAtomicSlices';
3
+ import { getCurrentPumukiVersion } from '../lifecycle/packageInfo';
3
4
  import { resolveLearningContextExperimentalFeature } from '../policy/experimentalFeatures';
4
5
  import { readSddLearningContext, type SddLearningContext } from '../sdd/learningInsights';
5
6
 
@@ -56,6 +57,12 @@ const confidenceFromViolation = (violationCode: string | null): number => {
56
57
  return 50;
57
58
  };
58
59
 
60
+ const buildPinnedPumukiNpxCommand = (params: {
61
+ repoRoot: string;
62
+ executableAndArgs: string;
63
+ }): string =>
64
+ `npx --yes --package pumuki@${getCurrentPumukiVersion({ repoRoot: params.repoRoot })} ${params.executableAndArgs}`;
65
+
59
66
  const nextActionFromViolation = (
60
67
  violation: AiGateViolation | undefined,
61
68
  repoRoot: string
@@ -74,7 +81,10 @@ const nextActionFromViolation = (
74
81
  return {
75
82
  kind: 'run_command',
76
83
  message: 'Regenera o refresca evidencia y vuelve a evaluar PRE_WRITE.',
77
- command: 'npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json',
84
+ command: buildPinnedPumukiNpxCommand({
85
+ repoRoot,
86
+ executableAndArgs: 'pumuki sdd validate --stage=PRE_WRITE --json',
87
+ }),
78
88
  };
79
89
  case 'EVIDENCE_ACTIVE_RULE_IDS_EMPTY_FOR_CODE_CHANGES':
80
90
  return {
@@ -82,7 +92,13 @@ const nextActionFromViolation = (
82
92
  message:
83
93
  'No hay active_rule_ids para plataforma de código detectada. Reconciliación strict de policy/skills y revalidación PRE_WRITE.',
84
94
  command:
85
- 'npx --yes --package pumuki@latest pumuki policy reconcile --strict --json && npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json',
95
+ `${buildPinnedPumukiNpxCommand({
96
+ repoRoot,
97
+ executableAndArgs: 'pumuki policy reconcile --strict --json',
98
+ })} && ${buildPinnedPumukiNpxCommand({
99
+ repoRoot,
100
+ executableAndArgs: 'pumuki sdd validate --stage=PRE_WRITE --json',
101
+ })}`,
86
102
  };
87
103
  case 'EVIDENCE_PLATFORM_SKILLS_SCOPE_INCOMPLETE':
88
104
  case 'EVIDENCE_PLATFORM_SKILLS_BUNDLES_MISSING':
@@ -91,7 +107,10 @@ const nextActionFromViolation = (
91
107
  kind: 'run_command',
92
108
  message:
93
109
  'Completa cobertura de skills por plataforma (prefijos + bundles) y revalida PRE_WRITE.',
94
- command: 'npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json',
110
+ command: buildPinnedPumukiNpxCommand({
111
+ repoRoot,
112
+ executableAndArgs: 'pumuki sdd validate --stage=PRE_WRITE --json',
113
+ }),
95
114
  };
96
115
  case 'EVIDENCE_PLATFORM_CRITICAL_SKILLS_RULES_MISSING':
97
116
  case 'EVIDENCE_CROSS_PLATFORM_CRITICAL_ENFORCEMENT_INCOMPLETE':
@@ -100,7 +119,13 @@ const nextActionFromViolation = (
100
119
  message:
101
120
  'Reconcilia policy/skills en modo estricto (incluida skills.ios.critical-test-quality cuando aplique) y revalida PRE_WRITE.',
102
121
  command:
103
- 'npx --yes --package pumuki@latest pumuki policy reconcile --strict --json && npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json',
122
+ `${buildPinnedPumukiNpxCommand({
123
+ repoRoot,
124
+ executableAndArgs: 'pumuki policy reconcile --strict --json',
125
+ })} && ${buildPinnedPumukiNpxCommand({
126
+ repoRoot,
127
+ executableAndArgs: 'pumuki sdd validate --stage=PRE_WRITE --json',
128
+ })}`,
104
129
  };
105
130
  case 'EVIDENCE_PREWRITE_WORKTREE_OVER_LIMIT':
106
131
  case 'EVIDENCE_PREWRITE_WORKTREE_WARN':
@@ -117,7 +142,10 @@ const nextActionFromViolation = (
117
142
  message:
118
143
  `Particiona el worktree en slices atómicos por scope. Primer lote sugerido: ${firstSlice?.scope ?? 'scope-desconocido'}.`,
119
144
  command:
120
- `${firstSlice?.staged_command ?? 'git add -p'} && npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json`,
145
+ `${firstSlice?.staged_command ?? 'git add -p'} && ${buildPinnedPumukiNpxCommand({
146
+ repoRoot,
147
+ executableAndArgs: 'pumuki sdd validate --stage=PRE_WRITE --json',
148
+ })}`,
121
149
  };
122
150
  }
123
151
  }
@@ -126,7 +154,10 @@ const nextActionFromViolation = (
126
154
  message:
127
155
  'Particiona el worktree en slices atómicos y revalida PRE_WRITE para continuar sin fricción.',
128
156
  command:
129
- 'git status --short && git add -p && npx --yes --package pumuki@latest pumuki sdd validate --stage=PRE_WRITE --json',
157
+ `git status --short && git add -p && ${buildPinnedPumukiNpxCommand({
158
+ repoRoot,
159
+ executableAndArgs: 'pumuki sdd validate --stage=PRE_WRITE --json',
160
+ })}`,
130
161
  };
131
162
  case 'GITFLOW_PROTECTED_BRANCH':
132
163
  return {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.103",
3
+ "version": "6.3.105",
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": {