pumuki 6.3.216 → 6.3.217

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.
@@ -1144,7 +1144,15 @@ const collectEvidenceViolations = (
1144
1144
  }
1145
1145
 
1146
1146
  if (result.evidence.ai_gate.status === 'BLOCKED') {
1147
- violations.push(toErrorViolation('EVIDENCE_GATE_BLOCKED', 'Evidence AI gate status is BLOCKED.'));
1147
+ const gateBlockedMessage = 'Evidence AI gate status is BLOCKED.';
1148
+ violations.push(
1149
+ isAdvisoryDocumentationRenderSlice(repoRoot, ageSeconds, maxAgeSeconds)
1150
+ ? toWarnViolation(
1151
+ 'EVIDENCE_GATE_BLOCKED',
1152
+ `${gateBlockedMessage} Advisory because the current slice only contains documentation/render/tooling artifacts and evidence is fresh.`
1153
+ )
1154
+ : toErrorViolation('EVIDENCE_GATE_BLOCKED', gateBlockedMessage)
1155
+ );
1148
1156
  }
1149
1157
 
1150
1158
  if (stage === 'PRE_WRITE') {
@@ -1164,6 +1172,107 @@ const collectEvidenceViolations = (
1164
1172
  return { violations, ageSeconds };
1165
1173
  };
1166
1174
 
1175
+ const SUPPORTED_FUNCTIONAL_EXTENSIONS = new Set([
1176
+ '.swift',
1177
+ '.ts',
1178
+ '.tsx',
1179
+ '.js',
1180
+ '.jsx',
1181
+ '.kt',
1182
+ '.kts',
1183
+ ]);
1184
+
1185
+ const DOCUMENTATION_RENDER_TOOLING_EXTENSIONS = new Set([
1186
+ '.css',
1187
+ '.html',
1188
+ '.json',
1189
+ '.md',
1190
+ '.mdx',
1191
+ '.txt',
1192
+ ]);
1193
+
1194
+ const normalizeGitPath = (value: string): string => value.replace(/\\/g, '/').replace(/^"|"$/g, '');
1195
+
1196
+ const extractGitStatusPath = (line: string): string | null => {
1197
+ const payload = line.slice(3).trim();
1198
+ if (payload.length === 0) {
1199
+ return null;
1200
+ }
1201
+ const renameSeparator = ' -> ';
1202
+ if (payload.includes(renameSeparator)) {
1203
+ return normalizeGitPath(payload.slice(payload.lastIndexOf(renameSeparator) + renameSeparator.length));
1204
+ }
1205
+ return normalizeGitPath(payload);
1206
+ };
1207
+
1208
+ const collectGitStatusPaths = (repoRoot: string): readonly string[] => {
1209
+ if (!existsSync(resolve(repoRoot, '.git'))) {
1210
+ return [];
1211
+ }
1212
+ try {
1213
+ return execFileSync('git', ['status', '--porcelain', '--untracked-files=all'], {
1214
+ cwd: repoRoot,
1215
+ encoding: 'utf8',
1216
+ stdio: ['ignore', 'pipe', 'ignore'],
1217
+ })
1218
+ .split(/\r?\n/)
1219
+ .map(extractGitStatusPath)
1220
+ .filter((path): path is string => path !== null);
1221
+ } catch {
1222
+ return [];
1223
+ }
1224
+ };
1225
+
1226
+ const pathExtension = (path: string): string => {
1227
+ const basename = path.split('/').pop() ?? '';
1228
+ const dotIndex = basename.lastIndexOf('.');
1229
+ return dotIndex >= 0 ? basename.slice(dotIndex).toLowerCase() : '';
1230
+ };
1231
+
1232
+ const isSupportedFunctionalPath = (path: string): boolean =>
1233
+ SUPPORTED_FUNCTIONAL_EXTENSIONS.has(pathExtension(path));
1234
+
1235
+ const isDocumentationRenderToolingPath = (path: string): boolean => {
1236
+ const normalized = path.toLowerCase();
1237
+ if (normalized.startsWith('docs/') && DOCUMENTATION_RENDER_TOOLING_EXTENSIONS.has(pathExtension(normalized))) {
1238
+ return true;
1239
+ }
1240
+ if (normalized.endsWith('.md') || normalized.endsWith('.mdx')) {
1241
+ return true;
1242
+ }
1243
+ if (
1244
+ normalized.startsWith('stack-my-architecture-pumuki/dist/') ||
1245
+ normalized.startsWith('stack-my-architecture-hub/pumuki/')
1246
+ ) {
1247
+ return DOCUMENTATION_RENDER_TOOLING_EXTENSIONS.has(pathExtension(normalized));
1248
+ }
1249
+ if (normalized === 'stack-my-architecture-pumuki/scripts/build-html.py') {
1250
+ return true;
1251
+ }
1252
+ if (normalized === 'package.json' || normalized === 'package-lock.json') {
1253
+ return true;
1254
+ }
1255
+ return false;
1256
+ };
1257
+
1258
+ const isAdvisoryDocumentationRenderSlice = (
1259
+ repoRoot: string,
1260
+ ageSeconds: number,
1261
+ maxAgeSeconds: number
1262
+ ): boolean => {
1263
+ if (ageSeconds > maxAgeSeconds) {
1264
+ return false;
1265
+ }
1266
+ const paths = collectGitStatusPaths(repoRoot);
1267
+ if (paths.length === 0) {
1268
+ return false;
1269
+ }
1270
+ return (
1271
+ paths.every(isDocumentationRenderToolingPath) &&
1272
+ !paths.some(isSupportedFunctionalPath)
1273
+ );
1274
+ };
1275
+
1167
1276
  const toEvidenceSourceDescriptor = (
1168
1277
  result: EvidenceReadResult,
1169
1278
  repoRoot: string
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pumuki",
3
- "version": "6.3.216",
3
+ "version": "6.3.217",
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": {
package/skills.lock.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": "1.0",
3
3
  "compilerVersion": "1.0.0",
4
- "generatedAt": "2026-05-13T13:25:12.010Z",
4
+ "generatedAt": "2026-05-13T13:30:09.135Z",
5
5
  "bundles": [
6
6
  {
7
7
  "name": "android-guidelines",