@mytechtoday/augment-extensions 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/augment-extensions/coding-standards/c/CHANGELOG.md +55 -0
  2. package/augment-extensions/coding-standards/c/LICENSE +22 -0
  3. package/augment-extensions/coding-standards/c/README.md +167 -0
  4. package/augment-extensions/coding-standards/c/config/defaults.json +26 -0
  5. package/augment-extensions/coding-standards/c/config/examples/embedded.yaml +25 -0
  6. package/augment-extensions/coding-standards/c/config/examples/systems.json +31 -0
  7. package/augment-extensions/coding-standards/c/config/schema.json +244 -0
  8. package/augment-extensions/coding-standards/c/docs/API.md +613 -0
  9. package/augment-extensions/coding-standards/c/docs/CONFIGURATION.md +259 -0
  10. package/augment-extensions/coding-standards/c/docs/USER_GUIDE.md +567 -0
  11. package/augment-extensions/coding-standards/c/examples/drivers/Makefile +33 -0
  12. package/augment-extensions/coding-standards/c/examples/drivers/README.md +192 -0
  13. package/augment-extensions/coding-standards/c/examples/drivers/dma-example.c +224 -0
  14. package/augment-extensions/coding-standards/c/examples/drivers/example.dts +64 -0
  15. package/augment-extensions/coding-standards/c/examples/drivers/platform-driver.c +174 -0
  16. package/augment-extensions/coding-standards/c/examples/embedded/README.md +167 -0
  17. package/augment-extensions/coding-standards/c/examples/embedded/gpio-control.c +172 -0
  18. package/augment-extensions/coding-standards/c/examples/embedded/timer-isr.c +198 -0
  19. package/augment-extensions/coding-standards/c/examples/embedded/uart-communication.c +212 -0
  20. package/augment-extensions/coding-standards/c/examples/kernel/Makefile +82 -0
  21. package/augment-extensions/coding-standards/c/examples/kernel/README.md +168 -0
  22. package/augment-extensions/coding-standards/c/examples/kernel/char-device.c +198 -0
  23. package/augment-extensions/coding-standards/c/examples/kernel/proc-file.c +131 -0
  24. package/augment-extensions/coding-standards/c/examples/kernel/simple-module.c +111 -0
  25. package/augment-extensions/coding-standards/c/examples/legacy/Makefile +62 -0
  26. package/augment-extensions/coding-standards/c/examples/legacy/README.md +255 -0
  27. package/augment-extensions/coding-standards/c/examples/legacy/c89-to-c11-migration.c +268 -0
  28. package/augment-extensions/coding-standards/c/examples/legacy/compatibility-layer.c +239 -0
  29. package/augment-extensions/coding-standards/c/examples/networking/Makefile +35 -0
  30. package/augment-extensions/coding-standards/c/examples/networking/README.md +207 -0
  31. package/augment-extensions/coding-standards/c/examples/networking/protocol-parser.c +270 -0
  32. package/augment-extensions/coding-standards/c/examples/networking/tcp-server.c +197 -0
  33. package/augment-extensions/coding-standards/c/examples/networking/udp-multicast.c +220 -0
  34. package/augment-extensions/coding-standards/c/examples/realtime/Makefile +53 -0
  35. package/augment-extensions/coding-standards/c/examples/realtime/README.md +199 -0
  36. package/augment-extensions/coding-standards/c/examples/realtime/deadline-monitoring.c +260 -0
  37. package/augment-extensions/coding-standards/c/examples/realtime/priority-scheduling.c +258 -0
  38. package/augment-extensions/coding-standards/c/examples/systems/Makefile +34 -0
  39. package/augment-extensions/coding-standards/c/examples/systems/README.md +123 -0
  40. package/augment-extensions/coding-standards/c/examples/systems/ipc-pipes.c +181 -0
  41. package/augment-extensions/coding-standards/c/examples/systems/process-management.c +153 -0
  42. package/augment-extensions/coding-standards/c/examples/systems/signal-handling.c +162 -0
  43. package/augment-extensions/coding-standards/c/module.json +149 -0
  44. package/augment-extensions/coding-standards/c/rules/categories/drivers.md +635 -0
  45. package/augment-extensions/coding-standards/c/rules/categories/embedded.md +510 -0
  46. package/augment-extensions/coding-standards/c/rules/categories/kernel.md +653 -0
  47. package/augment-extensions/coding-standards/c/rules/categories/legacy.md +526 -0
  48. package/augment-extensions/coding-standards/c/rules/categories/networking.md +735 -0
  49. package/augment-extensions/coding-standards/c/rules/categories/realtime.md +631 -0
  50. package/augment-extensions/coding-standards/c/rules/categories/systems.md +586 -0
  51. package/augment-extensions/coding-standards/c/rules/universal/const-correctness.md +275 -0
  52. package/augment-extensions/coding-standards/c/rules/universal/documentation.md +251 -0
  53. package/augment-extensions/coding-standards/c/rules/universal/error-handling.md +250 -0
  54. package/augment-extensions/coding-standards/c/rules/universal/header-guards.md +254 -0
  55. package/augment-extensions/coding-standards/c/rules/universal/memory-safety.md +233 -0
  56. package/augment-extensions/coding-standards/c/rules/universal/naming.md +146 -0
  57. package/augment-extensions/coding-standards/c/src/conflict-detector.ts +461 -0
  58. package/augment-extensions/coding-standards/c/src/prompt-generator.ts +307 -0
  59. package/augment-extensions/coding-standards/c/src/rule-evaluator.ts +307 -0
  60. package/augment-extensions/coding-standards/c/src/rule-override.ts +427 -0
  61. package/augment-extensions/coding-standards/c/src/template-engine.ts +217 -0
  62. package/augment-extensions/coding-standards/c/templates/prompts/drivers.txt +191 -0
  63. package/augment-extensions/coding-standards/c/templates/prompts/embedded.txt +164 -0
  64. package/augment-extensions/coding-standards/c/templates/prompts/kernel.txt +175 -0
  65. package/augment-extensions/coding-standards/c/templates/prompts/legacy.txt +280 -0
  66. package/augment-extensions/coding-standards/c/templates/prompts/networking.txt +259 -0
  67. package/augment-extensions/coding-standards/c/templates/prompts/realtime.txt +219 -0
  68. package/augment-extensions/coding-standards/c/templates/prompts/systems.txt +147 -0
  69. package/augment-extensions/coding-standards/c/tests/integration/category-specific.test.ts +356 -0
  70. package/augment-extensions/coding-standards/c/tests/integration/end-to-end-workflow.test.ts +377 -0
  71. package/augment-extensions/coding-standards/c/tests/performance/benchmarks.test.ts +407 -0
  72. package/augment-extensions/coding-standards/c/tests/unit/config-manager.test.ts +345 -0
  73. package/augment-extensions/coding-standards/c/tests/unit/conflict-detector.test.ts +294 -0
  74. package/augment-extensions/coding-standards/c/tests/unit/prompt-generator.test.ts +174 -0
  75. package/augment-extensions/coding-standards/c/tests/unit/registry.test.ts +313 -0
  76. package/augment-extensions/coding-standards/c/tests/unit/rule-evaluator.test.ts +318 -0
  77. package/augment-extensions/coding-standards/c/tests/unit/rule-override.test.ts +326 -0
  78. package/augment-extensions/coding-standards/c/tests/unit/template-engine.test.ts +314 -0
  79. package/augment-extensions/coding-standards/go/CHARACTER-COUNT-REPORT.md +135 -0
  80. package/augment-extensions/coding-standards/go/PHASE1-COMPLETION.md +146 -0
  81. package/augment-extensions/coding-standards/go/PHASE4-COMPLETION.md +184 -0
  82. package/augment-extensions/coding-standards/go/README.md +200 -0
  83. package/augment-extensions/coding-standards/go/VALIDATION-CHECKLIST.md +154 -0
  84. package/augment-extensions/coding-standards/go/config/examples/example-cli.json +15 -0
  85. package/augment-extensions/coding-standards/go/config/examples/example-microservices.json +21 -0
  86. package/augment-extensions/coding-standards/go/config/examples/example-multi-category.yaml +24 -0
  87. package/augment-extensions/coding-standards/go/config/examples/example-web.json +15 -0
  88. package/augment-extensions/coding-standards/go/config/schema.json +110 -0
  89. package/augment-extensions/coding-standards/go/docs/CATEGORIES.md +221 -0
  90. package/augment-extensions/coding-standards/go/docs/CONFIGURATION.md +198 -0
  91. package/augment-extensions/coding-standards/go/docs/TROUBLESHOOTING.md +285 -0
  92. package/augment-extensions/coding-standards/go/examples/cli/cobra-app.go +287 -0
  93. package/augment-extensions/coding-standards/go/examples/cloud-native-app.go +217 -0
  94. package/augment-extensions/coding-standards/go/examples/devops-tool.go +250 -0
  95. package/augment-extensions/coding-standards/go/examples/distributed-system.go +247 -0
  96. package/augment-extensions/coding-standards/go/examples/microservices/grpc-service.go +253 -0
  97. package/augment-extensions/coding-standards/go/examples/rest-api.go +270 -0
  98. package/augment-extensions/coding-standards/go/examples/web/http-server.go +224 -0
  99. package/augment-extensions/coding-standards/go/module.json +139 -0
  100. package/augment-extensions/coding-standards/go/rules/categories/api-development/api-versioning.md +149 -0
  101. package/augment-extensions/coding-standards/go/rules/categories/api-development/rate-limiting.md +209 -0
  102. package/augment-extensions/coding-standards/go/rules/categories/api-development/rest-api-design.md +183 -0
  103. package/augment-extensions/coding-standards/go/rules/categories/cloud-native/cloud-config.md +193 -0
  104. package/augment-extensions/coding-standards/go/rules/categories/cloud-native/health-checks.md +231 -0
  105. package/augment-extensions/coding-standards/go/rules/categories/cloud-native/kubernetes.md +180 -0
  106. package/augment-extensions/coding-standards/go/rules/categories/devops-tooling/automation.md +179 -0
  107. package/augment-extensions/coding-standards/go/rules/categories/devops-tooling/ci-cd-integration.md +147 -0
  108. package/augment-extensions/coding-standards/go/rules/categories/devops-tooling/infrastructure-as-code.md +231 -0
  109. package/augment-extensions/coding-standards/go/rules/categories/distributed-systems/caching.md +150 -0
  110. package/augment-extensions/coding-standards/go/rules/categories/distributed-systems/consensus.md +187 -0
  111. package/augment-extensions/coding-standards/go/rules/categories/distributed-systems/event-sourcing.md +246 -0
  112. package/augment-extensions/coding-standards/go/rules/cli/command-parsing.md +264 -0
  113. package/augment-extensions/coding-standards/go/rules/cli/configuration.md +268 -0
  114. package/augment-extensions/coding-standards/go/rules/cli/cross-platform.md +324 -0
  115. package/augment-extensions/coding-standards/go/rules/microservices/distributed-tracing.md +253 -0
  116. package/augment-extensions/coding-standards/go/rules/microservices/grpc.md +257 -0
  117. package/augment-extensions/coding-standards/go/rules/microservices/metrics.md +278 -0
  118. package/augment-extensions/coding-standards/go/rules/microservices/service-discovery.md +249 -0
  119. package/augment-extensions/coding-standards/go/rules/universal/code-organization.md +221 -0
  120. package/augment-extensions/coding-standards/go/rules/universal/documentation.md +269 -0
  121. package/augment-extensions/coding-standards/go/rules/universal/performance.md +323 -0
  122. package/augment-extensions/coding-standards/go/rules/universal/testing.md +162 -0
  123. package/augment-extensions/coding-standards/go/rules/web/graceful-shutdown.md +249 -0
  124. package/augment-extensions/coding-standards/go/rules/web/http-handlers.md +164 -0
  125. package/augment-extensions/coding-standards/go/rules/web/middleware.md +234 -0
  126. package/augment-extensions/coding-standards/go/rules/web/routing.md +251 -0
  127. package/augment-extensions/coding-standards/go/templates/prompts/api.md +160 -0
  128. package/augment-extensions/coding-standards/go/templates/prompts/cli.md +225 -0
  129. package/augment-extensions/coding-standards/go/templates/prompts/cloud-native.md +121 -0
  130. package/augment-extensions/coding-standards/go/templates/prompts/devops.md +146 -0
  131. package/augment-extensions/coding-standards/go/templates/prompts/distributed.md +133 -0
  132. package/augment-extensions/coding-standards/go/templates/prompts/microservices.md +225 -0
  133. package/augment-extensions/coding-standards/go/templates/prompts/web.md +181 -0
  134. package/augment-extensions/coding-standards/go/tests/integration/module-integration.test.ts +164 -0
  135. package/augment-extensions/coding-standards/go/tests/unit/category-selection.test.ts +147 -0
  136. package/augment-extensions/coding-standards/go/tests/unit/module-structure.test.ts +154 -0
  137. package/augment-extensions/coding-standards/go/tests/validate-character-count.ps1 +13 -0
  138. package/augment-extensions/coding-standards/go/tests/validate-examples.ps1 +148 -0
  139. package/augment-extensions/coding-standards/go/tests/validate-examples.sh +135 -0
  140. package/cli/dist/analysis/ast-parser.d.ts +47 -0
  141. package/cli/dist/analysis/ast-parser.d.ts.map +1 -0
  142. package/cli/dist/analysis/ast-parser.js +161 -0
  143. package/cli/dist/analysis/ast-parser.js.map +1 -0
  144. package/cli/dist/analysis/complexity-analyzer.d.ts +27 -0
  145. package/cli/dist/analysis/complexity-analyzer.d.ts.map +1 -0
  146. package/cli/dist/analysis/complexity-analyzer.js +189 -0
  147. package/cli/dist/analysis/complexity-analyzer.js.map +1 -0
  148. package/cli/dist/analysis/dependency-analyzer.d.ts +23 -0
  149. package/cli/dist/analysis/dependency-analyzer.d.ts.map +1 -0
  150. package/cli/dist/analysis/dependency-analyzer.js +237 -0
  151. package/cli/dist/analysis/dependency-analyzer.js.map +1 -0
  152. package/cli/dist/analysis/index.d.ts +9 -0
  153. package/cli/dist/analysis/index.d.ts.map +1 -0
  154. package/cli/dist/analysis/index.js +25 -0
  155. package/cli/dist/analysis/index.js.map +1 -0
  156. package/cli/dist/analysis/security-scanner.d.ts +11 -0
  157. package/cli/dist/analysis/security-scanner.d.ts.map +1 -0
  158. package/cli/dist/analysis/security-scanner.js +294 -0
  159. package/cli/dist/analysis/security-scanner.js.map +1 -0
  160. package/cli/dist/analysis/types.d.ts +151 -0
  161. package/cli/dist/analysis/types.d.ts.map +1 -0
  162. package/cli/dist/analysis/types.js +6 -0
  163. package/cli/dist/analysis/types.js.map +1 -0
  164. package/cli/dist/cli.js +24 -0
  165. package/cli/dist/cli.js.map +1 -1
  166. package/cli/dist/commands/code-analysis.d.ts +11 -0
  167. package/cli/dist/commands/code-analysis.d.ts.map +1 -0
  168. package/cli/dist/commands/code-analysis.js +412 -0
  169. package/cli/dist/commands/code-analysis.js.map +1 -0
  170. package/modules.md +99 -3
  171. package/package.json +14 -2
  172. package/cli/dist/commands/agent.d.ts +0 -37
  173. package/cli/dist/commands/agent.d.ts.map +0 -1
  174. package/cli/dist/commands/agent.js +0 -222
  175. package/cli/dist/commands/agent.js.map +0 -1
  176. package/cli/dist/commands/beads.d.ts +0 -64
  177. package/cli/dist/commands/beads.d.ts.map +0 -1
  178. package/cli/dist/commands/beads.js +0 -377
  179. package/cli/dist/commands/beads.js.map +0 -1
  180. package/cli/dist/commands/change.d.ts +0 -54
  181. package/cli/dist/commands/change.d.ts.map +0 -1
  182. package/cli/dist/commands/change.js +0 -243
  183. package/cli/dist/commands/change.js.map +0 -1
  184. package/cli/dist/commands/clean.d.ts +0 -15
  185. package/cli/dist/commands/clean.d.ts.map +0 -1
  186. package/cli/dist/commands/clean.js +0 -63
  187. package/cli/dist/commands/clean.js.map +0 -1
  188. package/cli/dist/commands/clone.d.ts +0 -15
  189. package/cli/dist/commands/clone.d.ts.map +0 -1
  190. package/cli/dist/commands/clone.js +0 -49
  191. package/cli/dist/commands/clone.js.map +0 -1
  192. package/cli/dist/commands/config.d.ts +0 -33
  193. package/cli/dist/commands/config.d.ts.map +0 -1
  194. package/cli/dist/commands/config.js +0 -166
  195. package/cli/dist/commands/config.js.map +0 -1
  196. package/cli/dist/commands/context.d.ts +0 -38
  197. package/cli/dist/commands/context.d.ts.map +0 -1
  198. package/cli/dist/commands/context.js +0 -205
  199. package/cli/dist/commands/context.js.map +0 -1
  200. package/cli/dist/commands/create.d.ts +0 -18
  201. package/cli/dist/commands/create.d.ts.map +0 -1
  202. package/cli/dist/commands/create.js +0 -178
  203. package/cli/dist/commands/create.js.map +0 -1
  204. package/cli/dist/commands/diff.d.ts +0 -19
  205. package/cli/dist/commands/diff.d.ts.map +0 -1
  206. package/cli/dist/commands/diff.js +0 -104
  207. package/cli/dist/commands/diff.js.map +0 -1
  208. package/cli/dist/commands/doctor.d.ts +0 -14
  209. package/cli/dist/commands/doctor.d.ts.map +0 -1
  210. package/cli/dist/commands/doctor.js +0 -62
  211. package/cli/dist/commands/doctor.js.map +0 -1
  212. package/cli/dist/commands/export.d.ts +0 -28
  213. package/cli/dist/commands/export.d.ts.map +0 -1
  214. package/cli/dist/commands/export.js +0 -135
  215. package/cli/dist/commands/export.js.map +0 -1
  216. package/cli/dist/commands/import.d.ts +0 -23
  217. package/cli/dist/commands/import.d.ts.map +0 -1
  218. package/cli/dist/commands/import.js +0 -118
  219. package/cli/dist/commands/import.js.map +0 -1
  220. package/cli/dist/commands/prompt.d.ts +0 -45
  221. package/cli/dist/commands/prompt.d.ts.map +0 -1
  222. package/cli/dist/commands/prompt.js +0 -223
  223. package/cli/dist/commands/prompt.js.map +0 -1
  224. package/cli/dist/commands/spec.d.ts +0 -57
  225. package/cli/dist/commands/spec.d.ts.map +0 -1
  226. package/cli/dist/commands/spec.js +0 -279
  227. package/cli/dist/commands/spec.js.map +0 -1
  228. package/cli/dist/commands/stats.d.ts +0 -18
  229. package/cli/dist/commands/stats.d.ts.map +0 -1
  230. package/cli/dist/commands/stats.js +0 -85
  231. package/cli/dist/commands/stats.js.map +0 -1
  232. package/cli/dist/commands/task.d.ts +0 -65
  233. package/cli/dist/commands/task.d.ts.map +0 -1
  234. package/cli/dist/commands/task.js +0 -282
  235. package/cli/dist/commands/task.js.map +0 -1
  236. package/cli/dist/commands/template.d.ts +0 -17
  237. package/cli/dist/commands/template.d.ts.map +0 -1
  238. package/cli/dist/commands/template.js +0 -55
  239. package/cli/dist/commands/template.js.map +0 -1
  240. package/cli/dist/utils/agent-config.d.ts +0 -129
  241. package/cli/dist/utils/agent-config.d.ts.map +0 -1
  242. package/cli/dist/utils/agent-config.js +0 -297
  243. package/cli/dist/utils/agent-config.js.map +0 -1
  244. package/cli/dist/utils/beads-graph.d.ts +0 -17
  245. package/cli/dist/utils/beads-graph.d.ts.map +0 -1
  246. package/cli/dist/utils/beads-graph.js +0 -150
  247. package/cli/dist/utils/beads-graph.js.map +0 -1
  248. package/cli/dist/utils/beads-integration.d.ts +0 -112
  249. package/cli/dist/utils/beads-integration.d.ts.map +0 -1
  250. package/cli/dist/utils/beads-integration.js +0 -312
  251. package/cli/dist/utils/beads-integration.js.map +0 -1
  252. package/cli/dist/utils/beads-reporter.d.ts +0 -17
  253. package/cli/dist/utils/beads-reporter.d.ts.map +0 -1
  254. package/cli/dist/utils/beads-reporter.js +0 -160
  255. package/cli/dist/utils/beads-reporter.js.map +0 -1
  256. package/cli/dist/utils/cache-manager.d.ts +0 -55
  257. package/cli/dist/utils/cache-manager.d.ts.map +0 -1
  258. package/cli/dist/utils/cache-manager.js +0 -150
  259. package/cli/dist/utils/cache-manager.js.map +0 -1
  260. package/cli/dist/utils/change-manager.d.ts +0 -70
  261. package/cli/dist/utils/change-manager.d.ts.map +0 -1
  262. package/cli/dist/utils/change-manager.js +0 -412
  263. package/cli/dist/utils/change-manager.js.map +0 -1
  264. package/cli/dist/utils/config-manager-enhanced.d.ts +0 -66
  265. package/cli/dist/utils/config-manager-enhanced.d.ts.map +0 -1
  266. package/cli/dist/utils/config-manager-enhanced.js +0 -77
  267. package/cli/dist/utils/config-manager-enhanced.js.map +0 -1
  268. package/cli/dist/utils/context-manager.d.ts +0 -96
  269. package/cli/dist/utils/context-manager.d.ts.map +0 -1
  270. package/cli/dist/utils/context-manager.js +0 -258
  271. package/cli/dist/utils/context-manager.js.map +0 -1
  272. package/cli/dist/utils/diff-engine.d.ts +0 -78
  273. package/cli/dist/utils/diff-engine.d.ts.map +0 -1
  274. package/cli/dist/utils/diff-engine.js +0 -233
  275. package/cli/dist/utils/diff-engine.js.map +0 -1
  276. package/cli/dist/utils/export-system.d.ts +0 -101
  277. package/cli/dist/utils/export-system.d.ts.map +0 -1
  278. package/cli/dist/utils/export-system.js +0 -289
  279. package/cli/dist/utils/export-system.js.map +0 -1
  280. package/cli/dist/utils/health-checker.d.ts +0 -66
  281. package/cli/dist/utils/health-checker.d.ts.map +0 -1
  282. package/cli/dist/utils/health-checker.js +0 -285
  283. package/cli/dist/utils/health-checker.js.map +0 -1
  284. package/cli/dist/utils/import-system.d.ts +0 -74
  285. package/cli/dist/utils/import-system.d.ts.map +0 -1
  286. package/cli/dist/utils/import-system.js +0 -317
  287. package/cli/dist/utils/import-system.js.map +0 -1
  288. package/cli/dist/utils/module-cloner.d.ts +0 -40
  289. package/cli/dist/utils/module-cloner.d.ts.map +0 -1
  290. package/cli/dist/utils/module-cloner.js +0 -136
  291. package/cli/dist/utils/module-cloner.js.map +0 -1
  292. package/cli/dist/utils/prompt-manager.d.ts +0 -90
  293. package/cli/dist/utils/prompt-manager.d.ts.map +0 -1
  294. package/cli/dist/utils/prompt-manager.js +0 -302
  295. package/cli/dist/utils/prompt-manager.js.map +0 -1
  296. package/cli/dist/utils/spec-manager.d.ts +0 -65
  297. package/cli/dist/utils/spec-manager.d.ts.map +0 -1
  298. package/cli/dist/utils/spec-manager.js +0 -329
  299. package/cli/dist/utils/spec-manager.js.map +0 -1
  300. package/cli/dist/utils/stats-collector.d.ts +0 -74
  301. package/cli/dist/utils/stats-collector.d.ts.map +0 -1
  302. package/cli/dist/utils/stats-collector.js +0 -164
  303. package/cli/dist/utils/stats-collector.js.map +0 -1
  304. package/cli/dist/utils/template-engine.d.ts +0 -47
  305. package/cli/dist/utils/template-engine.d.ts.map +0 -1
  306. package/cli/dist/utils/template-engine.js +0 -204
  307. package/cli/dist/utils/template-engine.js.map +0 -1
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Unit Tests for RuleEvaluator
3
+ * Tests code evaluation, violation detection, and reporting
4
+ */
5
+
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { RuleEvaluator } from '../../src/rule-evaluator';
9
+ import { RuleRegistry } from '../../src/registry';
10
+ import { ConfigurationManager } from '../../src/config-manager';
11
+
12
+ describe('RuleEvaluator', () => {
13
+ let tempDir: string;
14
+ let rulesPath: string;
15
+ let configPath: string;
16
+ let registry: RuleRegistry;
17
+ let configManager: ConfigurationManager;
18
+ let evaluator: RuleEvaluator;
19
+
20
+ beforeEach(async () => {
21
+ // Create temporary directories
22
+ tempDir = path.join(__dirname, '../fixtures/temp-evaluator');
23
+ rulesPath = path.join(tempDir, 'rules');
24
+ configPath = tempDir;
25
+
26
+ await fs.mkdir(path.join(rulesPath, 'universal'), { recursive: true });
27
+ await fs.mkdir(path.join(configPath, '.augment'), { recursive: true });
28
+
29
+ // Create sample rules
30
+ await createSampleRules();
31
+
32
+ // Initialize components
33
+ registry = new RuleRegistry(rulesPath);
34
+ await registry.loadRules();
35
+
36
+ configManager = new ConfigurationManager(configPath);
37
+ await configManager.load();
38
+
39
+ evaluator = new RuleEvaluator(registry, configManager);
40
+ });
41
+
42
+ afterEach(async () => {
43
+ try {
44
+ await fs.rm(tempDir, { recursive: true, force: true });
45
+ } catch (error) {
46
+ // Ignore cleanup errors
47
+ }
48
+ });
49
+
50
+ async function createSampleRules() {
51
+ const namingRule = `# Rule: Naming Conventions
52
+
53
+ ## Metadata
54
+ - **ID**: universal-naming
55
+ - **Category**: universal
56
+ - **Severity**: ERROR
57
+
58
+ ## Description
59
+ Use snake_case for functions and variables.
60
+
61
+ ## Pattern
62
+ Functions and variables must use snake_case: ^[a-z][a-z0-9_]*$
63
+
64
+ ## Examples
65
+
66
+ ### Bad Example
67
+ \`\`\`c
68
+ int myFunction() { return 0; }
69
+ int MyVariable = 5;
70
+ \`\`\`
71
+
72
+ ### Good Example
73
+ \`\`\`c
74
+ int my_function() { return 0; }
75
+ int my_variable = 5;
76
+ \`\`\`
77
+ `;
78
+
79
+ await fs.writeFile(path.join(rulesPath, 'universal/naming.md'), namingRule);
80
+ }
81
+
82
+ describe('evaluate()', () => {
83
+ it('should detect naming violations', async () => {
84
+ const code = `
85
+ int myFunction() {
86
+ int MyVariable = 5;
87
+ return MyVariable;
88
+ }
89
+ `;
90
+
91
+ const violations = await evaluator.evaluate(code, {
92
+ filePath: '/project/src/main.c',
93
+ rules: ['universal-naming']
94
+ });
95
+
96
+ expect(violations.length).toBeGreaterThan(0);
97
+ expect(violations[0].ruleId).toBe('universal-naming');
98
+ expect(violations[0].severity).toBe('ERROR');
99
+ });
100
+
101
+ it('should not report violations for compliant code', async () => {
102
+ const code = `
103
+ int my_function() {
104
+ int my_variable = 5;
105
+ return my_variable;
106
+ }
107
+ `;
108
+
109
+ const violations = await evaluator.evaluate(code, {
110
+ filePath: '/project/src/main.c',
111
+ rules: ['universal-naming']
112
+ });
113
+
114
+ expect(violations.length).toBe(0);
115
+ });
116
+
117
+ it('should include line numbers in violations', async () => {
118
+ const code = `
119
+ int myFunction() {
120
+ return 0;
121
+ }
122
+ `;
123
+
124
+ const violations = await evaluator.evaluate(code, {
125
+ filePath: '/project/src/main.c',
126
+ rules: ['universal-naming']
127
+ });
128
+
129
+ if (violations.length > 0) {
130
+ expect(violations[0].line).toBeDefined();
131
+ expect(violations[0].line).toBeGreaterThan(0);
132
+ }
133
+ });
134
+
135
+ it('should include suggestions for fixes', async () => {
136
+ const code = `
137
+ int myFunction() {
138
+ return 0;
139
+ }
140
+ `;
141
+
142
+ const violations = await evaluator.evaluate(code, {
143
+ filePath: '/project/src/main.c',
144
+ rules: ['universal-naming']
145
+ });
146
+
147
+ if (violations.length > 0) {
148
+ expect(violations[0].suggestion).toBeDefined();
149
+ expect(violations[0].suggestion.length).toBeGreaterThan(0);
150
+ }
151
+ });
152
+
153
+ it('should filter by severity', async () => {
154
+ const code = `int myFunction() { return 0; }`;
155
+
156
+ const violations = await evaluator.evaluate(code, {
157
+ filePath: '/project/src/main.c',
158
+ rules: ['universal-naming'],
159
+ minSeverity: 'WARNING'
160
+ });
161
+
162
+ expect(violations.every(v => v.severity === 'ERROR' || v.severity === 'WARNING')).toBe(true);
163
+ });
164
+ });
165
+
166
+ describe('applyRule()', () => {
167
+ it('should apply single rule to code', async () => {
168
+ const code = `int myFunction() { return 0; }`;
169
+ const rule = registry.getRule('universal-naming');
170
+
171
+ if (rule) {
172
+ const violations = await evaluator.applyRule(code, rule);
173
+ expect(Array.isArray(violations)).toBe(true);
174
+ }
175
+ });
176
+
177
+ it('should return empty array for compliant code', async () => {
178
+ const code = `int my_function() { return 0; }`;
179
+ const rule = registry.getRule('universal-naming');
180
+
181
+ if (rule) {
182
+ const violations = await evaluator.applyRule(code, rule);
183
+ expect(violations.length).toBe(0);
184
+ }
185
+ });
186
+ });
187
+
188
+ describe('evaluateBatch()', () => {
189
+ it('should evaluate multiple files', async () => {
190
+ const files = [
191
+ {
192
+ path: '/project/src/file1.c',
193
+ content: 'int myFunction() { return 0; }'
194
+ },
195
+ {
196
+ path: '/project/src/file2.c',
197
+ content: 'int my_function() { return 0; }'
198
+ }
199
+ ];
200
+
201
+ const results = await evaluator.evaluateBatch(files, {
202
+ rules: ['universal-naming']
203
+ });
204
+
205
+ expect(results.length).toBe(2);
206
+ expect(results[0].filePath).toBe('/project/src/file1.c');
207
+ expect(results[1].filePath).toBe('/project/src/file2.c');
208
+ });
209
+
210
+ it('should report violations per file', async () => {
211
+ const files = [
212
+ {
213
+ path: '/project/src/file1.c',
214
+ content: 'int myFunction() { return 0; }'
215
+ }
216
+ ];
217
+
218
+ const results = await evaluator.evaluateBatch(files, {
219
+ rules: ['universal-naming']
220
+ });
221
+
222
+ expect(results[0].violations).toBeDefined();
223
+ expect(Array.isArray(results[0].violations)).toBe(true);
224
+ });
225
+ });
226
+
227
+ describe('generateReport()', () => {
228
+ it('should generate text report', async () => {
229
+ const code = `int myFunction() { return 0; }`;
230
+
231
+ const violations = await evaluator.evaluate(code, {
232
+ filePath: '/project/src/main.c',
233
+ rules: ['universal-naming']
234
+ });
235
+
236
+ const report = evaluator.generateReport(violations, { format: 'text' });
237
+
238
+ expect(report).toBeDefined();
239
+ expect(typeof report).toBe('string');
240
+ expect(report.length).toBeGreaterThan(0);
241
+ });
242
+
243
+ it('should generate JSON report', async () => {
244
+ const code = `int myFunction() { return 0; }`;
245
+
246
+ const violations = await evaluator.evaluate(code, {
247
+ filePath: '/project/src/main.c',
248
+ rules: ['universal-naming']
249
+ });
250
+
251
+ const report = evaluator.generateReport(violations, { format: 'json' });
252
+
253
+ expect(report).toBeDefined();
254
+ expect(() => JSON.parse(report)).not.toThrow();
255
+ });
256
+
257
+ it('should include summary statistics', async () => {
258
+ const code = `int myFunction() { return 0; }`;
259
+
260
+ const violations = await evaluator.evaluate(code, {
261
+ filePath: '/project/src/main.c',
262
+ rules: ['universal-naming']
263
+ });
264
+
265
+ const report = evaluator.generateReport(violations, {
266
+ format: 'json',
267
+ includeSummary: true
268
+ });
269
+
270
+ const parsed = JSON.parse(report);
271
+ expect(parsed.summary).toBeDefined();
272
+ expect(parsed.summary.total).toBeDefined();
273
+ });
274
+ });
275
+
276
+ describe('getViolationsByFile()', () => {
277
+ it('should group violations by file', async () => {
278
+ const files = [
279
+ {
280
+ path: '/project/src/file1.c',
281
+ content: 'int myFunction() { return 0; }'
282
+ },
283
+ {
284
+ path: '/project/src/file2.c',
285
+ content: 'int anotherBadName() { return 0; }'
286
+ }
287
+ ];
288
+
289
+ const results = await evaluator.evaluateBatch(files, {
290
+ rules: ['universal-naming']
291
+ });
292
+
293
+ const grouped = evaluator.getViolationsByFile(results);
294
+
295
+ expect(Object.keys(grouped).length).toBeGreaterThan(0);
296
+ expect(grouped['/project/src/file1.c']).toBeDefined();
297
+ });
298
+ });
299
+
300
+ describe('getViolationsBySeverity()', () => {
301
+ it('should group violations by severity', async () => {
302
+ const code = `int myFunction() { return 0; }`;
303
+
304
+ const violations = await evaluator.evaluate(code, {
305
+ filePath: '/project/src/main.c',
306
+ rules: ['universal-naming']
307
+ });
308
+
309
+ const grouped = evaluator.getViolationsBySeverity(violations);
310
+
311
+ expect(grouped).toBeDefined();
312
+ if (violations.length > 0) {
313
+ expect(grouped.ERROR || grouped.WARNING).toBeDefined();
314
+ }
315
+ });
316
+ });
317
+ });
318
+
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Unit Tests for RuleOverrideSystem
3
+ * Tests rule override application, validation, and management
4
+ */
5
+
6
+ import * as fs from 'fs/promises';
7
+ import * as path from 'path';
8
+ import { RuleOverrideSystem } from '../../src/rule-override';
9
+ import { RuleRegistry } from '../../src/registry';
10
+ import { ConfigurationManager } from '../../src/config-manager';
11
+
12
+ describe('RuleOverrideSystem', () => {
13
+ let tempDir: string;
14
+ let rulesPath: string;
15
+ let configPath: string;
16
+ let registry: RuleRegistry;
17
+ let configManager: ConfigurationManager;
18
+ let overrideSystem: RuleOverrideSystem;
19
+
20
+ beforeEach(async () => {
21
+ // Create temporary directories
22
+ tempDir = path.join(__dirname, '../fixtures/temp-overrides');
23
+ rulesPath = path.join(tempDir, 'rules');
24
+ configPath = tempDir;
25
+
26
+ await fs.mkdir(path.join(rulesPath, 'universal'), { recursive: true });
27
+ await fs.mkdir(path.join(configPath, '.augment'), { recursive: true });
28
+
29
+ // Create sample rules
30
+ await createSampleRules();
31
+
32
+ // Initialize components
33
+ registry = new RuleRegistry(rulesPath);
34
+ await registry.loadRules();
35
+
36
+ configManager = new ConfigurationManager(configPath);
37
+ await configManager.load();
38
+
39
+ overrideSystem = new RuleOverrideSystem(registry, configManager);
40
+ });
41
+
42
+ afterEach(async () => {
43
+ try {
44
+ await fs.rm(tempDir, { recursive: true, force: true });
45
+ } catch (error) {
46
+ // Ignore cleanup errors
47
+ }
48
+ });
49
+
50
+ async function createSampleRules() {
51
+ const namingRule = `# Rule: Naming Conventions
52
+
53
+ ## Metadata
54
+ - **ID**: universal-naming
55
+ - **Category**: universal
56
+ - **Severity**: ERROR
57
+
58
+ ## Description
59
+ Use snake_case for functions and variables.
60
+ `;
61
+
62
+ await fs.writeFile(path.join(rulesPath, 'universal/naming.md'), namingRule);
63
+ }
64
+
65
+ describe('applyOverride()', () => {
66
+ it('should apply severity override', () => {
67
+ overrideSystem.applyOverride('universal-naming', {
68
+ severity: 'WARNING'
69
+ });
70
+
71
+ const rule = registry.getRule('universal-naming');
72
+ expect(rule?.severity).toBe('WARNING');
73
+ });
74
+
75
+ it('should apply enabled override', () => {
76
+ overrideSystem.applyOverride('universal-naming', {
77
+ enabled: false
78
+ });
79
+
80
+ const rule = registry.getRule('universal-naming');
81
+ expect(rule?.enabled).toBe(false);
82
+ });
83
+
84
+ it('should apply multiple overrides', () => {
85
+ overrideSystem.applyOverride('universal-naming', {
86
+ severity: 'WARNING',
87
+ enabled: false
88
+ });
89
+
90
+ const rule = registry.getRule('universal-naming');
91
+ expect(rule?.severity).toBe('WARNING');
92
+ expect(rule?.enabled).toBe(false);
93
+ });
94
+
95
+ it('should throw error for non-existent rule', () => {
96
+ expect(() => {
97
+ overrideSystem.applyOverride('nonexistent-rule', {
98
+ severity: 'WARNING'
99
+ });
100
+ }).toThrow('Rule not found');
101
+ });
102
+ });
103
+
104
+ describe('removeOverride()', () => {
105
+ it('should remove override and restore original', () => {
106
+ const originalRule = registry.getRule('universal-naming');
107
+ const originalSeverity = originalRule?.severity;
108
+
109
+ overrideSystem.applyOverride('universal-naming', {
110
+ severity: 'WARNING'
111
+ });
112
+
113
+ overrideSystem.removeOverride('universal-naming');
114
+
115
+ const rule = registry.getRule('universal-naming');
116
+ expect(rule?.severity).toBe(originalSeverity);
117
+ });
118
+
119
+ it('should handle removing non-existent override', () => {
120
+ expect(() => {
121
+ overrideSystem.removeOverride('universal-naming');
122
+ }).not.toThrow();
123
+ });
124
+ });
125
+
126
+ describe('getOverride()', () => {
127
+ it('should return override for rule', () => {
128
+ overrideSystem.applyOverride('universal-naming', {
129
+ severity: 'WARNING'
130
+ });
131
+
132
+ const override = overrideSystem.getOverride('universal-naming');
133
+
134
+ expect(override).toBeDefined();
135
+ expect(override?.severity).toBe('WARNING');
136
+ });
137
+
138
+ it('should return undefined for non-overridden rule', () => {
139
+ const override = overrideSystem.getOverride('universal-naming');
140
+ expect(override).toBeUndefined();
141
+ });
142
+ });
143
+
144
+ describe('getAllOverrides()', () => {
145
+ it('should return all active overrides', () => {
146
+ overrideSystem.applyOverride('universal-naming', {
147
+ severity: 'WARNING'
148
+ });
149
+
150
+ const overrides = overrideSystem.getAllOverrides();
151
+
152
+ expect(Object.keys(overrides).length).toBeGreaterThan(0);
153
+ expect(overrides['universal-naming']).toBeDefined();
154
+ });
155
+
156
+ it('should return empty object when no overrides', () => {
157
+ const overrides = overrideSystem.getAllOverrides();
158
+ expect(Object.keys(overrides).length).toBe(0);
159
+ });
160
+ });
161
+
162
+ describe('validateOverride()', () => {
163
+ it('should validate correct override', () => {
164
+ const result = overrideSystem.validateOverride('universal-naming', {
165
+ severity: 'WARNING'
166
+ });
167
+
168
+ expect(result.valid).toBe(true);
169
+ expect(result.errors).toHaveLength(0);
170
+ });
171
+
172
+ it('should reject invalid severity', () => {
173
+ const result = overrideSystem.validateOverride('universal-naming', {
174
+ severity: 'INVALID' as any
175
+ });
176
+
177
+ expect(result.valid).toBe(false);
178
+ expect(result.errors.length).toBeGreaterThan(0);
179
+ });
180
+
181
+ it('should reject override for non-existent rule', () => {
182
+ const result = overrideSystem.validateOverride('nonexistent-rule', {
183
+ severity: 'WARNING'
184
+ });
185
+
186
+ expect(result.valid).toBe(false);
187
+ });
188
+ });
189
+
190
+ describe('applyBatchOverrides()', () => {
191
+ it('should apply multiple overrides at once', () => {
192
+ const overrides = {
193
+ 'universal-naming': {
194
+ severity: 'WARNING' as const
195
+ }
196
+ };
197
+
198
+ overrideSystem.applyBatchOverrides(overrides);
199
+
200
+ const rule = registry.getRule('universal-naming');
201
+ expect(rule?.severity).toBe('WARNING');
202
+ });
203
+
204
+ it('should validate all overrides before applying', () => {
205
+ const overrides = {
206
+ 'universal-naming': {
207
+ severity: 'INVALID' as any
208
+ }
209
+ };
210
+
211
+ expect(() => {
212
+ overrideSystem.applyBatchOverrides(overrides);
213
+ }).toThrow();
214
+ });
215
+ });
216
+
217
+ describe('clearAllOverrides()', () => {
218
+ it('should clear all overrides', () => {
219
+ overrideSystem.applyOverride('universal-naming', {
220
+ severity: 'WARNING'
221
+ });
222
+
223
+ overrideSystem.clearAllOverrides();
224
+
225
+ const overrides = overrideSystem.getAllOverrides();
226
+ expect(Object.keys(overrides).length).toBe(0);
227
+ });
228
+
229
+ it('should restore original rule values', () => {
230
+ const originalRule = registry.getRule('universal-naming');
231
+ const originalSeverity = originalRule?.severity;
232
+
233
+ overrideSystem.applyOverride('universal-naming', {
234
+ severity: 'WARNING'
235
+ });
236
+
237
+ overrideSystem.clearAllOverrides();
238
+
239
+ const rule = registry.getRule('universal-naming');
240
+ expect(rule?.severity).toBe(originalSeverity);
241
+ });
242
+ });
243
+
244
+ describe('exportOverrides()', () => {
245
+ it('should export overrides to JSON', () => {
246
+ overrideSystem.applyOverride('universal-naming', {
247
+ severity: 'WARNING'
248
+ });
249
+
250
+ const json = overrideSystem.exportOverrides('json');
251
+
252
+ expect(json).toBeDefined();
253
+ expect(() => JSON.parse(json)).not.toThrow();
254
+ });
255
+
256
+ it('should export overrides to YAML', () => {
257
+ overrideSystem.applyOverride('universal-naming', {
258
+ severity: 'WARNING'
259
+ });
260
+
261
+ const yaml = overrideSystem.exportOverrides('yaml');
262
+
263
+ expect(yaml).toBeDefined();
264
+ expect(yaml.length).toBeGreaterThan(0);
265
+ });
266
+ });
267
+
268
+ describe('importOverrides()', () => {
269
+ it('should import overrides from JSON', () => {
270
+ const json = JSON.stringify({
271
+ 'universal-naming': {
272
+ severity: 'WARNING'
273
+ }
274
+ });
275
+
276
+ overrideSystem.importOverrides(json, 'json');
277
+
278
+ const rule = registry.getRule('universal-naming');
279
+ expect(rule?.severity).toBe('WARNING');
280
+ });
281
+
282
+ it('should validate imported overrides', () => {
283
+ const invalidJson = JSON.stringify({
284
+ 'universal-naming': {
285
+ severity: 'INVALID'
286
+ }
287
+ });
288
+
289
+ expect(() => {
290
+ overrideSystem.importOverrides(invalidJson, 'json');
291
+ }).toThrow();
292
+ });
293
+ });
294
+
295
+ describe('hasOverride()', () => {
296
+ it('should return true for overridden rule', () => {
297
+ overrideSystem.applyOverride('universal-naming', {
298
+ severity: 'WARNING'
299
+ });
300
+
301
+ expect(overrideSystem.hasOverride('universal-naming')).toBe(true);
302
+ });
303
+
304
+ it('should return false for non-overridden rule', () => {
305
+ expect(overrideSystem.hasOverride('universal-naming')).toBe(false);
306
+ });
307
+ });
308
+
309
+ describe('getOverrideHistory()', () => {
310
+ it('should track override history', () => {
311
+ overrideSystem.applyOverride('universal-naming', {
312
+ severity: 'WARNING'
313
+ });
314
+
315
+ overrideSystem.applyOverride('universal-naming', {
316
+ severity: 'ERROR'
317
+ });
318
+
319
+ const history = overrideSystem.getOverrideHistory('universal-naming');
320
+
321
+ expect(history).toBeDefined();
322
+ expect(history.length).toBeGreaterThan(0);
323
+ });
324
+ });
325
+ });
326
+