@agentvibes/guardrails 0.1.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.
- package/README.md +239 -0
- package/candidates/README.md +30 -0
- package/candidates/r10-as-cast.yml +24 -0
- package/candidates/r1d-scattered-numeric-const-in-component.yml +13 -0
- package/candidates/r2-helper-fn-in-tsx.yml +22 -0
- package/candidates/r3-hooks-outside-layout.yml +21 -0
- package/candidates/r6-jsx-comment-smell.yml +14 -0
- package/candidates/r7-raw-hsl-outside-tokens.yml +17 -0
- package/candidates/r8-inline-style-prop.yml +13 -0
- package/candidates/r9-optional-store-arg.yml +24 -0
- package/configs/biome.json +96 -0
- package/configs/tsconfig.base.json +21 -0
- package/dist/astGrep.d.ts +16 -0
- package/dist/astGrep.js +48 -0
- package/dist/astGrep.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/deploy.d.ts +1 -0
- package/dist/deploy.js +34 -0
- package/dist/deploy.js.map +1 -0
- package/dist/doctor.d.ts +6 -0
- package/dist/doctor.js +102 -0
- package/dist/doctor.js.map +1 -0
- package/dist/fileWalk.d.ts +2 -0
- package/dist/fileWalk.js +45 -0
- package/dist/fileWalk.js.map +1 -0
- package/dist/findings.d.ts +12 -0
- package/dist/findings.js +8 -0
- package/dist/findings.js.map +1 -0
- package/dist/gateRed.d.ts +1 -0
- package/dist/gateRed.js +93 -0
- package/dist/gateRed.js.map +1 -0
- package/dist/gitDiff.d.ts +18 -0
- package/dist/gitDiff.js +90 -0
- package/dist/gitDiff.js.map +1 -0
- package/dist/hookPostedit.d.ts +1 -0
- package/dist/hookPostedit.js +117 -0
- package/dist/hookPostedit.js.map +1 -0
- package/dist/hookStop.d.ts +1 -0
- package/dist/hookStop.js +56 -0
- package/dist/hookStop.js.map +1 -0
- package/dist/hookStopTest.d.ts +1 -0
- package/dist/hookStopTest.js +71 -0
- package/dist/hookStopTest.js.map +1 -0
- package/dist/init.d.ts +24 -0
- package/dist/init.js +172 -0
- package/dist/init.js.map +1 -0
- package/dist/initTest.d.ts +1 -0
- package/dist/initTest.js +88 -0
- package/dist/initTest.js.map +1 -0
- package/dist/iterate.d.ts +9 -0
- package/dist/iterate.js +79 -0
- package/dist/iterate.js.map +1 -0
- package/dist/iterateTest.d.ts +1 -0
- package/dist/iterateTest.js +91 -0
- package/dist/iterateTest.js.map +1 -0
- package/dist/leakPatterns.d.ts +5 -0
- package/dist/leakPatterns.js +22 -0
- package/dist/leakPatterns.js.map +1 -0
- package/dist/leaks.d.ts +8 -0
- package/dist/leaks.js +211 -0
- package/dist/leaks.js.map +1 -0
- package/dist/leaksRed.d.ts +1 -0
- package/dist/leaksRed.js +62 -0
- package/dist/leaksRed.js.map +1 -0
- package/dist/metrics.d.ts +10 -0
- package/dist/metrics.js +113 -0
- package/dist/metrics.js.map +1 -0
- package/dist/metricsAggregate.d.ts +5 -0
- package/dist/metricsAggregate.js +78 -0
- package/dist/metricsAggregate.js.map +1 -0
- package/dist/metricsBaseline.d.ts +21 -0
- package/dist/metricsBaseline.js +88 -0
- package/dist/metricsBaseline.js.map +1 -0
- package/dist/metricsCollect.d.ts +8 -0
- package/dist/metricsCollect.js +295 -0
- package/dist/metricsCollect.js.map +1 -0
- package/dist/metricsCycle.d.ts +1 -0
- package/dist/metricsCycle.js +79 -0
- package/dist/metricsCycle.js.map +1 -0
- package/dist/metricsTypes.d.ts +102 -0
- package/dist/metricsTypes.js +2 -0
- package/dist/metricsTypes.js.map +1 -0
- package/dist/packagePaths.d.ts +7 -0
- package/dist/packagePaths.js +11 -0
- package/dist/packagePaths.js.map +1 -0
- package/dist/pluginApi.d.ts +24 -0
- package/dist/pluginApi.js +12 -0
- package/dist/pluginApi.js.map +1 -0
- package/dist/pluginResolve.d.ts +6 -0
- package/dist/pluginResolve.js +48 -0
- package/dist/pluginResolve.js.map +1 -0
- package/dist/screenScope.d.ts +21 -0
- package/dist/screenScope.js +81 -0
- package/dist/screenScope.js.map +1 -0
- package/dist/screenScopeTest.d.ts +1 -0
- package/dist/screenScopeTest.js +116 -0
- package/dist/screenScopeTest.js.map +1 -0
- package/dist/severity.d.ts +9 -0
- package/dist/severity.js +62 -0
- package/dist/severity.js.map +1 -0
- package/dist/severityTest.d.ts +1 -0
- package/dist/severityTest.js +63 -0
- package/dist/severityTest.js.map +1 -0
- package/dist/sourceLines.d.ts +9 -0
- package/dist/sourceLines.js +52 -0
- package/dist/sourceLines.js.map +1 -0
- package/dist/structure.d.ts +2 -0
- package/dist/structure.js +98 -0
- package/dist/structure.js.map +1 -0
- package/dist/testRules.d.ts +1 -0
- package/dist/testRules.js +285 -0
- package/dist/testRules.js.map +1 -0
- package/dist/textGrep.d.ts +2 -0
- package/dist/textGrep.js +52 -0
- package/dist/textGrep.js.map +1 -0
- package/dist/tomlTable.d.ts +2 -0
- package/dist/tomlTable.js +26 -0
- package/dist/tomlTable.js.map +1 -0
- package/dist/toolResolve.d.ts +18 -0
- package/dist/toolResolve.js +50 -0
- package/dist/toolResolve.js.map +1 -0
- package/dist/verify.d.ts +3 -0
- package/dist/verify.js +49 -0
- package/dist/verify.js.map +1 -0
- package/dist/verifyDiff.d.ts +18 -0
- package/dist/verifyDiff.js +126 -0
- package/dist/verifyDiff.js.map +1 -0
- package/dist/workspaces.d.ts +6 -0
- package/dist/workspaces.js +84 -0
- package/dist/workspaces.js.map +1 -0
- package/mise.toml +9 -0
- package/package.json +62 -0
- package/rules/__fixtures__/as-any-escape/bad.ts +8 -0
- package/rules/__fixtures__/as-any-escape/good.ts +14 -0
- package/rules/__fixtures__/catch-empty/bad.ts +7 -0
- package/rules/__fixtures__/catch-empty/good.ts +14 -0
- package/rules/__fixtures__/direct-store-import/bad.tsx +23 -0
- package/rules/__fixtures__/direct-store-import/good.tsx +34 -0
- package/rules/__fixtures__/direct-store-import/showcase/ignored.tsx +9 -0
- package/rules/__fixtures__/discriminator-ternary/bad.tsx +10 -0
- package/rules/__fixtures__/discriminator-ternary/good.tsx +23 -0
- package/rules/__fixtures__/hardcoded-url-in-component/components/bad.tsx +8 -0
- package/rules/__fixtures__/hardcoded-url-in-component/components/good.tsx +14 -0
- package/rules/__fixtures__/inline-map-row/bad.tsx +72 -0
- package/rules/__fixtures__/inline-map-row/good.tsx +51 -0
- package/rules/__fixtures__/instanceof-map-set/bad.ts +7 -0
- package/rules/__fixtures__/instanceof-map-set/good.ts +8 -0
- package/rules/__fixtures__/literal-union-in-component/components/bad.ts +8 -0
- package/rules/__fixtures__/literal-union-in-component/components/good.ts +23 -0
- package/rules/__fixtures__/missing-observer/bad.tsx +66 -0
- package/rules/__fixtures__/missing-observer/good.tsx +69 -0
- package/rules/__fixtures__/no-local-kit-clone/bad.ts +30 -0
- package/rules/__fixtures__/no-local-kit-clone/bad.tsx +30 -0
- package/rules/__fixtures__/no-local-kit-clone/good.ts +31 -0
- package/rules/__fixtures__/no-local-kit-clone/good.tsx +31 -0
- package/rules/__fixtures__/non-exhaustive-match/bad.ts +8 -0
- package/rules/__fixtures__/non-exhaustive-match/good.ts +14 -0
- package/rules/__fixtures__/page-store-bare-usememo/bad.ts +15 -0
- package/rules/__fixtures__/page-store-bare-usememo/bad.tsx +13 -0
- package/rules/__fixtures__/page-store-bare-usememo/good.ts +17 -0
- package/rules/__fixtures__/page-store-bare-usememo/good.tsx +14 -0
- package/rules/__fixtures__/screen-file-styling/bad.screen.tsx +10 -0
- package/rules/__fixtures__/screen-file-styling/good.screen.tsx +8 -0
- package/rules/__fixtures__/state-loading-boolean-shape/bad.ts +36 -0
- package/rules/__fixtures__/state-loading-boolean-shape/bad.tsx +36 -0
- package/rules/__fixtures__/state-loading-boolean-shape/good.ts +44 -0
- package/rules/__fixtures__/state-loading-boolean-shape/good.tsx +44 -0
- package/rules/__fixtures__/store-async-method/bad.ts +37 -0
- package/rules/__fixtures__/store-async-method/bad.tsx +37 -0
- package/rules/__fixtures__/store-async-method/good.ts +73 -0
- package/rules/__fixtures__/store-async-method/good.tsx +73 -0
- package/rules/__fixtures__/store-context-provider/bad.ts +16 -0
- package/rules/__fixtures__/store-context-provider/bad.tsx +24 -0
- package/rules/__fixtures__/store-context-provider/good.ts +13 -0
- package/rules/__fixtures__/store-context-provider/good.tsx +11 -0
- package/rules/__fixtures__/store-delegation-getter/bad.ts +30 -0
- package/rules/__fixtures__/store-delegation-getter/bad.tsx +30 -0
- package/rules/__fixtures__/store-delegation-getter/good.ts +65 -0
- package/rules/__fixtures__/store-delegation-getter/good.tsx +65 -0
- package/rules/__fixtures__/store-new-map/bad.ts +22 -0
- package/rules/__fixtures__/store-new-map/bad.tsx +22 -0
- package/rules/__fixtures__/store-new-map/good.ts +41 -0
- package/rules/__fixtures__/store-new-map/good.tsx +41 -0
- package/rules/__fixtures__/store-no-runinaction/bad.ts +67 -0
- package/rules/__fixtures__/store-no-runinaction/bad.tsx +67 -0
- package/rules/__fixtures__/store-no-runinaction/good.ts +39 -0
- package/rules/__fixtures__/store-no-runinaction/good.tsx +39 -0
- package/rules/__fixtures__/store-no-setinterval-poll/bad.ts +19 -0
- package/rules/__fixtures__/store-no-setinterval-poll/bad.tsx +19 -0
- package/rules/__fixtures__/store-no-setinterval-poll/good.ts +29 -0
- package/rules/__fixtures__/store-no-setinterval-poll/good.tsx +29 -0
- package/rules/__fixtures__/ts-pattern-dangling-match/bad.ts +20 -0
- package/rules/__fixtures__/ts-pattern-dangling-match/good.ts +35 -0
- package/rules/__fixtures__/ui-imports-app-store/src/ui/bad.tsx +13 -0
- package/rules/__fixtures__/ui-imports-app-store/src/ui/good.tsx +23 -0
- package/rules/__fixtures__/view-file-logic/bad.view.tsx +16 -0
- package/rules/__fixtures__/view-file-logic/good.view.tsx +7 -0
- package/rules/__fixtures__/view-imports-store/bad.view.tsx +13 -0
- package/rules/__fixtures__/view-imports-store/good.view.tsx +23 -0
- package/rules/__fixtures__/zod-optional-nullable/bad.ts +10 -0
- package/rules/__fixtures__/zod-optional-nullable/bad.tsx +17 -0
- package/rules/__fixtures__/zod-optional-nullable/good.ts +16 -0
- package/rules/__fixtures__/zod-optional-nullable/good.tsx +20 -0
- package/rules/as-any-escape-tsx.yml +53 -0
- package/rules/as-any-escape.yml +29 -0
- package/rules/catch-empty-tsx.yml +55 -0
- package/rules/catch-empty.yml +31 -0
- package/rules/classname-not-composed.yml +28 -0
- package/rules/classname-visual-identity.yml +34 -0
- package/rules/demo-mode-by-default-ts.yml +76 -0
- package/rules/demo-mode-by-default.yml +54 -0
- package/rules/direct-store-import.yml +118 -0
- package/rules/discriminator-ternary.yml +70 -0
- package/rules/hardcoded-url-in-component.yml +44 -0
- package/rules/inline-map-row.yml +107 -0
- package/rules/instanceof-map-set-tsx.yml +46 -0
- package/rules/instanceof-map-set.yml +22 -0
- package/rules/json-roundtrip.yml +9 -0
- package/rules/jsx-cond-and.yml +16 -0
- package/rules/jsx-ternary.yml +35 -0
- package/rules/kind-if-without-match.yml +13 -0
- package/rules/literal-union-in-component.yml +71 -0
- package/rules/match-bool-to-null.yml +15 -0
- package/rules/missing-observer.yml +189 -0
- package/rules/mobx-effect-observable-dep.yml +23 -0
- package/rules/mobx-effect-store-write.yml +21 -0
- package/rules/mobx-usestate-from-store.yml +20 -0
- package/rules/no-local-kit-clone-tsx.yml +104 -0
- package/rules/no-local-kit-clone.yml +93 -0
- package/rules/non-exhaustive-match.yml +34 -0
- package/rules/page-store-bare-usememo-tsx.yml +47 -0
- package/rules/page-store-bare-usememo.yml +43 -0
- package/rules/screen-file-styling.yml +29 -0
- package/rules/silent-default-return.yml +17 -0
- package/rules/state-loading-boolean-shape-tsx.yml +102 -0
- package/rules/state-loading-boolean-shape.yml +91 -0
- package/rules/store-async-method-tsx.yml +108 -0
- package/rules/store-async-method.yml +98 -0
- package/rules/store-context-provider-tsx.yml +68 -0
- package/rules/store-context-provider.yml +78 -0
- package/rules/store-delegation-getter-tsx.yml +104 -0
- package/rules/store-delegation-getter.yml +93 -0
- package/rules/store-new-map-tsx.yml +84 -0
- package/rules/store-new-map.yml +73 -0
- package/rules/store-no-runinaction-tsx.yml +71 -0
- package/rules/store-no-runinaction.yml +60 -0
- package/rules/store-no-setinterval-poll-tsx.yml +62 -0
- package/rules/store-no-setinterval-poll.yml +51 -0
- package/rules/ts-pattern-dangling-match-tsx.yml +41 -0
- package/rules/ts-pattern-dangling-match.yml +63 -0
- package/rules/ui-imports-app-store.yml +49 -0
- package/rules/view-file-logic.yml +53 -0
- package/rules/view-imports-store.yml +64 -0
- package/rules/zod-optional-nullable-tsx.yml +56 -0
- package/rules/zod-optional-nullable.yml +29 -0
- package/sgconfig.yml +8 -0
- package/structure/rules/component-decl.yml +48 -0
- package/structure/sgconfig.yml +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsCollect.js","sourceRoot":"","sources":["../src/metricsCollect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ7C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEnE,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM,aAAa,GAAG,iEAAiE,CAAC;AAExF,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,CAAU,CAAC;AAE1F,6EAA6E;AAC7E,8EAA8E;AAC9E,2CAA2C;AAC3C,MAAM,aAAa,GACjB,oMAAoM,CAAC;AAEvM;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,KAAe;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE;QACxD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IACH,wEAAwE;IACxE,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACrE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AASD,SAAS,KAAK,CAAC,IAAY,EAAE,IAAY;IACvC,MAAM,IAAI,GACR,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;IACxF,OAAO,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7E,CAAC;AAED,SAAS,MAAM,CAAC,EAAiB,EAAE,IAAa;IAC9C,OAAO,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,UAAU,CAAC,IAAuB;IACzC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAClE,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IACrF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,iFAAiF;AACjF,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAChG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,KAAK,KAAK,SAAS,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,YAAY,CAAC,EAAuC;IAC3D,MAAM,KAAK,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AACpC,CAAC;AAQD,SAAS,aAAa,CAAC,IAAa;IAClC,MAAM,KAAK,GAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/F,MAAM,SAAS,GAAoB;QACjC,KAAK,EAAE,CAAC;QACR,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,CAAC;QACZ,YAAY,EAAE,CAAC;QACf,QAAQ,EAAE,CAAC;KACZ,CAAC;IACF,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,QAAgB,EAAE,SAAkB,EAAQ,EAAE;QAC1E,IAAI,KAAK,GAAG,QAAQ,CAAC;QACrB,IAAI,MAAM,GAAG,SAAS,CAAC;QACvB,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxF,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,GAAG,WAAW;gBAAE,WAAW,GAAG,KAAK,CAAC;YAC7C,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC;aAAM,IAAI,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;QAED,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;oBAC3B,IAAI,IAAI,KAAK,CAAC;wBAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;gBACD,IAAI,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;oBAAE,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;gBAC/E,IAAI,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC5E,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC;gBAC5B,CAAC;gBACD,IAAI,IAAI,KAAK,WAAW,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC3E,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,MAAM;YAAE,SAAS,CAAC,YAAY,IAAI,CAAC,CAAC;QAC5E,IACE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,uBAAuB;YACjE,MAAM,EACN,CAAC;YACD,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC;IACF,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACtB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAC3C,CAAC;AAED,wFAAwF;AACxF,SAAS,WAAW,CAAC,EAAiB,EAAE,IAAY,EAAE,IAAY;IAChE,IAAI,MAA2B,CAAC;IAChC,IAAI,MAA2B,CAAC;IAChC,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAE,QAA4B,EAAQ,EAAE;QACrE,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO;QAC9B,MAAM,KAAK,IAAI,CAAC;QAChB,IAAI,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM,KAAK,IAAI,CAAC;IACjD,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;gBAClD,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;oBAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,IAAI,MAAM,CAAC;AAC1B,CAAC;AAED,SAAS,uBAAuB,CAAC,EAAiB;IAChD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,IAAI,MAAM,KAAK,SAAS;YAAE,SAAS;QACnC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,KAAK,IAAI,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAS;QACrC,IAAI,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;;YAC1C,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,EAAiB;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACvE,MAAM,GAAG,GAAG,EAAE,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QACjE,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4EAA4E;AAC5E,kEAAkE;AAClE,4EAA4E;AAC5E,SAAS,mBAAmB,CAAC,EAAiB,EAAE,KAAmB;IACjE,MAAM,KAAK,GAAG,CAAC,IAAa,EAAQ,EAAE;QACpC,IAAI,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAC9B,yEAAyE;YACzE,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpF,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,mEAAmE;QACnE,oEAAoE;QACpE,wEAAwE;QACxE,uEAAuE;QACvE,qBAAqB;QACrB,IACE,CAAC,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;YAChE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAClC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,cAAc;gBAC/C,CAAC,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC;oBAC7B,IAAI,CAAC,IAAI,KAAK,SAAS;oBACvB,IAAI,CAAC,WAAW,KAAK,SAAS;oBAC9B,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;wBAClD,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,EAC7D,CAAC;YACD,KAAK,CAAC,oBAAoB,IAAI,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,KAAK,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAiB;IAC9C,MAAM,QAAQ,GAAG,cAAc,CAC7B,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACrF,CAAC;IAEF,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,MAAM,CACjD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,gBAAgB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CACpE,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwB,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACb,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,6EAA6E;IAC7E,yEAAyE;IACzE,0EAA0E;IAC1E,oCAAoC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,MAAM,SAAS,GAAG,CAAC,GAAG,GAAa,EAAU,EAAE,CAC7C,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,iBAAiB,GAAG,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAiB;QAC1B,gBAAgB,EAAE,SAAS,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;QAC/E,YAAY,EAAE,SAAS,CAAC,oBAAoB,EAAE,wBAAwB,CAAC;QACvE,aAAa,EAAE,SAAS,CAAC,eAAe,EAAE,mBAAmB,CAAC;QAC9D,cAAc,EAAE,CAAC;QACjB,oBAAoB,EAAE,CAAC;KACxB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,KAAK,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAE,QAAQ,IAAI,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,mBAAmB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAE/B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;YACvC,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAS;YACjC,MAAM,MAAM,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAClF,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC/B,cAAc,IAAI,KAAK,CAAC;YACxB,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YAChE,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,YAAY,EAAE,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;gBAC1F,KAAK;gBACL,UAAU,EAAE,KAAK;gBACjB,eAAe,EAAE,iBAAiB,CAAC,MAAM,CAAC;gBAC1C,WAAW;gBACX,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QAED,MAAM,mBAAmB,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC;YACT,IAAI;YACJ,QAAQ;YACR,iBAAiB,EAAE,SAAS,CAAC,MAAM;YACnC,mBAAmB;YACnB,WAAW,EAAE,mBAAmB,GAAG,cAAc;SAClD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { packageRoot } from "./packagePaths.js";
|
|
6
|
+
// Baseline-cycle autotest: init baseline → worsen the code → --check goes RED →
|
|
7
|
+
// improve back → --check green → tighten baseline → worsen again → RED again.
|
|
8
|
+
// This is the metrics twin of gateRed.ts: a ratchet that has never been seen
|
|
9
|
+
// red proves nothing.
|
|
10
|
+
const GOOD_COMPONENT = `export const Row = ({ id, name }: { id: string; name: string }) => {
|
|
11
|
+
return <li>{name}</li>;
|
|
12
|
+
};
|
|
13
|
+
`;
|
|
14
|
+
// Worse on two GATED axes: useStateDensity (a useState appears) and
|
|
15
|
+
// p90ComponentLoc (a second, much longer component raises the p90).
|
|
16
|
+
const LONG_BODY = Array.from({ length: 95 }, (_, i) => ` const v${i} = ${i};`).join("\n");
|
|
17
|
+
const BAD_COMPONENT = `import { useState } from "react";
|
|
18
|
+
export const Wide = () => {
|
|
19
|
+
const [n, setN] = useState(0);
|
|
20
|
+
${LONG_BODY}
|
|
21
|
+
return <button onClick={() => setN(n + 1)}>{n}</button>;
|
|
22
|
+
};
|
|
23
|
+
`;
|
|
24
|
+
function metrics(cwd, args) {
|
|
25
|
+
const res = spawnSync("node", [join(packageRoot, "dist", "cli.js"), "metrics", ...args], {
|
|
26
|
+
cwd,
|
|
27
|
+
encoding: "utf8",
|
|
28
|
+
});
|
|
29
|
+
if (res.error)
|
|
30
|
+
throw res.error;
|
|
31
|
+
return { status: res.status ?? -1, out: `${res.stdout}${res.stderr}` };
|
|
32
|
+
}
|
|
33
|
+
function expectStatus(step, got, want) {
|
|
34
|
+
if (got.status !== want) {
|
|
35
|
+
console.error(`FAIL metrics-cycle: ${step} exited ${got.status}, expected ${want}\n${got.out}`);
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
console.log(` ok metrics-cycle: ${step} → exit ${want}`);
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
function main() {
|
|
42
|
+
const dir = mkdtempSync(join(tmpdir(), "guardrails-metrics-cycle-"));
|
|
43
|
+
try {
|
|
44
|
+
mkdirSync(join(dir, "src"));
|
|
45
|
+
const rowFile = join(dir, "src", "Row.tsx");
|
|
46
|
+
const wideFile = join(dir, "src", "Wide.tsx");
|
|
47
|
+
writeFileSync(rowFile, GOOD_COMPONENT);
|
|
48
|
+
if (!expectStatus("--check with no baseline", metrics(dir, ["--check"]), 2))
|
|
49
|
+
return 1;
|
|
50
|
+
if (!expectStatus("--update-baseline (create)", metrics(dir, ["--update-baseline"]), 0))
|
|
51
|
+
return 1;
|
|
52
|
+
if (!expectStatus("--check on unchanged code", metrics(dir, ["--check"]), 0))
|
|
53
|
+
return 1;
|
|
54
|
+
writeFileSync(wideFile, BAD_COMPONENT);
|
|
55
|
+
if (!expectStatus("--check after worsening", metrics(dir, ["--check"]), 1))
|
|
56
|
+
return 1;
|
|
57
|
+
if (!expectStatus("--update-baseline while worse (must not loosen)", metrics(dir, ["--update-baseline"]), 0)) {
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
if (!expectStatus("--check still red (baseline held)", metrics(dir, ["--check"]), 1))
|
|
61
|
+
return 1;
|
|
62
|
+
rmSync(wideFile);
|
|
63
|
+
if (!expectStatus("--check after improving back", metrics(dir, ["--check"]), 0))
|
|
64
|
+
return 1;
|
|
65
|
+
if (!expectStatus("--update-baseline --force (tighten)", metrics(dir, ["--update-baseline", "--force"]), 0)) {
|
|
66
|
+
return 1;
|
|
67
|
+
}
|
|
68
|
+
writeFileSync(wideFile, BAD_COMPONENT);
|
|
69
|
+
if (!expectStatus("--check after worsening again", metrics(dir, ["--check"]), 1))
|
|
70
|
+
return 1;
|
|
71
|
+
console.log("metrics baseline cycle passed");
|
|
72
|
+
return 0;
|
|
73
|
+
}
|
|
74
|
+
finally {
|
|
75
|
+
rmSync(dir, { recursive: true, force: true });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
process.exit(main());
|
|
79
|
+
//# sourceMappingURL=metricsCycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsCycle.js","sourceRoot":"","sources":["../src/metricsCycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export interface HookCounts {
|
|
2
|
+
useState: number;
|
|
3
|
+
useEffect: number;
|
|
4
|
+
useMemo: number;
|
|
5
|
+
useCallback: number;
|
|
6
|
+
useRef: number;
|
|
7
|
+
}
|
|
8
|
+
export interface BranchingCounts {
|
|
9
|
+
match: number;
|
|
10
|
+
exhaustive: number;
|
|
11
|
+
otherwise: number;
|
|
12
|
+
ternaryInJsx: number;
|
|
13
|
+
andInJsx: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ComponentMetrics {
|
|
16
|
+
file: string;
|
|
17
|
+
name: string;
|
|
18
|
+
line: number;
|
|
19
|
+
/** span lines minus blank and comment-only lines — "does it fit on a screen" */
|
|
20
|
+
componentLoc: number;
|
|
21
|
+
hooks: HookCounts;
|
|
22
|
+
/** properties in the destructured first parameter; 0 when not destructured */
|
|
23
|
+
propsCount: number;
|
|
24
|
+
observerWrapped: boolean;
|
|
25
|
+
jsxMaxDepth: number;
|
|
26
|
+
branching: BranchingCounts;
|
|
27
|
+
}
|
|
28
|
+
export interface FileMetrics {
|
|
29
|
+
file: string;
|
|
30
|
+
/** lines minus imports, blanks, comments */
|
|
31
|
+
fileSloc: number;
|
|
32
|
+
componentsPerFile: number;
|
|
33
|
+
importedIdentifiers: number;
|
|
34
|
+
/**
|
|
35
|
+
* context-cost = imported identifiers (value + type) + props of the file's
|
|
36
|
+
* components — how many foreign concepts a reader must hold to edit the file.
|
|
37
|
+
*/
|
|
38
|
+
contextCost: number;
|
|
39
|
+
}
|
|
40
|
+
export interface StoreMetrics {
|
|
41
|
+
/** canon rule store-no-runinaction(+tsx): runInAction in make(Auto)Observable classes */
|
|
42
|
+
runInActionCount: number;
|
|
43
|
+
/** canon rule store-async-method(+tsx): async store methods that should be flow() */
|
|
44
|
+
asyncInStore: number;
|
|
45
|
+
/** canon rule store-new-map(+tsx): plain-Map store fields that should be observable.map */
|
|
46
|
+
newMapInStore: number;
|
|
47
|
+
/** reaction( + autorun( call sites — the ~3-per-app budget; direct AST count (no rule yet) */
|
|
48
|
+
reactionsTotal: number;
|
|
49
|
+
/**
|
|
50
|
+
* Boolean-shaped async-progress DECLARATIONS (`loading: boolean`,
|
|
51
|
+
* `uploading = false`) — direct AST count, intentionally NOT the
|
|
52
|
+
* state-loading-boolean-shape rule: the rule fires only on type-level shapes
|
|
53
|
+
* with a second outcome/payload field, while this metric also counts the
|
|
54
|
+
* lone class-field flags that are Resource<T>'s migration target.
|
|
55
|
+
*/
|
|
56
|
+
loadingBooleanShapes: number;
|
|
57
|
+
}
|
|
58
|
+
/** The ratchet set (D7): direction for every one of these is LOWER = BETTER. */
|
|
59
|
+
export interface GatedMetrics {
|
|
60
|
+
p90ComponentLoc: number;
|
|
61
|
+
useStateDensity: number;
|
|
62
|
+
inlineMapRowCount: number;
|
|
63
|
+
p90ContextCost: number;
|
|
64
|
+
runInActionCount: number;
|
|
65
|
+
asyncInStore: number;
|
|
66
|
+
newMapInStore: number;
|
|
67
|
+
reactionsTotal: number;
|
|
68
|
+
loadingBooleanShapes: number;
|
|
69
|
+
}
|
|
70
|
+
export interface ObservedMetrics {
|
|
71
|
+
componentCount: number;
|
|
72
|
+
fileCount: number;
|
|
73
|
+
p50ComponentLoc: number;
|
|
74
|
+
maxComponentLoc: number;
|
|
75
|
+
pctComponentsLe80: number;
|
|
76
|
+
observerWrappedPct: number;
|
|
77
|
+
hooksTotal: HookCounts;
|
|
78
|
+
avgPropsCount: number;
|
|
79
|
+
maxJsxDepth: number;
|
|
80
|
+
/** .exhaustive() / match( call sites; null when the project has no match sites */
|
|
81
|
+
exhaustiveRatio: number | null;
|
|
82
|
+
matchSites: number;
|
|
83
|
+
otherwiseCount: number;
|
|
84
|
+
ternaryInJsxCount: number;
|
|
85
|
+
andInJsxCount: number;
|
|
86
|
+
p50FileSloc: number;
|
|
87
|
+
p90ContextCostObserved: number;
|
|
88
|
+
}
|
|
89
|
+
export interface ProjectMetrics {
|
|
90
|
+
gated: GatedMetrics;
|
|
91
|
+
observed: ObservedMetrics;
|
|
92
|
+
components: ComponentMetrics[];
|
|
93
|
+
files: FileMetrics[];
|
|
94
|
+
}
|
|
95
|
+
export interface Baseline {
|
|
96
|
+
version: 1;
|
|
97
|
+
updatedAt: string;
|
|
98
|
+
commit: string | null;
|
|
99
|
+
gated: GatedMetrics;
|
|
100
|
+
/** informational only — --check always recomputes and never trusts this */
|
|
101
|
+
observed: ObservedMetrics;
|
|
102
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsTypes.js","sourceRoot":"","sources":["../src/metricsTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const packageRoot: string;
|
|
2
|
+
export declare const rulesConfig: string;
|
|
3
|
+
export declare const structureConfig: string;
|
|
4
|
+
export declare const rulesDir: string;
|
|
5
|
+
export declare const structureRulesDir: string;
|
|
6
|
+
export declare const fixturesDir: string;
|
|
7
|
+
export declare const miseToml: string;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
// dist/packagePaths.js sits one level under the package root.
|
|
4
|
+
export const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
5
|
+
export const rulesConfig = join(packageRoot, "sgconfig.yml");
|
|
6
|
+
export const structureConfig = join(packageRoot, "structure", "sgconfig.yml");
|
|
7
|
+
export const rulesDir = join(packageRoot, "rules");
|
|
8
|
+
export const structureRulesDir = join(packageRoot, "structure", "rules");
|
|
9
|
+
export const fixturesDir = join(packageRoot, "rules", "__fixtures__");
|
|
10
|
+
export const miseToml = join(packageRoot, "mise.toml");
|
|
11
|
+
//# sourceMappingURL=packagePaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packagePaths.js","sourceRoot":"","sources":["../src/packagePaths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,8DAA8D;AAC9D,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface DeployContext {
|
|
2
|
+
cwd: string;
|
|
3
|
+
/** raw key/value pairs of the [deploy] table in .agentvibes/project.toml */
|
|
4
|
+
deployConfig: Record<string, string>;
|
|
5
|
+
json: boolean;
|
|
6
|
+
}
|
|
7
|
+
/** A leak-scan pattern as data: `pattern` is a JS RegExp source string. */
|
|
8
|
+
export interface LeakPatternSpec {
|
|
9
|
+
id: string;
|
|
10
|
+
pattern: string;
|
|
11
|
+
}
|
|
12
|
+
export interface GuardrailsDeployPlugin {
|
|
13
|
+
name: string;
|
|
14
|
+
/** returns the process exit code */
|
|
15
|
+
deploy(args: string[], context: DeployContext): Promise<number> | number;
|
|
16
|
+
/**
|
|
17
|
+
* Optional: private-infrastructure marker patterns for `guardrails leaks`.
|
|
18
|
+
* The public CLI ships only generic credential patterns; house marker lists
|
|
19
|
+
* are facts about a private topology and reach the scanner through this
|
|
20
|
+
* hook (or a patterns file) instead of the public package.
|
|
21
|
+
*/
|
|
22
|
+
leakPatterns?(): LeakPatternSpec[];
|
|
23
|
+
}
|
|
24
|
+
export declare function isDeployPlugin(value: unknown): value is GuardrailsDeployPlugin;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// The deploy extension point (spec layer A″). The public CLI knows the
|
|
2
|
+
// MECHANISM only: find a plugin, hand it the args and the project's [deploy]
|
|
3
|
+
// config. Every FACT of a concrete topology (hosts, orgs, registries, SSO)
|
|
4
|
+
// lives in a private plugin package — the public code physically contains
|
|
5
|
+
// none of it, and `guardrails leaks` keeps it that way.
|
|
6
|
+
export function isDeployPlugin(value) {
|
|
7
|
+
if (typeof value !== "object" || value === null)
|
|
8
|
+
return false;
|
|
9
|
+
const v = value;
|
|
10
|
+
return typeof v.name === "string" && typeof v.deploy === "function";
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=pluginApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginApi.js","sourceRoot":"","sources":["../src/pluginApi.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,6EAA6E;AAC7E,2EAA2E;AAC3E,0EAA0E;AAC1E,wDAAwD;AA4BxD,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type GuardrailsDeployPlugin } from "./pluginApi.js";
|
|
2
|
+
export declare class PluginResolutionError extends Error {
|
|
3
|
+
}
|
|
4
|
+
export declare function resolvePluginName(cwd: string): string | undefined;
|
|
5
|
+
/** Import a resolved plugin module; throws PluginResolutionError with a usable message. */
|
|
6
|
+
export declare function loadPlugin(cwd: string, pluginName: string): Promise<GuardrailsDeployPlugin>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
import { isDeployPlugin } from "./pluginApi.js";
|
|
6
|
+
import { readTomlTable } from "./tomlTable.js";
|
|
7
|
+
// Shared plugin resolution for `deploy` and `leaks`: [deploy] plugin= in the
|
|
8
|
+
// manifest wins, else a single guardrails-plugin-* dependency.
|
|
9
|
+
export class PluginResolutionError extends Error {
|
|
10
|
+
}
|
|
11
|
+
function pluginsFromPackageJson(cwd) {
|
|
12
|
+
const pkgPath = join(cwd, "package.json");
|
|
13
|
+
// ast-grep-ignore: silent-default-return -- a directory without package.json legitimately has no installable plugins; callers report their own "no plugin" outcome
|
|
14
|
+
if (!existsSync(pkgPath))
|
|
15
|
+
return [];
|
|
16
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
17
|
+
return Object.keys({ ...pkg.dependencies, ...pkg.devDependencies }).filter((name) => /(^|\/)guardrails-plugin-/.test(name));
|
|
18
|
+
}
|
|
19
|
+
export function resolvePluginName(cwd) {
|
|
20
|
+
const deployConfig = readTomlTable(join(cwd, ".agentvibes", "project.toml"), "deploy");
|
|
21
|
+
const configured = deployConfig.plugin;
|
|
22
|
+
if (configured !== undefined && configured !== "")
|
|
23
|
+
return configured;
|
|
24
|
+
const found = pluginsFromPackageJson(cwd);
|
|
25
|
+
if (found.length === 1)
|
|
26
|
+
return found[0];
|
|
27
|
+
if (found.length > 1) {
|
|
28
|
+
throw new PluginResolutionError(`several deploy plugins installed (${found.join(", ")}) — pin one with \`plugin = "<name>"\` under [deploy] in .agentvibes/project.toml`);
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
/** Import a resolved plugin module; throws PluginResolutionError with a usable message. */
|
|
33
|
+
export async function loadPlugin(cwd, pluginName) {
|
|
34
|
+
let resolved;
|
|
35
|
+
try {
|
|
36
|
+
resolved = createRequire(join(cwd, "package.json")).resolve(pluginName);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new PluginResolutionError(`plugin '${pluginName}' is configured but not installed (module resolution failed from ${cwd}). Install it, then retry.`);
|
|
40
|
+
}
|
|
41
|
+
const mod = (await import(pathToFileURL(resolved).href));
|
|
42
|
+
const candidate = mod.default ?? mod.plugin;
|
|
43
|
+
if (!isDeployPlugin(candidate)) {
|
|
44
|
+
throw new PluginResolutionError(`'${pluginName}' does not export a guardrails plugin (need default or named 'plugin' export with { name, deploy }).`);
|
|
45
|
+
}
|
|
46
|
+
return candidate;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=pluginResolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pluginResolve.js","sourceRoot":"","sources":["../src/pluginResolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAA+B,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,6EAA6E;AAC7E,+DAA+D;AAE/D,MAAM,OAAO,qBAAsB,SAAQ,KAAK;CAAG;AAEnD,SAAS,sBAAsB,CAAC,GAAW;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC1C,mKAAmK;IACnK,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAGnD,CAAC;IACF,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAClF,0BAA0B,CAAC,IAAI,CAAC,IAAI,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC;IACvC,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,EAAE;QAAE,OAAO,UAAU,CAAC;IACrE,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,qBAAqB,CAC7B,qCAAqC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mFAAmF,CACzI,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,2FAA2F;AAC3F,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW,EAAE,UAAkB;IAC9D,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,qBAAqB,CAC7B,WAAW,UAAU,oEAAoE,GAAG,4BAA4B,CACzH,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAA4B,CAAC;IACpF,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,qBAAqB,CAC7B,IAAI,UAAU,sGAAsG,CACrH,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Finding } from "./findings.js";
|
|
2
|
+
export declare class ScreenScopeError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/** Rule ids whose bundled definition declares `appliesTo: not-screens`. */
|
|
5
|
+
export declare function screenExemptRuleIds(dir?: string): Set<string>;
|
|
6
|
+
/**
|
|
7
|
+
* The repo's `[verify] screens` pattern, or undefined when it declares none.
|
|
8
|
+
*
|
|
9
|
+
* An unusable pattern throws rather than being dropped: a scope the gate cannot
|
|
10
|
+
* honour must fail loudly, the same posture `[severity]` takes on an unknown
|
|
11
|
+
* rule id. Silently ignoring it would leave every screen flagged while the repo
|
|
12
|
+
* believes it has scoped them.
|
|
13
|
+
*/
|
|
14
|
+
export declare function screensPattern(cwd: string): RegExp | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Drop findings from rules that do not apply to screens, in files the repo has
|
|
17
|
+
* declared to BE screens. Everything else passes through untouched — including
|
|
18
|
+
* those same rules outside the screen paths, which is the half that has to keep
|
|
19
|
+
* working for the scoping to be worth anything.
|
|
20
|
+
*/
|
|
21
|
+
export declare function dropScreenExempt(findings: readonly Finding[], screens: RegExp | undefined, exempt: ReadonlySet<string>): Finding[];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { rulesDir } from "./packagePaths.js";
|
|
4
|
+
import { readTomlTable } from "./tomlTable.js";
|
|
5
|
+
// Screens are not leaf components, and one canon rule cannot tell them apart.
|
|
6
|
+
//
|
|
7
|
+
// `direct-store-import` bans pulling a store class or slice-store singleton into
|
|
8
|
+
// a component file. A SCREEN is required to do exactly that — report §8's shape
|
|
9
|
+
// is `usePageStore(() => new GalleryPageStore(rootStore, slug))`, which needs
|
|
10
|
+
// the class imported — so the rule fires on the form the canon prescribes. Its
|
|
11
|
+
// own header predicted this and named the fix: the boundary needs the repo to
|
|
12
|
+
// say where its screens are, because an ast-grep `files:` glob is per-rule-file
|
|
13
|
+
// and cannot read a manifest (is-7067a0b8).
|
|
14
|
+
//
|
|
15
|
+
// Measured before choosing this shape rather than after: the canon's own screen
|
|
16
|
+
// marker `**/*.screen.tsx` matches ZERO files across observatory, tg-gallery and
|
|
17
|
+
// merkle-substrate, while `screens/` directories exist in two of the three. So
|
|
18
|
+
// no naming convention in the park can carry this, and a rule-side `ignores:`
|
|
19
|
+
// glob would have been a guess about layout dressed as a fix.
|
|
20
|
+
//
|
|
21
|
+
// [verify]
|
|
22
|
+
// screens = "^src/screens/"
|
|
23
|
+
//
|
|
24
|
+
// The key states a FACT ABOUT THE REPO — these paths are screens — not a
|
|
25
|
+
// suppression of a rule. That distinction is the whole design: a per-rule path
|
|
26
|
+
// map in user config would be an allowlist that grows, and which rules stop
|
|
27
|
+
// applying to screens is the canon's business, declared in the rule itself:
|
|
28
|
+
//
|
|
29
|
+
// metadata:
|
|
30
|
+
// appliesTo: not-screens
|
|
31
|
+
//
|
|
32
|
+
// Absent key = absent behaviour. A repo that says nothing is scanned exactly as
|
|
33
|
+
// it was before this existed.
|
|
34
|
+
export class ScreenScopeError extends Error {
|
|
35
|
+
}
|
|
36
|
+
/** Rule ids whose bundled definition declares `appliesTo: not-screens`. */
|
|
37
|
+
export function screenExemptRuleIds(dir = rulesDir) {
|
|
38
|
+
const ids = new Set();
|
|
39
|
+
for (const f of readdirSync(dir)) {
|
|
40
|
+
if (!f.endsWith(".yml"))
|
|
41
|
+
continue;
|
|
42
|
+
const text = readFileSync(join(dir, f), "utf8");
|
|
43
|
+
const id = text.match(/^id:\s*(\S+)/m)?.[1];
|
|
44
|
+
if (id === undefined)
|
|
45
|
+
continue;
|
|
46
|
+
if (/^\s{2}appliesTo:\s*not-screens\s*$/m.test(text))
|
|
47
|
+
ids.add(id);
|
|
48
|
+
}
|
|
49
|
+
return ids;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The repo's `[verify] screens` pattern, or undefined when it declares none.
|
|
53
|
+
*
|
|
54
|
+
* An unusable pattern throws rather than being dropped: a scope the gate cannot
|
|
55
|
+
* honour must fail loudly, the same posture `[severity]` takes on an unknown
|
|
56
|
+
* rule id. Silently ignoring it would leave every screen flagged while the repo
|
|
57
|
+
* believes it has scoped them.
|
|
58
|
+
*/
|
|
59
|
+
export function screensPattern(cwd) {
|
|
60
|
+
const raw = readTomlTable(join(cwd, ".agentvibes", "project.toml"), "verify").screens;
|
|
61
|
+
if (raw === undefined || raw.trim() === "")
|
|
62
|
+
return undefined;
|
|
63
|
+
try {
|
|
64
|
+
return new RegExp(raw);
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
throw new ScreenScopeError(`[verify] screens = ${JSON.stringify(raw)} is not a valid regular expression (${e.message})`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Drop findings from rules that do not apply to screens, in files the repo has
|
|
72
|
+
* declared to BE screens. Everything else passes through untouched — including
|
|
73
|
+
* those same rules outside the screen paths, which is the half that has to keep
|
|
74
|
+
* working for the scoping to be worth anything.
|
|
75
|
+
*/
|
|
76
|
+
export function dropScreenExempt(findings, screens, exempt) {
|
|
77
|
+
if (screens === undefined || exempt.size === 0)
|
|
78
|
+
return [...findings];
|
|
79
|
+
return findings.filter((f) => !(exempt.has(f.rule) && screens.test(f.file)));
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=screenScope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenScope.js","sourceRoot":"","sources":["../src/screenScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,8EAA8E;AAC9E,EAAE;AACF,iFAAiF;AACjF,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,4CAA4C;AAC5C,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,+EAA+E;AAC/E,8EAA8E;AAC9E,8DAA8D;AAC9D,EAAE;AACF,aAAa;AACb,8BAA8B;AAC9B,EAAE;AACF,yEAAyE;AACzE,+EAA+E;AAC/E,4EAA4E;AAC5E,4EAA4E;AAC5E,EAAE;AACF,cAAc;AACd,6BAA6B;AAC7B,EAAE;AACF,gFAAgF;AAChF,8BAA8B;AAC9B,MAAM,OAAO,gBAAiB,SAAQ,KAAK;CAAG;AAE9C,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,MAAc,QAAQ;IACxD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QAClC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS;QAC/B,IAAI,qCAAqC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,EAAE,cAAc,CAAC,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC;IACtF,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,gBAAgB,CACxB,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,uCAAwC,CAAW,CAAC,OAAO,GAAG,CACxG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAA4B,EAC5B,OAA2B,EAC3B,MAA2B;IAE3B,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IACrE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { packageRoot } from "./packagePaths.js";
|
|
6
|
+
import { screenExemptRuleIds } from "./screenScope.js";
|
|
7
|
+
// `[verify] screens` — the repo says where its screens are; the canon says which
|
|
8
|
+
// rules do not apply there (is-7067a0b8). Four directions, all executed:
|
|
9
|
+
// 1. with no declaration, a screen still fires — absent key, absent behaviour
|
|
10
|
+
// 2. with the declaration, the screen stops firing
|
|
11
|
+
// 3. the LEAF COMPONENT still fires either way — the half that has to keep
|
|
12
|
+
// working, or the scope is a blanket off-switch wearing a narrow name
|
|
13
|
+
// 4. an unusable pattern fails loudly rather than being dropped
|
|
14
|
+
//
|
|
15
|
+
// Plus the one that stops the whole mechanism being inert: at least one bundled
|
|
16
|
+
// rule must actually carry the marker. A scope with an empty exempt set filters
|
|
17
|
+
// nothing and would pass 1, 3 and 4 while doing nothing at all.
|
|
18
|
+
// The §8 screen shape: the screen owns its page store, so it must import the class.
|
|
19
|
+
const SCREEN = 'import { rootStore } from "../stores/rootStore";\n' +
|
|
20
|
+
'import { GalleryPageStore } from "../stores/GalleryPageStore";\n' +
|
|
21
|
+
'export const GalleryScreen = () => new GalleryPageStore(rootStore, "slug");\n';
|
|
22
|
+
// A leaf reaching past the boundary — banned everywhere, screens included.
|
|
23
|
+
const LEAF = 'import { galleryStore } from "../stores/gallery";\n' +
|
|
24
|
+
"export const Row = () => galleryStore.title;\n";
|
|
25
|
+
function fixture(screensKey) {
|
|
26
|
+
const root = mkdtempSync(join(tmpdir(), "guardrails-screens-"));
|
|
27
|
+
mkdirSync(join(root, "src", "screens"), { recursive: true });
|
|
28
|
+
mkdirSync(join(root, "src", "components"), { recursive: true });
|
|
29
|
+
mkdirSync(join(root, ".agentvibes"), { recursive: true });
|
|
30
|
+
writeFileSync(join(root, "src", "screens", "GalleryScreen.tsx"), SCREEN);
|
|
31
|
+
writeFileSync(join(root, "src", "components", "Row.tsx"), LEAF);
|
|
32
|
+
writeFileSync(join(root, ".agentvibes", "project.toml"), screensKey === undefined ? "" : `[verify]\nscreens = "${screensKey}"\n`);
|
|
33
|
+
return root;
|
|
34
|
+
}
|
|
35
|
+
function verify(cwd) {
|
|
36
|
+
const res = spawnSync("node", [join(packageRoot, "dist", "cli.js"), "verify", "src"], {
|
|
37
|
+
cwd,
|
|
38
|
+
encoding: "utf8",
|
|
39
|
+
});
|
|
40
|
+
if (res.error)
|
|
41
|
+
throw res.error;
|
|
42
|
+
return { status: res.status ?? -1, out: `${res.stdout}${res.stderr}` };
|
|
43
|
+
}
|
|
44
|
+
let failed = 0;
|
|
45
|
+
const fail = (m) => {
|
|
46
|
+
console.error(`FAIL screen-scope: ${m}`);
|
|
47
|
+
failed++;
|
|
48
|
+
};
|
|
49
|
+
// 0 — the marker exists, so the mechanism is not inert
|
|
50
|
+
const exempt = screenExemptRuleIds();
|
|
51
|
+
if (!exempt.has("direct-store-import")) {
|
|
52
|
+
fail("no bundled rule declares `appliesTo: not-screens` — the scope would filter nothing");
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
console.log(` ok screen-scope: ${exempt.size} rule(s) declare appliesTo: not-screens`);
|
|
56
|
+
}
|
|
57
|
+
// 1 — no declaration, no change
|
|
58
|
+
{
|
|
59
|
+
const root = fixture(undefined);
|
|
60
|
+
try {
|
|
61
|
+
const { out } = verify(root);
|
|
62
|
+
if (!out.includes("GalleryScreen.tsx")) {
|
|
63
|
+
fail("without [verify] screens the screen must still be flagged (absent key, absent behaviour)");
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
console.log(" ok screen-scope: undeclared repo scans exactly as before");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
finally {
|
|
70
|
+
rmSync(root, { recursive: true, force: true });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// 2 and 3 — the screen is scoped out, the leaf is not
|
|
74
|
+
{
|
|
75
|
+
const root = fixture("^src/screens/");
|
|
76
|
+
try {
|
|
77
|
+
const { out } = verify(root);
|
|
78
|
+
if (out.includes("GalleryScreen.tsx")) {
|
|
79
|
+
fail("a declared screen must not be flagged by direct-store-import");
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
console.log(" ok screen-scope: the §8 screen shape stops firing once declared");
|
|
83
|
+
}
|
|
84
|
+
if (!out.includes("Row.tsx")) {
|
|
85
|
+
fail("the leaf component MUST still fire — scoping screens is not an off-switch");
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(" ok screen-scope: the leaf component still fires (the scope is narrow)");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
rmSync(root, { recursive: true, force: true });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
// 4 — an unusable pattern is refused, not dropped
|
|
96
|
+
{
|
|
97
|
+
const root = fixture("^src/screens/[");
|
|
98
|
+
try {
|
|
99
|
+
const { status, out } = verify(root);
|
|
100
|
+
if (status !== 2 || !out.includes("not a valid regular expression")) {
|
|
101
|
+
fail(`a malformed [verify] screens must exit 2 with a reason, got exit ${status}`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
console.log(" ok screen-scope: a malformed pattern fails loudly (exit 2)");
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
rmSync(root, { recursive: true, force: true });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
if (failed > 0) {
|
|
112
|
+
console.error(`screen-scope: ${failed} check(s) failed`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
115
|
+
console.log("screen-scope: all checks passed");
|
|
116
|
+
//# sourceMappingURL=screenScopeTest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenScopeTest.js","sourceRoot":"","sources":["../src/screenScopeTest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare class SeverityConfigError extends Error {
|
|
2
|
+
}
|
|
3
|
+
/**
|
|
4
|
+
* ast-grep CLI args implementing the repo's [severity] raises; [] when none.
|
|
5
|
+
* Throws SeverityConfigError on an unknown rule id or a non-raise target —
|
|
6
|
+
* a config the gate cannot honour must fail loudly (exit 2), never be
|
|
7
|
+
* silently dropped.
|
|
8
|
+
*/
|
|
9
|
+
export declare function severityRaiseArgs(cwd: string): string[];
|