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.
- package/integrations/gate/evaluateAiGate.ts +110 -1
- package/package.json +1 -1
- package/skills.lock.json +1 -1
|
@@ -1144,7 +1144,15 @@ const collectEvidenceViolations = (
|
|
|
1144
1144
|
}
|
|
1145
1145
|
|
|
1146
1146
|
if (result.evidence.ai_gate.status === 'BLOCKED') {
|
|
1147
|
-
|
|
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.
|
|
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": {
|