pumuki 6.3.111 → 6.3.113
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 +4 -3
- package/VERSION +1 -1
- package/docs/operations/RELEASE_NOTES.md +4 -3
- package/integrations/lifecycle/bootstrapManifest.ts +1 -1
- package/integrations/lifecycle/doctor.ts +7 -8
- package/integrations/lifecycle/governanceObservationSnapshot.ts +1 -11
- package/integrations/lifecycle/status.ts +16 -2
- package/integrations/lifecycle/trackingState.ts +11 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,12 +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.
|
|
9
|
+
## [6.3.113] - 2026-04-23
|
|
10
10
|
|
|
11
11
|
### Fixed
|
|
12
12
|
|
|
13
|
-
- **
|
|
14
|
-
-
|
|
13
|
+
- **Contrato bloqueado canónico en `status` / `doctor`:** cuando el runtime está bloqueado, la salida expone `issues` accionables en vez de dejar el diagnóstico implícito.
|
|
14
|
+
- **`governanceNextAction.stage` alineado con la evidencia:** el stage visible deja de forzarse y respeta `evidence.snapshot_stage` cuando existe.
|
|
15
|
+
- **Remediación reproducible respecto al runtime diagnosticado:** la guía de alineación deja de apuntar a `pumuki@latest` y pasa a resolver contra el runtime efectivo del consumer.
|
|
15
16
|
|
|
16
17
|
## [6.3.102] - 2026-04-22
|
|
17
18
|
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v6.3.
|
|
1
|
+
v6.3.113
|
|
@@ -6,10 +6,11 @@ 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-23 (v6.3.
|
|
9
|
+
### 2026-04-23 (v6.3.113)
|
|
10
10
|
|
|
11
|
-
- **
|
|
12
|
-
- **
|
|
11
|
+
- **Tracking canónico accionable en `status` / `doctor`:** cuando el runtime está bloqueado, la salida visible ya incluye `issues` y contexto suficiente para no depender de grep manual.
|
|
12
|
+
- **Stage visible coherente con la evidencia:** `governanceNextAction.stage` deja de ser un valor forzado y sigue el `snapshot_stage` real cuando existe.
|
|
13
|
+
- **Remediación reproducible:** la recomendación de alineación ahora apunta al runtime diagnosticado del consumer, no a una versión comodín.
|
|
13
14
|
|
|
14
15
|
### 2026-04-22 (v6.3.102)
|
|
15
16
|
|
|
@@ -174,7 +174,7 @@ export const buildLifecycleBootstrapManifest = (params: {
|
|
|
174
174
|
})
|
|
175
175
|
const governanceNextAction = readGovernanceNextAction({
|
|
176
176
|
repoRoot,
|
|
177
|
-
stage: 'PRE_WRITE',
|
|
177
|
+
stage: governanceObservation.evidence.snapshot_stage ?? 'PRE_WRITE',
|
|
178
178
|
governanceObservation,
|
|
179
179
|
})
|
|
180
180
|
const hooksDirectory = resolvePumukiHooksDirectory(repoRoot)
|
|
@@ -30,7 +30,11 @@ import {
|
|
|
30
30
|
evaluateOpenSpecCompatibility,
|
|
31
31
|
isOpenSpecProjectInitialized,
|
|
32
32
|
} from '../sdd/openSpecCli';
|
|
33
|
-
import {
|
|
33
|
+
import {
|
|
34
|
+
formatTrackingActionableContext,
|
|
35
|
+
resolveRepoTrackingState,
|
|
36
|
+
type RepoTrackingState,
|
|
37
|
+
} from './trackingState';
|
|
34
38
|
|
|
35
39
|
export type DoctorIssueSeverity = 'warning' | 'error';
|
|
36
40
|
|
|
@@ -180,16 +184,11 @@ const buildDoctorIssues = (params: {
|
|
|
180
184
|
`Tracking contract has conflicting canonical declarations (${params.tracking.declarations.map((declaration) => declaration.resolved_path).join(', ')}).`,
|
|
181
185
|
});
|
|
182
186
|
} else if (!params.tracking.single_in_progress_valid) {
|
|
183
|
-
const
|
|
184
|
-
.map((entry) => `${entry.task_id ?? 'UNKNOWN'}@L${entry.line_number}`)
|
|
185
|
-
.join(', ');
|
|
186
|
-
const actionableContext = activeEntries.length > 0
|
|
187
|
-
? ` active_entries=${activeEntries} last_run_status=${params.tracking.last_run_status ?? 'absent'}`
|
|
188
|
-
: '';
|
|
187
|
+
const actionableContext = formatTrackingActionableContext(params.tracking);
|
|
189
188
|
issues.push({
|
|
190
189
|
severity: 'warning',
|
|
191
190
|
message:
|
|
192
|
-
`Canonical tracking is inconsistent for ${params.tracking.canonical_path} (in_progress_count=${params.tracking.in_progress_count}, active_task=${params.tracking.active_task_id ?? 'unknown'}, last_run_status=${params.tracking.last_run_status ?? 'absent'}).${actionableContext}`,
|
|
191
|
+
`Canonical tracking is inconsistent for ${params.tracking.canonical_path} (in_progress_count=${params.tracking.in_progress_count}, active_task=${params.tracking.active_task_id ?? 'unknown'}, last_run_status=${params.tracking.last_run_status ?? 'absent'}).${actionableContext ? ` ${actionableContext}` : ''}`,
|
|
193
192
|
});
|
|
194
193
|
}
|
|
195
194
|
}
|
|
@@ -10,6 +10,7 @@ import type { ILifecycleGitService } from './gitService';
|
|
|
10
10
|
import { LifecycleGitService } from './gitService';
|
|
11
11
|
import type { LifecyclePolicyValidationSnapshot } from './policyValidationSnapshot';
|
|
12
12
|
import { writeInfo } from './cliOutputs';
|
|
13
|
+
import { formatTrackingActionableContext } from './trackingState';
|
|
13
14
|
|
|
14
15
|
const DEFAULT_PROTECTED_BRANCHES = new Set(['main', 'master', 'develop', 'dev']);
|
|
15
16
|
|
|
@@ -119,17 +120,6 @@ const buildContractSurface = (repoRoot: string): GovernanceContractSurface => ({
|
|
|
119
120
|
pumuki_adapter_json: existsSync(join(repoRoot, '.pumuki', 'adapter.json')),
|
|
120
121
|
});
|
|
121
122
|
|
|
122
|
-
const formatTrackingActionableContext = (tracking: RepoTrackingState): string | null => {
|
|
123
|
-
const activeEntries = (tracking.in_progress_entries ?? [])
|
|
124
|
-
.map((entry) => `${entry.task_id ?? 'UNKNOWN'}@L${entry.line_number}`)
|
|
125
|
-
.join(', ');
|
|
126
|
-
if (!activeEntries) {
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
const lastRunStatus = tracking.last_run_status ?? 'absent';
|
|
130
|
-
return `active_entries=${activeEntries} last_run_status=${lastRunStatus}`;
|
|
131
|
-
};
|
|
132
|
-
|
|
133
123
|
const PLATFORM_BUNDLE_ORDER = [
|
|
134
124
|
'android-enterprise-rules',
|
|
135
125
|
'backend-enterprise-rules',
|
|
@@ -21,7 +21,11 @@ import {
|
|
|
21
21
|
} from './governanceNextAction';
|
|
22
22
|
import type { DoctorIssue } from './doctor';
|
|
23
23
|
import { readLifecycleState, type LifecycleState } from './state';
|
|
24
|
-
import {
|
|
24
|
+
import {
|
|
25
|
+
formatTrackingActionableContext,
|
|
26
|
+
resolveRepoTrackingState,
|
|
27
|
+
type RepoTrackingState,
|
|
28
|
+
} from './trackingState';
|
|
25
29
|
|
|
26
30
|
export type LifecycleStatus = {
|
|
27
31
|
repoRoot: string;
|
|
@@ -43,6 +47,7 @@ export type LifecycleStatus = {
|
|
|
43
47
|
const buildLifecycleIssues = (params: {
|
|
44
48
|
governanceObservation: GovernanceObservationSnapshot;
|
|
45
49
|
governanceNextAction: GovernanceNextActionSummary;
|
|
50
|
+
tracking: RepoTrackingState;
|
|
46
51
|
}): ReadonlyArray<DoctorIssue> => {
|
|
47
52
|
const issues: DoctorIssue[] = [];
|
|
48
53
|
|
|
@@ -55,6 +60,15 @@ const buildLifecycleIssues = (params: {
|
|
|
55
60
|
});
|
|
56
61
|
}
|
|
57
62
|
|
|
63
|
+
if (params.tracking.enforced && params.tracking.single_in_progress_valid === false) {
|
|
64
|
+
const actionableContext = formatTrackingActionableContext(params.tracking);
|
|
65
|
+
issues.push({
|
|
66
|
+
severity: 'warning',
|
|
67
|
+
message:
|
|
68
|
+
`Canonical tracking is inconsistent for ${params.tracking.canonical_path ?? 'unknown'} (in_progress_count=${params.tracking.in_progress_count}, active_task=${params.tracking.active_task_id ?? 'unknown'}, last_run_status=${params.tracking.last_run_status ?? 'absent'}).${actionableContext ? ` ${actionableContext}` : ''}`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
58
72
|
return issues;
|
|
59
73
|
};
|
|
60
74
|
|
|
@@ -88,7 +102,7 @@ export const readLifecycleStatus = (params?: {
|
|
|
88
102
|
governanceObservation,
|
|
89
103
|
});
|
|
90
104
|
const tracking = resolveRepoTrackingState(repoRoot);
|
|
91
|
-
const issues = buildLifecycleIssues({ governanceObservation, governanceNextAction });
|
|
105
|
+
const issues = buildLifecycleIssues({ governanceObservation, governanceNextAction, tracking });
|
|
92
106
|
|
|
93
107
|
return {
|
|
94
108
|
repoRoot,
|
|
@@ -25,6 +25,17 @@ export type RepoTrackingState = {
|
|
|
25
25
|
last_run_status?: string | null;
|
|
26
26
|
};
|
|
27
27
|
|
|
28
|
+
export const formatTrackingActionableContext = (tracking: RepoTrackingState): string | null => {
|
|
29
|
+
const activeEntries = (tracking.in_progress_entries ?? [])
|
|
30
|
+
.map((entry) => `${entry.task_id ?? 'UNKNOWN'}@L${entry.line_number}`)
|
|
31
|
+
.join(', ');
|
|
32
|
+
if (!activeEntries) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const lastRunStatus = tracking.last_run_status ?? 'absent';
|
|
36
|
+
return `active_entries=${activeEntries} last_run_status=${lastRunStatus}`;
|
|
37
|
+
};
|
|
38
|
+
|
|
28
39
|
type TrackingDeclarationSource = {
|
|
29
40
|
sourceFile: string;
|
|
30
41
|
priority: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pumuki",
|
|
3
|
-
"version": "6.3.
|
|
3
|
+
"version": "6.3.113",
|
|
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": {
|