@khoavu882/doflow 0.0.0-stage → 2.0.0-beta.4

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 (409) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -2
  3. package/bin/doflow.js +44 -0
  4. package/core/.antigravity-plugin/hooks.json +39 -0
  5. package/core/.antigravity-plugin/mcp_config.json +18 -0
  6. package/core/.antigravity-plugin/plugin.json +31 -0
  7. package/core/.claude-plugin/marketplace.json +20 -0
  8. package/core/.claude-plugin/plugin.json +21 -0
  9. package/core/.codex-plugin/marketplace.json +20 -0
  10. package/core/.codex-plugin/plugin.json +35 -0
  11. package/core/.plugin/plugin.json +19 -0
  12. package/core/harnesses/antigravity/hooks/pre-implementation-gate.sh +9 -0
  13. package/core/harnesses/antigravity/hooks/stop-check.sh +10 -0
  14. package/core/harnesses/claude/hooks/lib.sh +304 -0
  15. package/core/harnesses/claude/hooks/mcp-tool-guard.sh +20 -0
  16. package/core/harnesses/claude/hooks/permission-audit.sh +47 -0
  17. package/core/harnesses/claude/hooks/post-compact.sh +74 -0
  18. package/core/harnesses/claude/hooks/post-edit-lint.sh +36 -0
  19. package/core/harnesses/claude/hooks/post-tool-failure.sh +47 -0
  20. package/core/harnesses/claude/hooks/pre-bash-guard.sh +20 -0
  21. package/core/harnesses/claude/hooks/pre-compact.sh +43 -0
  22. package/core/harnesses/claude/hooks/pre-implement-gate.sh +21 -0
  23. package/core/harnesses/claude/hooks/session-end.sh +89 -0
  24. package/core/harnesses/claude/hooks/session-start.sh +5 -0
  25. package/core/harnesses/claude/hooks/skill-config-audit.sh +39 -0
  26. package/core/harnesses/claude/hooks/stop-check.sh +5 -0
  27. package/core/harnesses/claude/hooks/subagent-audit.sh +7 -0
  28. package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -0
  29. package/core/harnesses/claude/settings/keybindings.json +20 -0
  30. package/core/harnesses/claude/settings/settings.json +201 -0
  31. package/core/harnesses/claude/statusline/doflow-statusline.sh +49 -0
  32. package/core/harnesses/codex/agents/core-implementer.toml +7 -0
  33. package/core/harnesses/codex/agents/quality-guardian.toml +8 -0
  34. package/core/harnesses/codex/agents/research-writer.toml +8 -0
  35. package/core/harnesses/codex/agents/spec-analyst.toml +8 -0
  36. package/core/harnesses/codex/agents/system-architect.toml +9 -0
  37. package/core/harnesses/codex/config/config.toml +10 -0
  38. package/core/harnesses/codex/hooks/hooks.json +122 -0
  39. package/core/harnesses/codex/hooks/lib.sh +335 -0
  40. package/core/harnesses/codex/hooks/mcp-tool-guard.sh +18 -0
  41. package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +52 -0
  42. package/core/harnesses/codex/hooks/post-edit-lint.sh +6 -0
  43. package/core/harnesses/codex/hooks/pre-bash-guard.sh +18 -0
  44. package/core/harnesses/codex/hooks/pre-compact.impl.sh +46 -0
  45. package/core/harnesses/codex/hooks/pre-compact.sh +9 -0
  46. package/core/harnesses/codex/hooks/pre-implement-gate.sh +19 -0
  47. package/core/harnesses/codex/hooks/session-end.impl.sh +92 -0
  48. package/core/harnesses/codex/hooks/session-end.sh +5 -0
  49. package/core/harnesses/codex/hooks/session-start.sh +5 -0
  50. package/core/harnesses/codex/hooks/stop-check.sh +8 -0
  51. package/core/harnesses/codex/hooks/subagent-audit.sh +8 -0
  52. package/core/harnesses/codex/hooks/user-prompt-submit.sh +6 -0
  53. package/core/harnesses/gemini/hooks/hooks.json +77 -0
  54. package/core/harnesses/gemini/hooks/lib.sh +302 -0
  55. package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +21 -0
  56. package/core/harnesses/gemini/hooks/post-edit-lint.sh +39 -0
  57. package/core/harnesses/gemini/hooks/pre-bash-guard.sh +21 -0
  58. package/core/harnesses/gemini/hooks/pre-compact.sh +38 -0
  59. package/core/harnesses/gemini/hooks/pre-implement-gate.sh +22 -0
  60. package/core/harnesses/gemini/hooks/session-end.impl.sh +89 -0
  61. package/core/harnesses/gemini/hooks/session-end.sh +5 -0
  62. package/core/harnesses/gemini/hooks/session-start.sh +5 -0
  63. package/core/harnesses/gemini/settings/adapter-defaults.json +4 -0
  64. package/core/harnesses/kiro/agents/doflow.json +58 -0
  65. package/core/harnesses/kiro/hooks/doflow.json +53 -0
  66. package/core/harnesses/kiro/hooks/lib.sh +324 -0
  67. package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +9 -0
  68. package/core/harnesses/kiro/hooks/pre-bash-guard.sh +9 -0
  69. package/core/harnesses/kiro/hooks/pre-implement-gate.sh +9 -0
  70. package/core/harnesses/kiro/hooks/session-start.sh +9 -0
  71. package/core/harnesses/kiro/hooks/stop-check.sh +43 -0
  72. package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +39 -0
  73. package/core/harnesses/shared/hooks/adapters/antigravity.js +111 -0
  74. package/core/harnesses/shared/hooks/adapters/arg-fields.js +19 -0
  75. package/core/harnesses/shared/hooks/adapters/gemini.js +114 -0
  76. package/core/harnesses/shared/hooks/hooks.json +47 -0
  77. package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +91 -0
  78. package/core/harnesses/shared/hooks/policies/capture-failure.sh +97 -0
  79. package/core/harnesses/shared/hooks/policies/deny-json.sh +29 -0
  80. package/core/harnesses/shared/hooks/policies/lib.sh +501 -0
  81. package/core/harnesses/shared/hooks/policies/mcp-policy.conf +21 -0
  82. package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +91 -0
  83. package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +328 -0
  84. package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +496 -0
  85. package/core/harnesses/shared/hooks/policies/prompt-nudge.jq +131 -0
  86. package/core/harnesses/shared/hooks/policies/session-context.sh +141 -0
  87. package/core/harnesses/shared/hooks/policies/stop-check.sh +264 -0
  88. package/core/harnesses/shared/hooks/policies/subagent-audit.sh +46 -0
  89. package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +235 -0
  90. package/core/harnesses/shared/hooks/stream-hook-runner.js +590 -0
  91. package/core/harnesses/shared/locator/doflow-run +87 -0
  92. package/core/registry/advice.json +101 -0
  93. package/core/registry/assets.json +792 -0
  94. package/core/registry/capabilities.json +120 -0
  95. package/core/registry/contracts.json +189 -0
  96. package/core/registry/external-tools.json +191 -0
  97. package/core/registry/harnesses.json +2062 -0
  98. package/core/registry/lifecycle.json +231 -0
  99. package/core/registry/mcp.json +18 -0
  100. package/core/registry/models.json +79 -0
  101. package/core/registry/readiness-templates.json +118 -0
  102. package/core/registry/routes.json +47 -0
  103. package/core/registry/storage.json +1061 -0
  104. package/core/registry/verification.json +258 -0
  105. package/core/registry/workflows.json +790 -0
  106. package/core/shared/agent-specs/core-implementer.md +73 -0
  107. package/core/shared/agent-specs/quality-guardian.md +28 -0
  108. package/core/shared/agent-specs/research-writer.md +31 -0
  109. package/core/shared/agent-specs/spec-analyst.md +33 -0
  110. package/core/shared/agent-specs/system-architect.md +29 -0
  111. package/core/shared/guidance/DOFLOW_CORE.md +8 -0
  112. package/core/shared/guidance/FLAGS.md +25 -0
  113. package/core/shared/guidance/PRINCIPLES.md +61 -0
  114. package/core/shared/guidance/VERSION +1 -0
  115. package/core/shared/guidance/mcp/MCP_Context7.md +18 -0
  116. package/core/shared/guidance/mcp/MCP_Sequential.md +17 -0
  117. package/core/shared/guidance/modes/MODE_Brainstorming.md +46 -0
  118. package/core/shared/guidance/modes/MODE_DeepResearch.md +69 -0
  119. package/core/shared/guidance/modes/MODE_Introspection.md +33 -0
  120. package/core/shared/guidance/modes/MODE_Orchestration.md +57 -0
  121. package/core/shared/guidance/modes/MODE_Task_Management.md +74 -0
  122. package/core/shared/guidance/pointers/claude-gemini.md +2 -0
  123. package/core/shared/guidance/pointers/codex.md +6 -0
  124. package/core/shared/guidance/references/ARTIFACT_FORMAT.md +373 -0
  125. package/core/shared/guidance/references/ARTIFACT_VOICE.md +104 -0
  126. package/core/shared/guidance/references/CONSTITUTION_BASE.md +47 -0
  127. package/core/shared/guidance/references/DIAGRAM_GUIDE.md +161 -0
  128. package/core/shared/guidance/references/DOFLOW_CHAIN.md +87 -0
  129. package/core/shared/guidance/references/EVIDENCE_LEDGER.md +93 -0
  130. package/core/shared/guidance/references/MODEL_SELECTION.md +74 -0
  131. package/core/shared/guidance/references/ORCHESTRATION.md +36 -0
  132. package/core/shared/guidance/references/RESEARCH_CONFIG.md +21 -0
  133. package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +81 -0
  134. package/core/shared/guidance/rules/RULE_01_SAFETY.md +25 -0
  135. package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +23 -0
  136. package/core/shared/guidance/rules/RULE_03_QUALITY.md +14 -0
  137. package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +46 -0
  138. package/core/shared/scripts/doflow/assets/mermaid-theme.json +46 -0
  139. package/core/shared/scripts/doflow/bash/do-exec-paths.sh +167 -0
  140. package/core/shared/scripts/doflow/bash/do-git-state.sh +546 -0
  141. package/core/shared/scripts/doflow/bash/do-parallel-check.sh +208 -0
  142. package/core/shared/scripts/doflow/bash/do-paths.sh +347 -0
  143. package/core/shared/scripts/doflow/bash/do-prereqs.sh +66 -0
  144. package/core/shared/scripts/doflow/bash/do-review-package.sh +127 -0
  145. package/core/shared/scripts/doflow/bash/do-task-brief.sh +698 -0
  146. package/core/shared/scripts/doflow/bash/render-audit.sh +224 -0
  147. package/core/shared/scripts/doflow/bash/render-diagrams.sh +177 -0
  148. package/core/shared/scripts/doflow/bash/render-puml.sh +223 -0
  149. package/core/shared/scripts/doflow/bash/sync-context.sh +66 -0
  150. package/core/shared/scripts/doflow/bash/validate-artifacts.sh +526 -0
  151. package/core/shared/scripts/doflow/bin/doflow-run +592 -0
  152. package/core/shared/skills/do/SKILL.md +128 -0
  153. package/core/shared/skills/do/references/estimation.md +13 -0
  154. package/core/shared/skills/do/references/pm_routing.md +25 -0
  155. package/core/shared/skills/do/references/tool_matrix.md +52 -0
  156. package/core/shared/skills/do-brainstorm/SKILL.md +252 -0
  157. package/core/shared/skills/do-code-review/README.md +49 -0
  158. package/core/shared/skills/do-code-review/SKILL.md +333 -0
  159. package/core/shared/skills/do-code-review/assets/sample_c_clean.c +71 -0
  160. package/core/shared/skills/do-code-review/assets/sample_c_smells.c +66 -0
  161. package/core/shared/skills/do-code-review/assets/sample_cpp_shift.cpp +19 -0
  162. package/core/shared/skills/do-code-review/assets/sample_csharp_clean.cs +100 -0
  163. package/core/shared/skills/do-code-review/assets/sample_csharp_smells.cs +78 -0
  164. package/core/shared/skills/do-code-review/assets/sample_java_clean.java +55 -0
  165. package/core/shared/skills/do-code-review/assets/sample_java_smells.java +56 -0
  166. package/core/shared/skills/do-code-review/assets/sample_json_clean.json +7 -0
  167. package/core/shared/skills/do-code-review/assets/sample_markdown_clean.md +30 -0
  168. package/core/shared/skills/do-code-review/assets/sample_markdown_smells.md +29 -0
  169. package/core/shared/skills/do-code-review/assets/sample_shell_heredoc.sh +38 -0
  170. package/core/shared/skills/do-code-review/assets/sample_shell_smells.sh +15 -0
  171. package/core/shared/skills/do-code-review/assets/sample_typescript_strings.ts +36 -0
  172. package/core/shared/skills/do-code-review/assets/sample_yaml_smells.yaml +6 -0
  173. package/core/shared/skills/do-code-review/content-types/config.md +83 -0
  174. package/core/shared/skills/do-code-review/content-types/markdown.md +132 -0
  175. package/core/shared/skills/do-code-review/expected_outputs/sample_c_clean_quality.json +79 -0
  176. package/core/shared/skills/do-code-review/expected_outputs/sample_c_smells_quality.json +169 -0
  177. package/core/shared/skills/do-code-review/expected_outputs/sample_cpp_shift_quality.json +49 -0
  178. package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_clean_quality.json +149 -0
  179. package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_smells_quality.json +157 -0
  180. package/core/shared/skills/do-code-review/expected_outputs/sample_java_clean_quality.json +67 -0
  181. package/core/shared/skills/do-code-review/expected_outputs/sample_java_smells_quality.json +97 -0
  182. package/core/shared/skills/do-code-review/expected_outputs/sample_json_clean_quality.json +33 -0
  183. package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_clean_quality.json +1 -0
  184. package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_smells_quality.json +16 -0
  185. package/core/shared/skills/do-code-review/expected_outputs/sample_shell_heredoc_quality.json +54 -0
  186. package/core/shared/skills/do-code-review/expected_outputs/sample_shell_smells_quality.json +91 -0
  187. package/core/shared/skills/do-code-review/expected_outputs/sample_typescript_strings_quality.json +60 -0
  188. package/core/shared/skills/do-code-review/expected_outputs/sample_yaml_smells_quality.json +46 -0
  189. package/core/shared/skills/do-code-review/languages/c.md +103 -0
  190. package/core/shared/skills/do-code-review/languages/cpp.md +103 -0
  191. package/core/shared/skills/do-code-review/languages/csharp.md +97 -0
  192. package/core/shared/skills/do-code-review/languages/dart.md +108 -0
  193. package/core/shared/skills/do-code-review/languages/go.md +92 -0
  194. package/core/shared/skills/do-code-review/languages/java.md +103 -0
  195. package/core/shared/skills/do-code-review/languages/kotlin.md +88 -0
  196. package/core/shared/skills/do-code-review/languages/php.md +109 -0
  197. package/core/shared/skills/do-code-review/languages/python.md +94 -0
  198. package/core/shared/skills/do-code-review/languages/ruby.md +105 -0
  199. package/core/shared/skills/do-code-review/languages/rust.md +99 -0
  200. package/core/shared/skills/do-code-review/languages/shell.md +90 -0
  201. package/core/shared/skills/do-code-review/languages/swift.md +88 -0
  202. package/core/shared/skills/do-code-review/languages/typescript.md +97 -0
  203. package/core/shared/skills/do-code-review/review-policy.json +47 -0
  204. package/core/shared/skills/do-code-review/rules/universal.md +49 -0
  205. package/core/shared/skills/do-code-review/scripts/code_quality_checker.py +1696 -0
  206. package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +532 -0
  207. package/core/shared/skills/do-code-review/scripts/pr_analyzer.py +620 -0
  208. package/core/shared/skills/do-code-review/scripts/review_report_generator.py +505 -0
  209. package/core/shared/skills/do-constitution/SKILL.md +72 -0
  210. package/core/shared/skills/do-design/SKILL.md +212 -0
  211. package/core/shared/skills/do-diagnose/SKILL.md +156 -0
  212. package/core/shared/skills/do-diagnose/references/code_audit.md +15 -0
  213. package/core/shared/skills/do-diagnose/references/refactoring.md +12 -0
  214. package/core/shared/skills/do-diagnose/references/root_cause.md +17 -0
  215. package/core/shared/skills/do-document/SKILL.md +81 -0
  216. package/core/shared/skills/do-document/references/api-reference.md +42 -0
  217. package/core/shared/skills/do-document/references/deep_research.md +18 -0
  218. package/core/shared/skills/do-document/references/embedded-research.md +11 -0
  219. package/core/shared/skills/do-document/references/implementation-flow.md +105 -0
  220. package/core/shared/skills/do-document/references/index_generator.md +9 -0
  221. package/core/shared/skills/do-document/references/user-guide.md +22 -0
  222. package/core/shared/skills/do-execute-plan/SKILL.md +261 -0
  223. package/core/shared/skills/do-execute-plan/references/handoff_record.md +57 -0
  224. package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +92 -0
  225. package/core/shared/skills/do-execute-plan/references/readiness_gate.md +155 -0
  226. package/core/shared/skills/do-execute-plan/references/run_position.md +63 -0
  227. package/core/shared/skills/do-execute-plan/references/scaffold.md +441 -0
  228. package/core/shared/skills/do-execute-plan/references/task_attempts.md +41 -0
  229. package/core/shared/skills/do-flow/SKILL.md +186 -0
  230. package/core/shared/skills/do-flow/references/task_classes.md +134 -0
  231. package/core/shared/skills/do-git/SKILL.md +115 -0
  232. package/core/shared/skills/do-git/references/hotfix-ritual.md +44 -0
  233. package/core/shared/skills/do-git/references/lifecycle-policy.md +54 -0
  234. package/core/shared/skills/do-git/references/release-ritual.md +64 -0
  235. package/core/shared/skills/do-implement/SKILL.md +222 -0
  236. package/core/shared/skills/do-plan/SKILL.md +219 -0
  237. package/core/shared/skills/do-test/SKILL.md +113 -0
  238. package/core/shared/templates/doflow/constitution-template.md +28 -0
  239. package/core/shared/templates/doflow/data-model-template.md +169 -0
  240. package/core/shared/templates/doflow/design-template.md +193 -0
  241. package/core/shared/templates/doflow/external-contract-template.md +35 -0
  242. package/core/shared/templates/doflow/intent-template.md +45 -0
  243. package/core/shared/templates/doflow/plan-template.md +151 -0
  244. package/core/shared/templates/doflow/question-log-template.md +51 -0
  245. package/core/shared/templates/doflow/requirement-template.md +126 -0
  246. package/core/shared/templates/doflow/specs-template.md +55 -0
  247. package/core/shared/templates/doflow/state-template.md +59 -0
  248. package/core/shared/workflows/do-flow-chain.md +17 -0
  249. package/package.json +48 -4
  250. package/src/adapters/antigravity/index.js +631 -0
  251. package/src/adapters/claude/index.js +548 -0
  252. package/src/adapters/claude/mcp.js +94 -0
  253. package/src/adapters/codex/agents.js +208 -0
  254. package/src/adapters/codex/config.js +272 -0
  255. package/src/adapters/codex/hooks.js +203 -0
  256. package/src/adapters/codex/index.js +707 -0
  257. package/src/adapters/codex/mcp.js +271 -0
  258. package/src/adapters/codex/native-projection.js +34 -0
  259. package/src/adapters/copilot/index.js +413 -0
  260. package/src/adapters/copy-tree.js +620 -0
  261. package/src/adapters/gemini/hooks.js +210 -0
  262. package/src/adapters/gemini/index.js +390 -0
  263. package/src/adapters/hook-commands.js +60 -0
  264. package/src/adapters/index.js +106 -0
  265. package/src/adapters/kiro/index.js +310 -0
  266. package/src/adapters/mcp-entries.js +331 -0
  267. package/src/adapters/opencode/index.js +466 -0
  268. package/src/adapters/pi/index.js +279 -0
  269. package/src/adapters/pi/json-members.js +185 -0
  270. package/src/adapters/pi/mcp.js +373 -0
  271. package/src/adapters/resolve-source.js +19 -0
  272. package/src/cli/commands/install.js +218 -0
  273. package/src/cli/commands/list-backups.js +21 -0
  274. package/src/cli/commands/reconcile.js +120 -0
  275. package/src/cli/commands/remove.js +82 -0
  276. package/src/cli/commands/rollback.js +172 -0
  277. package/src/cli/commands/self-update.js +33 -0
  278. package/src/cli/commands/status.js +138 -0
  279. package/src/cli/commands/tools.js +92 -0
  280. package/src/cli/commands/update.js +162 -0
  281. package/src/cli/index.js +568 -0
  282. package/src/cli/runtime-commands.js +281 -0
  283. package/src/cli/shared.js +218 -0
  284. package/src/helper/bash-helper.js +34 -0
  285. package/src/helper/git.js +24 -0
  286. package/src/helper/guardrails.js +49 -0
  287. package/src/helper/harness-paths.js +140 -0
  288. package/src/helper/marker-merge.js +116 -0
  289. package/src/helper/prompt.js +61 -0
  290. package/src/helper/repo-root.js +29 -0
  291. package/src/helper/settings-merge.js +151 -0
  292. package/src/helper/settings-scope.js +33 -0
  293. package/src/helper/toml.js +244 -0
  294. package/src/install/backup-set.js +149 -0
  295. package/src/install/backup.js +724 -0
  296. package/src/install/context.js +58 -0
  297. package/src/install/manifest.js +145 -0
  298. package/src/install/mcp.js +254 -0
  299. package/src/install/paths.js +84 -0
  300. package/src/install/targets.js +90 -0
  301. package/src/install/tool-lifecycle.js +151 -0
  302. package/src/lifecycle/bash-availability.js +25 -0
  303. package/src/lifecycle/index.js +812 -0
  304. package/src/lifecycle/mcp-index.js +28 -0
  305. package/src/lifecycle/policies.js +73 -0
  306. package/src/lifecycle/view.js +175 -0
  307. package/src/registry/index.js +611 -0
  308. package/src/release/build-package.js +91 -0
  309. package/src/release/changelog-section.js +70 -0
  310. package/src/release/sync-plugin-versions.js +66 -0
  311. package/src/runtime/advice/cli.js +283 -0
  312. package/src/runtime/advice/client.js +324 -0
  313. package/src/runtime/advice/config.js +189 -0
  314. package/src/runtime/advice/doctor.js +169 -0
  315. package/src/runtime/advice/endpoint-guard.js +134 -0
  316. package/src/runtime/advice/kinds.js +154 -0
  317. package/src/runtime/advice/providers/ollama-systemone.js +209 -0
  318. package/src/runtime/advice/record.js +166 -0
  319. package/src/runtime/advice/registry.js +170 -0
  320. package/src/runtime/advice/strength.js +66 -0
  321. package/src/runtime/brief-tools.js +342 -0
  322. package/src/runtime/c4-project.js +371 -0
  323. package/src/runtime/capability-router.js +484 -0
  324. package/src/runtime/checkouts.js +170 -0
  325. package/src/runtime/claims.js +468 -0
  326. package/src/runtime/cli-result.js +55 -0
  327. package/src/runtime/cli.js +678 -0
  328. package/src/runtime/command-detect.js +516 -0
  329. package/src/runtime/context-pack.js +492 -0
  330. package/src/runtime/decision-register.js +493 -0
  331. package/src/runtime/evidence-ledger.js +338 -0
  332. package/src/runtime/failure/capture.js +272 -0
  333. package/src/runtime/failure/classifier.js +68 -0
  334. package/src/runtime/failure/cli.js +178 -0
  335. package/src/runtime/failure/home.js +64 -0
  336. package/src/runtime/failure/store.js +226 -0
  337. package/src/runtime/feature-resolve.js +79 -0
  338. package/src/runtime/freshness.js +177 -0
  339. package/src/runtime/health.js +863 -0
  340. package/src/runtime/history-compactor.js +237 -0
  341. package/src/runtime/implementation-gate.js +321 -0
  342. package/src/runtime/inventory/coverage.js +218 -0
  343. package/src/runtime/inventory/identity.js +65 -0
  344. package/src/runtime/inventory/index.js +705 -0
  345. package/src/runtime/inventory/precedence.js +134 -0
  346. package/src/runtime/inventory/read-scopes.js +131 -0
  347. package/src/runtime/inventory/siblings.js +192 -0
  348. package/src/runtime/knowledge/chunker.js +124 -0
  349. package/src/runtime/knowledge/hybrid.js +149 -0
  350. package/src/runtime/knowledge/index-store.js +145 -0
  351. package/src/runtime/knowledge/retrieval.js +194 -0
  352. package/src/runtime/leak-scan.js +185 -0
  353. package/src/runtime/lifecycle/cli.js +276 -0
  354. package/src/runtime/lifecycle/event-store.js +340 -0
  355. package/src/runtime/lifecycle/fold.js +353 -0
  356. package/src/runtime/lifecycle/followup.js +432 -0
  357. package/src/runtime/lifecycle/goal.js +249 -0
  358. package/src/runtime/lifecycle/intent-writer.js +86 -0
  359. package/src/runtime/lifecycle/overview.js +292 -0
  360. package/src/runtime/lifecycle/release.js +241 -0
  361. package/src/runtime/lifecycle/report-store.js +221 -0
  362. package/src/runtime/lifecycle/retention.js +212 -0
  363. package/src/runtime/lifecycle/root.js +71 -0
  364. package/src/runtime/lifecycle/status.js +353 -0
  365. package/src/runtime/lifecycle/store-upkeep.js +393 -0
  366. package/src/runtime/locator-resolve.js +158 -0
  367. package/src/runtime/mask.js +210 -0
  368. package/src/runtime/mcp-consultations.js +412 -0
  369. package/src/runtime/mcp-reach.js +157 -0
  370. package/src/runtime/model-router.js +153 -0
  371. package/src/runtime/outcome.js +467 -0
  372. package/src/runtime/reach.js +148 -0
  373. package/src/runtime/readiness-record.js +150 -0
  374. package/src/runtime/readiness.js +435 -0
  375. package/src/runtime/recovery.js +282 -0
  376. package/src/runtime/research-request.js +231 -0
  377. package/src/runtime/retrieval-plan.js +578 -0
  378. package/src/runtime/scaffold/artifacts.js +217 -0
  379. package/src/runtime/scaffold/fingerprint.js +56 -0
  380. package/src/runtime/scaffold/generate.js +911 -0
  381. package/src/runtime/scaffold/languages.js +245 -0
  382. package/src/runtime/storage/cli.js +64 -0
  383. package/src/runtime/storage/engine.js +249 -0
  384. package/src/runtime/storage/registry.js +130 -0
  385. package/src/runtime/storage/roots.js +63 -0
  386. package/src/runtime/storage/rules.js +282 -0
  387. package/src/runtime/storage/upkeep.js +243 -0
  388. package/src/runtime/storage/work-status.js +326 -0
  389. package/src/runtime/task-attempts.js +415 -0
  390. package/src/runtime/task-classifier.js +550 -0
  391. package/src/runtime/task-scope.js +130 -0
  392. package/src/runtime/task-state.js +176 -0
  393. package/src/runtime/trace/indicators.js +235 -0
  394. package/src/runtime/trace/ledger.js +626 -0
  395. package/src/runtime/trace/render.js +76 -0
  396. package/src/runtime/trace/views.js +459 -0
  397. package/src/runtime/verification/contract-runner.js +341 -0
  398. package/src/runtime/verification/engine.js +1461 -0
  399. package/src/runtime/verification/registry.js +130 -0
  400. package/src/runtime/verification/scope-bound.js +418 -0
  401. package/src/runtime/verification/test-selection.js +172 -0
  402. package/src/runtime/workflow-engine.js +588 -0
  403. package/src/runtime/workflow-orchestrator.js +953 -0
  404. package/src/runtime/worktree.js +340 -0
  405. package/src/state/index.js +193 -0
  406. package/src/state/lockfile.js +136 -0
  407. package/src/state/run-lock.js +408 -0
  408. package/types/node-commonjs.d.ts +68 -0
  409. package/types/runtime.d.ts +91 -0
