@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.
- package/LICENSE +21 -0
- package/README.md +132 -2
- package/bin/doflow.js +44 -0
- package/core/.antigravity-plugin/hooks.json +39 -0
- package/core/.antigravity-plugin/mcp_config.json +18 -0
- package/core/.antigravity-plugin/plugin.json +31 -0
- package/core/.claude-plugin/marketplace.json +20 -0
- package/core/.claude-plugin/plugin.json +21 -0
- package/core/.codex-plugin/marketplace.json +20 -0
- package/core/.codex-plugin/plugin.json +35 -0
- package/core/.plugin/plugin.json +19 -0
- package/core/harnesses/antigravity/hooks/pre-implementation-gate.sh +9 -0
- package/core/harnesses/antigravity/hooks/stop-check.sh +10 -0
- package/core/harnesses/claude/hooks/lib.sh +304 -0
- package/core/harnesses/claude/hooks/mcp-tool-guard.sh +20 -0
- package/core/harnesses/claude/hooks/permission-audit.sh +47 -0
- package/core/harnesses/claude/hooks/post-compact.sh +74 -0
- package/core/harnesses/claude/hooks/post-edit-lint.sh +36 -0
- package/core/harnesses/claude/hooks/post-tool-failure.sh +47 -0
- package/core/harnesses/claude/hooks/pre-bash-guard.sh +20 -0
- package/core/harnesses/claude/hooks/pre-compact.sh +43 -0
- package/core/harnesses/claude/hooks/pre-implement-gate.sh +21 -0
- package/core/harnesses/claude/hooks/session-end.sh +89 -0
- package/core/harnesses/claude/hooks/session-start.sh +5 -0
- package/core/harnesses/claude/hooks/skill-config-audit.sh +39 -0
- package/core/harnesses/claude/hooks/stop-check.sh +5 -0
- package/core/harnesses/claude/hooks/subagent-audit.sh +7 -0
- package/core/harnesses/claude/hooks/user-prompt-submit.sh +5 -0
- package/core/harnesses/claude/settings/keybindings.json +20 -0
- package/core/harnesses/claude/settings/settings.json +201 -0
- package/core/harnesses/claude/statusline/doflow-statusline.sh +49 -0
- package/core/harnesses/codex/agents/core-implementer.toml +7 -0
- package/core/harnesses/codex/agents/quality-guardian.toml +8 -0
- package/core/harnesses/codex/agents/research-writer.toml +8 -0
- package/core/harnesses/codex/agents/spec-analyst.toml +8 -0
- package/core/harnesses/codex/agents/system-architect.toml +9 -0
- package/core/harnesses/codex/config/config.toml +10 -0
- package/core/harnesses/codex/hooks/hooks.json +122 -0
- package/core/harnesses/codex/hooks/lib.sh +335 -0
- package/core/harnesses/codex/hooks/mcp-tool-guard.sh +18 -0
- package/core/harnesses/codex/hooks/post-edit-lint.impl.sh +52 -0
- package/core/harnesses/codex/hooks/post-edit-lint.sh +6 -0
- package/core/harnesses/codex/hooks/pre-bash-guard.sh +18 -0
- package/core/harnesses/codex/hooks/pre-compact.impl.sh +46 -0
- package/core/harnesses/codex/hooks/pre-compact.sh +9 -0
- package/core/harnesses/codex/hooks/pre-implement-gate.sh +19 -0
- package/core/harnesses/codex/hooks/session-end.impl.sh +92 -0
- package/core/harnesses/codex/hooks/session-end.sh +5 -0
- package/core/harnesses/codex/hooks/session-start.sh +5 -0
- package/core/harnesses/codex/hooks/stop-check.sh +8 -0
- package/core/harnesses/codex/hooks/subagent-audit.sh +8 -0
- package/core/harnesses/codex/hooks/user-prompt-submit.sh +6 -0
- package/core/harnesses/gemini/hooks/hooks.json +77 -0
- package/core/harnesses/gemini/hooks/lib.sh +302 -0
- package/core/harnesses/gemini/hooks/mcp-tool-guard.sh +21 -0
- package/core/harnesses/gemini/hooks/post-edit-lint.sh +39 -0
- package/core/harnesses/gemini/hooks/pre-bash-guard.sh +21 -0
- package/core/harnesses/gemini/hooks/pre-compact.sh +38 -0
- package/core/harnesses/gemini/hooks/pre-implement-gate.sh +22 -0
- package/core/harnesses/gemini/hooks/session-end.impl.sh +89 -0
- package/core/harnesses/gemini/hooks/session-end.sh +5 -0
- package/core/harnesses/gemini/hooks/session-start.sh +5 -0
- package/core/harnesses/gemini/settings/adapter-defaults.json +4 -0
- package/core/harnesses/kiro/agents/doflow.json +58 -0
- package/core/harnesses/kiro/hooks/doflow.json +53 -0
- package/core/harnesses/kiro/hooks/lib.sh +324 -0
- package/core/harnesses/kiro/hooks/mcp-tool-guard.sh +9 -0
- package/core/harnesses/kiro/hooks/pre-bash-guard.sh +9 -0
- package/core/harnesses/kiro/hooks/pre-implement-gate.sh +9 -0
- package/core/harnesses/kiro/hooks/session-start.sh +9 -0
- package/core/harnesses/kiro/hooks/stop-check.sh +43 -0
- package/core/harnesses/shared/hooks/ENVELOPE_MIGRATION.md +39 -0
- package/core/harnesses/shared/hooks/adapters/antigravity.js +111 -0
- package/core/harnesses/shared/hooks/adapters/arg-fields.js +19 -0
- package/core/harnesses/shared/hooks/adapters/gemini.js +114 -0
- package/core/harnesses/shared/hooks/hooks.json +47 -0
- package/core/harnesses/shared/hooks/policies/blocked-patterns.conf +91 -0
- package/core/harnesses/shared/hooks/policies/capture-failure.sh +97 -0
- package/core/harnesses/shared/hooks/policies/deny-json.sh +29 -0
- package/core/harnesses/shared/hooks/policies/lib.sh +501 -0
- package/core/harnesses/shared/hooks/policies/mcp-policy.conf +21 -0
- package/core/harnesses/shared/hooks/policies/mcp-tool-guard.sh +91 -0
- package/core/harnesses/shared/hooks/policies/pre-bash-guard.sh +328 -0
- package/core/harnesses/shared/hooks/policies/pre-implementation-gate.sh +496 -0
- package/core/harnesses/shared/hooks/policies/prompt-nudge.jq +131 -0
- package/core/harnesses/shared/hooks/policies/session-context.sh +141 -0
- package/core/harnesses/shared/hooks/policies/stop-check.sh +264 -0
- package/core/harnesses/shared/hooks/policies/subagent-audit.sh +46 -0
- package/core/harnesses/shared/hooks/policies/user-prompt-submit.sh +235 -0
- package/core/harnesses/shared/hooks/stream-hook-runner.js +590 -0
- package/core/harnesses/shared/locator/doflow-run +87 -0
- package/core/registry/advice.json +101 -0
- package/core/registry/assets.json +792 -0
- package/core/registry/capabilities.json +120 -0
- package/core/registry/contracts.json +189 -0
- package/core/registry/external-tools.json +191 -0
- package/core/registry/harnesses.json +2062 -0
- package/core/registry/lifecycle.json +231 -0
- package/core/registry/mcp.json +18 -0
- package/core/registry/models.json +79 -0
- package/core/registry/readiness-templates.json +118 -0
- package/core/registry/routes.json +47 -0
- package/core/registry/storage.json +1061 -0
- package/core/registry/verification.json +258 -0
- package/core/registry/workflows.json +790 -0
- package/core/shared/agent-specs/core-implementer.md +73 -0
- package/core/shared/agent-specs/quality-guardian.md +28 -0
- package/core/shared/agent-specs/research-writer.md +31 -0
- package/core/shared/agent-specs/spec-analyst.md +33 -0
- package/core/shared/agent-specs/system-architect.md +29 -0
- package/core/shared/guidance/DOFLOW_CORE.md +8 -0
- package/core/shared/guidance/FLAGS.md +25 -0
- package/core/shared/guidance/PRINCIPLES.md +61 -0
- package/core/shared/guidance/VERSION +1 -0
- package/core/shared/guidance/mcp/MCP_Context7.md +18 -0
- package/core/shared/guidance/mcp/MCP_Sequential.md +17 -0
- package/core/shared/guidance/modes/MODE_Brainstorming.md +46 -0
- package/core/shared/guidance/modes/MODE_DeepResearch.md +69 -0
- package/core/shared/guidance/modes/MODE_Introspection.md +33 -0
- package/core/shared/guidance/modes/MODE_Orchestration.md +57 -0
- package/core/shared/guidance/modes/MODE_Task_Management.md +74 -0
- package/core/shared/guidance/pointers/claude-gemini.md +2 -0
- package/core/shared/guidance/pointers/codex.md +6 -0
- package/core/shared/guidance/references/ARTIFACT_FORMAT.md +373 -0
- package/core/shared/guidance/references/ARTIFACT_VOICE.md +104 -0
- package/core/shared/guidance/references/CONSTITUTION_BASE.md +47 -0
- package/core/shared/guidance/references/DIAGRAM_GUIDE.md +161 -0
- package/core/shared/guidance/references/DOFLOW_CHAIN.md +87 -0
- package/core/shared/guidance/references/EVIDENCE_LEDGER.md +93 -0
- package/core/shared/guidance/references/MODEL_SELECTION.md +74 -0
- package/core/shared/guidance/references/ORCHESTRATION.md +36 -0
- package/core/shared/guidance/references/RESEARCH_CONFIG.md +21 -0
- package/core/shared/guidance/references/WORKFLOW_HANDOFF.md +81 -0
- package/core/shared/guidance/rules/RULE_01_SAFETY.md +25 -0
- package/core/shared/guidance/rules/RULE_02_WORKFLOW.md +23 -0
- package/core/shared/guidance/rules/RULE_03_QUALITY.md +14 -0
- package/core/shared/guidance/rules/RULE_04_QUESTIONS.md +46 -0
- package/core/shared/scripts/doflow/assets/mermaid-theme.json +46 -0
- package/core/shared/scripts/doflow/bash/do-exec-paths.sh +167 -0
- package/core/shared/scripts/doflow/bash/do-git-state.sh +546 -0
- package/core/shared/scripts/doflow/bash/do-parallel-check.sh +208 -0
- package/core/shared/scripts/doflow/bash/do-paths.sh +347 -0
- package/core/shared/scripts/doflow/bash/do-prereqs.sh +66 -0
- package/core/shared/scripts/doflow/bash/do-review-package.sh +127 -0
- package/core/shared/scripts/doflow/bash/do-task-brief.sh +698 -0
- package/core/shared/scripts/doflow/bash/render-audit.sh +224 -0
- package/core/shared/scripts/doflow/bash/render-diagrams.sh +177 -0
- package/core/shared/scripts/doflow/bash/render-puml.sh +223 -0
- package/core/shared/scripts/doflow/bash/sync-context.sh +66 -0
- package/core/shared/scripts/doflow/bash/validate-artifacts.sh +526 -0
- package/core/shared/scripts/doflow/bin/doflow-run +592 -0
- package/core/shared/skills/do/SKILL.md +128 -0
- package/core/shared/skills/do/references/estimation.md +13 -0
- package/core/shared/skills/do/references/pm_routing.md +25 -0
- package/core/shared/skills/do/references/tool_matrix.md +52 -0
- package/core/shared/skills/do-brainstorm/SKILL.md +252 -0
- package/core/shared/skills/do-code-review/README.md +49 -0
- package/core/shared/skills/do-code-review/SKILL.md +333 -0
- package/core/shared/skills/do-code-review/assets/sample_c_clean.c +71 -0
- package/core/shared/skills/do-code-review/assets/sample_c_smells.c +66 -0
- package/core/shared/skills/do-code-review/assets/sample_cpp_shift.cpp +19 -0
- package/core/shared/skills/do-code-review/assets/sample_csharp_clean.cs +100 -0
- package/core/shared/skills/do-code-review/assets/sample_csharp_smells.cs +78 -0
- package/core/shared/skills/do-code-review/assets/sample_java_clean.java +55 -0
- package/core/shared/skills/do-code-review/assets/sample_java_smells.java +56 -0
- package/core/shared/skills/do-code-review/assets/sample_json_clean.json +7 -0
- package/core/shared/skills/do-code-review/assets/sample_markdown_clean.md +30 -0
- package/core/shared/skills/do-code-review/assets/sample_markdown_smells.md +29 -0
- package/core/shared/skills/do-code-review/assets/sample_shell_heredoc.sh +38 -0
- package/core/shared/skills/do-code-review/assets/sample_shell_smells.sh +15 -0
- package/core/shared/skills/do-code-review/assets/sample_typescript_strings.ts +36 -0
- package/core/shared/skills/do-code-review/assets/sample_yaml_smells.yaml +6 -0
- package/core/shared/skills/do-code-review/content-types/config.md +83 -0
- package/core/shared/skills/do-code-review/content-types/markdown.md +132 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_c_clean_quality.json +79 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_c_smells_quality.json +169 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_cpp_shift_quality.json +49 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_clean_quality.json +149 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_csharp_smells_quality.json +157 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_java_clean_quality.json +67 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_java_smells_quality.json +97 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_json_clean_quality.json +33 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_clean_quality.json +1 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_markdown_smells_quality.json +16 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_shell_heredoc_quality.json +54 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_shell_smells_quality.json +91 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_typescript_strings_quality.json +60 -0
- package/core/shared/skills/do-code-review/expected_outputs/sample_yaml_smells_quality.json +46 -0
- package/core/shared/skills/do-code-review/languages/c.md +103 -0
- package/core/shared/skills/do-code-review/languages/cpp.md +103 -0
- package/core/shared/skills/do-code-review/languages/csharp.md +97 -0
- package/core/shared/skills/do-code-review/languages/dart.md +108 -0
- package/core/shared/skills/do-code-review/languages/go.md +92 -0
- package/core/shared/skills/do-code-review/languages/java.md +103 -0
- package/core/shared/skills/do-code-review/languages/kotlin.md +88 -0
- package/core/shared/skills/do-code-review/languages/php.md +109 -0
- package/core/shared/skills/do-code-review/languages/python.md +94 -0
- package/core/shared/skills/do-code-review/languages/ruby.md +105 -0
- package/core/shared/skills/do-code-review/languages/rust.md +99 -0
- package/core/shared/skills/do-code-review/languages/shell.md +90 -0
- package/core/shared/skills/do-code-review/languages/swift.md +88 -0
- package/core/shared/skills/do-code-review/languages/typescript.md +97 -0
- package/core/shared/skills/do-code-review/review-policy.json +47 -0
- package/core/shared/skills/do-code-review/rules/universal.md +49 -0
- package/core/shared/skills/do-code-review/scripts/code_quality_checker.py +1696 -0
- package/core/shared/skills/do-code-review/scripts/doc_quality_checker.py +532 -0
- package/core/shared/skills/do-code-review/scripts/pr_analyzer.py +620 -0
- package/core/shared/skills/do-code-review/scripts/review_report_generator.py +505 -0
- package/core/shared/skills/do-constitution/SKILL.md +72 -0
- package/core/shared/skills/do-design/SKILL.md +212 -0
- package/core/shared/skills/do-diagnose/SKILL.md +156 -0
- package/core/shared/skills/do-diagnose/references/code_audit.md +15 -0
- package/core/shared/skills/do-diagnose/references/refactoring.md +12 -0
- package/core/shared/skills/do-diagnose/references/root_cause.md +17 -0
- package/core/shared/skills/do-document/SKILL.md +81 -0
- package/core/shared/skills/do-document/references/api-reference.md +42 -0
- package/core/shared/skills/do-document/references/deep_research.md +18 -0
- package/core/shared/skills/do-document/references/embedded-research.md +11 -0
- package/core/shared/skills/do-document/references/implementation-flow.md +105 -0
- package/core/shared/skills/do-document/references/index_generator.md +9 -0
- package/core/shared/skills/do-document/references/user-guide.md +22 -0
- package/core/shared/skills/do-execute-plan/SKILL.md +261 -0
- package/core/shared/skills/do-execute-plan/references/handoff_record.md +57 -0
- package/core/shared/skills/do-execute-plan/references/parallel_dispatch.md +92 -0
- package/core/shared/skills/do-execute-plan/references/readiness_gate.md +155 -0
- package/core/shared/skills/do-execute-plan/references/run_position.md +63 -0
- package/core/shared/skills/do-execute-plan/references/scaffold.md +441 -0
- package/core/shared/skills/do-execute-plan/references/task_attempts.md +41 -0
- package/core/shared/skills/do-flow/SKILL.md +186 -0
- package/core/shared/skills/do-flow/references/task_classes.md +134 -0
- package/core/shared/skills/do-git/SKILL.md +115 -0
- package/core/shared/skills/do-git/references/hotfix-ritual.md +44 -0
- package/core/shared/skills/do-git/references/lifecycle-policy.md +54 -0
- package/core/shared/skills/do-git/references/release-ritual.md +64 -0
- package/core/shared/skills/do-implement/SKILL.md +222 -0
- package/core/shared/skills/do-plan/SKILL.md +219 -0
- package/core/shared/skills/do-test/SKILL.md +113 -0
- package/core/shared/templates/doflow/constitution-template.md +28 -0
- package/core/shared/templates/doflow/data-model-template.md +169 -0
- package/core/shared/templates/doflow/design-template.md +193 -0
- package/core/shared/templates/doflow/external-contract-template.md +35 -0
- package/core/shared/templates/doflow/intent-template.md +45 -0
- package/core/shared/templates/doflow/plan-template.md +151 -0
- package/core/shared/templates/doflow/question-log-template.md +51 -0
- package/core/shared/templates/doflow/requirement-template.md +126 -0
- package/core/shared/templates/doflow/specs-template.md +55 -0
- package/core/shared/templates/doflow/state-template.md +59 -0
- package/core/shared/workflows/do-flow-chain.md +17 -0
- package/package.json +48 -4
- package/src/adapters/antigravity/index.js +631 -0
- package/src/adapters/claude/index.js +548 -0
- package/src/adapters/claude/mcp.js +94 -0
- package/src/adapters/codex/agents.js +208 -0
- package/src/adapters/codex/config.js +272 -0
- package/src/adapters/codex/hooks.js +203 -0
- package/src/adapters/codex/index.js +707 -0
- package/src/adapters/codex/mcp.js +271 -0
- package/src/adapters/codex/native-projection.js +34 -0
- package/src/adapters/copilot/index.js +413 -0
- package/src/adapters/copy-tree.js +620 -0
- package/src/adapters/gemini/hooks.js +210 -0
- package/src/adapters/gemini/index.js +390 -0
- package/src/adapters/hook-commands.js +60 -0
- package/src/adapters/index.js +106 -0
- package/src/adapters/kiro/index.js +310 -0
- package/src/adapters/mcp-entries.js +331 -0
- package/src/adapters/opencode/index.js +466 -0
- package/src/adapters/pi/index.js +279 -0
- package/src/adapters/pi/json-members.js +185 -0
- package/src/adapters/pi/mcp.js +373 -0
- package/src/adapters/resolve-source.js +19 -0
- package/src/cli/commands/install.js +218 -0
- package/src/cli/commands/list-backups.js +21 -0
- package/src/cli/commands/reconcile.js +120 -0
- package/src/cli/commands/remove.js +82 -0
- package/src/cli/commands/rollback.js +172 -0
- package/src/cli/commands/self-update.js +33 -0
- package/src/cli/commands/status.js +138 -0
- package/src/cli/commands/tools.js +92 -0
- package/src/cli/commands/update.js +162 -0
- package/src/cli/index.js +568 -0
- package/src/cli/runtime-commands.js +281 -0
- package/src/cli/shared.js +218 -0
- package/src/helper/bash-helper.js +34 -0
- package/src/helper/git.js +24 -0
- package/src/helper/guardrails.js +49 -0
- package/src/helper/harness-paths.js +140 -0
- package/src/helper/marker-merge.js +116 -0
- package/src/helper/prompt.js +61 -0
- package/src/helper/repo-root.js +29 -0
- package/src/helper/settings-merge.js +151 -0
- package/src/helper/settings-scope.js +33 -0
- package/src/helper/toml.js +244 -0
- package/src/install/backup-set.js +149 -0
- package/src/install/backup.js +724 -0
- package/src/install/context.js +58 -0
- package/src/install/manifest.js +145 -0
- package/src/install/mcp.js +254 -0
- package/src/install/paths.js +84 -0
- package/src/install/targets.js +90 -0
- package/src/install/tool-lifecycle.js +151 -0
- package/src/lifecycle/bash-availability.js +25 -0
- package/src/lifecycle/index.js +812 -0
- package/src/lifecycle/mcp-index.js +28 -0
- package/src/lifecycle/policies.js +73 -0
- package/src/lifecycle/view.js +175 -0
- package/src/registry/index.js +611 -0
- package/src/release/build-package.js +91 -0
- package/src/release/changelog-section.js +70 -0
- package/src/release/sync-plugin-versions.js +66 -0
- package/src/runtime/advice/cli.js +283 -0
- package/src/runtime/advice/client.js +324 -0
- package/src/runtime/advice/config.js +189 -0
- package/src/runtime/advice/doctor.js +169 -0
- package/src/runtime/advice/endpoint-guard.js +134 -0
- package/src/runtime/advice/kinds.js +154 -0
- package/src/runtime/advice/providers/ollama-systemone.js +209 -0
- package/src/runtime/advice/record.js +166 -0
- package/src/runtime/advice/registry.js +170 -0
- package/src/runtime/advice/strength.js +66 -0
- package/src/runtime/brief-tools.js +342 -0
- package/src/runtime/c4-project.js +371 -0
- package/src/runtime/capability-router.js +484 -0
- package/src/runtime/checkouts.js +170 -0
- package/src/runtime/claims.js +468 -0
- package/src/runtime/cli-result.js +55 -0
- package/src/runtime/cli.js +678 -0
- package/src/runtime/command-detect.js +516 -0
- package/src/runtime/context-pack.js +492 -0
- package/src/runtime/decision-register.js +493 -0
- package/src/runtime/evidence-ledger.js +338 -0
- package/src/runtime/failure/capture.js +272 -0
- package/src/runtime/failure/classifier.js +68 -0
- package/src/runtime/failure/cli.js +178 -0
- package/src/runtime/failure/home.js +64 -0
- package/src/runtime/failure/store.js +226 -0
- package/src/runtime/feature-resolve.js +79 -0
- package/src/runtime/freshness.js +177 -0
- package/src/runtime/health.js +863 -0
- package/src/runtime/history-compactor.js +237 -0
- package/src/runtime/implementation-gate.js +321 -0
- package/src/runtime/inventory/coverage.js +218 -0
- package/src/runtime/inventory/identity.js +65 -0
- package/src/runtime/inventory/index.js +705 -0
- package/src/runtime/inventory/precedence.js +134 -0
- package/src/runtime/inventory/read-scopes.js +131 -0
- package/src/runtime/inventory/siblings.js +192 -0
- package/src/runtime/knowledge/chunker.js +124 -0
- package/src/runtime/knowledge/hybrid.js +149 -0
- package/src/runtime/knowledge/index-store.js +145 -0
- package/src/runtime/knowledge/retrieval.js +194 -0
- package/src/runtime/leak-scan.js +185 -0
- package/src/runtime/lifecycle/cli.js +276 -0
- package/src/runtime/lifecycle/event-store.js +340 -0
- package/src/runtime/lifecycle/fold.js +353 -0
- package/src/runtime/lifecycle/followup.js +432 -0
- package/src/runtime/lifecycle/goal.js +249 -0
- package/src/runtime/lifecycle/intent-writer.js +86 -0
- package/src/runtime/lifecycle/overview.js +292 -0
- package/src/runtime/lifecycle/release.js +241 -0
- package/src/runtime/lifecycle/report-store.js +221 -0
- package/src/runtime/lifecycle/retention.js +212 -0
- package/src/runtime/lifecycle/root.js +71 -0
- package/src/runtime/lifecycle/status.js +353 -0
- package/src/runtime/lifecycle/store-upkeep.js +393 -0
- package/src/runtime/locator-resolve.js +158 -0
- package/src/runtime/mask.js +210 -0
- package/src/runtime/mcp-consultations.js +412 -0
- package/src/runtime/mcp-reach.js +157 -0
- package/src/runtime/model-router.js +153 -0
- package/src/runtime/outcome.js +467 -0
- package/src/runtime/reach.js +148 -0
- package/src/runtime/readiness-record.js +150 -0
- package/src/runtime/readiness.js +435 -0
- package/src/runtime/recovery.js +282 -0
- package/src/runtime/research-request.js +231 -0
- package/src/runtime/retrieval-plan.js +578 -0
- package/src/runtime/scaffold/artifacts.js +217 -0
- package/src/runtime/scaffold/fingerprint.js +56 -0
- package/src/runtime/scaffold/generate.js +911 -0
- package/src/runtime/scaffold/languages.js +245 -0
- package/src/runtime/storage/cli.js +64 -0
- package/src/runtime/storage/engine.js +249 -0
- package/src/runtime/storage/registry.js +130 -0
- package/src/runtime/storage/roots.js +63 -0
- package/src/runtime/storage/rules.js +282 -0
- package/src/runtime/storage/upkeep.js +243 -0
- package/src/runtime/storage/work-status.js +326 -0
- package/src/runtime/task-attempts.js +415 -0
- package/src/runtime/task-classifier.js +550 -0
- package/src/runtime/task-scope.js +130 -0
- package/src/runtime/task-state.js +176 -0
- package/src/runtime/trace/indicators.js +235 -0
- package/src/runtime/trace/ledger.js +626 -0
- package/src/runtime/trace/render.js +76 -0
- package/src/runtime/trace/views.js +459 -0
- package/src/runtime/verification/contract-runner.js +341 -0
- package/src/runtime/verification/engine.js +1461 -0
- package/src/runtime/verification/registry.js +130 -0
- package/src/runtime/verification/scope-bound.js +418 -0
- package/src/runtime/verification/test-selection.js +172 -0
- package/src/runtime/workflow-engine.js +588 -0
- package/src/runtime/workflow-orchestrator.js +953 -0
- package/src/runtime/worktree.js +340 -0
- package/src/state/index.js +193 -0
- package/src/state/lockfile.js +136 -0
- package/src/state/run-lock.js +408 -0
- package/types/node-commonjs.d.ts +68 -0
- 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
|