pumuki 6.3.167 → 6.3.169

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,18 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [6.3.169] - 2026-05-06
10
+
11
+ ### Fixed
12
+
13
+ - **Tracked evidence working-tree hygiene:** successful `pumuki-pre-commit` now restores tracked `.ai_evidence.json` from `HEAD` when the file was not staged at hook start, preventing pre-commit frameworks from failing with “files were modified by this hook” while still excluding evidence from code commits.
14
+
15
+ ## [6.3.168] - 2026-05-06
16
+
17
+ ### Fixed
18
+
19
+ - **Tracked evidence commit hygiene:** `pumuki-pre-commit` now respects tracked `.ai_evidence.json` when it was not staged by the developer before a successful code commit. Documentation-only commits still restore evidence drift, and `PUMUKI_PRE_COMMIT_ALWAYS_RESTAGE_TRACKED_EVIDENCE=1` preserves the previous forced restage behavior.
20
+
9
21
  ## [6.3.167] - 2026-05-06
10
22
 
11
23
  ### Fixed
@@ -77,6 +77,9 @@ const shouldSkipRestagingTrackedEvidenceForDocumentationOnlyScope = (params: {
77
77
  return paths.every(isDocumentationOnlyStagedPath);
78
78
  };
79
79
 
80
+ const hasStagedEvidencePath = (paths: ReadonlyArray<string>): boolean =>
81
+ paths.some((path) => path === '.ai_evidence.json' || path === '.AI_EVIDENCE.json');
82
+
80
83
  const PRE_COMMIT_EVIDENCE_MAX_AGE_SECONDS = 900;
81
84
  const PRE_PUSH_EVIDENCE_MAX_AGE_SECONDS = 1800;
82
85
  const HOOK_GATE_PROGRESS_REMINDER_MS = 2000;
@@ -520,6 +523,7 @@ const syncTrackedEvidenceAfterSuccessfulPreCommit = (params: {
520
523
  dependencies: StageRunnerDependencies;
521
524
  repoRoot: string;
522
525
  gateBlocked: boolean;
526
+ evidenceWasStagedAtStart: boolean;
523
527
  }): boolean => {
524
528
  const evidenceAbsolutePath = join(params.repoRoot, EVIDENCE_FILE_PATH);
525
529
  if (!existsSync(evidenceAbsolutePath)) {
@@ -543,6 +547,20 @@ const syncTrackedEvidenceAfterSuccessfulPreCommit = (params: {
543
547
  params.dependencies.restorePathFromHead(params.repoRoot, EVIDENCE_FILE_PATH);
544
548
  return false;
545
549
  }
550
+ if (
551
+ !params.gateBlocked &&
552
+ !params.evidenceWasStagedAtStart &&
553
+ !isTruthyEnvFlag(process.env.PUMUKI_PRE_COMMIT_ALWAYS_RESTAGE_TRACKED_EVIDENCE)
554
+ ) {
555
+ if (!params.dependencies.isQuietMode()) {
556
+ process.stderr.write(
557
+ `[pumuki][evidence-sync] tracked ${EVIDENCE_FILE_PATH} restored because it was not staged before PRE_COMMIT. ` +
558
+ `Force previous behavior: PUMUKI_PRE_COMMIT_ALWAYS_RESTAGE_TRACKED_EVIDENCE=1\n`
559
+ );
560
+ }
561
+ params.dependencies.restorePathFromHead(params.repoRoot, EVIDENCE_FILE_PATH);
562
+ return false;
563
+ }
546
564
  try {
547
565
  params.dependencies.stagePath(params.repoRoot, EVIDENCE_FILE_PATH);
548
566
  return false;
@@ -787,6 +805,7 @@ export async function runPreCommitStage(
787
805
  const activeDependencies = getDependencies(dependencies);
788
806
  const repoRoot = activeDependencies.resolveRepoRoot();
789
807
  const manifestSnapshot = captureManifestGuardSnapshot(repoRoot);
808
+ const initiallyStagedPaths = activeDependencies.listStagedIndexPaths(repoRoot);
790
809
  activeDependencies.ensureRuntimeArtifactsIgnored(repoRoot);
791
810
  if (
792
811
  enforceGitAtomicityGate({
@@ -820,6 +839,7 @@ export async function runPreCommitStage(
820
839
  dependencies: activeDependencies,
821
840
  repoRoot,
822
841
  gateBlocked: result.exitCode !== 0,
842
+ evidenceWasStagedAtStart: hasStagedEvidencePath(initiallyStagedPaths),
823
843
  })
824
844
  ) {
825
845
  return 1;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.167",
3
+ "version": "6.3.169",
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": {