pumuki 6.3.7

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.
Files changed (744) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +370 -0
  3. package/VERSION +1 -0
  4. package/assets/Hook_01.png +0 -0
  5. package/assets/Hook_02.png +0 -0
  6. package/assets/ai-start.png +0 -0
  7. package/assets/ai_gate.png +0 -0
  8. package/assets/ast_intelligence_01.png +0 -0
  9. package/assets/ast_intelligence_01.svg +40 -0
  10. package/assets/ast_intelligence_02.png +0 -0
  11. package/assets/ast_intelligence_02.svg +39 -0
  12. package/assets/ast_intelligence_03.png +0 -0
  13. package/assets/ast_intelligence_03.svg +55 -0
  14. package/assets/ast_intelligence_04.png +0 -0
  15. package/assets/ast_intelligence_04.svg +39 -0
  16. package/assets/ast_intelligence_05.png +0 -0
  17. package/assets/ast_intelligence_05.svg +45 -0
  18. package/assets/logo.png +0 -0
  19. package/assets/logo_banner.svg +29 -0
  20. package/assets/pre-flight-check.png +0 -0
  21. package/bin/_run-ts-entry.js +46 -0
  22. package/bin/pumuki-ci.js +5 -0
  23. package/bin/pumuki-framework.js +5 -0
  24. package/bin/pumuki-mcp-evidence.js +5 -0
  25. package/bin/pumuki-pre-commit.js +5 -0
  26. package/bin/pumuki-pre-push.js +5 -0
  27. package/bin/pumuki.js +5 -0
  28. package/core/facts/DependencyFact.test.ts +38 -0
  29. package/core/facts/DependencyFact.ts +6 -0
  30. package/core/facts/Fact.test.ts +74 -0
  31. package/core/facts/Fact.ts +10 -0
  32. package/core/facts/FactSet.test.ts +38 -0
  33. package/core/facts/FactSet.ts +3 -0
  34. package/core/facts/FileChangeFact.test.ts +36 -0
  35. package/core/facts/FileChangeFact.ts +5 -0
  36. package/core/facts/FileContentFact.test.ts +26 -0
  37. package/core/facts/FileContentFact.ts +5 -0
  38. package/core/facts/HeuristicFact.test.ts +34 -0
  39. package/core/facts/HeuristicFact.ts +10 -0
  40. package/core/facts/detectors/browser/index.test.ts +131 -0
  41. package/core/facts/detectors/browser/index.ts +67 -0
  42. package/core/facts/detectors/fs/callbacks.test.ts +73 -0
  43. package/core/facts/detectors/fs/callbacks.ts +93 -0
  44. package/core/facts/detectors/fs/promises.test.ts +88 -0
  45. package/core/facts/detectors/fs/promises.ts +75 -0
  46. package/core/facts/detectors/fs/sync.test.ts +48 -0
  47. package/core/facts/detectors/fs/sync.ts +3 -0
  48. package/core/facts/detectors/fs/syncPart1.test.ts +52 -0
  49. package/core/facts/detectors/fs/syncPart1.ts +3 -0
  50. package/core/facts/detectors/fs/syncPart1DirTimes.test.ts +58 -0
  51. package/core/facts/detectors/fs/syncPart1DirTimes.ts +93 -0
  52. package/core/facts/detectors/fs/syncPart1FileOps.test.ts +64 -0
  53. package/core/facts/detectors/fs/syncPart1FileOps.ts +93 -0
  54. package/core/facts/detectors/fs/syncPart1Metadata.test.ts +64 -0
  55. package/core/facts/detectors/fs/syncPart1Metadata.ts +139 -0
  56. package/core/facts/detectors/fs/syncPart2.test.ts +62 -0
  57. package/core/facts/detectors/fs/syncPart2.ts +4 -0
  58. package/core/facts/detectors/fs/syncPart2Core.test.ts +62 -0
  59. package/core/facts/detectors/fs/syncPart2Core.ts +70 -0
  60. package/core/facts/detectors/fs/syncPart2Io.test.ts +62 -0
  61. package/core/facts/detectors/fs/syncPart2Io.ts +70 -0
  62. package/core/facts/detectors/fs/syncPart2Permissions.test.ts +66 -0
  63. package/core/facts/detectors/fs/syncPart2Permissions.ts +93 -0
  64. package/core/facts/detectors/fs/syncPart2Times.test.ts +66 -0
  65. package/core/facts/detectors/fs/syncPart2Times.ts +93 -0
  66. package/core/facts/detectors/fs/syncPart3.test.ts +62 -0
  67. package/core/facts/detectors/fs/syncPart3.ts +3 -0
  68. package/core/facts/detectors/fs/syncPart3DescriptorIo.test.ts +69 -0
  69. package/core/facts/detectors/fs/syncPart3DescriptorIo.ts +93 -0
  70. package/core/facts/detectors/fs/syncPart3Links.test.ts +62 -0
  71. package/core/facts/detectors/fs/syncPart3Links.ts +70 -0
  72. package/core/facts/detectors/fs/syncPart3PathOps.test.ts +72 -0
  73. package/core/facts/detectors/fs/syncPart3PathOps.ts +116 -0
  74. package/core/facts/detectors/process/core.test.ts +147 -0
  75. package/core/facts/detectors/process/core.ts +120 -0
  76. package/core/facts/detectors/process/index.test.ts +61 -0
  77. package/core/facts/detectors/process/index.ts +3 -0
  78. package/core/facts/detectors/process/shell.test.ts +137 -0
  79. package/core/facts/detectors/process/shell.ts +170 -0
  80. package/core/facts/detectors/process/spawn.test.ts +155 -0
  81. package/core/facts/detectors/process/spawn.ts +121 -0
  82. package/core/facts/detectors/security/index.test.ts +382 -0
  83. package/core/facts/detectors/security/index.ts +16 -0
  84. package/core/facts/detectors/security/securityCredentials.test.ts +149 -0
  85. package/core/facts/detectors/security/securityCredentials.ts +192 -0
  86. package/core/facts/detectors/security/securityCrypto.test.ts +122 -0
  87. package/core/facts/detectors/security/securityCrypto.ts +88 -0
  88. package/core/facts/detectors/security/securityJwt.test.ts +187 -0
  89. package/core/facts/detectors/security/securityJwt.ts +134 -0
  90. package/core/facts/detectors/security/securityTls.test.ts +121 -0
  91. package/core/facts/detectors/security/securityTls.ts +88 -0
  92. package/core/facts/detectors/text/android.test.ts +87 -0
  93. package/core/facts/detectors/text/android.ts +38 -0
  94. package/core/facts/detectors/text/ios.test.ts +83 -0
  95. package/core/facts/detectors/text/ios.ts +108 -0
  96. package/core/facts/detectors/text/utils.test.ts +71 -0
  97. package/core/facts/detectors/text/utils.ts +146 -0
  98. package/core/facts/detectors/typescript/index.test.ts +231 -0
  99. package/core/facts/detectors/typescript/index.ts +167 -0
  100. package/core/facts/detectors/utils/astHelpers.test.ts +79 -0
  101. package/core/facts/detectors/utils/astHelpers.ts +33 -0
  102. package/core/facts/detectors/vm/index.test.ts +58 -0
  103. package/core/facts/detectors/vm/index.ts +27 -0
  104. package/core/facts/extractHeuristicFacts.ts +394 -0
  105. package/core/facts/index.test.ts +72 -0
  106. package/core/facts/index.ts +11 -0
  107. package/core/gate/Finding.test.ts +52 -0
  108. package/core/gate/Finding.ts +9 -0
  109. package/core/gate/GateOutcome.test.ts +20 -0
  110. package/core/gate/GateOutcome.ts +1 -0
  111. package/core/gate/GatePolicy.test.ts +28 -0
  112. package/core/gate/GatePolicy.ts +9 -0
  113. package/core/gate/GateStage.test.ts +22 -0
  114. package/core/gate/GateStage.ts +1 -0
  115. package/core/gate/conditionMatches.test.ts +110 -0
  116. package/core/gate/conditionMatches.ts +174 -0
  117. package/core/gate/evaluateGate.test.ts +77 -0
  118. package/core/gate/evaluateGate.ts +23 -0
  119. package/core/gate/evaluateRules.test.ts +106 -0
  120. package/core/gate/evaluateRules.ts +40 -0
  121. package/core/gate/index.test.ts +39 -0
  122. package/core/gate/index.ts +6 -0
  123. package/core/rules/Condition.test.ts +54 -0
  124. package/core/rules/Condition.ts +40 -0
  125. package/core/rules/Consequence.test.ts +25 -0
  126. package/core/rules/Consequence.ts +5 -0
  127. package/core/rules/README.md +6 -0
  128. package/core/rules/RuleDefinition.test.ts +55 -0
  129. package/core/rules/RuleDefinition.ts +20 -0
  130. package/core/rules/RuleSet.test.ts +48 -0
  131. package/core/rules/RuleSet.ts +3 -0
  132. package/core/rules/Severity.test.ts +19 -0
  133. package/core/rules/Severity.ts +12 -0
  134. package/core/rules/index.test.ts +41 -0
  135. package/core/rules/index.ts +7 -0
  136. package/core/rules/mergeRuleSets.ts +53 -0
  137. package/core/rules/presets/androidRuleSet.test.ts +22 -0
  138. package/core/rules/presets/androidRuleSet.ts +62 -0
  139. package/core/rules/presets/astHeuristicsRuleSet.ts +31 -0
  140. package/core/rules/presets/backendRuleSet.test.ts +27 -0
  141. package/core/rules/presets/backendRuleSet.ts +61 -0
  142. package/core/rules/presets/exampleRuleSet.test.ts +25 -0
  143. package/core/rules/presets/exampleRuleSet.ts +34 -0
  144. package/core/rules/presets/frontendRuleSet.test.ts +27 -0
  145. package/core/rules/presets/frontendRuleSet.ts +61 -0
  146. package/core/rules/presets/heuristics/android.ts +58 -0
  147. package/core/rules/presets/heuristics/browser.ts +58 -0
  148. package/core/rules/presets/heuristics/fsCallbacks.ts +9 -0
  149. package/core/rules/presets/heuristics/fsCallbacksFileOperationsRules.ts +400 -0
  150. package/core/rules/presets/heuristics/fsCallbacksMetadataRules.ts +418 -0
  151. package/core/rules/presets/heuristics/fsPromises.ts +9 -0
  152. package/core/rules/presets/heuristics/fsPromisesFileOperations.ts +184 -0
  153. package/core/rules/presets/heuristics/fsPromisesMetadataRules.ts +238 -0
  154. package/core/rules/presets/heuristics/fsSync.ts +13 -0
  155. package/core/rules/presets/heuristics/fsSyncAppendRules.ts +22 -0
  156. package/core/rules/presets/heuristics/fsSyncDescriptorRules.ts +328 -0
  157. package/core/rules/presets/heuristics/fsSyncFileOperationsRules.ts +382 -0
  158. package/core/rules/presets/heuristics/fsSyncPathRules.ts +4 -0
  159. package/core/rules/presets/heuristics/ios.ts +94 -0
  160. package/core/rules/presets/heuristics/process.ts +241 -0
  161. package/core/rules/presets/heuristics/security.ts +13 -0
  162. package/core/rules/presets/heuristics/securityCredentialsRules.ts +80 -0
  163. package/core/rules/presets/heuristics/securityCryptoRules.ts +61 -0
  164. package/core/rules/presets/heuristics/securityJwtRules.ts +61 -0
  165. package/core/rules/presets/heuristics/securityTlsRules.ts +42 -0
  166. package/core/rules/presets/heuristics/typescript.ts +220 -0
  167. package/core/rules/presets/heuristics/vm.ts +23 -0
  168. package/core/rules/presets/index.test.ts +32 -0
  169. package/core/rules/presets/index.ts +8 -0
  170. package/core/rules/presets/iosEnterpriseRuleSet.ts +204 -0
  171. package/core/rules/presets/iosNonNegotiableRuleSet.ts +76 -0
  172. package/core/rules/presets/rulePackVersions.test.ts +21 -0
  173. package/core/rules/presets/rulePackVersions.ts +11 -0
  174. package/core/utils/stableStringify.ts +18 -0
  175. package/docs/API_REFERENCE.md +233 -0
  176. package/docs/ARCHITECTURE.md +190 -0
  177. package/docs/ARCHITECTURE_DETAILED.md +165 -0
  178. package/docs/AST_HEURISTICS_REINTRODUCTION_PLAN.md +88 -0
  179. package/docs/BRANCH_PROTECTION_GUIDE.md +50 -0
  180. package/docs/CODE_STANDARDS.md +73 -0
  181. package/docs/CONFIGURATION.md +132 -0
  182. package/docs/CONTRIBUTING.md +92 -0
  183. package/docs/DEPENDENCIES.md +54 -0
  184. package/docs/HOW_IT_WORKS.md +155 -0
  185. package/docs/INSTALLATION.md +172 -0
  186. package/docs/MCP_AGENT_CONTEXT_CONSUMPTION.md +189 -0
  187. package/docs/MCP_EVIDENCE_CONTEXT_SERVER.md +242 -0
  188. package/docs/MCP_SERVERS.md +114 -0
  189. package/docs/README.md +85 -0
  190. package/docs/REFRACTOR_PROGRESS.md +155 -0
  191. package/docs/RELEASE_NOTES.md +175 -0
  192. package/docs/TESTING.md +101 -0
  193. package/docs/TODO.md +692 -0
  194. package/docs/USAGE.md +259 -0
  195. package/docs/evidence-v2.1.md +49 -0
  196. package/docs/images/README.md +20 -0
  197. package/docs/rule-packs/README.md +45 -0
  198. package/docs/rule-packs/android.md +21 -0
  199. package/docs/rule-packs/backend.md +24 -0
  200. package/docs/rule-packs/frontend.md +22 -0
  201. package/docs/rule-packs/heuristics.md +1304 -0
  202. package/docs/rule-packs/ios.md +22 -0
  203. package/docs/skills-repo-enforcement-migration.md +73 -0
  204. package/docs/validation/README.md +82 -0
  205. package/docs/validation/adapter-hook-runtime-local-report.md +45 -0
  206. package/docs/validation/adapter-hook-runtime-validation.md +82 -0
  207. package/docs/validation/adapter-real-session-report-template.md +63 -0
  208. package/docs/validation/consumer-ci-startup-failure-playbook.md +184 -0
  209. package/docs/validation/consumer-startup-escalation-handoff-latest.md +237 -0
  210. package/docs/validation/enterprise-consumer-isolation-policy.md +45 -0
  211. package/docs/validation/github-support-ticket-template-startup-failure.md +84 -0
  212. package/docs/validation/mock-consumer-integration-runbook.md +89 -0
  213. package/docs/validation/phase5-execution-closure.md +227 -0
  214. package/docs/validation/phase8-external-rollout-pack.md +168 -0
  215. package/docs/validation/phase8-post-billing-reactivation-runbook.md +133 -0
  216. package/docs/validation/skills-rollout-consumer-repositories.md +124 -0
  217. package/index.js +15 -0
  218. package/integrations/config/compileSkillsLock.ts +231 -0
  219. package/integrations/config/heuristics.ts +18 -0
  220. package/integrations/config/loadProjectRules.ts +43 -0
  221. package/integrations/config/projectRules.ts +6 -0
  222. package/integrations/config/projectRulesSchema.ts +85 -0
  223. package/integrations/config/skillsCompilerTemplates.ts +151 -0
  224. package/integrations/config/skillsLock.ts +248 -0
  225. package/integrations/config/skillsPolicy.ts +178 -0
  226. package/integrations/config/skillsRuleSet.ts +188 -0
  227. package/integrations/config/skillsSources.ts +88 -0
  228. package/integrations/evidence/buildEvidence.ts +350 -0
  229. package/integrations/evidence/generateEvidence.ts +14 -0
  230. package/integrations/evidence/humanIntent.ts +115 -0
  231. package/integrations/evidence/readEvidence.ts +47 -0
  232. package/integrations/evidence/schema.ts +97 -0
  233. package/integrations/evidence/writeEvidence.ts +201 -0
  234. package/integrations/gate/stagePolicies.ts +295 -0
  235. package/integrations/git/EvidenceService.ts +111 -0
  236. package/integrations/git/GitService.ts +35 -0
  237. package/integrations/git/baselineRuleSets.ts +58 -0
  238. package/integrations/git/ciAndroid.cli.ts +4 -0
  239. package/integrations/git/ciAndroid.ts +1 -0
  240. package/integrations/git/ciBackend.cli.ts +4 -0
  241. package/integrations/git/ciBackend.ts +1 -0
  242. package/integrations/git/ciFrontend.cli.ts +4 -0
  243. package/integrations/git/ciFrontend.ts +1 -0
  244. package/integrations/git/ciIOS.cli.ts +4 -0
  245. package/integrations/git/ciIOS.ts +1 -0
  246. package/integrations/git/evaluateStagedIOS.ts +127 -0
  247. package/integrations/git/getCommitRangeFacts.ts +28 -0
  248. package/integrations/git/gitDiffUtils.ts +90 -0
  249. package/integrations/git/index.ts +13 -0
  250. package/integrations/git/preCommitAndroid.cli.ts +4 -0
  251. package/integrations/git/preCommitAndroid.ts +1 -0
  252. package/integrations/git/preCommitBackend.cli.ts +4 -0
  253. package/integrations/git/preCommitBackend.ts +1 -0
  254. package/integrations/git/preCommitFrontend.cli.ts +4 -0
  255. package/integrations/git/preCommitFrontend.ts +1 -0
  256. package/integrations/git/preCommitIOS.cli.ts +4 -0
  257. package/integrations/git/preCommitIOS.ts +1 -0
  258. package/integrations/git/prePushAndroid.cli.ts +4 -0
  259. package/integrations/git/prePushAndroid.ts +1 -0
  260. package/integrations/git/prePushBackend.cli.ts +4 -0
  261. package/integrations/git/prePushBackend.ts +1 -0
  262. package/integrations/git/prePushFrontend.cli.ts +4 -0
  263. package/integrations/git/prePushFrontend.ts +1 -0
  264. package/integrations/git/prePushIOS.cli.ts +4 -0
  265. package/integrations/git/prePushIOS.ts +1 -0
  266. package/integrations/git/resolveGitRefs.ts +51 -0
  267. package/integrations/git/runCliCommand.ts +11 -0
  268. package/integrations/git/runPlatformGate.ts +89 -0
  269. package/integrations/git/runPlatformGateEvaluation.ts +82 -0
  270. package/integrations/git/runPlatformGateEvidence.ts +41 -0
  271. package/integrations/git/runPlatformGateFacts.ts +34 -0
  272. package/integrations/git/runPlatformGateOutput.ts +11 -0
  273. package/integrations/git/stageRunners.ts +40 -0
  274. package/integrations/lifecycle/artifacts.ts +26 -0
  275. package/integrations/lifecycle/cli.ts +180 -0
  276. package/integrations/lifecycle/constants.ts +13 -0
  277. package/integrations/lifecycle/consumerPackage.ts +48 -0
  278. package/integrations/lifecycle/doctor.ts +90 -0
  279. package/integrations/lifecycle/gitService.ts +63 -0
  280. package/integrations/lifecycle/hookBlock.ts +93 -0
  281. package/integrations/lifecycle/hookManager.ts +107 -0
  282. package/integrations/lifecycle/index.ts +6 -0
  283. package/integrations/lifecycle/install.ts +44 -0
  284. package/integrations/lifecycle/npmService.ts +21 -0
  285. package/integrations/lifecycle/packageInfo.ts +5 -0
  286. package/integrations/lifecycle/remove.ts +95 -0
  287. package/integrations/lifecycle/state.ts +41 -0
  288. package/integrations/lifecycle/status.ts +30 -0
  289. package/integrations/lifecycle/uninstall.ts +36 -0
  290. package/integrations/lifecycle/update.ts +77 -0
  291. package/integrations/mcp/evidenceContextServer.cli.ts +16 -0
  292. package/integrations/mcp/evidenceContextServer.ts +152 -0
  293. package/integrations/mcp/evidenceFacets.ts +3 -0
  294. package/integrations/mcp/evidenceFacetsBase.ts +94 -0
  295. package/integrations/mcp/evidenceFacetsSnapshot.ts +104 -0
  296. package/integrations/mcp/evidenceFacetsSuppressed.ts +3 -0
  297. package/integrations/mcp/evidenceFacetsSuppressedBase.ts +221 -0
  298. package/integrations/mcp/evidenceFacetsSuppressedRelations.ts +263 -0
  299. package/integrations/mcp/evidenceFacetsSuppressedShare.ts +2 -0
  300. package/integrations/mcp/evidenceFacetsSuppressedShareCore.ts +442 -0
  301. package/integrations/mcp/evidenceFacetsSuppressedShareTriage.ts +487 -0
  302. package/integrations/mcp/evidencePayloadCollections.ts +37 -0
  303. package/integrations/mcp/evidencePayloadCollectionsFindings.ts +64 -0
  304. package/integrations/mcp/evidencePayloadCollectionsLedger.ts +69 -0
  305. package/integrations/mcp/evidencePayloadCollectionsPaging.ts +38 -0
  306. package/integrations/mcp/evidencePayloadCollectionsPlatforms.ts +49 -0
  307. package/integrations/mcp/evidencePayloadCollectionsRulesets.ts +50 -0
  308. package/integrations/mcp/evidencePayloadCollectionsSorters.ts +62 -0
  309. package/integrations/mcp/evidencePayloadConfig.ts +79 -0
  310. package/integrations/mcp/evidencePayloadSummary.ts +144 -0
  311. package/integrations/mcp/evidencePayloadSummarySuppressed.ts +361 -0
  312. package/integrations/mcp/evidencePayloads.ts +8 -0
  313. package/integrations/mcp/index.ts +1 -0
  314. package/integrations/platform/detectAndroid.ts +25 -0
  315. package/integrations/platform/detectBackend.ts +22 -0
  316. package/integrations/platform/detectFrontend.ts +29 -0
  317. package/integrations/platform/detectPlatforms.ts +69 -0
  318. package/package.json +218 -0
  319. package/scripts/adapter-readiness-cli-lib.ts +64 -0
  320. package/scripts/adapter-readiness-contract.ts +46 -0
  321. package/scripts/adapter-readiness-lib.ts +10 -0
  322. package/scripts/adapter-readiness-markdown-lib.ts +41 -0
  323. package/scripts/adapter-readiness-markdown-next-actions-lib.ts +33 -0
  324. package/scripts/adapter-readiness-markdown-sections-lib.ts +78 -0
  325. package/scripts/adapter-readiness-parser-lib.ts +30 -0
  326. package/scripts/adapter-readiness-summary-lib.ts +62 -0
  327. package/scripts/adapter-real-session-analysis-evaluation-lib.ts +49 -0
  328. package/scripts/adapter-real-session-analysis-lib.ts +8 -0
  329. package/scripts/adapter-real-session-analysis-messages-lib.ts +58 -0
  330. package/scripts/adapter-real-session-analysis-signals-lib.ts +59 -0
  331. package/scripts/adapter-real-session-analysis-status-lib.ts +29 -0
  332. package/scripts/adapter-real-session-arg-values-lib.ts +47 -0
  333. package/scripts/adapter-real-session-args-lib.ts +46 -0
  334. package/scripts/adapter-real-session-audit-snapshot-lib.ts +70 -0
  335. package/scripts/adapter-real-session-context-lib.ts +7 -0
  336. package/scripts/adapter-real-session-contract.ts +54 -0
  337. package/scripts/adapter-real-session-fs-lib.ts +36 -0
  338. package/scripts/adapter-real-session-git-lib.ts +13 -0
  339. package/scripts/adapter-real-session-hook-config-lib.ts +24 -0
  340. package/scripts/adapter-real-session-markdown-core-sections-lib.ts +11 -0
  341. package/scripts/adapter-real-session-markdown-lib.ts +25 -0
  342. package/scripts/adapter-real-session-markdown-sections-context-lib.ts +56 -0
  343. package/scripts/adapter-real-session-markdown-sections-evaluation-lib.ts +71 -0
  344. package/scripts/adapter-real-session-markdown-sections-lib.ts +34 -0
  345. package/scripts/adapter-real-session-markdown-snippet-section-lib.ts +44 -0
  346. package/scripts/adapter-real-session-markdown-snippets-lib.ts +19 -0
  347. package/scripts/adapter-real-session-markdown-value-formatters-lib.ts +10 -0
  348. package/scripts/adapter-real-session-report-lib.ts +16 -0
  349. package/scripts/adapter-real-session-status-parser-lib.ts +42 -0
  350. package/scripts/adapter-session-status-args-lib.ts +46 -0
  351. package/scripts/adapter-session-status-audit-latest-lib.ts +22 -0
  352. package/scripts/adapter-session-status-audit-tail-entries-lib.ts +78 -0
  353. package/scripts/adapter-session-status-audit-tail-lib.ts +15 -0
  354. package/scripts/adapter-session-status-command-lib.ts +49 -0
  355. package/scripts/adapter-session-status-contract.ts +55 -0
  356. package/scripts/adapter-session-status-hook-log-filter-lib.ts +38 -0
  357. package/scripts/adapter-session-status-lib.ts +25 -0
  358. package/scripts/adapter-session-status-log-filter-lib.ts +3 -0
  359. package/scripts/adapter-session-status-log-utils-lib.ts +23 -0
  360. package/scripts/adapter-session-status-markdown-lib.ts +65 -0
  361. package/scripts/adapter-session-status-report-lib.ts +21 -0
  362. package/scripts/adapter-session-status-tail-readers-lib.ts +58 -0
  363. package/scripts/adapter-session-status-verdict-lib.ts +43 -0
  364. package/scripts/adapter-session-status-writes-log-filter-lib.ts +25 -0
  365. package/scripts/build-adapter-readiness.ts +51 -0
  366. package/scripts/build-adapter-real-session-report.ts +58 -0
  367. package/scripts/build-adapter-session-status.ts +42 -0
  368. package/scripts/build-consumer-startup-failure-support-bundle.ts +22 -0
  369. package/scripts/build-consumer-startup-triage-arg-flags-lib.ts +26 -0
  370. package/scripts/build-consumer-startup-triage-arg-values-lib.ts +45 -0
  371. package/scripts/build-consumer-startup-triage-args-lib.ts +59 -0
  372. package/scripts/build-consumer-startup-triage-contract.ts +25 -0
  373. package/scripts/build-consumer-startup-triage-runner-lib.ts +59 -0
  374. package/scripts/build-consumer-startup-triage.ts +58 -0
  375. package/scripts/build-consumer-startup-unblock-status.ts +34 -0
  376. package/scripts/build-consumer-support-ticket-draft.ts +32 -0
  377. package/scripts/build-mock-consumer-ab-report.ts +34 -0
  378. package/scripts/build-mock-consumer-startup-triage.ts +71 -0
  379. package/scripts/build-phase5-blockers-readiness.ts +69 -0
  380. package/scripts/build-phase5-execution-closure-status-output-lib.ts +22 -0
  381. package/scripts/build-phase5-execution-closure-status-runner-lib.ts +61 -0
  382. package/scripts/build-phase5-execution-closure-status.ts +35 -0
  383. package/scripts/build-phase5-external-handoff-arg-flags-lib.ts +21 -0
  384. package/scripts/build-phase5-external-handoff-arg-handlers-lib.ts +48 -0
  385. package/scripts/build-phase5-external-handoff-arg-values-lib.ts +59 -0
  386. package/scripts/build-phase5-external-handoff-args-lib.ts +25 -0
  387. package/scripts/build-phase5-external-handoff-contract.ts +39 -0
  388. package/scripts/build-phase5-external-handoff-inputs-lib.ts +86 -0
  389. package/scripts/build-phase5-external-handoff.ts +71 -0
  390. package/scripts/build-phase5-support-portal-payload.sh +67 -0
  391. package/scripts/build-phase8-ready-handoff-summary.sh +66 -0
  392. package/scripts/check-consumer-ci-auth.ts +64 -0
  393. package/scripts/check-package-manifest.ts +54 -0
  394. package/scripts/check-phase5-escalation-ready-to-submit.sh +74 -0
  395. package/scripts/check-phase5-latest-ready-chain.sh +44 -0
  396. package/scripts/check-phase8-loop-guard-coverage.sh +44 -0
  397. package/scripts/check-phase8-loop-guard.sh +81 -0
  398. package/scripts/check-refactor-progress-single-active.sh +25 -0
  399. package/scripts/check-validation-docs-hygiene.ts +42 -0
  400. package/scripts/clean-validation-artifacts-cli-lib.ts +38 -0
  401. package/scripts/clean-validation-artifacts-lib.ts +64 -0
  402. package/scripts/clean-validation-artifacts-output-lib.ts +21 -0
  403. package/scripts/clean-validation-artifacts.ts +42 -0
  404. package/scripts/close-phase5-escalation-submission.sh +81 -0
  405. package/scripts/collect-consumer-ci-artifacts-args-lib.ts +61 -0
  406. package/scripts/collect-consumer-ci-artifacts-contract.ts +54 -0
  407. package/scripts/collect-consumer-ci-artifacts-gh-command-lib.ts +17 -0
  408. package/scripts/collect-consumer-ci-artifacts-gh-fetch-lib.ts +45 -0
  409. package/scripts/collect-consumer-ci-artifacts-gh-lib.ts +5 -0
  410. package/scripts/collect-consumer-ci-artifacts-gh-run-fetch-lib.ts +56 -0
  411. package/scripts/collect-consumer-ci-artifacts-markdown-lib.ts +69 -0
  412. package/scripts/collect-consumer-ci-artifacts.ts +30 -0
  413. package/scripts/compile-skills-lock-args-lib.ts +53 -0
  414. package/scripts/compile-skills-lock-runner-lib.ts +48 -0
  415. package/scripts/compile-skills-lock.ts +9 -0
  416. package/scripts/consumer-ci-auth-check-contract.ts +39 -0
  417. package/scripts/consumer-ci-auth-check-gh-lib.ts +54 -0
  418. package/scripts/consumer-ci-auth-check-lib.ts +15 -0
  419. package/scripts/consumer-ci-auth-check-markdown-header-status-lib.ts +32 -0
  420. package/scripts/consumer-ci-auth-check-markdown-json-lib.ts +19 -0
  421. package/scripts/consumer-ci-auth-check-markdown-lib.ts +30 -0
  422. package/scripts/consumer-ci-auth-check-markdown-remediation-lib.ts +36 -0
  423. package/scripts/consumer-ci-auth-check-markdown-sections-lib.ts +6 -0
  424. package/scripts/consumer-ci-auth-check-parse-lib.ts +65 -0
  425. package/scripts/consumer-startup-failure-support-bundle-lib.ts +58 -0
  426. package/scripts/consumer-startup-triage-command-builders-core-lib.ts +5 -0
  427. package/scripts/consumer-startup-triage-command-builders-core-required-lib.ts +40 -0
  428. package/scripts/consumer-startup-triage-command-builders-lib.ts +10 -0
  429. package/scripts/consumer-startup-triage-command-builders-support-bundle-lib.ts +26 -0
  430. package/scripts/consumer-startup-triage-command-builders-support-followup-lib.ts +53 -0
  431. package/scripts/consumer-startup-triage-command-builders-support-lib.ts +5 -0
  432. package/scripts/consumer-startup-triage-command-builders-workflow-lint-lib.ts +45 -0
  433. package/scripts/consumer-startup-triage-commands-lib.ts +64 -0
  434. package/scripts/consumer-startup-triage-contract.ts +41 -0
  435. package/scripts/consumer-startup-triage-lib.ts +9 -0
  436. package/scripts/consumer-startup-triage-markdown-lib.ts +63 -0
  437. package/scripts/consumer-startup-triage-outputs-lib.ts +19 -0
  438. package/scripts/consumer-startup-unblock-arg-setters-lib.ts +34 -0
  439. package/scripts/consumer-startup-unblock-args-contract.ts +17 -0
  440. package/scripts/consumer-startup-unblock-args-defaults-lib.ts +17 -0
  441. package/scripts/consumer-startup-unblock-args-lib.ts +49 -0
  442. package/scripts/consumer-startup-unblock-auth-lib.ts +16 -0
  443. package/scripts/consumer-startup-unblock-blockers-lib.ts +65 -0
  444. package/scripts/consumer-startup-unblock-cli-lib.ts +10 -0
  445. package/scripts/consumer-startup-unblock-contract.ts +42 -0
  446. package/scripts/consumer-startup-unblock-input-lib.ts +17 -0
  447. package/scripts/consumer-startup-unblock-markdown-lib.ts +47 -0
  448. package/scripts/consumer-startup-unblock-markdown-next-actions-lib.ts +37 -0
  449. package/scripts/consumer-startup-unblock-markdown-sections-lib.ts +53 -0
  450. package/scripts/consumer-startup-unblock-parser-lib.ts +24 -0
  451. package/scripts/consumer-startup-unblock-runner-lib.ts +69 -0
  452. package/scripts/consumer-startup-unblock-status-lib.ts +7 -0
  453. package/scripts/consumer-startup-unblock-summary-lib.ts +54 -0
  454. package/scripts/consumer-support-bundle-args-defaults-lib.ts +11 -0
  455. package/scripts/consumer-support-bundle-args-values-lib.ts +27 -0
  456. package/scripts/consumer-support-bundle-contract.ts +61 -0
  457. package/scripts/consumer-support-bundle-gh-auth-repo-lib.ts +51 -0
  458. package/scripts/consumer-support-bundle-gh-command-lib.ts +63 -0
  459. package/scripts/consumer-support-bundle-gh-diagnostics-collector-lib.ts +66 -0
  460. package/scripts/consumer-support-bundle-gh-diagnostics-fetch-lib.ts +36 -0
  461. package/scripts/consumer-support-bundle-gh-lib.ts +8 -0
  462. package/scripts/consumer-support-bundle-gh-loaders-lib.ts +7 -0
  463. package/scripts/consumer-support-bundle-gh-workflow-runs-lib.ts +30 -0
  464. package/scripts/consumer-support-bundle-markdown-context-lib.ts +49 -0
  465. package/scripts/consumer-support-bundle-markdown-lib.ts +44 -0
  466. package/scripts/consumer-support-bundle-markdown-run-sections-append-lib.ts +47 -0
  467. package/scripts/consumer-support-bundle-markdown-sections-append-lib.ts +51 -0
  468. package/scripts/consumer-support-bundle-markdown-sections-core-lib.ts +67 -0
  469. package/scripts/consumer-support-bundle-markdown-sections-lib.ts +7 -0
  470. package/scripts/consumer-support-bundle-markdown-sections-run-diagnostics-lib.ts +34 -0
  471. package/scripts/consumer-support-bundle-markdown-sections-support-payload-lib.ts +60 -0
  472. package/scripts/consumer-support-bundle-markdown-top-sections-append-lib.ts +55 -0
  473. package/scripts/consumer-support-bundle-markdown-top-sections-lib.ts +51 -0
  474. package/scripts/consumer-support-bundle-runner-lib.ts +49 -0
  475. package/scripts/consumer-support-ticket-cli-arg-setters-lib.ts +30 -0
  476. package/scripts/consumer-support-ticket-cli-contract.ts +14 -0
  477. package/scripts/consumer-support-ticket-cli-defaults-lib.ts +14 -0
  478. package/scripts/consumer-support-ticket-cli-lib.ts +63 -0
  479. package/scripts/consumer-support-ticket-draft-diagnostics-sections-lib.ts +67 -0
  480. package/scripts/consumer-support-ticket-draft-lib.ts +36 -0
  481. package/scripts/consumer-support-ticket-draft-primary-sections-lib.ts +51 -0
  482. package/scripts/consumer-support-ticket-draft-sections-lib.ts +10 -0
  483. package/scripts/consumer-support-ticket-lib.ts +3 -0
  484. package/scripts/consumer-support-ticket-parser-lib.ts +72 -0
  485. package/scripts/consumer-support-ticket-runner-lib.ts +42 -0
  486. package/scripts/consumer-workflow-lint-args-lib.ts +56 -0
  487. package/scripts/consumer-workflow-lint-command-lib.ts +60 -0
  488. package/scripts/consumer-workflow-lint-contract.ts +14 -0
  489. package/scripts/consumer-workflow-lint-markdown-lib.ts +39 -0
  490. package/scripts/consumer-workflow-lint-runner-lib.ts +52 -0
  491. package/scripts/fill-adapter-external-ide-replay-closeout.sh +90 -0
  492. package/scripts/framework-menu-action-contract.ts +17 -0
  493. package/scripts/framework-menu-actions-diagnostics-adapter-lib.ts +31 -0
  494. package/scripts/framework-menu-actions-diagnostics-ci-lib.ts +40 -0
  495. package/scripts/framework-menu-actions-diagnostics-maintenance-lib.ts +22 -0
  496. package/scripts/framework-menu-actions-diagnostics-support-core-lib.ts +40 -0
  497. package/scripts/framework-menu-actions-diagnostics-support-lib.ts +15 -0
  498. package/scripts/framework-menu-actions-diagnostics-support-triage-lib.ts +28 -0
  499. package/scripts/framework-menu-actions-diagnostics.ts +19 -0
  500. package/scripts/framework-menu-actions-gates-ci-lib.ts +30 -0
  501. package/scripts/framework-menu-actions-gates-stage-lib.ts +32 -0
  502. package/scripts/framework-menu-actions-gates-tools-lib.ts +26 -0
  503. package/scripts/framework-menu-actions-gates.ts +17 -0
  504. package/scripts/framework-menu-actions-phase5-exec-lib.ts +32 -0
  505. package/scripts/framework-menu-actions-phase5-exit-lib.ts +16 -0
  506. package/scripts/framework-menu-actions-phase5-reports-lib.ts +49 -0
  507. package/scripts/framework-menu-actions-phase5.ts +17 -0
  508. package/scripts/framework-menu-actions.ts +22 -0
  509. package/scripts/framework-menu-builders-adapter.ts +29 -0
  510. package/scripts/framework-menu-builders-consumer-contract.ts +19 -0
  511. package/scripts/framework-menu-builders-consumer-mock-ab-lib.ts +22 -0
  512. package/scripts/framework-menu-builders-consumer-triage-lib.ts +31 -0
  513. package/scripts/framework-menu-builders-consumer.ts +6 -0
  514. package/scripts/framework-menu-builders-maintenance.ts +24 -0
  515. package/scripts/framework-menu-builders-phase5-blockers-lib.ts +16 -0
  516. package/scripts/framework-menu-builders-phase5-closure-lib.ts +46 -0
  517. package/scripts/framework-menu-builders-phase5-contract.ts +43 -0
  518. package/scripts/framework-menu-builders-phase5-handoff-lib.ts +38 -0
  519. package/scripts/framework-menu-builders-phase5-status-lib.ts +24 -0
  520. package/scripts/framework-menu-builders-phase5.ts +12 -0
  521. package/scripts/framework-menu-builders-shared-lib.ts +3 -0
  522. package/scripts/framework-menu-builders.ts +19 -0
  523. package/scripts/framework-menu-gate-lib.ts +53 -0
  524. package/scripts/framework-menu-prompt-types.ts +12 -0
  525. package/scripts/framework-menu-prompts-adapter.ts +50 -0
  526. package/scripts/framework-menu-prompts-consumer-ci-lib.ts +36 -0
  527. package/scripts/framework-menu-prompts-consumer-contract.ts +46 -0
  528. package/scripts/framework-menu-prompts-consumer-startup-triage-lib.ts +69 -0
  529. package/scripts/framework-menu-prompts-consumer-support-bundle-lib.ts +20 -0
  530. package/scripts/framework-menu-prompts-consumer-support-ticket-lib.ts +27 -0
  531. package/scripts/framework-menu-prompts-consumer-unblock-status-lib.ts +33 -0
  532. package/scripts/framework-menu-prompts-consumer-workflow-lint-lib.ts +27 -0
  533. package/scripts/framework-menu-prompts-consumer.ts +26 -0
  534. package/scripts/framework-menu-prompts-phase5-blockers-lib.ts +24 -0
  535. package/scripts/framework-menu-prompts-phase5-closure-lib.ts +17 -0
  536. package/scripts/framework-menu-prompts-phase5-closure-live-lib.ts +51 -0
  537. package/scripts/framework-menu-prompts-phase5-closure-mock-lib.ts +23 -0
  538. package/scripts/framework-menu-prompts-phase5-closure-shared-lib.ts +24 -0
  539. package/scripts/framework-menu-prompts-phase5-contract.ts +48 -0
  540. package/scripts/framework-menu-prompts-phase5-handoff-lib.ts +54 -0
  541. package/scripts/framework-menu-prompts-phase5-mock-ab-lib.ts +36 -0
  542. package/scripts/framework-menu-prompts-phase5-status-lib.ts +31 -0
  543. package/scripts/framework-menu-prompts-phase5.ts +16 -0
  544. package/scripts/framework-menu-prompts.ts +32 -0
  545. package/scripts/framework-menu-runner-common.ts +13 -0
  546. package/scripts/framework-menu-runner-constants.ts +3 -0
  547. package/scripts/framework-menu-runner-evidence-lib.ts +14 -0
  548. package/scripts/framework-menu-runner-git-lib.ts +13 -0
  549. package/scripts/framework-menu-runner-path-lib.ts +12 -0
  550. package/scripts/framework-menu-runner-process-lib.ts +27 -0
  551. package/scripts/framework-menu-runners-adapter-contract.ts +13 -0
  552. package/scripts/framework-menu-runners-adapter-readiness-lib.ts +20 -0
  553. package/scripts/framework-menu-runners-adapter-real-session-lib.ts +20 -0
  554. package/scripts/framework-menu-runners-adapter-session-lib.ts +19 -0
  555. package/scripts/framework-menu-runners-adapter.ts +9 -0
  556. package/scripts/framework-menu-runners-consumer-artifacts-lib.ts +11 -0
  557. package/scripts/framework-menu-runners-consumer-auth-lib.ts +11 -0
  558. package/scripts/framework-menu-runners-consumer-contract.ts +55 -0
  559. package/scripts/framework-menu-runners-consumer-exec-lib.ts +13 -0
  560. package/scripts/framework-menu-runners-consumer-mock-ab-lib.ts +24 -0
  561. package/scripts/framework-menu-runners-consumer-startup-triage-lib.ts +24 -0
  562. package/scripts/framework-menu-runners-consumer-support-bundle-lib.ts +11 -0
  563. package/scripts/framework-menu-runners-consumer-support-ticket-lib.ts +20 -0
  564. package/scripts/framework-menu-runners-consumer-unblock-lib.ts +22 -0
  565. package/scripts/framework-menu-runners-consumer-workflow-lib.ts +18 -0
  566. package/scripts/framework-menu-runners-consumer.ts +21 -0
  567. package/scripts/framework-menu-runners-phase5-blockers-lib.ts +18 -0
  568. package/scripts/framework-menu-runners-phase5-closure-lib.ts +25 -0
  569. package/scripts/framework-menu-runners-phase5-contract.ts +39 -0
  570. package/scripts/framework-menu-runners-phase5-exec-lib.ts +25 -0
  571. package/scripts/framework-menu-runners-phase5-handoff-lib.ts +25 -0
  572. package/scripts/framework-menu-runners-phase5-status-lib.ts +20 -0
  573. package/scripts/framework-menu-runners-phase5.ts +12 -0
  574. package/scripts/framework-menu-runners-validation-cleanup-lib.ts +31 -0
  575. package/scripts/framework-menu-runners-validation-docs-lib.ts +20 -0
  576. package/scripts/framework-menu-runners-validation-skills-lib.ts +11 -0
  577. package/scripts/framework-menu-runners-validation.ts +4 -0
  578. package/scripts/framework-menu-runners.ts +37 -0
  579. package/scripts/framework-menu-skills-lib.ts +26 -0
  580. package/scripts/framework-menu.cli.ts +3 -0
  581. package/scripts/framework-menu.ts +67 -0
  582. package/scripts/lint-consumer-workflows.ts +29 -0
  583. package/scripts/mark-phase5-escalation-submitted.sh +49 -0
  584. package/scripts/mark-phase8-followup-posted-now.sh +33 -0
  585. package/scripts/mark-phase8-followup-replied-now.sh +52 -0
  586. package/scripts/mark-phase8-support-followup-state.sh +89 -0
  587. package/scripts/mock-consumer-ab-blockers-lib.ts +36 -0
  588. package/scripts/mock-consumer-ab-cli-arg-setters-lib.ts +46 -0
  589. package/scripts/mock-consumer-ab-cli-defaults-lib.ts +19 -0
  590. package/scripts/mock-consumer-ab-cli-lib.ts +46 -0
  591. package/scripts/mock-consumer-ab-contract.ts +30 -0
  592. package/scripts/mock-consumer-ab-evidence-lib.ts +50 -0
  593. package/scripts/mock-consumer-ab-markdown-assertions-lib.ts +24 -0
  594. package/scripts/mock-consumer-ab-markdown-blockers-lib.ts +9 -0
  595. package/scripts/mock-consumer-ab-markdown-contract.ts +16 -0
  596. package/scripts/mock-consumer-ab-markdown-header-inputs-lib.ts +21 -0
  597. package/scripts/mock-consumer-ab-markdown-lib.ts +24 -0
  598. package/scripts/mock-consumer-ab-markdown-next-actions-lib.ts +22 -0
  599. package/scripts/mock-consumer-ab-markdown-sections-lib.ts +21 -0
  600. package/scripts/mock-consumer-ab-report-lib.ts +12 -0
  601. package/scripts/mock-consumer-ab-runner-lib.ts +51 -0
  602. package/scripts/mock-consumer-smoke-contract.ts +14 -0
  603. package/scripts/mock-consumer-smoke-lib.ts +3 -0
  604. package/scripts/mock-consumer-smoke-summary-lib.ts +59 -0
  605. package/scripts/mock-consumer-smoke-verdict-lib.ts +27 -0
  606. package/scripts/mock-consumer-startup-triage-arg-flags-lib.ts +13 -0
  607. package/scripts/mock-consumer-startup-triage-arg-values-lib.ts +35 -0
  608. package/scripts/mock-consumer-startup-triage-cli-contract.ts +7 -0
  609. package/scripts/mock-consumer-startup-triage-cli-lib.ts +56 -0
  610. package/scripts/mock-consumer-startup-triage-lib.ts +2 -0
  611. package/scripts/mock-consumer-startup-triage-markdown-lib.ts +57 -0
  612. package/scripts/mock-consumer-startup-unblock-markdown-lib.ts +38 -0
  613. package/scripts/package-install-smoke-command-lib.ts +67 -0
  614. package/scripts/package-install-smoke-consumer-git-lib.ts +10 -0
  615. package/scripts/package-install-smoke-consumer-git-payload-lib.ts +45 -0
  616. package/scripts/package-install-smoke-consumer-git-repo-lib.ts +49 -0
  617. package/scripts/package-install-smoke-consumer-npm-lib.ts +47 -0
  618. package/scripts/package-install-smoke-consumer-repo-setup-lib.ts +31 -0
  619. package/scripts/package-install-smoke-contract.ts +6 -0
  620. package/scripts/package-install-smoke-execution-lib.ts +73 -0
  621. package/scripts/package-install-smoke-execution-steps-lib.ts +46 -0
  622. package/scripts/package-install-smoke-execution-summary-lib.ts +51 -0
  623. package/scripts/package-install-smoke-file-lib.ts +33 -0
  624. package/scripts/package-install-smoke-fixtures-content-lib.ts +57 -0
  625. package/scripts/package-install-smoke-fixtures-lib.ts +41 -0
  626. package/scripts/package-install-smoke-fixtures-write-lib.ts +14 -0
  627. package/scripts/package-install-smoke-gate-lib.ts +64 -0
  628. package/scripts/package-install-smoke-lib.ts +3 -0
  629. package/scripts/package-install-smoke-lifecycle-lib.ts +91 -0
  630. package/scripts/package-install-smoke-mode-lib.ts +31 -0
  631. package/scripts/package-install-smoke-repo-setup-lib.ts +2 -0
  632. package/scripts/package-install-smoke-runner-common.ts +12 -0
  633. package/scripts/package-install-smoke-tarball-lib.ts +34 -0
  634. package/scripts/package-install-smoke-workspace-contract.ts +11 -0
  635. package/scripts/package-install-smoke-workspace-factory-lib.ts +38 -0
  636. package/scripts/package-install-smoke-workspace-lib.ts +7 -0
  637. package/scripts/package-install-smoke-workspace-report-lib.ts +44 -0
  638. package/scripts/package-install-smoke.ts +7 -0
  639. package/scripts/package-manifest-lib.ts +44 -0
  640. package/scripts/phase5-blockers-contract.ts +36 -0
  641. package/scripts/phase5-blockers-detected-blockers-lib.ts +35 -0
  642. package/scripts/phase5-blockers-markdown-header-inputs-signals-lib.ts +48 -0
  643. package/scripts/phase5-blockers-markdown-lib.ts +51 -0
  644. package/scripts/phase5-blockers-markdown-list-utils-lib.ts +13 -0
  645. package/scripts/phase5-blockers-markdown-next-actions-blocked-lib.ts +46 -0
  646. package/scripts/phase5-blockers-markdown-next-actions-lib.ts +29 -0
  647. package/scripts/phase5-blockers-markdown-next-actions-ready-lib.ts +13 -0
  648. package/scripts/phase5-blockers-markdown-sections-lib.ts +7 -0
  649. package/scripts/phase5-blockers-markdown-static-sections-lib.ts +26 -0
  650. package/scripts/phase5-blockers-missing-inputs-lib.ts +16 -0
  651. package/scripts/phase5-blockers-parser-adapter-lib.ts +44 -0
  652. package/scripts/phase5-blockers-parser-consumer-lib.ts +32 -0
  653. package/scripts/phase5-blockers-parser-lib.ts +2 -0
  654. package/scripts/phase5-blockers-readiness-arg-flags-lib.ts +13 -0
  655. package/scripts/phase5-blockers-readiness-arg-values-lib.ts +27 -0
  656. package/scripts/phase5-blockers-readiness-cli-contract.ts +6 -0
  657. package/scripts/phase5-blockers-readiness-cli-lib.ts +55 -0
  658. package/scripts/phase5-blockers-readiness-input-lib.ts +17 -0
  659. package/scripts/phase5-blockers-readiness-lib.ts +8 -0
  660. package/scripts/phase5-blockers-summary-lib.ts +48 -0
  661. package/scripts/phase5-execution-closure-commands-lib.ts +32 -0
  662. package/scripts/phase5-execution-closure-lib.ts +2 -0
  663. package/scripts/phase5-execution-closure-outputs-lib.ts +25 -0
  664. package/scripts/phase5-execution-closure-plan-adapter-commands-lib.ts +41 -0
  665. package/scripts/phase5-execution-closure-plan-adapter-lib.ts +25 -0
  666. package/scripts/phase5-execution-closure-plan-consumer-lib.ts +5 -0
  667. package/scripts/phase5-execution-closure-plan-consumer-preflight-lib.ts +58 -0
  668. package/scripts/phase5-execution-closure-plan-consumer-triage-lib.ts +62 -0
  669. package/scripts/phase5-execution-closure-plan-contract.ts +42 -0
  670. package/scripts/phase5-execution-closure-plan-lib.ts +7 -0
  671. package/scripts/phase5-execution-closure-plan-phase5-args-lib.ts +52 -0
  672. package/scripts/phase5-execution-closure-plan-phase5-lib.ts +37 -0
  673. package/scripts/phase5-execution-closure-plan-validation-lib.ts +15 -0
  674. package/scripts/phase5-execution-closure-report-contract.ts +22 -0
  675. package/scripts/phase5-execution-closure-report-executions-lib.ts +35 -0
  676. package/scripts/phase5-execution-closure-report-header-lib.ts +38 -0
  677. package/scripts/phase5-execution-closure-report-lib.ts +31 -0
  678. package/scripts/phase5-execution-closure-report-next-actions-lib.ts +19 -0
  679. package/scripts/phase5-execution-closure-report-sections-lib.ts +51 -0
  680. package/scripts/phase5-execution-closure-runner-arg-flags-lib.ts +32 -0
  681. package/scripts/phase5-execution-closure-runner-arg-handlers-lib.ts +33 -0
  682. package/scripts/phase5-execution-closure-runner-arg-value-handlers-lib.ts +62 -0
  683. package/scripts/phase5-execution-closure-runner-arg-values-lib.ts +39 -0
  684. package/scripts/phase5-execution-closure-runner-contract.ts +31 -0
  685. package/scripts/phase5-execution-closure-runner-exec-command-lib.ts +20 -0
  686. package/scripts/phase5-execution-closure-runner-exec-error-lib.ts +32 -0
  687. package/scripts/phase5-execution-closure-runner-exec-lib.ts +35 -0
  688. package/scripts/phase5-execution-closure-runner-lib.ts +8 -0
  689. package/scripts/phase5-execution-closure-runner-mappers-lib.ts +30 -0
  690. package/scripts/phase5-execution-closure-runner-options-normalizer-lib.ts +19 -0
  691. package/scripts/phase5-execution-closure-runner-parse-lib.ts +23 -0
  692. package/scripts/phase5-execution-closure-runner-plan-lib.ts +14 -0
  693. package/scripts/phase5-execution-closure-runner-report-writer-lib.ts +12 -0
  694. package/scripts/phase5-execution-closure-status-arg-flags-lib.ts +13 -0
  695. package/scripts/phase5-execution-closure-status-arg-values-lib.ts +35 -0
  696. package/scripts/phase5-execution-closure-status-blockers-lib.ts +47 -0
  697. package/scripts/phase5-execution-closure-status-cli-contract.ts +24 -0
  698. package/scripts/phase5-execution-closure-status-cli-input-lib.ts +17 -0
  699. package/scripts/phase5-execution-closure-status-cli-lib.ts +10 -0
  700. package/scripts/phase5-execution-closure-status-cli-parse-lib.ts +59 -0
  701. package/scripts/phase5-execution-closure-status-contract.ts +48 -0
  702. package/scripts/phase5-execution-closure-status-lib.ts +8 -0
  703. package/scripts/phase5-execution-closure-status-markdown-lib.ts +22 -0
  704. package/scripts/phase5-execution-closure-status-markdown-list-lib.ts +16 -0
  705. package/scripts/phase5-execution-closure-status-markdown-next-actions-lib.ts +24 -0
  706. package/scripts/phase5-execution-closure-status-markdown-sections-lib.ts +7 -0
  707. package/scripts/phase5-execution-closure-status-markdown-static-sections-lib.ts +58 -0
  708. package/scripts/phase5-execution-closure-status-missing-inputs-lib.ts +19 -0
  709. package/scripts/phase5-execution-closure-status-parser-lib.ts +4 -0
  710. package/scripts/phase5-execution-closure-status-summary-helpers-lib.ts +6 -0
  711. package/scripts/phase5-execution-closure-status-summary-lib.ts +34 -0
  712. package/scripts/phase5-execution-closure-status-verdict-lib.ts +11 -0
  713. package/scripts/phase5-external-handoff-contract.ts +51 -0
  714. package/scripts/phase5-external-handoff-inputs-artifacts-lib.ts +45 -0
  715. package/scripts/phase5-external-handoff-lib.ts +3 -0
  716. package/scripts/phase5-external-handoff-markdown-core-sections-lib.ts +70 -0
  717. package/scripts/phase5-external-handoff-markdown-header-lib.ts +15 -0
  718. package/scripts/phase5-external-handoff-markdown-lib.ts +44 -0
  719. package/scripts/phase5-external-handoff-markdown-list-lib.ts +16 -0
  720. package/scripts/phase5-external-handoff-markdown-list-sections-lib.ts +54 -0
  721. package/scripts/phase5-external-handoff-markdown-next-actions-lib.ts +27 -0
  722. package/scripts/phase5-external-handoff-markdown-sections-append-lib.ts +69 -0
  723. package/scripts/phase5-external-handoff-markdown-sections-lib.ts +12 -0
  724. package/scripts/phase5-external-handoff-summary-helpers-lib.ts +9 -0
  725. package/scripts/phase5-external-handoff-summary-lib.ts +46 -0
  726. package/scripts/phase5-external-handoff-verdict-evaluators-lib.ts +67 -0
  727. package/scripts/prepare-adapter-external-ide-replay-closeout-auto.sh +100 -0
  728. package/scripts/prepare-phase5-escalation-submission.sh +21 -0
  729. package/scripts/refresh-phase5-latest-escalation.sh +94 -0
  730. package/scripts/run-phase5-execution-closure.ts +58 -0
  731. package/scripts/run-phase5-post-support-refresh.sh +25 -0
  732. package/scripts/run-phase8-after-billing-reactivation.sh +31 -0
  733. package/scripts/run-phase8-autopilot.sh +42 -0
  734. package/scripts/run-phase8-close-ready.sh +38 -0
  735. package/scripts/run-phase8-doctor.sh +61 -0
  736. package/scripts/run-phase8-next-step.sh +39 -0
  737. package/scripts/run-phase8-status-pack.sh +35 -0
  738. package/scripts/run-phase8-tick.sh +35 -0
  739. package/scripts/sync-codex-skills.sh +40 -0
  740. package/scripts/sync-phase5-latest-docs.sh +119 -0
  741. package/scripts/validation-docs-hygiene-lib.ts +46 -0
  742. package/skills.lock.json +178 -0
  743. package/skills.sources.json +33 -0
  744. package/tsconfig.json +39 -0
