@khoavu882/doflow 0.0.0-stage → 2.0.0-beta.3
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 +1057 -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 +46 -4
- package/src/adapters/antigravity/index.ts +631 -0
- package/src/adapters/claude/index.ts +548 -0
- package/src/adapters/claude/mcp.ts +94 -0
- package/src/adapters/codex/agents.ts +208 -0
- package/src/adapters/codex/config.ts +272 -0
- package/src/adapters/codex/hooks.ts +203 -0
- package/src/adapters/codex/index.ts +707 -0
- package/src/adapters/codex/mcp.ts +271 -0
- package/src/adapters/codex/native-projection.ts +34 -0
- package/src/adapters/copilot/index.ts +413 -0
- package/src/adapters/copy-tree.ts +620 -0
- package/src/adapters/gemini/hooks.ts +210 -0
- package/src/adapters/gemini/index.ts +390 -0
- package/src/adapters/hook-commands.ts +60 -0
- package/src/adapters/index.ts +106 -0
- package/src/adapters/kiro/index.ts +310 -0
- package/src/adapters/mcp-entries.ts +331 -0
- package/src/adapters/opencode/index.ts +466 -0
- package/src/adapters/pi/index.ts +279 -0
- package/src/adapters/pi/json-members.ts +185 -0
- package/src/adapters/pi/mcp.ts +373 -0
- package/src/adapters/resolve-source.ts +19 -0
- package/src/cli/commands/install.ts +218 -0
- package/src/cli/commands/list-backups.ts +21 -0
- package/src/cli/commands/reconcile.ts +120 -0
- package/src/cli/commands/remove.ts +82 -0
- package/src/cli/commands/rollback.ts +172 -0
- package/src/cli/commands/self-update.ts +33 -0
- package/src/cli/commands/status.ts +138 -0
- package/src/cli/commands/tools.ts +92 -0
- package/src/cli/commands/update.ts +162 -0
- package/src/cli/index.ts +568 -0
- package/src/cli/runtime-commands.ts +281 -0
- package/src/cli/shared.ts +218 -0
- package/src/helper/bash-helper.ts +34 -0
- package/src/helper/git.ts +24 -0
- package/src/helper/guardrails.ts +49 -0
- package/src/helper/harness-paths.ts +140 -0
- package/src/helper/marker-merge.ts +116 -0
- package/src/helper/prompt.ts +61 -0
- package/src/helper/repo-root.ts +29 -0
- package/src/helper/settings-merge.ts +151 -0
- package/src/helper/settings-scope.ts +33 -0
- package/src/helper/toml.ts +244 -0
- package/src/install/backup-set.ts +149 -0
- package/src/install/backup.ts +724 -0
- package/src/install/context.ts +58 -0
- package/src/install/manifest.ts +145 -0
- package/src/install/mcp.ts +254 -0
- package/src/install/paths.ts +84 -0
- package/src/install/targets.ts +90 -0
- package/src/install/tool-lifecycle.ts +151 -0
- package/src/lifecycle/bash-availability.ts +25 -0
- package/src/lifecycle/index.ts +812 -0
- package/src/lifecycle/mcp-index.ts +28 -0
- package/src/lifecycle/policies.ts +73 -0
- package/src/lifecycle/view.ts +175 -0
- package/src/registry/index.ts +611 -0
- package/src/release/sync-plugin-versions.ts +66 -0
- package/src/runtime/advice/cli.ts +283 -0
- package/src/runtime/advice/client.ts +324 -0
- package/src/runtime/advice/config.ts +189 -0
- package/src/runtime/advice/doctor.ts +169 -0
- package/src/runtime/advice/endpoint-guard.ts +134 -0
- package/src/runtime/advice/kinds.ts +154 -0
- package/src/runtime/advice/providers/ollama-systemone.ts +209 -0
- package/src/runtime/advice/record.ts +166 -0
- package/src/runtime/advice/registry.ts +170 -0
- package/src/runtime/advice/strength.ts +66 -0
- package/src/runtime/brief-tools.ts +342 -0
- package/src/runtime/c4-project.ts +371 -0
- package/src/runtime/capability-router.ts +484 -0
- package/src/runtime/checkouts.ts +170 -0
- package/src/runtime/claims.ts +468 -0
- package/src/runtime/cli-result.ts +55 -0
- package/src/runtime/cli.ts +678 -0
- package/src/runtime/command-detect.ts +516 -0
- package/src/runtime/context-pack.ts +492 -0
- package/src/runtime/decision-register.ts +493 -0
- package/src/runtime/evidence-ledger.ts +338 -0
- package/src/runtime/failure/capture.ts +272 -0
- package/src/runtime/failure/classifier.ts +68 -0
- package/src/runtime/failure/cli.ts +178 -0
- package/src/runtime/failure/home.ts +64 -0
- package/src/runtime/failure/store.ts +226 -0
- package/src/runtime/feature-resolve.ts +79 -0
- package/src/runtime/freshness.ts +177 -0
- package/src/runtime/health.ts +863 -0
- package/src/runtime/history-compactor.ts +237 -0
- package/src/runtime/implementation-gate.ts +321 -0
- package/src/runtime/inventory/coverage.ts +218 -0
- package/src/runtime/inventory/identity.ts +65 -0
- package/src/runtime/inventory/index.ts +705 -0
- package/src/runtime/inventory/precedence.ts +134 -0
- package/src/runtime/inventory/read-scopes.ts +131 -0
- package/src/runtime/inventory/siblings.ts +192 -0
- package/src/runtime/knowledge/chunker.ts +124 -0
- package/src/runtime/knowledge/hybrid.ts +149 -0
- package/src/runtime/knowledge/index-store.ts +145 -0
- package/src/runtime/knowledge/retrieval.ts +194 -0
- package/src/runtime/leak-scan.ts +185 -0
- package/src/runtime/lifecycle/cli.ts +276 -0
- package/src/runtime/lifecycle/event-store.ts +340 -0
- package/src/runtime/lifecycle/fold.ts +353 -0
- package/src/runtime/lifecycle/followup.ts +432 -0
- package/src/runtime/lifecycle/goal.ts +249 -0
- package/src/runtime/lifecycle/intent-writer.ts +86 -0
- package/src/runtime/lifecycle/overview.ts +292 -0
- package/src/runtime/lifecycle/release.ts +241 -0
- package/src/runtime/lifecycle/report-store.ts +221 -0
- package/src/runtime/lifecycle/retention.ts +212 -0
- package/src/runtime/lifecycle/root.ts +71 -0
- package/src/runtime/lifecycle/status.ts +353 -0
- package/src/runtime/lifecycle/store-upkeep.ts +393 -0
- package/src/runtime/locator-resolve.ts +158 -0
- package/src/runtime/mask.ts +210 -0
- package/src/runtime/mcp-consultations.ts +412 -0
- package/src/runtime/mcp-reach.ts +157 -0
- package/src/runtime/model-router.ts +153 -0
- package/src/runtime/outcome.ts +467 -0
- package/src/runtime/reach.ts +148 -0
- package/src/runtime/readiness-record.ts +150 -0
- package/src/runtime/readiness.ts +435 -0
- package/src/runtime/recovery.ts +282 -0
- package/src/runtime/research-request.ts +231 -0
- package/src/runtime/retrieval-plan.ts +578 -0
- package/src/runtime/scaffold/artifacts.ts +217 -0
- package/src/runtime/scaffold/fingerprint.ts +56 -0
- package/src/runtime/scaffold/generate.ts +911 -0
- package/src/runtime/scaffold/languages.ts +245 -0
- package/src/runtime/storage/cli.ts +64 -0
- package/src/runtime/storage/engine.ts +249 -0
- package/src/runtime/storage/registry.ts +130 -0
- package/src/runtime/storage/roots.ts +63 -0
- package/src/runtime/storage/rules.ts +282 -0
- package/src/runtime/storage/upkeep.ts +243 -0
- package/src/runtime/storage/work-status.ts +326 -0
- package/src/runtime/task-attempts.ts +415 -0
- package/src/runtime/task-classifier.ts +550 -0
- package/src/runtime/task-scope.ts +130 -0
- package/src/runtime/task-state.ts +176 -0
- package/src/runtime/trace/indicators.ts +235 -0
- package/src/runtime/trace/ledger.ts +626 -0
- package/src/runtime/trace/render.ts +76 -0
- package/src/runtime/trace/views.ts +459 -0
- package/src/runtime/verification/contract-runner.ts +341 -0
- package/src/runtime/verification/engine.ts +1461 -0
- package/src/runtime/verification/registry.ts +130 -0
- package/src/runtime/verification/scope-bound.ts +418 -0
- package/src/runtime/verification/test-selection.ts +172 -0
- package/src/runtime/workflow-engine.ts +588 -0
- package/src/runtime/workflow-orchestrator.ts +953 -0
- package/src/runtime/worktree.ts +340 -0
- package/src/state/index.ts +193 -0
- package/src/state/lockfile.ts +136 -0
- package/src/state/run-lock.ts +408 -0
- package/types/node-commonjs.d.ts +68 -0
- package/types/runtime.d.ts +91 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
language: ruby
|
|
3
|
+
extensions: [".rb", ".rake", ".gemspec", ".ru"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Ruby — Language-Specific Review Notes
|
|
7
|
+
|
|
8
|
+
Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Ruby-specific rules and idioms.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## PR Analyzer — Ruby Risk Signals
|
|
13
|
+
|
|
14
|
+
- `puts` / `p` / `pp` debug statements left in production code
|
|
15
|
+
- `# rubocop:disable` comments — verify they are justified
|
|
16
|
+
- `eval` / `instance_eval` / `class_eval` with user-controlled input
|
|
17
|
+
- Hardcoded credentials, tokens, or `SECRET_KEY_BASE` in source
|
|
18
|
+
- `binding.pry` / `byebug` / `debugger` left in code
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Code Quality — Ruby Checks
|
|
23
|
+
|
|
24
|
+
- Methods longer than 15 lines — Ruby idioms favor very small methods
|
|
25
|
+
- Classes with more than 10 public methods — possible god object
|
|
26
|
+
- `rescue Exception` — catches `SignalException` and `SystemExit`; use `rescue StandardError` or more specific types
|
|
27
|
+
- `method_missing` implemented without `respond_to_missing?`
|
|
28
|
+
- Deeply nested blocks (>3 levels) — extract to methods
|
|
29
|
+
- String interpolation used where a symbol would suffice (hash keys, etc.)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Security
|
|
34
|
+
|
|
35
|
+
- Flag `eval` / `instance_eval` with user-controlled strings — remote code execution
|
|
36
|
+
- Flag `system()` / `exec()` / backtick calls with user-controlled input — shell injection
|
|
37
|
+
- Flag `YAML.load` on untrusted data — use `YAML.safe_load`
|
|
38
|
+
- Flag `Marshal.load` on untrusted data — arbitrary code execution
|
|
39
|
+
- Flag raw SQL string interpolation in ActiveRecord — use parameterized queries (`where("name = ?", name)`)
|
|
40
|
+
- Flag `params` passed directly to `redirect_to` without validation — open redirect
|
|
41
|
+
- Flag `render inline:` with user data — XSS via ERB
|
|
42
|
+
- Flag missing `strong_parameters` in Rails controllers — mass assignment vulnerability
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Async / Concurrency
|
|
47
|
+
|
|
48
|
+
- Flag shared mutable state accessed from multiple threads without a `Mutex`
|
|
49
|
+
- Flag `Thread.new` without storing the thread reference — exceptions are silently swallowed
|
|
50
|
+
- Flag `sleep` used as a synchronization mechanism in threaded code
|
|
51
|
+
- Flag `@@class_variables` mutated in multi-threaded contexts — not thread-safe
|
|
52
|
+
- Flag Sidekiq / ActiveJob workers that are not idempotent — jobs can be retried
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Resource Management
|
|
57
|
+
|
|
58
|
+
- Flag `File.open` without a block form — the block form guarantees `close`
|
|
59
|
+
- Flag database connections or HTTP clients not released in `ensure` blocks
|
|
60
|
+
- Flag `ActiveRecord` queries inside loops — N+1 pattern; use `includes` / `preload` / `eager_load`
|
|
61
|
+
- Flag `ObjectSpace` usage in production — memory and performance impact
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Exception Handling
|
|
66
|
+
|
|
67
|
+
- Flag `rescue Exception` — use `rescue StandardError` or a specific exception class
|
|
68
|
+
- Flag empty `rescue` blocks — swallowed errors
|
|
69
|
+
- Flag `rescue` used for control flow (e.g. rescuing `ActiveRecord::RecordNotFound` instead of using `find_by`)
|
|
70
|
+
- Flag re-raising with `raise e` instead of bare `raise` — loses the original backtrace
|
|
71
|
+
- Flag `ensure` blocks that can raise — masks the original exception
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Performance
|
|
76
|
+
|
|
77
|
+
- Flag N+1 ActiveRecord queries — use `includes`, `preload`, or `eager_load`
|
|
78
|
+
- Flag `Array#each` with string concatenation — use `map` + `join`
|
|
79
|
+
- Flag `select` + `map` that could be a single `filter_map`
|
|
80
|
+
- Flag `.count` on an ActiveRecord relation inside a view or loop — triggers a query each time
|
|
81
|
+
- Flag `require` inside a method body — constant overhead on every call
|
|
82
|
+
- Flag `Hash#merge` in a loop — use `merge!` or `each_with_object`
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Idioms and Best Practices
|
|
87
|
+
|
|
88
|
+
### Ruby Style
|
|
89
|
+
- Prefer `map` / `select` / `reject` / `reduce` over manual `each` + accumulator
|
|
90
|
+
- Prefer `&method(:name)` over `{ |x| some_method(x) }` for method reference blocks
|
|
91
|
+
- Prefer `freeze` on string constants to avoid repeated object allocation
|
|
92
|
+
- Use `attr_reader` / `attr_writer` / `attr_accessor` instead of manual getter/setter methods
|
|
93
|
+
- Prefer `Symbol#to_proc` (`&:method_name`) for simple single-method blocks
|
|
94
|
+
|
|
95
|
+
### Rails-Specific
|
|
96
|
+
- Keep controllers thin — logic belongs in service objects, models, or concerns
|
|
97
|
+
- Use `before_action` for authentication/authorization checks — never inline
|
|
98
|
+
- Prefer `find_by` over `where(...).first` — more intent-revealing
|
|
99
|
+
- Flag `after_commit` callbacks with side effects that should be in a service object
|
|
100
|
+
- Prefer `respond_to` blocks over separate controller actions for format variants
|
|
101
|
+
|
|
102
|
+
### Modern Ruby (3.x)
|
|
103
|
+
- Prefer pattern matching (`case/in`) for complex data destructuring
|
|
104
|
+
- Use numbered block parameters (`_1`, `_2`) only for very short, obvious blocks
|
|
105
|
+
- Prefer `Data.define` for simple immutable value objects (Ruby 3.2+)
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
language: rust
|
|
3
|
+
extensions: [".rs"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Rust — Language-Specific Review Notes
|
|
7
|
+
|
|
8
|
+
Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Rust-specific rules and idioms.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## PR Analyzer — Rust Risk Signals
|
|
13
|
+
|
|
14
|
+
- `unsafe { }` blocks — require explicit justification and sign-off
|
|
15
|
+
- `#[allow(...)]` attributes suppressing lints — verify they are justified
|
|
16
|
+
- `.unwrap()` / `.expect("")` on `Option` or `Result` outside of tests or prototypes
|
|
17
|
+
- Hardcoded credentials or tokens in source
|
|
18
|
+
- `TODO` / `FIXME` comments near `unsafe` or ownership code
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Code Quality — Rust Checks
|
|
23
|
+
|
|
24
|
+
- `.unwrap()` used broadly in production code — prefer `?`, `if let`, or `match`
|
|
25
|
+
- `clone()` called excessively — may indicate ownership design issues
|
|
26
|
+
- `Arc<Mutex<T>>` used where a simpler ownership model would work
|
|
27
|
+
- `Box<dyn Trait>` used where generics (`impl Trait`) would avoid heap allocation
|
|
28
|
+
- `pub` fields on structs that should enforce invariants — use accessor methods
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Security
|
|
33
|
+
|
|
34
|
+
- Flag `unsafe` blocks accessing raw pointers without clear safety invariant documented in a comment
|
|
35
|
+
- Flag `std::mem::transmute` — almost always a logic error or undefined behavior; require strong justification
|
|
36
|
+
- Flag `from_utf8_unchecked` on user-controlled data — use `from_utf8` with error handling
|
|
37
|
+
- Flag `unwrap()` on user-supplied input parsing — panics are a denial-of-service vector in server code
|
|
38
|
+
- Flag hardcoded secrets — use environment variables or a secrets crate
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Async / Concurrency
|
|
43
|
+
|
|
44
|
+
- Flag `std::sync::Mutex` used in async code — use `tokio::sync::Mutex` to avoid blocking the async runtime
|
|
45
|
+
- Flag `.await` inside a `std::sync::MutexGuard` scope — holds the lock across an await point, blocking other tasks
|
|
46
|
+
- Flag `spawn` without storing the `JoinHandle` — panics in the spawned task are silently ignored
|
|
47
|
+
- Flag `Arc<Mutex<T>>` cloned excessively — consider message passing via channels instead
|
|
48
|
+
- Flag blocking I/O calls (`std::fs`, `std::net`) inside async functions — use async equivalents
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Resource Management
|
|
53
|
+
|
|
54
|
+
- Flag manual `drop` called explicitly where the natural scope boundary suffices
|
|
55
|
+
- Flag `Rc<T>` used in multi-threaded code — use `Arc<T>`; the compiler catches this but flag in review for architecture discussion
|
|
56
|
+
- Flag `Vec` or `String` with large pre-allocated capacity never trimmed — call `.shrink_to_fit()` if long-lived
|
|
57
|
+
- Flag `impl Drop` that can panic — causes `abort` during stack unwinding
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Exception Handling
|
|
62
|
+
|
|
63
|
+
- Flag `.unwrap()` in production code outside of tests — use `?` to propagate or handle explicitly
|
|
64
|
+
- Flag `.expect("todo")` or `.expect("")` — messages must explain the invariant that guarantees safety
|
|
65
|
+
- Flag `panic!` used for recoverable errors — use `Result<T, E>`
|
|
66
|
+
- Flag `unwrap_or_default()` where the default silently masks a real error
|
|
67
|
+
- Prefer typed error enums (`thiserror`) over `Box<dyn Error>` for library crates
|
|
68
|
+
- Prefer `anyhow` for application-level error context; `thiserror` for library error types
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Performance
|
|
73
|
+
|
|
74
|
+
- Flag `.clone()` on large types in hot paths — review whether a reference or `Cow<T>` would work
|
|
75
|
+
- Flag `format!` used only to create a `String` from a literal — use `.to_string()` or `String::from`
|
|
76
|
+
- Flag `collect::<Vec<_>>()` followed immediately by `.iter()` — chain iterators instead
|
|
77
|
+
- Flag `Box<T>` for small types where stack allocation is fine
|
|
78
|
+
- Flag `Mutex` contention on a hot path — consider `RwLock` for read-heavy workloads or sharding
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Idioms and Best Practices
|
|
83
|
+
|
|
84
|
+
### Ownership
|
|
85
|
+
- Prefer borrowing (`&T`, `&mut T`) over cloning wherever the lifetime allows
|
|
86
|
+
- Use `Cow<'_, str>` for functions that sometimes need to own and sometimes borrow
|
|
87
|
+
- Prefer `impl Trait` in function signatures over `Box<dyn Trait>` for static dispatch
|
|
88
|
+
|
|
89
|
+
### Error Handling
|
|
90
|
+
- Use `?` operator to propagate errors — avoid manual `match Err(e) => return Err(e)`
|
|
91
|
+
- Define domain error types with `thiserror` in libraries; use `anyhow` in binaries
|
|
92
|
+
- Never use `.unwrap()` in library code — it panics the caller's thread
|
|
93
|
+
|
|
94
|
+
### Modern Rust
|
|
95
|
+
- Prefer `if let` / `while let` for single-variant matches over full `match`
|
|
96
|
+
- Prefer `?` over `unwrap` everywhere errors are recoverable
|
|
97
|
+
- Use `#[derive(Debug, Clone, PartialEq)]` consistently on data types
|
|
98
|
+
- Prefer `iter()` chains over manual loops — they compose and optimize well
|
|
99
|
+
- Use `clippy` and treat its lints as required — flag any `#[allow(clippy::...)]` in review
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
language: shell
|
|
3
|
+
extensions: [".sh", ".bash", ".zsh"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Shell — Language-Specific Review Notes
|
|
7
|
+
|
|
8
|
+
Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only
|
|
9
|
+
shell-specific rules and idioms.
|
|
10
|
+
|
|
11
|
+
Shell sits in `languages/` rather than `content-types/` because it is executable code with real
|
|
12
|
+
control flow: functions, branches, loops, and a complexity reading that means something. Its
|
|
13
|
+
failure modes are its own, though — almost every serious shell bug is a quoting bug, an unchecked
|
|
14
|
+
exit status, or a command that ran in the wrong directory.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## PR Analyzer — Shell Risk Signals
|
|
19
|
+
|
|
20
|
+
- No `set -euo pipefail` (or equivalent) near the top of an executable script
|
|
21
|
+
- `rm -rf` with any variable in the path
|
|
22
|
+
- `eval`, or a command assembled by string concatenation
|
|
23
|
+
- `curl ... | bash`, or any pipe from the network into an interpreter
|
|
24
|
+
- `sudo` inside a script that is not documented as requiring it
|
|
25
|
+
- A `trap` that is registered but cleans up nothing, or is absent where a temp dir is created
|
|
26
|
+
|
|
27
|
+
## Code Quality — Shell Checks
|
|
28
|
+
|
|
29
|
+
- **Unquoted expansion** — `$VAR` rather than `"$VAR"` in any command touching a path. A value with
|
|
30
|
+
a space becomes two arguments; a value with `*` becomes whatever the glob matched. This is the
|
|
31
|
+
single most common real shell defect and the analyser flags it for path-acting commands.
|
|
32
|
+
- **Unchecked `cd`** — `cd "$dir"` without `|| exit` and without `set -e` leaves every subsequent
|
|
33
|
+
line running in the previous directory. The commands still "succeed", against the wrong tree.
|
|
34
|
+
- **Unchecked command substitution** — `x=$(cmd)` swallows `cmd`'s exit status unless `set -e` and
|
|
35
|
+
`pipefail` are both in force.
|
|
36
|
+
- **`[` vs `[[`** — prefer `[[ ]]` in bash: it does not word-split, so an empty variable does not
|
|
37
|
+
turn a comparison into a syntax error.
|
|
38
|
+
- **Long functions** — the universal threshold applies; a shell function past it is usually several
|
|
39
|
+
scripts that never got separated.
|
|
40
|
+
|
|
41
|
+
## Security
|
|
42
|
+
|
|
43
|
+
- Never interpolate untrusted input into a command string; pass it as an argument.
|
|
44
|
+
- `eval` is a finding unless the review can name why nothing else works.
|
|
45
|
+
- Secrets passed as command-line arguments are visible in `ps`; prefer an environment variable read
|
|
46
|
+
from a file, or stdin.
|
|
47
|
+
- A temp file created without `mktemp` is a predictable path, which is a symlink attack.
|
|
48
|
+
- `IFS` changed without being restored affects every later word-split in the script.
|
|
49
|
+
|
|
50
|
+
## Async / Concurrency
|
|
51
|
+
|
|
52
|
+
- A backgrounded job (`&`) whose exit status is never collected by `wait` fails silently.
|
|
53
|
+
- `nohup ... &` detaches deliberately; the review should confirm the output redirection is explicit,
|
|
54
|
+
since an inherited stdin or stdout fd can hold a pipe open and hang the caller.
|
|
55
|
+
- Parallel writes to one file from backgrounded jobs interleave; append-with-`>>` is not atomic
|
|
56
|
+
above the pipe buffer size.
|
|
57
|
+
|
|
58
|
+
## Resource Management
|
|
59
|
+
|
|
60
|
+
- Every `mktemp` needs a matching `trap ... EXIT` that removes it, including on the error paths.
|
|
61
|
+
- A `trap` registered after the resource is created leaves a window where a signal leaks it.
|
|
62
|
+
- File descriptors opened with `exec 3<` are closed with `exec 3<&-`, not by falling off the end.
|
|
63
|
+
|
|
64
|
+
## Exception Handling
|
|
65
|
+
|
|
66
|
+
- Shell has no exceptions; `set -e` plus explicit `|| { ...; exit 1; }` is the mechanism.
|
|
67
|
+
- `set -e` does not apply inside a command substitution, a condition, or the left side of `&&` —
|
|
68
|
+
a review that assumes it does will pass code that silently continues.
|
|
69
|
+
- An error message must go to stderr (`>&2`), or a caller capturing stdout will absorb it as data.
|
|
70
|
+
- A non-zero exit that is expected and handled should say so in a comment; a reader cannot tell an
|
|
71
|
+
ignored failure from a tolerated one.
|
|
72
|
+
|
|
73
|
+
## Performance
|
|
74
|
+
|
|
75
|
+
- A loop calling an external binary per line is the usual cause of a slow script; `awk`, `sed` or a
|
|
76
|
+
single `xargs` does the same work in one process.
|
|
77
|
+
- `$(cat file)` reads the whole file into memory; `< file` in a redirect does not.
|
|
78
|
+
- Subshells `( )` fork; braces `{ }` do not. Reaching for the first out of habit costs a process per
|
|
79
|
+
iteration.
|
|
80
|
+
|
|
81
|
+
## Idioms and Best Practices
|
|
82
|
+
|
|
83
|
+
- `#!/usr/bin/env bash` rather than a hardcoded interpreter path.
|
|
84
|
+
- `set -euo pipefail` at the top of anything executable, with a comment where one of the three is
|
|
85
|
+
deliberately omitted (a hook that must fail open, for example — see this repository's own hooks).
|
|
86
|
+
- Quote every expansion by default; make the unquoted ones the exception that carries a comment.
|
|
87
|
+
- `local` on every variable inside a function — shell variables are global otherwise.
|
|
88
|
+
- `readonly` for constants, so a later assignment is an error rather than a surprise.
|
|
89
|
+
- `shellcheck` catches most of the above; this file exists because the bundled analyser must work
|
|
90
|
+
without it (see the skill's no-external-dependency constraint).
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
language: swift
|
|
3
|
+
extensions: [".swift"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Swift — Language-Specific Review Notes
|
|
7
|
+
|
|
8
|
+
Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only Swift-specific rules and idioms.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## PR Analyzer — Swift Risk Signals
|
|
13
|
+
|
|
14
|
+
- `print()` statements left in production code
|
|
15
|
+
- Force unwrap (`!`) on optionals outside of tests or justified init
|
|
16
|
+
- Force cast (`as!`) without a safe fallback
|
|
17
|
+
- Hardcoded credentials or API keys in source
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Code Quality — Swift Checks
|
|
22
|
+
|
|
23
|
+
- Force unwrap (`!`) used broadly — prefer `guard let` or `if let`
|
|
24
|
+
- `try!` used outside of guaranteed-safe contexts
|
|
25
|
+
- Retain cycles in closures — missing `[weak self]` or `[unowned self]`
|
|
26
|
+
- `@objc` / `dynamic` used without an Objective-C interop reason
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Security
|
|
31
|
+
|
|
32
|
+
- Flag credentials stored in `UserDefaults` — require Keychain
|
|
33
|
+
- Flag `URLSession` requests over plain HTTP in production
|
|
34
|
+
- Flag `WKWebView` loading arbitrary user-supplied URLs without validation
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Async / Concurrency
|
|
39
|
+
|
|
40
|
+
- Flag `DispatchQueue.main.sync` called from the main thread — deadlock
|
|
41
|
+
- Flag `@escaping` closures capturing `self` strongly in reference cycles — use `[weak self]`
|
|
42
|
+
- Flag mixing `async/await` and `DispatchQueue` for the same operation without clear reasoning
|
|
43
|
+
- Flag `Task { }` (unstructured) where a structured `async let` or `TaskGroup` would maintain structure
|
|
44
|
+
- Flag data races — shared mutable state accessed from multiple tasks without an actor
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Resource Management
|
|
49
|
+
|
|
50
|
+
- Flag `URLSessionDataTask` started with no cancellation handle stored — cannot be cancelled if the view disappears
|
|
51
|
+
- Flag `NotificationCenter` observers added without a corresponding `removeObserver` — memory leak
|
|
52
|
+
- Flag `CLLocationManager` / `AVCaptureSession` not stopped when the owning view controller is dismissed
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Exception Handling
|
|
57
|
+
|
|
58
|
+
- Flag `try!` outside of guaranteed-safe contexts (test fixtures, constants) — crashes on failure
|
|
59
|
+
- Flag `try?` discarding errors where the failure mode matters to the caller
|
|
60
|
+
- Flag error types conforming to `Error` with no associated values or message — makes debugging hard
|
|
61
|
+
- Flag throwing functions calling `fatalError()` as a fallback — choose one error strategy
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Performance
|
|
66
|
+
|
|
67
|
+
- Flag `UIImage(named:)` called repeatedly for the same asset without caching
|
|
68
|
+
- Flag synchronous network calls on the main thread
|
|
69
|
+
- Flag `Array` used for frequent membership tests — prefer `Set`
|
|
70
|
+
- Flag `String` interpolation inside tight loops where a pre-built string would avoid allocations
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## Idioms and Best Practices
|
|
75
|
+
|
|
76
|
+
### Optionals
|
|
77
|
+
- Prefer `guard let` for early exit; `if let` for local scope
|
|
78
|
+
- Prefer optional chaining (`?.`) over force unwrap
|
|
79
|
+
- Flag implicitly unwrapped optionals (`var x: String!`) outside of `@IBOutlet`
|
|
80
|
+
|
|
81
|
+
### Memory Management
|
|
82
|
+
- Flag closures capturing `self` strongly in reference cycles — use `[weak self]`
|
|
83
|
+
- Prefer `struct` over `class` for value semantics unless identity or inheritance is needed
|
|
84
|
+
- Use `unowned` only when the lifetime is guaranteed — otherwise `weak`
|
|
85
|
+
|
|
86
|
+
### Concurrency (Swift 5.5+)
|
|
87
|
+
- Prefer `async/await` over completion handlers in new code
|
|
88
|
+
- Flag `DispatchQueue.main.async` where `@MainActor` or `await MainActor.run` is more appropriate
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
language: typescript
|
|
3
|
+
extensions: [".ts", ".tsx", ".js", ".jsx", ".mjs"]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TypeScript / JavaScript — Language-Specific Review Notes
|
|
7
|
+
|
|
8
|
+
Load this file alongside `rules/universal.md`. Universal rules are not repeated here — only TypeScript/JavaScript-specific rules and idioms.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## PR Analyzer — TypeScript / JavaScript Risk Signals
|
|
13
|
+
|
|
14
|
+
- `console.log` / `debugger` statements left in production code
|
|
15
|
+
- `// eslint-disable` comments — verify they are justified
|
|
16
|
+
- `any` type annotations — require explicit justification
|
|
17
|
+
- `@ts-ignore` / `@ts-expect-error` — verify they are justified
|
|
18
|
+
- `eval()` with any dynamic or user-controlled input
|
|
19
|
+
- Hardcoded API keys or tokens in source
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Code Quality — TypeScript / JavaScript Checks
|
|
24
|
+
|
|
25
|
+
- `any` used broadly instead of proper typing
|
|
26
|
+
- Non-null assertion (`!`) used without justification
|
|
27
|
+
- `var` declarations — prefer `const` / `let`
|
|
28
|
+
- Missing `await` on async function calls
|
|
29
|
+
- Floating promises (no `.catch()` and no `await`)
|
|
30
|
+
- `==` used instead of `===`
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Security
|
|
35
|
+
|
|
36
|
+
- Flag `innerHTML`, `outerHTML`, `document.write()` with user-controlled data — use `textContent` or a sanitizer
|
|
37
|
+
- Flag `dangerouslySetInnerHTML` in React without a sanitizer
|
|
38
|
+
- Flag `eval()` / `new Function()` with dynamic input
|
|
39
|
+
- Flag JWT decoded without signature verification
|
|
40
|
+
- Flag missing `httpOnly` / `secure` flags on cookies
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Async / Promises
|
|
45
|
+
|
|
46
|
+
- Flag floating promises — async calls not `await`-ed and without `.catch()`
|
|
47
|
+
- Flag `Promise.all()` where `Promise.allSettled()` is safer (one failure should not cancel siblings)
|
|
48
|
+
- Flag `async` functions inside `forEach` — `forEach` does not await; use `for...of` or `Promise.all()`
|
|
49
|
+
- Flag unhandled promise rejection (no global `unhandledRejection` handler in Node.js services)
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Resource Management
|
|
54
|
+
|
|
55
|
+
- Flag `fs.createReadStream` / `fs.createWriteStream` with no `close` or `destroy` on error
|
|
56
|
+
- Flag `EventEmitter` listeners added in a loop without removal — memory leak
|
|
57
|
+
- Flag `setInterval` / `setTimeout` handles not cleared when the owning component unmounts or exits
|
|
58
|
+
- Flag database clients / pools not released after use in Node.js
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## Exception Handling
|
|
63
|
+
|
|
64
|
+
- Flag `catch (e) {}` (empty catch) — swallowed error
|
|
65
|
+
- Flag `catch (e)` where `e` is used as `any` without narrowing — type the error properly
|
|
66
|
+
- Flag `Promise` rejection not handled — `.catch()` or `try/await/catch` required
|
|
67
|
+
- Flag re-throwing a new `Error` without wrapping the original — loses stack context
|
|
68
|
+
- Use `Error` subclasses for domain errors rather than plain strings or object literals
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Performance
|
|
73
|
+
|
|
74
|
+
- Flag `Array.prototype.find` / `filter` / `map` chained multiple times over the same array — combine into one pass
|
|
75
|
+
- Flag DOM queries (`document.querySelector`) inside loops — cache the result
|
|
76
|
+
- Flag `JSON.parse` / `JSON.stringify` in a hot path on large objects — consider streaming or partial parsing
|
|
77
|
+
- Flag `async` functions called sequentially in a loop where `Promise.all()` would parallelize them
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Idioms and Best Practices
|
|
82
|
+
|
|
83
|
+
### Type Safety (TypeScript)
|
|
84
|
+
- Prefer `unknown` over `any` for truly unknown values — forces a type guard before use
|
|
85
|
+
- Prefer type narrowing (`typeof`, `instanceof`, discriminated unions) over casting
|
|
86
|
+
- Enable `strict` mode in `tsconfig.json`
|
|
87
|
+
- Prefer `interface` for object shapes that may be extended; `type` for unions and aliases
|
|
88
|
+
|
|
89
|
+
### Modern JavaScript / TypeScript
|
|
90
|
+
- Prefer `const` by default; `let` only when reassignment is needed
|
|
91
|
+
- Prefer optional chaining (`?.`) and nullish coalescing (`??`) over manual null guards
|
|
92
|
+
- Prefer `structuredClone()` over manual deep-copy patterns
|
|
93
|
+
- Prefer named exports over default exports for better refactoring support
|
|
94
|
+
|
|
95
|
+
### Null / Undefined Safety
|
|
96
|
+
- Distinguish between `null` (intentional absence) and `undefined` (not set) — be consistent
|
|
97
|
+
- Flag `== null` checks that accidentally include `undefined` when only one is intended
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"description": "Review policy DoFlow ships. The analyzer resolves three tiers, lowest precedence first: its built-in literal, this file, then agent-docs/review-policy.json in the repository under review. A project overrides individual values by declaring only those values in its own file; everything it omits resolves from here. Documentation must name this file rather than restate any value in it, and a guard in the default test suite fails when a shipped document carries a number declared here.",
|
|
3
|
+
"thresholds": {
|
|
4
|
+
"long_function_lines": 50,
|
|
5
|
+
"too_many_parameters": 5,
|
|
6
|
+
"high_complexity": 10,
|
|
7
|
+
"god_class_methods": 20,
|
|
8
|
+
"max_imports": 15,
|
|
9
|
+
"max_declarative_depth": 8
|
|
10
|
+
},
|
|
11
|
+
"thresholdLabels": {
|
|
12
|
+
"long_function_lines": "Long function",
|
|
13
|
+
"too_many_parameters": "Too many params",
|
|
14
|
+
"high_complexity": "High complexity",
|
|
15
|
+
"god_class_methods": "God class",
|
|
16
|
+
"max_imports": "Too many imports",
|
|
17
|
+
"max_declarative_depth": "Nesting depth"
|
|
18
|
+
},
|
|
19
|
+
"severities": [
|
|
20
|
+
"low",
|
|
21
|
+
"medium",
|
|
22
|
+
"high"
|
|
23
|
+
],
|
|
24
|
+
"verdictBands": [
|
|
25
|
+
{
|
|
26
|
+
"verdict": "Approve",
|
|
27
|
+
"minScore": 90,
|
|
28
|
+
"maxHighFindings": 0
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"verdict": "Approve with suggestions",
|
|
32
|
+
"minScore": 75,
|
|
33
|
+
"maxHighFindings": 2
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"verdict": "Request changes",
|
|
37
|
+
"minScore": 50,
|
|
38
|
+
"maxHighFindings": null
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"verdict": "Block",
|
|
42
|
+
"minScore": 0,
|
|
43
|
+
"maxHighFindings": null
|
|
44
|
+
}
|
|
45
|
+
],
|
|
46
|
+
"exclusions": []
|
|
47
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Universal Rules — All Languages
|
|
2
|
+
|
|
3
|
+
These rules apply regardless of language. Load this file for every review, alongside the relevant `languages/*.md` file.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Security
|
|
8
|
+
|
|
9
|
+
- Flag any string interpolation or concatenation used to build SQL, shell, or LDAP queries — require parameterized queries or a safe API
|
|
10
|
+
- Flag hardcoded credentials, API keys, tokens, or secrets anywhere in source — require environment variables or a secrets manager
|
|
11
|
+
- Flag user-controlled input passed to file system, process execution, or URL redirect APIs without validation
|
|
12
|
+
- Flag overly broad CORS or CSP policies
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Async / Concurrency
|
|
17
|
+
|
|
18
|
+
- Flag shared mutable state accessed from multiple threads/coroutines/tasks without synchronization
|
|
19
|
+
- Flag fire-and-forget async operations with no error handling path
|
|
20
|
+
- Flag timeouts missing on any network or I/O call
|
|
21
|
+
- Flag unbounded queues or thread pools with no backpressure mechanism
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Resource Management
|
|
26
|
+
|
|
27
|
+
- Flag any resource (file, socket, DB connection, HTTP connection) acquired without a guaranteed release path
|
|
28
|
+
- Flag connection pools not returned to the pool on all code paths (including exceptions)
|
|
29
|
+
- Flag unbounded collections that grow without eviction — potential memory leak
|
|
30
|
+
- Flag resources held open longer than the operation they serve
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Exception Handling
|
|
35
|
+
|
|
36
|
+
- Flag empty catch/except blocks — swallowed exceptions hide bugs silently
|
|
37
|
+
- Flag catching the broadest possible exception type (`Exception`, `Throwable`, `error`) where a specific type is appropriate
|
|
38
|
+
- Flag exceptions used for normal control flow (signaling "not found", etc.) — use return values or `Optional`
|
|
39
|
+
- Flag error context lost when re-throwing — always wrap with the original cause
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Performance
|
|
44
|
+
|
|
45
|
+
- Flag N+1 query patterns — loading a collection then querying for each item individually
|
|
46
|
+
- Flag unbounded queries or API calls with no pagination or limit
|
|
47
|
+
- Flag synchronous I/O on a thread or event loop that serves concurrent requests
|
|
48
|
+
- Flag large objects serialized/deserialized repeatedly when they could be cached
|
|
49
|
+
- Flag string concatenation in tight loops — use a builder or join
|