@@ -0,0 +1,108 @@
1
+ ---
2
+ language: dart
3
+ extensions: [".dart"]
4
+ ---
5
+
6
+ # Dart / Flutter — Language-Specific Review Notes
7
+
8
+ Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Dart and Flutter-specific rules and idioms.
9
+
10
+ ---
11
+
12
+ ## PR Analyzer — Dart / Flutter Risk Signals
13
+
14
+ - `print()` statements left in production code — use a logging package
15
+ - `// ignore:` lint suppression comments — verify they are justified
16
+ - `!` null assertion operator used broadly without justification
17
+ - Hardcoded API keys, tokens, or URLs in Dart source — use environment variables or a secrets package
18
+ - `TODO` / `FIXME` near widget lifecycle or state management code
19
+
20
+ ---
21
+
22
+ ## Code Quality — Dart Checks
23
+
24
+ - `dynamic` used where a concrete type is known — defeats static analysis
25
+ - `!` (null assertion) used broadly — prefer null-safe patterns
26
+ - `StatefulWidget` used where `StatelessWidget` suffices — prefer stateless
27
+ - `setState` called with heavy computation inside — offload before calling
28
+ - `BuildContext` used across async gaps without checking `mounted`
29
+ - Missing `const` constructor on widgets that could be constant
30
+
31
+ ---
32
+
33
+ ## Security
34
+
35
+ - Flag API keys or secrets hardcoded in Dart source or `pubspec.yaml` — use `--dart-define` or a secrets manager
36
+ - Flag `http` package used without certificate validation disabled intentionally
37
+ - Flag `SharedPreferences` used to store sensitive data — use `flutter_secure_storage`
38
+ - Flag user-controlled input used in `dart:io` file path operations without sanitization
39
+ - Flag `WebView` loading arbitrary user-supplied URLs without validation
40
+ - Flag deep link / URL scheme handlers that don't validate the incoming URL before acting on it
41
+
42
+ ---
43
+
44
+ ## Async / Concurrency
45
+
46
+ - Flag `BuildContext` used after an `await` without checking `if (!mounted) return` — context may be invalid
47
+ - Flag `Future` returned but not `await`-ed and without `.catchError()` or `unawaited()` — floating future
48
+ - Flag `Isolate.spawn` without a clear message-passing protocol
49
+ - Flag heavy computation on the main isolate — offload with `compute()` or `Isolate.run()`
50
+ - Flag `StreamController` not closed when the owning widget is disposed — memory leak
51
+ - Flag `async*` / `yield*` generators with no error handling on the stream consumer side
52
+
53
+ ---
54
+
55
+ ## Resource Management
56
+
57
+ - Flag `StreamController` not closed in `dispose()`
58
+ - Flag `AnimationController` not disposed in `dispose()`
59
+ - Flag `TextEditingController` / `FocusNode` / `ScrollController` not disposed in `dispose()`
60
+ - Flag `Timer` not cancelled in `dispose()`
61
+ - Flag listeners added to `ChangeNotifier` / `ValueNotifier` without a corresponding `removeListener`
62
+
63
+ ---
64
+
65
+ ## Exception Handling
66
+
67
+ - Flag empty `catch` blocks — swallowed errors
68
+ - Flag `catchError` with no handler body — silent failure
69
+ - Flag `Future.error` not surfaced to the UI — show an error state
70
+ - Flag `FlutterError.onError` overridden without calling the original handler
71
+ - Prefer typed `on ExceptionType catch (e)` over generic `catch (e)` where the exception type is known
72
+
73
+ ---
74
+
75
+ ## Performance
76
+
77
+ - Flag `setState` called for changes that only affect a small subtree — use `ValueNotifier` / `provider` / `Riverpod` to scope rebuilds
78
+ - Flag expensive computation inside `build()` — move to `initState`, a controller, or a `FutureBuilder`
79
+ - Flag `ListView` without `ListView.builder` for long or infinite lists — builds all children at once
80
+ - Flag missing `const` on widgets that never change — prevents unnecessary rebuilds
81
+ - Flag `Image.network` without a caching package in a list — re-downloads on every scroll
82
+ - Flag `RepaintBoundary` missing around frequently-repainted widgets (animations, counters)
83
+
84
+ ---
85
+
86
+ ## Idioms and Best Practices
87
+
88
+ ### Null Safety
89
+ - Prefer `?.` safe navigation and `??` null coalescing over `!` assertions
90
+ - Use `late` only when initialization is guaranteed before first access — document why
91
+ - Prefer early returns over deeply nested null checks
92
+
93
+ ### Flutter Widget Patterns
94
+ - Prefer `StatelessWidget` + external state management over `StatefulWidget` for business logic
95
+ - Keep `build()` methods pure — no side effects, no heavy computation
96
+ - Extract repeated widget subtrees into named widget classes, not just methods, for better rebuild granularity
97
+ - Use `const` constructors wherever possible — compile-time constant widgets skip rebuilds entirely
98
+
99
+ ### State Management
100
+ - Do not mix multiple state management approaches in the same feature
101
+ - Flag business logic inside `build()` — it belongs in a ViewModel, Notifier, or BLoC
102
+ - Prefer `Riverpod` / `provider` / `BLoC` over raw `setState` for anything beyond local UI state
103
+
104
+ ### Modern Dart (3.x)
105
+ - Prefer `sealed` classes for exhaustive pattern matching on domain types
106
+ - Use records (`(int, String)`) for lightweight multi-value returns instead of ad hoc classes
107
+ - Use `switch` expressions with pattern matching instead of long `if/else` chains
108
+ - Prefer `final` for local variables — immutability by default
@@ -0,0 +1,92 @@
1
+ ---
2
+ language: go
3
+ extensions: [".go"]
4
+ ---
5
+
6
+ # Go — Language-Specific Review Notes
7
+
8
+ Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Go-specific rules and idioms.
9
+
10
+ ---
11
+
12
+ ## PR Analyzer — Go Risk Signals
13
+
14
+ - `fmt.Println` / `log.Println` debug statements left in production code
15
+ - `//nolint` comments — verify they are justified
16
+ - `unsafe` package imports — require explicit sign-off
17
+ - Hardcoded credentials or tokens in source
18
+
19
+ ---
20
+
21
+ ## Code Quality — Go Checks
22
+
23
+ - Errors returned but not checked (`_ = someFunc()`)
24
+ - `panic()` used outside of package initialization
25
+ - Goroutines started without a clear lifetime or cancellation path
26
+ - `interface{}` / `any` used where a concrete type or typed interface would work
27
+ - Missing context propagation (`context.Context` not threaded through call chains)
28
+
29
+ ---
30
+
31
+ ## Security
32
+
33
+ - Flag `database/sql` queries built with `fmt.Sprintf` — require `?` / `$N` placeholders
34
+ - Flag `os/exec` calls with user-controlled arguments without sanitization
35
+ - Flag `html/template` bypassed in favor of `text/template` for HTML output
36
+ - Flag `http.ListenAndServeTLS` with `InsecureSkipVerify: true`
37
+
38
+ ---
39
+
40
+ ## Async / Concurrency
41
+
42
+ - Flag goroutines started with no clear lifetime or cancellation path — always pass `context.Context`
43
+ - Flag goroutines that write to a channel with no receiver and no `select` default — causes a leak
44
+ - Flag `time.Sleep()` used inside a goroutine as a synchronization mechanism
45
+ - Flag `sync.WaitGroup.Add()` called inside the goroutine it tracks — race condition
46
+ - Flag `sync.Mutex` copied by value — must always be used as a pointer or embedded in a struct
47
+
48
+ ---
49
+
50
+ ## Resource Management
51
+
52
+ - Flag `http.Response.Body` not closed after reading — even on error paths (`defer resp.Body.Close()`)
53
+ - Flag `os.File` not closed — use `defer f.Close()` immediately after opening
54
+ - Flag `rows.Close()` missing after `sql.Query()` — leaks the DB connection
55
+ - Flag `context.WithCancel` / `context.WithTimeout` cancel function not called — context and resources leak
56
+
57
+ ---
58
+
59
+ ## Exception Handling
60
+
61
+ - Flag errors assigned to `_` without a comment explaining why it is safe to ignore
62
+ - Flag errors not wrapped with `fmt.Errorf("...: %w", err)` — loses stack context
63
+ - Flag `errors.New` / `fmt.Errorf` strings starting with a capital letter or ending in punctuation — violates Go conventions
64
+ - Flag `panic()` used for expected runtime errors — reserve for programming errors and unrecoverable states
65
+ - Flag `recover()` used to silently swallow panics without logging
66
+
67
+ ---
68
+
69
+ ## Performance
70
+
71
+ - Flag `fmt.Sprintf` used for simple string concatenation — use `strings.Builder` or `+` for small cases
72
+ - Flag `append()` in a tight loop without pre-allocating slice capacity — use `make([]T, 0, n)`
73
+ - Flag `json.Marshal` / `json.Unmarshal` on large structs in hot paths — consider `json.Encoder` / streaming
74
+ - Flag goroutines spawned per-request without a worker pool for CPU-bound tasks
75
+
76
+ ---
77
+
78
+ ## Idioms and Best Practices
79
+
80
+ ### Error Handling
81
+ - All returned errors must be checked — never assign to `_` without a comment
82
+ - Prefer wrapping with `fmt.Errorf("...: %w", err)` for stack context
83
+ - Use `errors.Is` / `errors.As` for error inspection — never string comparison
84
+
85
+ ### Concurrency
86
+ - Every goroutine must have an owner responsible for its lifetime
87
+ - Always pass `context.Context` as the first argument to functions that do I/O or block
88
+ - Prefer `sync.WaitGroup` or `errgroup` over ad-hoc channel coordination
89
+
90
+ ### Modern Go (1.18+)
91
+ - Prefer generics over `interface{}` for container types and utility functions
92
+ - Use `any` (alias for `interface{}`) in new code for readability
@@ -0,0 +1,103 @@
1
+ ---
2
+ language: java
3
+ extensions: [".java"]
4
+ ---
5
+
6
+ # Java — Language-Specific Review Notes
7
+
8
+ Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Java-specific rules and idioms.
9
+
10
+ ---
11
+
12
+ ## PR Analyzer — Java Risk Signals
13
+
14
+ - `System.out.println` / `e.printStackTrace()` left in production code
15
+ - `@SuppressWarnings` annotations — verify they are justified
16
+ - Hardcoded JDBC URLs or credentials in source
17
+ - Raw type usage (`List`, `Map` without generics)
18
+
19
+ ---
20
+
21
+ ## Code Quality — Java Checks
22
+
23
+ - Empty `catch` blocks swallowing exceptions silently
24
+ - Checked exceptions caught and not re-thrown with context
25
+ - `Closeable` / `AutoCloseable` resources not in try-with-resources
26
+ - Raw type usage — defeats generics type safety
27
+ - Missing `@Override` on overriding methods
28
+ - `InterruptedException` caught without calling `Thread.currentThread().interrupt()`
29
+
30
+ ---
31
+
32
+ ## Security
33
+
34
+ - Flag JPQL / HQL or native SQL string concatenation — require named parameters or `CriteriaBuilder`
35
+ - Flag `@RequestMapping` without explicit HTTP method restriction on state-changing endpoints
36
+ - Flag user-controlled input passed to `Runtime.exec()` or `ProcessBuilder` without validation
37
+ - Flag `ObjectInputStream.readObject()` on untrusted data — unsafe deserialization
38
+ - Flag hardcoded JDBC URLs or credentials — require environment variables or a vault
39
+
40
+ ---
41
+
42
+ ## Async / Concurrency
43
+
44
+ - Flag `ExecutorService.submit()` return value ignored — exceptions are swallowed
45
+ - Flag `Thread.sleep()` used as a synchronization mechanism — use `CountDownLatch`, `CompletableFuture`, or `await()`
46
+ - Flag `CompletableFuture` chains with no `.exceptionally()` or `.handle()` terminal handler
47
+ - Flag `InterruptedException` caught without calling `Thread.currentThread().interrupt()`
48
+ - Flag `synchronized` on a non-final field — the lock object can be replaced
49
+ - Flag `HashMap` used in multi-threaded context — use `ConcurrentHashMap`
50
+
51
+ ---
52
+
53
+ ## Resource Management
54
+
55
+ - Flag `InputStream`, `OutputStream`, `Connection`, `ResultSet`, `PreparedStatement` not wrapped in try-with-resources
56
+ - Flag manual `finally { resource.close() }` — replace with try-with-resources
57
+ - Flag `HttpURLConnection` not disconnected after use
58
+ - Flag JDBC `Connection` obtained from a pool and not returned (missing `close()`) on all paths
59
+ - Flag `static` `HttpClient` or `Connection` fields shared across threads without connection pool management
60
+
61
+ ---
62
+
63
+ ## Exception Handling
64
+
65
+ - Flag empty `catch` blocks — `catch (Exception e) {}`
66
+ - Flag `InterruptedException` caught without `Thread.currentThread().interrupt()` — breaks cooperative cancellation
67
+ - Flag checked exceptions swallowed in a `catch` and not re-thrown or logged with context
68
+ - Flag `throw new RuntimeException(e)` without a descriptive message — loses context
69
+ - Flag `printStackTrace()` as the sole error handling — use a proper logger
70
+
71
+ ---
72
+
73
+ ## Performance
74
+
75
+ - Flag `String` concatenation in loops — use `StringBuilder`
76
+ - Flag `List.contains()` / `Map.get()` in a loop on large collections — review data structure choice
77
+ - Flag N+1 JPA / Hibernate queries — use `JOIN FETCH` or `@BatchSize`
78
+ - Flag `new ObjectMapper()` / `new Gson()` instantiated per-request — share a singleton
79
+ - Flag `ResultSet` fully iterated when only the first result is needed — use `LIMIT 1` in the query
80
+
81
+ ---
82
+
83
+ ## Idioms and Best Practices
84
+
85
+ ### Null Safety
86
+ - Prefer returning `Optional<T>` over `null` from methods
87
+ - Flag unchecked dereferences without a prior null guard
88
+ - Do not catch `NullPointerException` — fix the root cause instead
89
+
90
+ ### Collections and Streams
91
+ - Flag `==` used to compare `String` or boxed types — use `.equals()`
92
+ - Flag `.collect(Collectors.toList())` where `.toList()` (Java 16+) suffices
93
+ - Flag premature `.stream().collect()` round-trips that could be a single-pass operation
94
+
95
+ ### Generics
96
+ - Flag raw types in any new code — always parameterize (`List<String>`, not `List`)
97
+ - Flag unchecked cast warnings suppressed without explanation
98
+
99
+ ### Modern Java (11+)
100
+ - Prefer `var` for local variables where the type is obvious from the right-hand side
101
+ - Prefer records for pure data carriers over manual POJOs with getters/setters
102
+ - Prefer `instanceof` pattern matching (`if (obj instanceof String s)`) over explicit casts
103
+ - Prefer `switch` expressions over `switch` statements where a value is returned
@@ -0,0 +1,88 @@
1
+ ---
2
+ language: kotlin
3
+ extensions: [".kt", ".kts"]
4
+ ---
5
+
6
+ # Kotlin — Language-Specific Review Notes
7
+
8
+ Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Kotlin-specific rules and idioms.
9
+
10
+ ---
11
+
12
+ ## PR Analyzer — Kotlin Risk Signals
13
+
14
+ - `println()` statements left in production code
15
+ - `@Suppress` annotations — verify they are justified
16
+ - `!!` (not-null assertion) used broadly without justification
17
+ - Hardcoded credentials or API keys in source
18
+
19
+ ---
20
+
21
+ ## Code Quality — Kotlin Checks
22
+
23
+ - `!!` used broadly — prefer `?.let`, `?:`, or `requireNotNull()`
24
+ - `lateinit var` accessed before initialization
25
+ - Coroutines launched with `GlobalScope` — prefer scoped coroutines
26
+ - `runBlocking` used outside of tests or top-level entry points
27
+
28
+ ---
29
+
30
+ ## Security
31
+
32
+ - Flag Room / SQLite queries built with string concatenation — require parameterized queries
33
+ - Flag `WebView.loadUrl()` with user-controlled input without validation
34
+ - Flag credentials stored in `SharedPreferences` — require `EncryptedSharedPreferences` or Keychain
35
+
36
+ ---
37
+
38
+ ## Async / Coroutines
39
+
40
+ - Flag `GlobalScope.launch` / `GlobalScope.async` in production code — use a structured scope
41
+ - Flag `runBlocking` outside of tests or top-level main functions
42
+ - Flag `launch` / `async` without a `CoroutineExceptionHandler` or `supervisorScope` where individual failures should not cancel siblings
43
+ - Flag `Dispatchers.Main` used for CPU-bound work — use `Dispatchers.Default`
44
+ - Flag coroutine cancellation not respected — long loops should check `isActive` or call `yield()`
45
+
46
+ ---
47
+
48
+ ## Resource Management
49
+
50
+ - Flag `Closeable` / `AutoCloseable` not wrapped in `.use { }` (Kotlin's try-with-resources equivalent)
51
+ - Flag `OkHttpClient` / `Retrofit` instantiated per-request — share a singleton
52
+ - Flag `BroadcastReceiver` registered without a corresponding `unregisterReceiver` — memory / battery leak
53
+ - Flag coroutines that hold a resource across a `suspend` point without structured cleanup in `finally`
54
+
55
+ ---
56
+
57
+ ## Exception Handling
58
+
59
+ - Flag `runCatching { }.getOrNull()` used broadly — silently swallows all exceptions
60
+ - Flag `catch (e: Exception)` in coroutines without re-throwing `CancellationException` — breaks structured concurrency
61
+ - Flag empty `catch` blocks
62
+ - Flag `throw RuntimeException(e)` without a descriptive message
63
+ - Prefer typed `sealed class` error hierarchies over raw exceptions for domain errors in coroutine flows
64
+
65
+ ---
66
+
67
+ ## Performance
68
+
69
+ - Flag `buildString` / `StringBuilder` not used for multi-step string construction in loops
70
+ - Flag `List` used for frequent `contains` checks — prefer `Set`
71
+ - Flag `flow.collect {}` re-subscribing on every recomposition in Jetpack Compose — use `collectAsStateWithLifecycle`
72
+ - Flag `Dispatchers.IO` used for CPU-bound work — use `Dispatchers.Default`
73
+ - Flag `suspend` functions calling non-suspend blocking APIs directly — wrap with `withContext(Dispatchers.IO)`
74
+
75
+ ---
76
+
77
+ ## Idioms and Best Practices
78
+
79
+ ### Null Safety
80
+ - Prefer safe call (`?.`) and Elvis operator (`?:`) over `!!`
81
+ - Use `requireNotNull()` / `checkNotNull()` with a descriptive message when null means a programming error
82
+ - Prefer `val` over `var` — immutability by default
83
+
84
+ ### Modern Kotlin
85
+ - Prefer `data class` for value carriers
86
+ - Prefer `sealed class` / `sealed interface` for exhaustive `when` expressions
87
+ - Prefer extension functions over utility classes
88
+ - Prefer `object` declarations for singletons
@@ -0,0 +1,109 @@
1
+ ---
2
+ language: php
3
+ extensions: [".php", ".phtml", ".php3", ".php4", ".php5", ".phps"]
4
+ ---
5
+
6
+ # PHP — Language-Specific Review Notes
7
+
8
+ Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only PHP-specific rules and idioms.
9
+
10
+ ---
11
+
12
+ ## PR Analyzer — PHP Risk Signals
13
+
14
+ - `var_dump` / `print_r` / `echo` debug statements left in production code
15
+ - `@` error suppression operator — masks real errors; verify it is justified
16
+ - `// phpcs:ignore` / `// phpstan-ignore` comments — verify they are justified
17
+ - Hardcoded credentials, database passwords, or API keys in source
18
+ - `eval()` anywhere — almost always a security issue
19
+ - `$_GET` / `$_POST` / `$_REQUEST` / `$_COOKIE` used without sanitization
20
+
21
+ ---
22
+
23
+ ## Code Quality — PHP Checks
24
+
25
+ - Missing type declarations on function parameters and return types
26
+ - `mixed` return type used broadly — tighten to specific types
27
+ - Global variables (`global $var`) — pass dependencies explicitly
28
+ - Long functions (>50 lines) — PHP functions tend to accumulate logic
29
+ - `isset()` / `empty()` used to mask type errors instead of fixing the root cause
30
+ - Missing `strict_types=1` declaration at the top of the file
31
+
32
+ ---
33
+
34
+ ## Security
35
+
36
+ - Flag `$_GET` / `$_POST` / `$_REQUEST` used directly in SQL queries — require PDO prepared statements
37
+ - Flag `mysqli_query($conn, "SELECT ... WHERE id = " . $_GET['id'])` — SQL injection
38
+ - Flag `echo $_GET['name']` or any unescaped output — XSS; use `htmlspecialchars()` with `ENT_QUOTES`
39
+ - Flag `include` / `require` with user-controlled paths — local/remote file inclusion
40
+ - Flag `eval()` — remote code execution risk; no legitimate use in application code
41
+ - Flag `shell_exec` / `exec` / `system` / `passthru` with user-controlled input — command injection
42
+ - Flag `unserialize()` on untrusted data — arbitrary object instantiation and code execution
43
+ - Flag `move_uploaded_file` without MIME type validation and extension whitelist — file upload attack
44
+ - Flag `header("Location: " . $_GET['url'])` without validation — open redirect
45
+ - Flag missing CSRF token validation on state-changing form endpoints
46
+
47
+ ---
48
+
49
+ ## Async / Concurrency
50
+
51
+ - Flag long-running synchronous operations in a request cycle — offload to a queue (Laravel Queue, RabbitMQ)
52
+ - Flag `sleep()` used inside a request handler — blocks the PHP-FPM worker
53
+ - Flag shared mutable state in `static` properties accessed across requests in long-running processes (Swoole, RoadRunner)
54
+ - Flag missing idempotency in queued jobs — jobs can be retried on failure
55
+
56
+ ---
57
+
58
+ ## Resource Management
59
+
60
+ - Flag database connections not closed or returned to the pool (`$pdo = null` or `$conn->close()`)
61
+ - Flag `fopen` / `fwrite` without a matching `fclose` on all paths
62
+ - Flag `curl_init` without `curl_close` — leaks the curl handle
63
+ - Flag unbounded file uploads with no size or type restriction
64
+ - Flag sessions not explicitly closed (`session_write_close()`) before long operations — session locking blocks other requests
65
+
66
+ ---
67
+
68
+ ## Exception Handling
69
+
70
+ - Flag empty `catch` blocks — swallowed exceptions
71
+ - Flag `catch (Exception $e) {}` without logging — silent failure
72
+ - Flag `die()` / `exit()` used for error handling in library code — use exceptions
73
+ - Flag `@` operator used to suppress errors from functions that can fail — check return values instead
74
+ - Flag `trigger_error` used in new code — prefer exceptions
75
+
76
+ ---
77
+
78
+ ## Performance
79
+
80
+ - Flag N+1 Eloquent / Doctrine queries — use eager loading (`with()`, `load()`, `join`)
81
+ - Flag `count($array)` called repeatedly in a loop condition — cache the result
82
+ - Flag `array_push($arr, $val)` — use `$arr[] = $val` which is faster
83
+ - Flag `in_array` on large arrays without the strict third argument — use `isset` on a flipped array for O(1) lookup
84
+ - Flag `file_get_contents` on remote URLs in a request cycle — use an HTTP client with timeout and async where possible
85
+ - Flag Eloquent `all()` without pagination — loads entire table into memory
86
+
87
+ ---
88
+
89
+ ## Idioms and Best Practices
90
+
91
+ ### Type Safety
92
+ - Always declare `declare(strict_types=1)` at the top of every file
93
+ - Use union types (`int|string`) and nullable types (`?string`) rather than `mixed`
94
+ - Use typed properties on classes — avoid untyped `public $foo`
95
+ - Use constructor promotion for simple value objects
96
+
97
+ ### Modern PHP (8.x)
98
+ - Prefer `match` expressions over `switch` — strict comparison, no fall-through
99
+ - Use named arguments for functions with many optional parameters
100
+ - Use `enum` for fixed sets of values instead of class constants
101
+ - Use `readonly` properties for immutable data
102
+ - Use nullsafe operator (`?->`) instead of nested `isset` checks
103
+ - Use `first-class callable syntax` (`strlen(...)`) instead of string references
104
+
105
+ ### Laravel / Symfony Specific
106
+ - Keep controllers thin — logic belongs in service classes or action classes
107
+ - Use form requests for validation — never validate in the controller directly
108
+ - Prefer Eloquent relationships over manual joins for readability
109
+ - Flag raw queries where the ORM can express the same intent safely
@@ -0,0 +1,94 @@
1
+ ---
2
+ language: python
3
+ extensions: [".py"]
4
+ ---
5
+
6
+ # Python — Language-Specific Review Notes
7
+
8
+ Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Python-specific rules and idioms.
9
+
10
+ ---
11
+
12
+ ## PR Analyzer — Python Risk Signals
13
+
14
+ - `print()` statements left in production code
15
+ - `# noqa` and `# type: ignore` comments — verify they are justified
16
+ - `eval()` / `exec()` with any user-controlled input
17
+ - `pickle` used to deserialize untrusted data
18
+ - Hardcoded credentials or tokens in source
19
+
20
+ ---
21
+
22
+ ## Code Quality — Python Checks
23
+
24
+ - Bare `except:` or `except Exception:` swallowing silently
25
+ - Mutable default arguments (`def foo(items=[])`) — shared across calls
26
+ - `import *` — pollutes namespace and hides dependencies
27
+ - Missing type hints on public functions and methods
28
+ - `assert` used for runtime validation — stripped by `-O` flag
29
+
30
+ ---
31
+
32
+ ## Security
33
+
34
+ - Flag `eval()` / `exec()` with any user-controlled input
35
+ - Flag `pickle.loads()` on untrusted data — use `json` or `msgpack`
36
+ - Flag `subprocess` calls with `shell=True` and user input
37
+ - Flag `flask.render_template_string()` with user data (SSTI)
38
+ - Flag `SECRET_KEY` / `DEBUG = True` committed to source
39
+
40
+ ---
41
+
42
+ ## Async
43
+
44
+ - Flag `asyncio.get_event_loop().run_until_complete()` inside an already-running loop
45
+ - Flag mixing `threading` and `asyncio` without a clear bridge (`run_in_executor`)
46
+ - Flag CPU-bound work inside an `async def` without offloading to `ProcessPoolExecutor`
47
+ - Flag `time.sleep()` inside async functions — use `await asyncio.sleep()`
48
+
49
+ ---
50
+
51
+ ## Resource Management
52
+
53
+ - Flag `open()` not used as a context manager (`with open(...) as f`)
54
+ - Flag `requests.Session` created per-request instead of shared/reused
55
+ - Flag database connections not closed or returned to a pool on all paths
56
+ - Flag large files read entirely into memory with `.read()` — prefer streaming / chunked reads
57
+
58
+ ---
59
+
60
+ ## Exception Handling
61
+
62
+ - Flag bare `except:` — catches `BaseException` including `KeyboardInterrupt` and `SystemExit`
63
+ - Flag `except Exception: pass` — silently swallows errors
64
+ - Flag re-raising with `raise e` instead of `raise` — loses the original traceback
65
+ - Flag `except` clause too broad when the `try` block covers multiple operations with different failure modes — split them
66
+
67
+ ---
68
+
69
+ ## Performance
70
+
71
+ - Flag `+` string concatenation in loops — use `"".join()`
72
+ - Flag repeated `re.compile()` inside a loop — compile once at module level
73
+ - Flag `list.append()` in a loop where a list comprehension would be more efficient
74
+ - Flag `in` membership tests on `list` where the collection is large — use `set`
75
+ - Flag loading entire large files into memory — prefer streaming or chunked reads
76
+
77
+ ---
78
+
79
+ ## Idioms and Best Practices
80
+
81
+ ### Type Safety
82
+ - All public functions and methods should have type annotations
83
+ - Prefer `X | None` (Python 3.10+) over `Optional[X]`
84
+ - Use `TypedDict` or `dataclass` over plain `dict` for structured data
85
+
86
+ ### Modern Python (3.10+)
87
+ - Prefer `match` statements over long `if/elif` chains
88
+ - Prefer `dataclass` or `NamedTuple` over plain classes for data carriers
89
+ - Prefer `pathlib.Path` over `os.path` for file operations
90
+ - Prefer f-strings over `.format()` or `%` formatting
91
+
92
+ ### None Safety
93
+ - Prefer explicit `if x is None` over falsy checks when `0` or `""` are valid values
94
+ - Flag functions returning `None` implicitly — make it explicit or raise