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.
|
|
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
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
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
|
|
1817
|
-
|
|
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:
|
|
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:
|
|
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} &&
|
|
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:
|
|
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] ??
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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'} &&
|
|
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
|
-
|
|
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.
|
|
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": {
|