@@ -0,0 +1,33 @@
1
+ export const isObject = (value: unknown): value is Record<string, unknown> => {
2
+ return typeof value === 'object' && value !== null;
3
+ };
4
+
5
+ export const hasNode = (
6
+ node: unknown,
7
+ predicate: (value: Record<string, unknown>) => boolean
8
+ ): boolean => {
9
+ if (!isObject(node)) {
10
+ return false;
11
+ }
12
+
13
+ if (predicate(node)) {
14
+ return true;
15
+ }
16
+
17
+ for (const value of Object.values(node)) {
18
+ if (Array.isArray(value)) {
19
+ for (const item of value) {
20
+ if (hasNode(item, predicate)) {
21
+ return true;
22
+ }
23
+ }
24
+ continue;
25
+ }
26
+
27
+ if (isObject(value) && hasNode(value, predicate)) {
28
+ return true;
29
+ }
30
+ }
31
+
32
+ return false;
33
+ };
@@ -0,0 +1,58 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { hasVmDynamicCodeExecutionCall } from './index';
4
+
5
+ test('hasVmDynamicCodeExecutionCall detecta llamadas directas por identificador', () => {
6
+ const ast = {
7
+ type: 'CallExpression',
8
+ callee: { type: 'Identifier', name: 'runInNewContext' },
9
+ arguments: [{ type: 'StringLiteral', value: 'code' }],
10
+ };
11
+
12
+ assert.equal(hasVmDynamicCodeExecutionCall(ast), true);
13
+ });
14
+
15
+ test('hasVmDynamicCodeExecutionCall detecta MemberExpression no computed', () => {
16
+ const ast = {
17
+ type: 'CallExpression',
18
+ callee: {
19
+ type: 'MemberExpression',
20
+ computed: false,
21
+ object: { type: 'Identifier', name: 'vm' },
22
+ property: { type: 'Identifier', name: 'runInThisContext' },
23
+ },
24
+ arguments: [{ type: 'StringLiteral', value: 'code' }],
25
+ };
26
+
27
+ assert.equal(hasVmDynamicCodeExecutionCall(ast), true);
28
+ });
29
+
30
+ test('hasVmDynamicCodeExecutionCall detecta MemberExpression computed', () => {
31
+ const ast = {
32
+ type: 'CallExpression',
33
+ callee: {
34
+ type: 'MemberExpression',
35
+ computed: true,
36
+ object: { type: 'Identifier', name: 'vm' },
37
+ property: { type: 'StringLiteral', value: 'runInNewContext' },
38
+ },
39
+ arguments: [{ type: 'StringLiteral', value: 'code' }],
40
+ };
41
+
42
+ assert.equal(hasVmDynamicCodeExecutionCall(ast), true);
43
+ });
44
+
45
+ test('hasVmDynamicCodeExecutionCall descarta llamadas no objetivo', () => {
46
+ const ast = {
47
+ type: 'CallExpression',
48
+ callee: {
49
+ type: 'MemberExpression',
50
+ computed: false,
51
+ object: { type: 'Identifier', name: 'vm' },
52
+ property: { type: 'Identifier', name: 'createContext' },
53
+ },
54
+ arguments: [],
55
+ };
56
+
57
+ assert.equal(hasVmDynamicCodeExecutionCall(ast), false);
58
+ });
@@ -0,0 +1,27 @@
1
+ import { hasNode, isObject } from '../utils/astHelpers';
2
+
3
+ export const hasVmDynamicCodeExecutionCall = (node: unknown): boolean => {
4
+ const targetNames = new Set(['runInNewContext', 'runInThisContext']);
5
+
6
+ return hasNode(node, (value) => {
7
+ if (value.type !== 'CallExpression') {
8
+ return false;
9
+ }
10
+
11
+ const callee = value.callee;
12
+ if (isObject(callee) && callee.type === 'Identifier') {
13
+ return targetNames.has(callee.name as string);
14
+ }
15
+ if (!isObject(callee) || callee.type !== 'MemberExpression') {
16
+ return false;
17
+ }
18
+ const propertyNode = callee.property;
19
+ if (!isObject(propertyNode)) {
20
+ return false;
21
+ }
22
+ if (callee.computed === true) {
23
+ return propertyNode.type === 'StringLiteral' && targetNames.has(propertyNode.value as string);
24
+ }
25
+ return propertyNode.type === 'Identifier' && targetNames.has(propertyNode.name as string);
26
+ });
27
+ };
@@ -0,0 +1,394 @@
1
+ import { parse } from '@babel/parser';
2
+ import type { Fact } from './Fact';
3
+ import type { FileContentFact } from './FileContentFact';
4
+ import type { HeuristicFact } from './HeuristicFact';
5
+
6
+ // Import detectors
7
+ import * as TS from './detectors/typescript';
8
+ import * as Process from './detectors/process';
9
+ import * as Security from './detectors/security';
10
+ import * as Browser from './detectors/browser';
11
+ import * as VM from './detectors/vm';
12
+ import * as FsSync from './detectors/fs/sync';
13
+ import * as FsPromises from './detectors/fs/promises';
14
+ import * as FsCallbacks from './detectors/fs/callbacks';
15
+ import * as TextIOS from './detectors/text/ios';
16
+ import * as TextAndroid from './detectors/text/android';
17
+
18
+ export type HeuristicExtractionParams = {
19
+ facts: ReadonlyArray<Fact>;
20
+ detectedPlatforms: {
21
+ ios?: { detected: boolean };
22
+ android?: { detected: boolean };
23
+ frontend?: { detected: boolean };
24
+ backend?: { detected: boolean };
25
+ };
26
+ };
27
+
28
+ export type ExtractedHeuristicFact = HeuristicFact & { source: string };
29
+
30
+ const HEURISTIC_SOURCE = 'heuristics:ast';
31
+
32
+ // --- Helper Functions ---
33
+
34
+ const isTypeScriptHeuristicTargetPath = (path: string): boolean => {
35
+ return (
36
+ (path.endsWith('.ts') || path.endsWith('.tsx')) &&
37
+ (path.startsWith('apps/frontend/') ||
38
+ path.startsWith('apps/web/') ||
39
+ path.startsWith('apps/backend/'))
40
+ );
41
+ };
42
+
43
+ const isIOSSwiftPath = (path: string): boolean => {
44
+ return path.endsWith('.swift') && path.startsWith('apps/ios/');
45
+ };
46
+
47
+ const isAndroidKotlinPath = (path: string): boolean => {
48
+ return (path.endsWith('.kt') || path.endsWith('.kts')) && path.startsWith('apps/android/');
49
+ };
50
+
51
+ const isApprovedIOSBridgePath = (path: string): boolean => {
52
+ const normalized = path.toLowerCase();
53
+ return (
54
+ normalized.includes('/bridge/') ||
55
+ normalized.includes('/bridges/') ||
56
+ normalized.endsWith('bridge.swift')
57
+ );
58
+ };
59
+
60
+ const isTestPath = (path: string): boolean => {
61
+ return (
62
+ path.includes('/__tests__/') ||
63
+ path.includes('/tests/') ||
64
+ path.endsWith('.spec.ts') ||
65
+ path.endsWith('.spec.tsx') ||
66
+ path.endsWith('.test.ts') ||
67
+ path.endsWith('.test.tsx') ||
68
+ path.endsWith('.spec.js') ||
69
+ path.endsWith('.spec.jsx') ||
70
+ path.endsWith('.test.js') ||
71
+ path.endsWith('.test.jsx')
72
+ );
73
+ };
74
+
75
+ const isSwiftTestPath = (path: string): boolean => {
76
+ return (
77
+ path.includes('/Tests/') ||
78
+ path.includes('/tests/') ||
79
+ path.endsWith('Tests.swift') ||
80
+ path.endsWith('Test.swift')
81
+ );
82
+ };
83
+
84
+ const isKotlinTestPath = (path: string): boolean => {
85
+ const normalized = path.toLowerCase();
86
+ return (
87
+ normalized.includes('/test/') ||
88
+ normalized.includes('/androidtest/') ||
89
+ normalized.endsWith('test.kt') ||
90
+ normalized.endsWith('tests.kt')
91
+ );
92
+ };
93
+
94
+ const asFileContentFact = (fact: Fact): FileContentFact | undefined => {
95
+ if (fact.kind !== 'FileContent') {
96
+ return undefined;
97
+ }
98
+ return fact;
99
+ };
100
+
101
+ const hasDetectedHeuristicPlatform = (params: HeuristicExtractionParams): boolean => {
102
+ return Boolean(
103
+ params.detectedPlatforms.frontend?.detected ||
104
+ params.detectedPlatforms.backend?.detected ||
105
+ params.detectedPlatforms.ios?.detected ||
106
+ params.detectedPlatforms.android?.detected
107
+ );
108
+ };
109
+
110
+ const createHeuristicFact = (params: {
111
+ ruleId: string;
112
+ code: string;
113
+ message: string;
114
+ filePath?: string;
115
+ severity?: HeuristicFact['severity'];
116
+ }): ExtractedHeuristicFact => {
117
+ return {
118
+ kind: 'Heuristic',
119
+ source: HEURISTIC_SOURCE,
120
+ ruleId: params.ruleId,
121
+ severity: params.severity ?? 'WARN',
122
+ code: params.code,
123
+ message: params.message,
124
+ filePath: params.filePath,
125
+ };
126
+ };
127
+
128
+ // --- Registries ---
129
+
130
+ type ASTDetectorRegistryEntry = {
131
+ readonly detect: (ast: unknown) => boolean;
132
+ readonly ruleId: string;
133
+ readonly code: string;
134
+ readonly message: string;
135
+ };
136
+
137
+ const astDetectorRegistry: ReadonlyArray<ASTDetectorRegistryEntry> = [
138
+ // TypeScript
139
+ { detect: TS.hasEmptyCatchClause, ruleId: 'heuristics.ts.empty-catch.ast', code: 'HEURISTICS_EMPTY_CATCH_AST', message: 'AST heuristic detected an empty catch block.' },
140
+ { detect: TS.hasExplicitAnyType, ruleId: 'heuristics.ts.explicit-any.ast', code: 'HEURISTICS_EXPLICIT_ANY_AST', message: 'AST heuristic detected explicit any usage.' },
141
+ { detect: TS.hasConsoleLogCall, ruleId: 'heuristics.ts.console-log.ast', code: 'HEURISTICS_CONSOLE_LOG_AST', message: 'AST heuristic detected console.log usage.' },
142
+ { detect: TS.hasConsoleErrorCall, ruleId: 'heuristics.ts.console-error.ast', code: 'HEURISTICS_CONSOLE_ERROR_AST', message: 'AST heuristic detected console.error usage.' },
143
+ { detect: TS.hasEvalCall, ruleId: 'heuristics.ts.eval.ast', code: 'HEURISTICS_EVAL_AST', message: 'AST heuristic detected eval usage.' },
144
+ { detect: TS.hasFunctionConstructorUsage, ruleId: 'heuristics.ts.function-constructor.ast', code: 'HEURISTICS_FUNCTION_CONSTRUCTOR_AST', message: 'AST heuristic detected Function constructor usage.' },
145
+ { detect: TS.hasSetTimeoutStringCallback, ruleId: 'heuristics.ts.set-timeout-string.ast', code: 'HEURISTICS_SET_TIMEOUT_STRING_AST', message: 'AST heuristic detected setTimeout with a string callback.' },
146
+ { detect: TS.hasSetIntervalStringCallback, ruleId: 'heuristics.ts.set-interval-string.ast', code: 'HEURISTICS_SET_INTERVAL_STRING_AST', message: 'AST heuristic detected setInterval with a string callback.' },
147
+ { detect: TS.hasAsyncPromiseExecutor, ruleId: 'heuristics.ts.new-promise-async.ast', code: 'HEURISTICS_NEW_PROMISE_ASYNC_AST', message: 'AST heuristic detected async Promise executor usage.' },
148
+ { detect: TS.hasWithStatement, ruleId: 'heuristics.ts.with-statement.ast', code: 'HEURISTICS_WITH_STATEMENT_AST', message: 'AST heuristic detected with-statement usage.' },
149
+ { detect: TS.hasDeleteOperator, ruleId: 'heuristics.ts.delete-operator.ast', code: 'HEURISTICS_DELETE_OPERATOR_AST', message: 'AST heuristic detected delete-operator usage.' },
150
+ { detect: TS.hasDebuggerStatement, ruleId: 'heuristics.ts.debugger.ast', code: 'HEURISTICS_DEBUGGER_AST', message: 'AST heuristic detected debugger statement usage.' },
151
+
152
+ // Process
153
+ { detect: Process.hasProcessExitCall, ruleId: 'heuristics.ts.process-exit.ast', code: 'HEURISTICS_PROCESS_EXIT_AST', message: 'AST heuristic detected process.exit usage.' },
154
+ { detect: Process.hasChildProcessImport, ruleId: 'heuristics.ts.child-process-import.ast', code: 'HEURISTICS_CHILD_PROCESS_IMPORT_AST', message: 'AST heuristic detected child_process import/require usage.' },
155
+ { detect: Process.hasProcessEnvMutation, ruleId: 'heuristics.ts.process-env-mutation.ast', code: 'HEURISTICS_PROCESS_ENV_MUTATION_AST', message: 'AST heuristic detected process.env mutation.' },
156
+ { detect: Process.hasExecSyncCall, ruleId: 'heuristics.ts.child-process-exec-sync.ast', code: 'HEURISTICS_CHILD_PROCESS_EXEC_SYNC_AST', message: 'AST heuristic detected execSync usage.' },
157
+ { detect: Process.hasExecCall, ruleId: 'heuristics.ts.child-process-exec.ast', code: 'HEURISTICS_CHILD_PROCESS_EXEC_AST', message: 'AST heuristic detected exec usage.' },
158
+ { detect: Process.hasDynamicShellInvocationCall, ruleId: 'heuristics.ts.dynamic-shell-invocation.ast', code: 'HEURISTICS_DYNAMIC_SHELL_INVOCATION_AST', message: 'AST heuristic detected dynamic shell command invocation.' },
159
+ { detect: Process.hasChildProcessShellTrueCall, ruleId: 'heuristics.ts.child-process-shell-true.ast', code: 'HEURISTICS_CHILD_PROCESS_SHELL_TRUE_AST', message: 'AST heuristic detected child_process call with shell=true.' },
160
+ { detect: Process.hasExecFileUntrustedArgsCall, ruleId: 'heuristics.ts.child-process-exec-file-untrusted-args.ast', code: 'HEURISTICS_CHILD_PROCESS_EXEC_FILE_UNTRUSTED_ARGS_AST', message: 'AST heuristic detected execFile/execFileSync with non-literal args array.' },
161
+ { detect: Process.hasSpawnSyncCall, ruleId: 'heuristics.ts.child-process-spawn-sync.ast', code: 'HEURISTICS_CHILD_PROCESS_SPAWN_SYNC_AST', message: 'AST heuristic detected spawnSync usage.' },
162
+ { detect: Process.hasSpawnCall, ruleId: 'heuristics.ts.child-process-spawn.ast', code: 'HEURISTICS_CHILD_PROCESS_SPAWN_AST', message: 'AST heuristic detected spawn usage.' },
163
+ { detect: Process.hasForkCall, ruleId: 'heuristics.ts.child-process-fork.ast', code: 'HEURISTICS_CHILD_PROCESS_FORK_AST', message: 'AST heuristic detected fork usage.' },
164
+ { detect: Process.hasExecFileSyncCall, ruleId: 'heuristics.ts.child-process-exec-file-sync.ast', code: 'HEURISTICS_CHILD_PROCESS_EXEC_FILE_SYNC_AST', message: 'AST heuristic detected execFileSync usage.' },
165
+ { detect: Process.hasExecFileCall, ruleId: 'heuristics.ts.child-process-exec-file.ast', code: 'HEURISTICS_CHILD_PROCESS_EXEC_FILE_AST', message: 'AST heuristic detected execFile usage.' },
166
+
167
+ // Security
168
+ { detect: Security.hasHardcodedSecretTokenLiteral, ruleId: 'heuristics.ts.hardcoded-secret-token.ast', code: 'HEURISTICS_HARDCODED_SECRET_TOKEN_AST', message: 'AST heuristic detected hardcoded secret/token literal.' },
169
+ { detect: Security.hasWeakCryptoHashCreateHashCall, ruleId: 'heuristics.ts.weak-crypto-hash.ast', code: 'HEURISTICS_WEAK_CRYPTO_HASH_AST', message: 'AST heuristic detected weak crypto hash usage (md5/sha1).' },
170
+ { detect: Security.hasInsecureTokenGenerationWithMathRandom, ruleId: 'heuristics.ts.insecure-token-math-random.ast', code: 'HEURISTICS_INSECURE_TOKEN_MATH_RANDOM_AST', message: 'AST heuristic detected insecure token generation via Math.random.' },
171
+ { detect: Security.hasInsecureTokenGenerationWithDateNow, ruleId: 'heuristics.ts.insecure-token-date-now.ast', code: 'HEURISTICS_INSECURE_TOKEN_DATE_NOW_AST', message: 'AST heuristic detected insecure token generation via Date.now.' },
172
+ { detect: Security.hasWeakTokenGenerationWithCryptoRandomUuid, ruleId: 'heuristics.ts.weak-token-randomuuid.ast', code: 'HEURISTICS_WEAK_TOKEN_RANDOMUUID_AST', message: 'AST heuristic detected weak token generation via crypto.randomUUID.' },
173
+ { detect: Security.hasJwtDecodeWithoutVerifyCall, ruleId: 'heuristics.ts.jwt-decode-without-verify.ast', code: 'HEURISTICS_JWT_DECODE_WITHOUT_VERIFY_AST', message: 'AST heuristic detected jsonwebtoken.decode usage without verify.' },
174
+ { detect: Security.hasJwtVerifyIgnoreExpirationCall, ruleId: 'heuristics.ts.jwt-verify-ignore-expiration.ast', code: 'HEURISTICS_JWT_VERIFY_IGNORE_EXPIRATION_AST', message: 'AST heuristic detected jsonwebtoken.verify with ignoreExpiration=true.' },
175
+ { detect: Security.hasJwtSignWithoutExpirationCall, ruleId: 'heuristics.ts.jwt-sign-no-expiration.ast', code: 'HEURISTICS_JWT_SIGN_NO_EXPIRATION_AST', message: 'AST heuristic detected jsonwebtoken.sign without expiration.' },
176
+ { detect: Security.hasTlsRejectUnauthorizedFalseOption, ruleId: 'heuristics.ts.tls-reject-unauthorized-false.ast', code: 'HEURISTICS_TLS_REJECT_UNAUTHORIZED_FALSE_AST', message: 'AST heuristic detected TLS rejectUnauthorized=false configuration.' },
177
+ { detect: Security.hasTlsEnvRejectUnauthorizedZeroOverride, ruleId: 'heuristics.ts.tls-env-override.ast', code: 'HEURISTICS_TLS_ENV_OVERRIDE_AST', message: 'AST heuristic detected NODE_TLS_REJECT_UNAUTHORIZED=0 override.' },
178
+ { detect: Security.hasBufferAllocUnsafeCall, ruleId: 'heuristics.ts.buffer-alloc-unsafe.ast', code: 'HEURISTICS_BUFFER_ALLOC_UNSAFE_AST', message: 'AST heuristic detected Buffer.allocUnsafe usage.' },
179
+ { detect: Security.hasBufferAllocUnsafeSlowCall, ruleId: 'heuristics.ts.buffer-alloc-unsafe-slow.ast', code: 'HEURISTICS_BUFFER_ALLOC_UNSAFE_SLOW_AST', message: 'AST heuristic detected Buffer.allocUnsafeSlow usage.' },
180
+
181
+ // Browser
182
+ { detect: Browser.hasInnerHtmlAssignment, ruleId: 'heuristics.ts.inner-html.ast', code: 'HEURISTICS_INNER_HTML_AST', message: 'AST heuristic detected innerHTML assignment.' },
183
+ { detect: Browser.hasDocumentWriteCall, ruleId: 'heuristics.ts.document-write.ast', code: 'HEURISTICS_DOCUMENT_WRITE_AST', message: 'AST heuristic detected document.write usage.' },
184
+ { detect: Browser.hasInsertAdjacentHtmlCall, ruleId: 'heuristics.ts.insert-adjacent-html.ast', code: 'HEURISTICS_INSERT_ADJACENT_HTML_AST', message: 'AST heuristic detected insertAdjacentHTML usage.' },
185
+
186
+ // VM
187
+ { detect: VM.hasVmDynamicCodeExecutionCall, ruleId: 'heuristics.ts.vm-dynamic-code-execution.ast', code: 'HEURISTICS_VM_DYNAMIC_CODE_EXECUTION_AST', message: 'AST heuristic detected vm dynamic code execution call.' },
188
+
189
+ // FS Sync
190
+ { detect: FsSync.hasFsWriteFileSyncCall, ruleId: 'heuristics.ts.fs-write-file-sync.ast', code: 'HEURISTICS_FS_WRITE_FILE_SYNC_AST', message: 'AST heuristic detected fs.writeFileSync usage.' },
191
+ { detect: FsSync.hasFsRmSyncCall, ruleId: 'heuristics.ts.fs-rm-sync.ast', code: 'HEURISTICS_FS_RM_SYNC_AST', message: 'AST heuristic detected fs.rmSync usage.' },
192
+ { detect: FsSync.hasFsMkdirSyncCall, ruleId: 'heuristics.ts.fs-mkdir-sync.ast', code: 'HEURISTICS_FS_MKDIR_SYNC_AST', message: 'AST heuristic detected fs.mkdirSync usage.' },
193
+ { detect: FsSync.hasFsReaddirSyncCall, ruleId: 'heuristics.ts.fs-readdir-sync.ast', code: 'HEURISTICS_FS_READDIR_SYNC_AST', message: 'AST heuristic detected fs.readdirSync usage.' },
194
+ { detect: FsSync.hasFsReadFileSyncCall, ruleId: 'heuristics.ts.fs-read-file-sync.ast', code: 'HEURISTICS_FS_READ_FILE_SYNC_AST', message: 'AST heuristic detected fs.readFileSync usage.' },
195
+ { detect: FsSync.hasFsStatSyncCall, ruleId: 'heuristics.ts.fs-stat-sync.ast', code: 'HEURISTICS_FS_STAT_SYNC_AST', message: 'AST heuristic detected fs.statSync usage.' },
196
+ { detect: FsSync.hasFsStatfsSyncCall, ruleId: 'heuristics.ts.fs-statfs-sync.ast', code: 'HEURISTICS_FS_STATFS_SYNC_AST', message: 'AST heuristic detected fs.statfsSync usage.' },
197
+ { detect: FsSync.hasFsRealpathSyncCall, ruleId: 'heuristics.ts.fs-realpath-sync.ast', code: 'HEURISTICS_FS_REALPATH_SYNC_AST', message: 'AST heuristic detected fs.realpathSync usage.' },
198
+ { detect: FsSync.hasFsLstatSyncCall, ruleId: 'heuristics.ts.fs-lstat-sync.ast', code: 'HEURISTICS_FS_LSTAT_SYNC_AST', message: 'AST heuristic detected fs.lstatSync usage.' },
199
+ { detect: FsSync.hasFsExistsSyncCall, ruleId: 'heuristics.ts.fs-exists-sync.ast', code: 'HEURISTICS_FS_EXISTS_SYNC_AST', message: 'AST heuristic detected fs.existsSync usage.' },
200
+ { detect: FsSync.hasFsAccessSyncCall, ruleId: 'heuristics.ts.fs-access-sync.ast', code: 'HEURISTICS_FS_ACCESS_SYNC_AST', message: 'AST heuristic detected fs.accessSync usage.' },
201
+ { detect: FsSync.hasFsUtimesSyncCall, ruleId: 'heuristics.ts.fs-utimes-sync.ast', code: 'HEURISTICS_FS_UTIMES_SYNC_AST', message: 'AST heuristic detected fs.utimesSync usage.' },
202
+ { detect: FsSync.hasFsRenameSyncCall, ruleId: 'heuristics.ts.fs-rename-sync.ast', code: 'HEURISTICS_FS_RENAME_SYNC_AST', message: 'AST heuristic detected fs.renameSync usage.' },
203
+ { detect: FsSync.hasFsCopyFileSyncCall, ruleId: 'heuristics.ts.fs-copy-file-sync.ast', code: 'HEURISTICS_FS_COPY_FILE_SYNC_AST', message: 'AST heuristic detected fs.copyFileSync usage.' },
204
+ { detect: FsSync.hasFsUnlinkSyncCall, ruleId: 'heuristics.ts.fs-unlink-sync.ast', code: 'HEURISTICS_FS_UNLINK_SYNC_AST', message: 'AST heuristic detected fs.unlinkSync usage.' },
205
+ { detect: FsSync.hasFsTruncateSyncCall, ruleId: 'heuristics.ts.fs-truncate-sync.ast', code: 'HEURISTICS_FS_TRUNCATE_SYNC_AST', message: 'AST heuristic detected fs.truncateSync usage.' },
206
+ { detect: FsSync.hasFsRmdirSyncCall, ruleId: 'heuristics.ts.fs-rmdir-sync.ast', code: 'HEURISTICS_FS_RMDIR_SYNC_AST', message: 'AST heuristic detected fs.rmdirSync usage.' },
207
+ { detect: FsSync.hasFsChmodSyncCall, ruleId: 'heuristics.ts.fs-chmod-sync.ast', code: 'HEURISTICS_FS_CHMOD_SYNC_AST', message: 'AST heuristic detected fs.chmodSync usage.' },
208
+ { detect: FsSync.hasFsChownSyncCall, ruleId: 'heuristics.ts.fs-chown-sync.ast', code: 'HEURISTICS_FS_CHOWN_SYNC_AST', message: 'AST heuristic detected fs.chownSync usage.' },
209
+ { detect: FsSync.hasFsFchownSyncCall, ruleId: 'heuristics.ts.fs-fchown-sync.ast', code: 'HEURISTICS_FS_FCHOWN_SYNC_AST', message: 'AST heuristic detected fs.fchownSync usage.' },
210
+ { detect: FsSync.hasFsFchmodSyncCall, ruleId: 'heuristics.ts.fs-fchmod-sync.ast', code: 'HEURISTICS_FS_FCHMOD_SYNC_AST', message: 'AST heuristic detected fs.fchmodSync usage.' },
211
+ { detect: FsSync.hasFsFstatSyncCall, ruleId: 'heuristics.ts.fs-fstat-sync.ast', code: 'HEURISTICS_FS_FSTAT_SYNC_AST', message: 'AST heuristic detected fs.fstatSync usage.' },
212
+ { detect: FsSync.hasFsFtruncateSyncCall, ruleId: 'heuristics.ts.fs-ftruncate-sync.ast', code: 'HEURISTICS_FS_FTRUNCATE_SYNC_AST', message: 'AST heuristic detected fs.ftruncateSync usage.' },
213
+ { detect: FsSync.hasFsFutimesSyncCall, ruleId: 'heuristics.ts.fs-futimes-sync.ast', code: 'HEURISTICS_FS_FUTIMES_SYNC_AST', message: 'AST heuristic detected fs.futimesSync usage.' },
214
+ { detect: FsSync.hasFsLutimesSyncCall, ruleId: 'heuristics.ts.fs-lutimes-sync.ast', code: 'HEURISTICS_FS_LUTIMES_SYNC_AST', message: 'AST heuristic detected fs.lutimesSync usage.' },
215
+ { detect: FsSync.hasFsReadvSyncCall, ruleId: 'heuristics.ts.fs-readv-sync.ast', code: 'HEURISTICS_FS_READV_SYNC_AST', message: 'AST heuristic detected fs.readvSync usage.' },
216
+ { detect: FsSync.hasFsWritevSyncCall, ruleId: 'heuristics.ts.fs-writev-sync.ast', code: 'HEURISTICS_FS_WRITEV_SYNC_AST', message: 'AST heuristic detected fs.writevSync usage.' },
217
+ { detect: FsSync.hasFsWriteSyncCall, ruleId: 'heuristics.ts.fs-write-sync.ast', code: 'HEURISTICS_FS_WRITE_SYNC_AST', message: 'AST heuristic detected fs.writeSync usage.' },
218
+ { detect: FsSync.hasFsFsyncSyncCall, ruleId: 'heuristics.ts.fs-fsync-sync.ast', code: 'HEURISTICS_FS_FSYNC_SYNC_AST', message: 'AST heuristic detected fs.fsyncSync usage.' },
219
+ { detect: FsSync.hasFsFdatasyncSyncCall, ruleId: 'heuristics.ts.fs-fdatasync-sync.ast', code: 'HEURISTICS_FS_FDATASYNC_SYNC_AST', message: 'AST heuristic detected fs.fdatasyncSync usage.' },
220
+ { detect: FsSync.hasFsCloseSyncCall, ruleId: 'heuristics.ts.fs-close-sync.ast', code: 'HEURISTICS_FS_CLOSE_SYNC_AST', message: 'AST heuristic detected fs.closeSync usage.' },
221
+ { detect: FsSync.hasFsReadSyncCall, ruleId: 'heuristics.ts.fs-read-sync.ast', code: 'HEURISTICS_FS_READ_SYNC_AST', message: 'AST heuristic detected fs.readSync usage.' },
222
+ { detect: FsSync.hasFsReadlinkSyncCall, ruleId: 'heuristics.ts.fs-readlink-sync.ast', code: 'HEURISTICS_FS_READLINK_SYNC_AST', message: 'AST heuristic detected fs.readlinkSync usage.' },
223
+ { detect: FsSync.hasFsSymlinkSyncCall, ruleId: 'heuristics.ts.fs-symlink-sync.ast', code: 'HEURISTICS_FS_SYMLINK_SYNC_AST', message: 'AST heuristic detected fs.symlinkSync usage.' },
224
+ { detect: FsSync.hasFsLinkSyncCall, ruleId: 'heuristics.ts.fs-link-sync.ast', code: 'HEURISTICS_FS_LINK_SYNC_AST', message: 'AST heuristic detected fs.linkSync usage.' },
225
+ { detect: FsSync.hasFsCpSyncCall, ruleId: 'heuristics.ts.fs-cp-sync.ast', code: 'HEURISTICS_FS_CP_SYNC_AST', message: 'AST heuristic detected fs.cpSync usage.' },
226
+ { detect: FsSync.hasFsOpenSyncCall, ruleId: 'heuristics.ts.fs-open-sync.ast', code: 'HEURISTICS_FS_OPEN_SYNC_AST', message: 'AST heuristic detected fs.openSync usage.' },
227
+ { detect: FsSync.hasFsOpendirSyncCall, ruleId: 'heuristics.ts.fs-opendir-sync.ast', code: 'HEURISTICS_FS_OPENDIR_SYNC_AST', message: 'AST heuristic detected fs.opendirSync usage.' },
228
+ { detect: FsSync.hasFsMkdtempSyncCall, ruleId: 'heuristics.ts.fs-mkdtemp-sync.ast', code: 'HEURISTICS_FS_MKDTEMP_SYNC_AST', message: 'AST heuristic detected fs.mkdtempSync usage.' },
229
+ { detect: FsSync.hasFsAppendFileSyncCall, ruleId: 'heuristics.ts.fs-append-file-sync.ast', code: 'HEURISTICS_FS_APPEND_FILE_SYNC_AST', message: 'AST heuristic detected fs.appendFileSync usage.' },
230
+
231
+ // FS Promises
232
+ { detect: FsPromises.hasFsPromisesWriteFileCall, ruleId: 'heuristics.ts.fs-promises-write-file.ast', code: 'HEURISTICS_FS_PROMISES_WRITE_FILE_AST', message: 'AST heuristic detected fs.promises.writeFile usage.' },
233
+ { detect: FsPromises.hasFsPromisesAppendFileCall, ruleId: 'heuristics.ts.fs-promises-append-file.ast', code: 'HEURISTICS_FS_PROMISES_APPEND_FILE_AST', message: 'AST heuristic detected fs.promises.appendFile usage.' },
234
+ { detect: FsPromises.hasFsPromisesRmCall, ruleId: 'heuristics.ts.fs-promises-rm.ast', code: 'HEURISTICS_FS_PROMISES_RM_AST', message: 'AST heuristic detected fs.promises.rm usage.' },
235
+ { detect: FsPromises.hasFsPromisesUnlinkCall, ruleId: 'heuristics.ts.fs-promises-unlink.ast', code: 'HEURISTICS_FS_PROMISES_UNLINK_AST', message: 'AST heuristic detected fs.promises.unlink usage.' },
236
+ { detect: FsPromises.hasFsPromisesReadFileCall, ruleId: 'heuristics.ts.fs-promises-read-file.ast', code: 'HEURISTICS_FS_PROMISES_READ_FILE_AST', message: 'AST heuristic detected fs.promises.readFile usage.' },
237
+ { detect: FsPromises.hasFsPromisesReaddirCall, ruleId: 'heuristics.ts.fs-promises-readdir.ast', code: 'HEURISTICS_FS_PROMISES_READDIR_AST', message: 'AST heuristic detected fs.promises.readdir usage.' },
238
+ { detect: FsPromises.hasFsPromisesMkdirCall, ruleId: 'heuristics.ts.fs-promises-mkdir.ast', code: 'HEURISTICS_FS_PROMISES_MKDIR_AST', message: 'AST heuristic detected fs.promises.mkdir usage.' },
239
+ { detect: FsPromises.hasFsPromisesStatCall, ruleId: 'heuristics.ts.fs-promises-stat.ast', code: 'HEURISTICS_FS_PROMISES_STAT_AST', message: 'AST heuristic detected fs.promises.stat usage.' },
240
+ { detect: FsPromises.hasFsPromisesCopyFileCall, ruleId: 'heuristics.ts.fs-promises-copy-file.ast', code: 'HEURISTICS_FS_PROMISES_COPY_FILE_AST', message: 'AST heuristic detected fs.promises.copyFile usage.' },
241
+ { detect: FsPromises.hasFsPromisesRenameCall, ruleId: 'heuristics.ts.fs-promises-rename.ast', code: 'HEURISTICS_FS_PROMISES_RENAME_AST', message: 'AST heuristic detected fs.promises.rename usage.' },
242
+ { detect: FsPromises.hasFsPromisesAccessCall, ruleId: 'heuristics.ts.fs-promises-access.ast', code: 'HEURISTICS_FS_PROMISES_ACCESS_AST', message: 'AST heuristic detected fs.promises.access usage.' },
243
+ { detect: FsPromises.hasFsPromisesChmodCall, ruleId: 'heuristics.ts.fs-promises-chmod.ast', code: 'HEURISTICS_FS_PROMISES_CHMOD_AST', message: 'AST heuristic detected fs.promises.chmod usage.' },
244
+ { detect: FsPromises.hasFsPromisesChownCall, ruleId: 'heuristics.ts.fs-promises-chown.ast', code: 'HEURISTICS_FS_PROMISES_CHOWN_AST', message: 'AST heuristic detected fs.promises.chown usage.' },
245
+ { detect: FsPromises.hasFsPromisesUtimesCall, ruleId: 'heuristics.ts.fs-promises-utimes.ast', code: 'HEURISTICS_FS_PROMISES_UTIMES_AST', message: 'AST heuristic detected fs.promises.utimes usage.' },
246
+ { detect: FsPromises.hasFsPromisesLstatCall, ruleId: 'heuristics.ts.fs-promises-lstat.ast', code: 'HEURISTICS_FS_PROMISES_LSTAT_AST', message: 'AST heuristic detected fs.promises.lstat usage.' },
247
+ { detect: FsPromises.hasFsPromisesRealpathCall, ruleId: 'heuristics.ts.fs-promises-realpath.ast', code: 'HEURISTICS_FS_PROMISES_REALPATH_AST', message: 'AST heuristic detected fs.promises.realpath usage.' },
248
+ { detect: FsPromises.hasFsPromisesSymlinkCall, ruleId: 'heuristics.ts.fs-promises-symlink.ast', code: 'HEURISTICS_FS_PROMISES_SYMLINK_AST', message: 'AST heuristic detected fs.promises.symlink usage.' },
249
+ { detect: FsPromises.hasFsPromisesLinkCall, ruleId: 'heuristics.ts.fs-promises-link.ast', code: 'HEURISTICS_FS_PROMISES_LINK_AST', message: 'AST heuristic detected fs.promises.link usage.' },
250
+ { detect: FsPromises.hasFsPromisesReadlinkCall, ruleId: 'heuristics.ts.fs-promises-readlink.ast', code: 'HEURISTICS_FS_PROMISES_READLINK_AST', message: 'AST heuristic detected fs.promises.readlink usage.' },
251
+ { detect: FsPromises.hasFsPromisesOpenCall, ruleId: 'heuristics.ts.fs-promises-open.ast', code: 'HEURISTICS_FS_PROMISES_OPEN_AST', message: 'AST heuristic detected fs.promises.open usage.' },
252
+ { detect: FsPromises.hasFsPromisesOpendirCall, ruleId: 'heuristics.ts.fs-promises-opendir.ast', code: 'HEURISTICS_FS_PROMISES_OPENDIR_AST', message: 'AST heuristic detected fs.promises.opendir usage.' },
253
+ { detect: FsPromises.hasFsPromisesCpCall, ruleId: 'heuristics.ts.fs-promises-cp.ast', code: 'HEURISTICS_FS_PROMISES_CP_AST', message: 'AST heuristic detected fs.promises.cp usage.' },
254
+ { detect: FsPromises.hasFsPromisesMkdtempCall, ruleId: 'heuristics.ts.fs-promises-mkdtemp.ast', code: 'HEURISTICS_FS_PROMISES_MKDTEMP_AST', message: 'AST heuristic detected fs.promises.mkdtemp usage.' },
255
+
256
+ // FS Callbacks
257
+ { detect: FsCallbacks.hasFsUtimesCallbackCall, ruleId: 'heuristics.ts.fs-utimes-callback.ast', code: 'HEURISTICS_FS_UTIMES_CALLBACK_AST', message: 'AST heuristic detected fs.utimes callback usage.' },
258
+ { detect: FsCallbacks.hasFsWatchCallbackCall, ruleId: 'heuristics.ts.fs-watch-callback.ast', code: 'HEURISTICS_FS_WATCH_CALLBACK_AST', message: 'AST heuristic detected fs.watch callback usage.' },
259
+ { detect: FsCallbacks.hasFsWatchFileCallbackCall, ruleId: 'heuristics.ts.fs-watch-file-callback.ast', code: 'HEURISTICS_FS_WATCH_FILE_CALLBACK_AST', message: 'AST heuristic detected fs.watchFile callback usage.' },
260
+ { detect: FsCallbacks.hasFsUnwatchFileCallbackCall, ruleId: 'heuristics.ts.fs-unwatch-file-callback.ast', code: 'HEURISTICS_FS_UNWATCH_FILE_CALLBACK_AST', message: 'AST heuristic detected fs.unwatchFile callback usage.' },
261
+ { detect: FsCallbacks.hasFsReadFileCallbackCall, ruleId: 'heuristics.ts.fs-read-file-callback.ast', code: 'HEURISTICS_FS_READ_FILE_CALLBACK_AST', message: 'AST heuristic detected fs.readFile callback usage.' },
262
+ { detect: FsCallbacks.hasFsExistsCallbackCall, ruleId: 'heuristics.ts.fs-exists-callback.ast', code: 'HEURISTICS_FS_EXISTS_CALLBACK_AST', message: 'AST heuristic detected fs.exists callback usage.' },
263
+ { detect: FsCallbacks.hasFsWriteFileCallbackCall, ruleId: 'heuristics.ts.fs-write-file-callback.ast', code: 'HEURISTICS_FS_WRITE_FILE_CALLBACK_AST', message: 'AST heuristic detected fs.writeFile callback usage.' },
264
+ { detect: FsCallbacks.hasFsAppendFileCallbackCall, ruleId: 'heuristics.ts.fs-append-file-callback.ast', code: 'HEURISTICS_FS_APPEND_FILE_CALLBACK_AST', message: 'AST heuristic detected fs.appendFile callback usage.' },
265
+ { detect: FsCallbacks.hasFsReaddirCallbackCall, ruleId: 'heuristics.ts.fs-readdir-callback.ast', code: 'HEURISTICS_FS_READDIR_CALLBACK_AST', message: 'AST heuristic detected fs.readdir callback usage.' },
266
+ { detect: FsCallbacks.hasFsMkdirCallbackCall, ruleId: 'heuristics.ts.fs-mkdir-callback.ast', code: 'HEURISTICS_FS_MKDIR_CALLBACK_AST', message: 'AST heuristic detected fs.mkdir callback usage.' },
267
+ { detect: FsCallbacks.hasFsRmdirCallbackCall, ruleId: 'heuristics.ts.fs-rmdir-callback.ast', code: 'HEURISTICS_FS_RMDIR_CALLBACK_AST', message: 'AST heuristic detected fs.rmdir callback usage.' },
268
+ { detect: FsCallbacks.hasFsRmCallbackCall, ruleId: 'heuristics.ts.fs-rm-callback.ast', code: 'HEURISTICS_FS_RM_CALLBACK_AST', message: 'AST heuristic detected fs.rm callback usage.' },
269
+ { detect: FsCallbacks.hasFsRenameCallbackCall, ruleId: 'heuristics.ts.fs-rename-callback.ast', code: 'HEURISTICS_FS_RENAME_CALLBACK_AST', message: 'AST heuristic detected fs.rename callback usage.' },
270
+ { detect: FsCallbacks.hasFsCopyFileCallbackCall, ruleId: 'heuristics.ts.fs-copy-file-callback.ast', code: 'HEURISTICS_FS_COPY_FILE_CALLBACK_AST', message: 'AST heuristic detected fs.copyFile callback usage.' },
271
+ { detect: FsCallbacks.hasFsStatCallbackCall, ruleId: 'heuristics.ts.fs-stat-callback.ast', code: 'HEURISTICS_FS_STAT_CALLBACK_AST', message: 'AST heuristic detected fs.stat callback usage.' },
272
+ { detect: FsCallbacks.hasFsStatfsCallbackCall, ruleId: 'heuristics.ts.fs-statfs-callback.ast', code: 'HEURISTICS_FS_STATFS_CALLBACK_AST', message: 'AST heuristic detected fs.statfs callback usage.' },
273
+ { detect: FsCallbacks.hasFsLstatCallbackCall, ruleId: 'heuristics.ts.fs-lstat-callback.ast', code: 'HEURISTICS_FS_LSTAT_CALLBACK_AST', message: 'AST heuristic detected fs.lstat callback usage.' },
274
+ { detect: FsCallbacks.hasFsRealpathCallbackCall, ruleId: 'heuristics.ts.fs-realpath-callback.ast', code: 'HEURISTICS_FS_REALPATH_CALLBACK_AST', message: 'AST heuristic detected fs.realpath callback usage.' },
275
+ { detect: FsCallbacks.hasFsAccessCallbackCall, ruleId: 'heuristics.ts.fs-access-callback.ast', code: 'HEURISTICS_FS_ACCESS_CALLBACK_AST', message: 'AST heuristic detected fs.access callback usage.' },
276
+ { detect: FsCallbacks.hasFsChmodCallbackCall, ruleId: 'heuristics.ts.fs-chmod-callback.ast', code: 'HEURISTICS_FS_CHMOD_CALLBACK_AST', message: 'AST heuristic detected fs.chmod callback usage.' },
277
+ { detect: FsCallbacks.hasFsChownCallbackCall, ruleId: 'heuristics.ts.fs-chown-callback.ast', code: 'HEURISTICS_FS_CHOWN_CALLBACK_AST', message: 'AST heuristic detected fs.chown callback usage.' },
278
+ { detect: FsCallbacks.hasFsLchownCallbackCall, ruleId: 'heuristics.ts.fs-lchown-callback.ast', code: 'HEURISTICS_FS_LCHOWN_CALLBACK_AST', message: 'AST heuristic detected fs.lchown callback usage.' },
279
+ { detect: FsCallbacks.hasFsLchmodCallbackCall, ruleId: 'heuristics.ts.fs-lchmod-callback.ast', code: 'HEURISTICS_FS_LCHMOD_CALLBACK_AST', message: 'AST heuristic detected fs.lchmod callback usage.' },
280
+ { detect: FsCallbacks.hasFsUnlinkCallbackCall, ruleId: 'heuristics.ts.fs-unlink-callback.ast', code: 'HEURISTICS_FS_UNLINK_CALLBACK_AST', message: 'AST heuristic detected fs.unlink callback usage.' },
281
+ { detect: FsCallbacks.hasFsReadlinkCallbackCall, ruleId: 'heuristics.ts.fs-readlink-callback.ast', code: 'HEURISTICS_FS_READLINK_CALLBACK_AST', message: 'AST heuristic detected fs.readlink callback usage.' },
282
+ { detect: FsCallbacks.hasFsSymlinkCallbackCall, ruleId: 'heuristics.ts.fs-symlink-callback.ast', code: 'HEURISTICS_FS_SYMLINK_CALLBACK_AST', message: 'AST heuristic detected fs.symlink callback usage.' },
283
+ { detect: FsCallbacks.hasFsLinkCallbackCall, ruleId: 'heuristics.ts.fs-link-callback.ast', code: 'HEURISTICS_FS_LINK_CALLBACK_AST', message: 'AST heuristic detected fs.link callback usage.' },
284
+ { detect: FsCallbacks.hasFsMkdtempCallbackCall, ruleId: 'heuristics.ts.fs-mkdtemp-callback.ast', code: 'HEURISTICS_FS_MKDTEMP_CALLBACK_AST', message: 'AST heuristic detected fs.mkdtemp callback usage.' },
285
+ { detect: FsCallbacks.hasFsOpendirCallbackCall, ruleId: 'heuristics.ts.fs-opendir-callback.ast', code: 'HEURISTICS_FS_OPENDIR_CALLBACK_AST', message: 'AST heuristic detected fs.opendir callback usage.' },
286
+ { detect: FsCallbacks.hasFsOpenCallbackCall, ruleId: 'heuristics.ts.fs-open-callback.ast', code: 'HEURISTICS_FS_OPEN_CALLBACK_AST', message: 'AST heuristic detected fs.open callback usage.' },
287
+ { detect: FsCallbacks.hasFsCpCallbackCall, ruleId: 'heuristics.ts.fs-cp-callback.ast', code: 'HEURISTICS_FS_CP_CALLBACK_AST', message: 'AST heuristic detected fs.cp callback usage.' },
288
+ { detect: FsCallbacks.hasFsCloseCallbackCall, ruleId: 'heuristics.ts.fs-close-callback.ast', code: 'HEURISTICS_FS_CLOSE_CALLBACK_AST', message: 'AST heuristic detected fs.close callback usage.' },
289
+ { detect: FsCallbacks.hasFsReadCallbackCall, ruleId: 'heuristics.ts.fs-read-callback.ast', code: 'HEURISTICS_FS_READ_CALLBACK_AST', message: 'AST heuristic detected fs.read callback usage.' },
290
+ { detect: FsCallbacks.hasFsReadvCallbackCall, ruleId: 'heuristics.ts.fs-readv-callback.ast', code: 'HEURISTICS_FS_READV_CALLBACK_AST', message: 'AST heuristic detected fs.readv callback usage.' },
291
+ { detect: FsCallbacks.hasFsWritevCallbackCall, ruleId: 'heuristics.ts.fs-writev-callback.ast', code: 'HEURISTICS_FS_WRITEV_CALLBACK_AST', message: 'AST heuristic detected fs.writev callback usage.' },
292
+ { detect: FsCallbacks.hasFsWriteCallbackCall, ruleId: 'heuristics.ts.fs-write-callback.ast', code: 'HEURISTICS_FS_WRITE_CALLBACK_AST', message: 'AST heuristic detected fs.write callback usage.' },
293
+ { detect: FsCallbacks.hasFsFsyncCallbackCall, ruleId: 'heuristics.ts.fs-fsync-callback.ast', code: 'HEURISTICS_FS_FSYNC_CALLBACK_AST', message: 'AST heuristic detected fs.fsync callback usage.' },
294
+ { detect: FsCallbacks.hasFsFdatasyncCallbackCall, ruleId: 'heuristics.ts.fs-fdatasync-callback.ast', code: 'HEURISTICS_FS_FDATASYNC_CALLBACK_AST', message: 'AST heuristic detected fs.fdatasync callback usage.' },
295
+ { detect: FsCallbacks.hasFsFchownCallbackCall, ruleId: 'heuristics.ts.fs-fchown-callback.ast', code: 'HEURISTICS_FS_FCHOWN_CALLBACK_AST', message: 'AST heuristic detected fs.fchown callback usage.' },
296
+ { detect: FsCallbacks.hasFsFchmodCallbackCall, ruleId: 'heuristics.ts.fs-fchmod-callback.ast', code: 'HEURISTICS_FS_FCHMOD_CALLBACK_AST', message: 'AST heuristic detected fs.fchmod callback usage.' },
297
+ { detect: FsCallbacks.hasFsFstatCallbackCall, ruleId: 'heuristics.ts.fs-fstat-callback.ast', code: 'HEURISTICS_FS_FSTAT_CALLBACK_AST', message: 'AST heuristic detected fs.fstat callback usage.' },
298
+ { detect: FsCallbacks.hasFsFtruncateCallbackCall, ruleId: 'heuristics.ts.fs-ftruncate-callback.ast', code: 'HEURISTICS_FS_FTRUNCATE_CALLBACK_AST', message: 'AST heuristic detected fs.ftruncate callback usage.' },
299
+ { detect: FsCallbacks.hasFsTruncateCallbackCall, ruleId: 'heuristics.ts.fs-truncate-callback.ast', code: 'HEURISTICS_FS_TRUNCATE_CALLBACK_AST', message: 'AST heuristic detected fs.truncate callback usage.' },
300
+ { detect: FsCallbacks.hasFsFutimesCallbackCall, ruleId: 'heuristics.ts.fs-futimes-callback.ast', code: 'HEURISTICS_FS_FUTIMES_CALLBACK_AST', message: 'AST heuristic detected fs.futimes callback usage.' },
301
+ { detect: FsCallbacks.hasFsLutimesCallbackCall, ruleId: 'heuristics.ts.fs-lutimes-callback.ast', code: 'HEURISTICS_FS_LUTIMES_CALLBACK_AST', message: 'AST heuristic detected fs.lutimes callback usage.' },
302
+ ];
303
+
304
+ type TextDetectorRegistryEntry = {
305
+ readonly platform: 'ios' | 'android';
306
+ readonly pathCheck: (path: string) => boolean;
307
+ readonly excludePaths: ReadonlyArray<(path: string) => boolean>;
308
+ readonly detect: (content: string) => boolean;
309
+ readonly ruleId: string;
310
+ readonly code: string;
311
+ readonly message: string;
312
+ };
313
+
314
+ const textDetectorRegistry: ReadonlyArray<TextDetectorRegistryEntry> = [
315
+ // iOS
316
+ { platform: 'ios', pathCheck: isIOSSwiftPath, excludePaths: [isSwiftTestPath], detect: TextIOS.hasSwiftForceUnwrap, ruleId: 'heuristics.ios.force-unwrap.ast', code: 'HEURISTICS_IOS_FORCE_UNWRAP_AST', message: 'AST heuristic detected force unwrap usage.' },
317
+ { platform: 'ios', pathCheck: isIOSSwiftPath, excludePaths: [isSwiftTestPath], detect: TextIOS.hasSwiftAnyViewUsage, ruleId: 'heuristics.ios.anyview.ast', code: 'HEURISTICS_IOS_ANYVIEW_AST', message: 'AST heuristic detected AnyView usage.' },
318
+ { platform: 'ios', pathCheck: isIOSSwiftPath, excludePaths: [isSwiftTestPath], detect: TextIOS.hasSwiftForceTryUsage, ruleId: 'heuristics.ios.force-try.ast', code: 'HEURISTICS_IOS_FORCE_TRY_AST', message: 'AST heuristic detected force try usage.' },
319
+ { platform: 'ios', pathCheck: isIOSSwiftPath, excludePaths: [isSwiftTestPath], detect: TextIOS.hasSwiftForceCastUsage, ruleId: 'heuristics.ios.force-cast.ast', code: 'HEURISTICS_IOS_FORCE_CAST_AST', message: 'AST heuristic detected force cast usage.' },
320
+ { platform: 'ios', pathCheck: isIOSSwiftPath, excludePaths: [isSwiftTestPath, isApprovedIOSBridgePath], detect: TextIOS.hasSwiftCallbackStyleSignature, ruleId: 'heuristics.ios.callback-style.ast', code: 'HEURISTICS_IOS_CALLBACK_STYLE_AST', message: 'AST heuristic detected callback-style API signature outside bridge layers.' },
321
+
322
+ // Android
323
+ { platform: 'android', pathCheck: isAndroidKotlinPath, excludePaths: [isKotlinTestPath], detect: TextAndroid.hasKotlinThreadSleepCall, ruleId: 'heuristics.android.thread-sleep.ast', code: 'HEURISTICS_ANDROID_THREAD_SLEEP_AST', message: 'AST heuristic detected Thread.sleep usage in production Kotlin code.' },
324
+ { platform: 'android', pathCheck: isAndroidKotlinPath, excludePaths: [isKotlinTestPath], detect: TextAndroid.hasKotlinGlobalScopeUsage, ruleId: 'heuristics.android.globalscope.ast', code: 'HEURISTICS_ANDROID_GLOBAL_SCOPE_AST', message: 'AST heuristic detected GlobalScope coroutine usage in production Kotlin code.' },
325
+ { platform: 'android', pathCheck: isAndroidKotlinPath, excludePaths: [isKotlinTestPath], detect: TextAndroid.hasKotlinRunBlockingUsage, ruleId: 'heuristics.android.run-blocking.ast', code: 'HEURISTICS_ANDROID_RUN_BLOCKING_AST', message: 'AST heuristic detected runBlocking usage in production Kotlin code.' },
326
+ ];
327
+
328
+ export const extractHeuristicFacts = (
329
+ params: HeuristicExtractionParams
330
+ ): ReadonlyArray<ExtractedHeuristicFact> => {
331
+ if (!hasDetectedHeuristicPlatform(params)) {
332
+ return [];
333
+ }
334
+
335
+ const heuristicFacts: ExtractedHeuristicFact[] = [];
336
+
337
+ for (const fact of params.facts) {
338
+ const fileFact = asFileContentFact(fact);
339
+ if (!fileFact) {
340
+ continue;
341
+ }
342
+
343
+ // Text-based heuristics
344
+ for (const entry of textDetectorRegistry) {
345
+ const platformDetected = params.detectedPlatforms[entry.platform]?.detected;
346
+ if (
347
+ platformDetected &&
348
+ entry.pathCheck(fileFact.path) &&
349
+ entry.excludePaths.every((exclude) => !exclude(fileFact.path)) &&
350
+ entry.detect(fileFact.content)
351
+ ) {
352
+ heuristicFacts.push(
353
+ createHeuristicFact({
354
+ ruleId: entry.ruleId,
355
+ code: entry.code,
356
+ message: entry.message,
357
+ filePath: fileFact.path,
358
+ })
359
+ );
360
+ }
361
+ }
362
+
363
+ // AST-based heuristics
364
+ const hasTypeScriptPlatform =
365
+ params.detectedPlatforms.frontend?.detected || params.detectedPlatforms.backend?.detected;
366
+ if (!hasTypeScriptPlatform || !isTypeScriptHeuristicTargetPath(fileFact.path) || isTestPath(fileFact.path)) {
367
+ continue;
368
+ }
369
+
370
+ try {
371
+ const ast = parse(fileFact.content, {
372
+ sourceType: 'unambiguous',
373
+ plugins: ['typescript', 'jsx'],
374
+ });
375
+
376
+ for (const entry of astDetectorRegistry) {
377
+ if (entry.detect(ast)) {
378
+ heuristicFacts.push(
379
+ createHeuristicFact({
380
+ ruleId: entry.ruleId,
381
+ code: entry.code,
382
+ message: entry.message,
383
+ filePath: fileFact.path,
384
+ })
385
+ );
386
+ }
387
+ }
388
+ } catch {
389
+ continue;
390
+ }
391
+ }
392
+
393
+ return heuristicFacts;
394
+ };
@@ -0,0 +1,72 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import {
4
+ extractHeuristicFacts,
5
+ type DependencyFact,
6
+ type Fact,
7
+ type FactSet,
8
+ type FileChangeFact,
9
+ type FileContentFact,
10
+ type HeuristicExtractionParams,
11
+ type HeuristicFact,
12
+ } from './index';
13
+
14
+ test('facts barrel expone tipos compatibles para Fact y FactSet', () => {
15
+ const fileChangeFact: FileChangeFact = {
16
+ kind: 'FileChange',
17
+ path: 'apps/backend/src/main.ts',
18
+ changeType: 'modified',
19
+ };
20
+ const dependencyFact: DependencyFact = {
21
+ kind: 'Dependency',
22
+ from: 'services/user',
23
+ to: 'repositories/user',
24
+ source: 'import graph',
25
+ };
26
+ const fileContentFact: FileContentFact = {
27
+ kind: 'FileContent',
28
+ path: 'apps/backend/src/main.ts',
29
+ content: 'export const ready = true;',
30
+ };
31
+ const heuristicFact: HeuristicFact = {
32
+ kind: 'Heuristic',
33
+ ruleId: 'heuristics.example.rule',
34
+ severity: 'WARN',
35
+ code: 'HEURISTICS_EXAMPLE_RULE',
36
+ message: 'Example heuristic fact.',
37
+ };
38
+
39
+ const facts: FactSet = [
40
+ { ...fileChangeFact, source: 'git' },
41
+ dependencyFact,
42
+ { ...fileContentFact, source: 'repo' },
43
+ { ...heuristicFact, source: 'heuristics:ast' },
44
+ ];
45
+ const firstFact: Fact = facts[0];
46
+
47
+ assert.equal(firstFact.kind, 'FileChange');
48
+ assert.equal(facts.length, 4);
49
+ });
50
+
51
+ test('facts barrel expone extractHeuristicFacts y permite retorno vacio sin plataformas detectadas', () => {
52
+ const params: HeuristicExtractionParams = {
53
+ facts: [
54
+ {
55
+ kind: 'FileContent',
56
+ source: 'repo',
57
+ path: 'apps/backend/src/app.ts',
58
+ content: 'console.log("hello")',
59
+ },
60
+ ],
61
+ detectedPlatforms: {
62
+ backend: { detected: false },
63
+ frontend: { detected: false },
64
+ ios: { detected: false },
65
+ android: { detected: false },
66
+ },
67
+ };
68
+
69
+ const extractedFacts = extractHeuristicFacts(params);
70
+
71
+ assert.deepEqual(extractedFacts, []);
72
+ });
@@ -0,0 +1,11 @@
1
+ export type { Fact } from './Fact';
2
+ export type { FactSet } from './FactSet';
3
+ export type { FileChangeFact } from './FileChangeFact';
4
+ export type { DependencyFact } from './DependencyFact';
5
+ export type { FileContentFact } from './FileContentFact';
6
+ export type { HeuristicFact } from './HeuristicFact';
7
+ export {
8
+ extractHeuristicFacts,
9
+ type HeuristicExtractionParams,
10
+ type ExtractedHeuristicFact,
11
+ } from './extractHeuristicFacts';