critical-gate 2.6.0 → 2.7.0

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.
@@ -1,4 +1,4 @@
1
1
  import { ExitCode, type CliIo } from "./types.js";
2
- export declare const CLI_VERSION = "2.6.0";
2
+ export declare const CLI_VERSION = "2.7.0";
3
3
  export declare function main(argv?: string[], io?: CliIo): ExitCode;
4
4
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository-intelligence-detector.d.ts","sourceRoot":"","sources":["../../src/detectors/repository-intelligence-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,8BAA8B,EAAE,QAoB5C,CAAC"}
1
+ {"version":3,"file":"repository-intelligence-detector.d.ts","sourceRoot":"","sources":["../../src/detectors/repository-intelligence-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,8BAA8B,EAAE,QAwB5C,CAAC"}
@@ -1,6 +1,6 @@
1
1
  export const repositoryIntelligenceDetector = {
2
2
  name: "repository-intelligence",
3
- run: ({ diff, context }) => {
3
+ run: ({ task, diff, context }) => {
4
4
  const history = context?.knowledge?.getHistoryIndex();
5
5
  const profile = context?.repositoryProfile ?? history?.profile;
6
6
  if (profile === undefined || profile.commitCount < profile.minConfidenceCommitCount) {
@@ -11,10 +11,29 @@ export const repositoryIntelligenceDetector = {
11
11
  return [];
12
12
  }
13
13
  return diff.files
14
- .filter((file) => isHistoricallyUnrelated(file, changedPaths, profile))
14
+ .filter((file) => isHistoricallyUnrelated(file, changedPaths, profile) &&
15
+ !isExplicitFocusedUiPresentationChange(file, diff.files, task.text))
15
16
  .map((file) => toFinding(file, changedPaths, profile, history));
16
17
  }
17
18
  };
19
+ const focusedUiPresentationTaskPattern = /\b(?:style|styles|styling|visual|redesign|polish|spacing|sizing|grid|layout|align|masonry|card|cards|cta|arrow|icon|indicator|vinyl|animation|animated|mobile|css|scss|typography|display|view|mode)\b/i;
20
+ const uiPresentationPathPattern = /(^|\/)(components?|views?|pages?|screens?|styles?|theme|themes|scripts?)\/|\.astro$|\.(?:css|scss|sass|less)$/i;
21
+ const visualAssetPathPattern = /(^|\/)(public|assets?)\/.+\.(?:png|jpe?g|webp|gif|svg|avif)$/i;
22
+ const genericPathTokens = new Set([
23
+ "component",
24
+ "components",
25
+ "view",
26
+ "views",
27
+ "page",
28
+ "pages",
29
+ "screen",
30
+ "screens",
31
+ "style",
32
+ "styles",
33
+ "script",
34
+ "scripts",
35
+ "src"
36
+ ]);
18
37
  function isHistoricallyUnrelated(file, changedPaths, profile) {
19
38
  const coChange = profile.coChanges.find((entry) => entry.path === file.path);
20
39
  if (coChange === undefined || coChange.count === 0) {
@@ -23,6 +42,42 @@ function isHistoricallyUnrelated(file, changedPaths, profile) {
23
42
  const relatedChangedPaths = coChange.relatedPaths.filter((related) => changedPaths.includes(related.path));
24
43
  return relatedChangedPaths.length === 0;
25
44
  }
45
+ function isExplicitFocusedUiPresentationChange(file, files, taskText) {
46
+ if (files.length === 0 ||
47
+ files.length > 6 ||
48
+ !focusedUiPresentationTaskPattern.test(taskText) ||
49
+ !files.every(isUiPresentationOrAssetChange)) {
50
+ return false;
51
+ }
52
+ return getPathIntentTokens(file.path).some((token) => taskMentionsToken(taskText, token));
53
+ }
54
+ function isUiPresentationOrAssetChange(file) {
55
+ return (file.status !== "deleted" &&
56
+ (file.role === "source" || file.role === "unknown") &&
57
+ (uiPresentationPathPattern.test(file.path) || visualAssetPathPattern.test(file.path)));
58
+ }
59
+ function getPathIntentTokens(path) {
60
+ const fileName = path
61
+ .split("/")
62
+ .at(-1)
63
+ ?.replace(/\.[^.]+$/u, "");
64
+ if (fileName === undefined) {
65
+ return [];
66
+ }
67
+ const tokens = fileName
68
+ .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
69
+ .toLowerCase()
70
+ .split(/[^a-z0-9]+/u)
71
+ .filter((token) => token.length >= 3)
72
+ .filter((token) => !genericPathTokens.has(token));
73
+ return [...new Set(tokens)];
74
+ }
75
+ function taskMentionsToken(taskText, token) {
76
+ return new RegExp(`(^|[^a-z0-9])${escapeRegExp(token)}([^a-z0-9]|$)`, "i").test(taskText);
77
+ }
78
+ function escapeRegExp(value) {
79
+ return value.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
80
+ }
26
81
  function toFinding(file, changedPaths, profile, history) {
27
82
  const coChange = profile.coChanges.find((entry) => entry.path === file.path);
28
83
  const topRelated = coChange?.relatedPaths.slice(0, 3).map((related) => related.path) ?? [];
@@ -1 +1 @@
1
- {"version":3,"file":"repository-intelligence-detector.js","sourceRoot":"","sources":["../../src/detectors/repository-intelligence-detector.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,8BAA8B,GAAa;IACtD,IAAI,EAAE,yBAAyB;IAC/B,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACzB,MAAM,OAAO,GAAG,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC;QACtD,MAAM,OAAO,GAAG,OAAO,EAAE,iBAAiB,IAAI,OAAO,EAAE,OAAO,CAAC;QAE/D,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,wBAAwB,EAAE,CAAC;YACpF,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEzD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,IAAI,CAAC,KAAK;aACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;aACtE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;CACF,CAAC;AAEF,SAAS,uBAAuB,CAC9B,IAAc,EACd,YAAsB,EACtB,OAA0B;IAE1B,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7E,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,mBAAmB,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACnE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CACpC,CAAC;IAEF,OAAO,mBAAmB,CAAC,MAAM,KAAK,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,SAAS,CAChB,IAAc,EACd,YAAsB,EACtB,OAA0B,EAC1B,OAAiC;IAEjC,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,UAAU,GAAG,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3F,MAAM,cAAc,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,IAAI,EAAE,CAAC,CAAC;IAE1F,OAAO;QACL,EAAE,EAAE,2BAA2B,IAAI,CAAC,IAAI,EAAE;QAC1C,QAAQ,EAAE,yBAAyB;QACnC,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,mCAAmC;QAC1C,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,8EAA8E;QACnG,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,wCAAwC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAC3E,IAAI,EAAE;oBACJ,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,eAAe,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;oBACrC,wBAAwB,EAAE,UAAU;oBACpC,cAAc,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBAC/C,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,UAAU,EAAE,OAAO,CAAC,UAAU;qBAC/B,CAAC,CAAC;iBACJ;aACF;SACF;QACD,MAAM,EACJ,4GAA4G;QAC9G,IAAI,EAAE,CAAC,OAAO,CAAC;KAChB,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAY,EACZ,cAAqC;IAErC,OAAO,cAAc;SAClB,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,KAAK,IAAI,CAAC;SAChF,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"repository-intelligence-detector.js","sourceRoot":"","sources":["../../src/detectors/repository-intelligence-detector.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const CRITICAL_GATE_VERSION = "2.6.0";
1
+ export declare const CRITICAL_GATE_VERSION = "2.7.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const CRITICAL_GATE_VERSION = "2.6.0";
1
+ export const CRITICAL_GATE_VERSION = "2.7.0";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "critical-gate",
3
- "version": "2.6.0",
3
+ "version": "2.7.0",
4
4
  "description": "Repository-aware diff integrity gate for AI-generated code changes.",
5
5
  "type": "module",
6
6
  "repository": {