kingmadoc 0.3.0.dev16__tar.gz → 0.3.0.dev17__tar.gz
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.
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/PKG-INFO +1 -1
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/examples/verify-mode-plan.md +22 -3
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/SKILL.md +2 -2
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/codex.md +84 -5
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/copilot.md +84 -5
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/cursor.md +84 -5
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/reference/diagram-rules.md +67 -3
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/reference/formats.md +15 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/config.py +8 -2
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/plan/generator.py +6 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/templates/plan_default.md.j2 +20 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/.featuredoc.yml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/.github/workflows/ci.yml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/.github/workflows/release.yml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/.gitignore +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/CHANGELOG.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/CLAUDE.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/CONTRIBUTING.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/LICENSE +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/README.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/docs/conventions.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/docs/index.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/docs/releasing.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/docs/roadmap.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/docs/test-plan.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/README.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/manage.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/requirements.txt +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/shop/__init__.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/shop/models.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/shop/services.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/shop/settings.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/shop/urls.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop/shop/views.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop-discount/shop/discounts.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/fixtures/shop-discount/shop/services.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/results/2026-09-27T111837Z.json +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/results/2026-09-27T112600Z.json +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/results/2026-09-27T162715Z.json +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/results/2026-09-28T064505Z.json +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/results/2026-09-28T092643Z.json +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/results/2026-09-28T093046Z.json +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/scenarios/explain-branch.yml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/scenarios/explain-feature.yml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/scenarios/explain-fo-to.yml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/evals/scenarios/plan-feature.yml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/pyproject.toml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/scripts/build_skill_variants.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/scripts/build_threat_reference.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/scripts/import_tmt_knowledge_base.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/scripts/run_evals.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/SKILL.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/arc42.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/c4-model.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/c4.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/models.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/split.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/stories.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/threat-model.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/skill/explaining-code/reference/threats.md +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/__init__.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/about.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/adr.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/cli.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/d2_binary.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/diagrams/__init__.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/diagrams/base.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/diagrams/d2.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/diagrams/mermaid.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/diagrams/plantuml.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/documents.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/exceptions.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/explain.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/__init__.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/branch.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/collect.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/data_model.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/dominators.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/js_modules.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/projects.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/routes.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/facts/services.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/git.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/naming.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/plan/__init__.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/plan/analyzer.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/plan/dependencies.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/plan/models.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/plandoc.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/raster.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/render.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/scaffold.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/screenshots.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/skills.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/templates/adr.md.j2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/templates/domain_design.md.j2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/templates/functional_design.md.j2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/templates/security_design.md.j2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/templates/technical_design.md.j2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/templating.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/threats/__init__.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/threats/filters.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/threats/knowledge_base.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/threats/model.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/threats/report.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/threats/sdl_knowledge_base.json +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/verify/__init__.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/verify/changes.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/verify/commands.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/verify/deviations.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/verify/locate.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/verify/report.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/src/kingmadoc/vscode.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/conftest.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/data/d2-sample.svg +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/d2/class.d2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/d2/component.d2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/d2/container.d2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/d2/context.d2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/d2/sequence.d2 +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/mermaid/class.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/mermaid/component.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/mermaid/container.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/mermaid/context.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/mermaid/sequence.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/plantuml/class.puml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/plantuml/component.puml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/plantuml/container.puml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/plantuml/context.puml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/backends/plantuml/sequence.puml +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/mermaid/component.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/mermaid/container.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/fixtures/mermaid/context.mmd +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_adr.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_adr_numbering.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_analyzer.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_cli.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_cli_encoding.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_cli_init.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_cli_plan_custom_template.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_cli_sigint.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_cli_verify_config.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_config.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_config_poetry.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_config_shape.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_d2_download.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_dependencies.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_dependency_graph_model.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_design_diagrams_compile.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_design_models.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_diagram_backends.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_diagrams_mermaid.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_documents.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_duplicate_names.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_evals.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_explain.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_explain_check.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_explain_config.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_explain_status.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_extra_designs_coverage.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_facts.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_facts_code.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_facts_data_model.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_facts_dominators.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_functional_design.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_generator.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_grep_performance.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_manifests.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_max_lines_per_file.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_output_dir.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_plan_e2e.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_plandoc.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_properties.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_raster.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_render.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_scaffold.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_screenshots.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_security_domain_designs.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_skill.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_skill_explaining_code.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_skill_models.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_skills_install.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_source_dirs.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_summary_slug_diagram_defaults.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_technical_design.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_templating_security.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_threats.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_verify.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_verify_locate.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_version.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/tests/test_vscode_preview.py +0 -0
- {kingmadoc-0.3.0.dev16 → kingmadoc-0.3.0.dev17}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: kingmadoc
|
|
3
|
-
Version: 0.3.0.
|
|
3
|
+
Version: 0.3.0.dev17
|
|
4
4
|
Summary: Feature docs for AI coding agents: a plan with C4 diagrams before the code, a verification doc after.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ATkingma/KingmaDoc
|
|
6
6
|
Project-URL: Issues, https://github.com/ATkingma/KingmaDoc/issues
|
|
@@ -11,7 +11,7 @@ files_expected: ["src/kingmadoc/cli.py", "src/kingmadoc/verify"]
|
|
|
11
11
|
|---|---|
|
|
12
12
|
| **Project** | KingmaDoc |
|
|
13
13
|
| **Status** | Draft |
|
|
14
|
-
| **Generated** | 2026-09-
|
|
14
|
+
| **Generated** | 2026-09-28T12:54+00:00 by KingmaDoc 0.1.0.dev50 |
|
|
15
15
|
|
|
16
16
|
> Generated before implementation. Fill in every _TODO_ and review everything marked
|
|
17
17
|
> _(inferred)_: it comes from the codebase analysis and is a starting point, not the truth.
|
|
@@ -97,6 +97,18 @@ _Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
|
97
97
|
|
|
98
98
|
_Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
99
99
|
|
|
100
|
+
## Data flow diagram (Mermaid)
|
|
101
|
+
|
|
102
|
+
Where the feature's data comes from, what transforms it and where it is stored.
|
|
103
|
+
|
|
104
|
+
_Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
105
|
+
|
|
106
|
+
## State diagram (Mermaid)
|
|
107
|
+
|
|
108
|
+
The states of the object whose lifecycle the feature changes.
|
|
109
|
+
|
|
110
|
+
_Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
111
|
+
|
|
100
112
|
## Open questions
|
|
101
113
|
|
|
102
114
|
- [ ] _TODO: anything else that must be decided before implementation._
|
|
@@ -121,12 +133,12 @@ _Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
|
121
133
|
| python | 113 |
|
|
122
134
|
| markdown | 28 |
|
|
123
135
|
| jinja | 6 |
|
|
136
|
+
| json | 4 |
|
|
124
137
|
| yaml | 3 |
|
|
125
|
-
| json | 2 |
|
|
126
138
|
| toml | 1 |
|
|
127
139
|
|
|
128
140
|
<details>
|
|
129
|
-
<summary>File tree (
|
|
141
|
+
<summary>File tree (236 files)</summary>
|
|
130
142
|
|
|
131
143
|
```text
|
|
132
144
|
KingmaDoc/
|
|
@@ -149,6 +161,7 @@ KingmaDoc/
|
|
|
149
161
|
│ │ ├── 0b0dfdcede5596e1
|
|
150
162
|
│ │ ├── 1b81a71a7607fbf6
|
|
151
163
|
│ │ ├── 2003bed8cb6acdf2
|
|
164
|
+
│ │ ├── 27972aa85104d731
|
|
152
165
|
│ │ ├── 2e00d1a2bca2c453
|
|
153
166
|
│ │ ├── 390efa9697d4e1bf
|
|
154
167
|
│ │ ├── 429e7d227d43fa43
|
|
@@ -189,6 +202,7 @@ KingmaDoc/
|
|
|
189
202
|
│ │ ├── c7c62939844fec2e
|
|
190
203
|
│ │ ├── cc4dfad2dc9d75e2
|
|
191
204
|
│ │ ├── cd82d38bc12deabd
|
|
205
|
+
│ │ ├── d1d54a4302c7359c
|
|
192
206
|
│ │ ├── d6e5d66b09a82b49
|
|
193
207
|
│ │ ├── da39a3ee5e6b4b0d
|
|
194
208
|
│ │ ├── e36626a891f1bf04
|
|
@@ -200,6 +214,11 @@ KingmaDoc/
|
|
|
200
214
|
│ │ └── 14.0.0/
|
|
201
215
|
│ │ └── …
|
|
202
216
|
│ └── .gitignore
|
|
217
|
+
├── .import_linter_cache/
|
|
218
|
+
│ ├── .gitignore
|
|
219
|
+
│ ├── 3516dc116b537972f63cac11b7ceb5fffe116986.data.json
|
|
220
|
+
│ ├── CACHEDIR.TAG
|
|
221
|
+
│ └── kingmadoc.meta.json
|
|
203
222
|
├── docs/
|
|
204
223
|
│ ├── conventions.md
|
|
205
224
|
│ ├── index.md
|
|
@@ -52,8 +52,8 @@ brackets); ignore the file if it is absent:
|
|
|
52
52
|
- `analyzer.exclude_dirs` [`.git`, `node_modules`, `.venv`, `venv`, `__pycache__`,
|
|
53
53
|
`dist`, `build`, `*.egg-info`, tool caches], `analyzer.max_files` [`5000`],
|
|
54
54
|
`analyzer.tree_depth` [`3`].
|
|
55
|
-
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`]:
|
|
56
|
-
a diagram.
|
|
55
|
+
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`, `data_flow`, `state`]:
|
|
56
|
+
which sections get a diagram.
|
|
57
57
|
- `diagrams_png` [`embed`]: `embed`, `file` or `off`; see
|
|
58
58
|
[Rendering](reference/diagram-rules.md#rendering).
|
|
59
59
|
- `language` [`en`]: language of fixed sentences, notes and captions (headings stay English).
|
|
@@ -52,8 +52,8 @@ brackets); ignore the file if it is absent:
|
|
|
52
52
|
- `analyzer.exclude_dirs` [`.git`, `node_modules`, `.venv`, `venv`, `__pycache__`,
|
|
53
53
|
`dist`, `build`, `*.egg-info`, tool caches], `analyzer.max_files` [`5000`],
|
|
54
54
|
`analyzer.tree_depth` [`3`].
|
|
55
|
-
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`]:
|
|
56
|
-
a diagram.
|
|
55
|
+
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`, `data_flow`, `state`]:
|
|
56
|
+
which sections get a diagram.
|
|
57
57
|
- `diagrams_png` [`embed`]: `embed`, `file` or `off`; see
|
|
58
58
|
[Rendering](#rendering).
|
|
59
59
|
- `language` [`en`]: language of fixed sentences, notes and captions (headings stay English).
|
|
@@ -239,7 +239,7 @@ Show the user the path, the number of deviations, and any failing check.
|
|
|
239
239
|
- **Always labeled**:
|
|
240
240
|
- C4 and `sequenceDiagram`: the first line after the diagram type is `title <text>`
|
|
241
241
|
(`System Context: <project>`, `Containers: <project>`);
|
|
242
|
-
- `classDiagram`, `erDiagram` and `
|
|
242
|
+
- `classDiagram`, `erDiagram`, `flowchart` and `stateDiagram-v2` have no `title` line; put frontmatter
|
|
243
243
|
before the diagram type instead: `---`, `title: "<text>"`, `---` (quote the
|
|
244
244
|
title: an unquoted `:` breaks the YAML and the render);
|
|
245
245
|
- every element has a quoted label: `Person(alias, "Label", "Description")`,
|
|
@@ -285,10 +285,73 @@ C4Context
|
|
|
285
285
|
Rel(shop, sendgrid, "Sends email via")
|
|
286
286
|
```
|
|
287
287
|
|
|
288
|
-
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence
|
|
288
|
+
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence`,
|
|
289
|
+
`data_flow`, `state`]
|
|
289
290
|
selects the diagrams. If one is disabled, keep its section and replace the diagram with
|
|
290
291
|
this line: _Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
291
292
|
|
|
293
|
+
## Data flow diagram
|
|
294
|
+
|
|
295
|
+
Yourdon/DeMarco style (Gane-Sarson draws the same with other shapes) as a `flowchart LR`:
|
|
296
|
+
|
|
297
|
+
- **External entity** (person or system outside the scope): rectangle `user[User]`.
|
|
298
|
+
- **Process** (transforms data): circle with a number and a verb phrase,
|
|
299
|
+
`p1((1. Validate order))`.
|
|
300
|
+
- **Data store** (data at rest): `d1[("D1 Orders")]`, named with a noun, numbered `D1`.
|
|
301
|
+
- **Data flow**: an arrow labelled with the **data** (a noun: `order`, `invoice`), never an
|
|
302
|
+
action; every arrow has a label.
|
|
303
|
+
- Rules: every flow starts or ends at a process (never entity → entity, entity → store
|
|
304
|
+
or store → store); every process has at least one input and one output (no black
|
|
305
|
+
holes, no miracles) and its output can be made from its input (no grey holes); a
|
|
306
|
+
store is both written and read somewhere, or it is outside the feature; no control
|
|
307
|
+
flow, loops or decisions (that is the sequence or state diagram).
|
|
308
|
+
- **Levels**: the Context diagram is level 0; this is level 1 for the feature. The flows
|
|
309
|
+
in and out must balance with the Context diagram (same external systems, same data).
|
|
310
|
+
- Mark new or changed processes and flows _(inferred)_ or from the answers, as usual.
|
|
311
|
+
|
|
312
|
+
```mermaid
|
|
313
|
+
---
|
|
314
|
+
title: "Data flow: place order"
|
|
315
|
+
---
|
|
316
|
+
flowchart LR
|
|
317
|
+
user[Customer] -- order --> p1((1. Validate order))
|
|
318
|
+
p1 -- valid order --> p2((2. Store order))
|
|
319
|
+
p2 -- order --> d1[("D1 Orders")]
|
|
320
|
+
p2 -- confirmation --> user
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## State diagram
|
|
324
|
+
|
|
325
|
+
UML 2 state machine as `stateDiagram-v2`, for the one object whose lifecycle the feature
|
|
326
|
+
changes (an order, a job, a document):
|
|
327
|
+
|
|
328
|
+
- **States** are conditions, named with an adjective or past participle (`Draft`,
|
|
329
|
+
`Paid`, `Cancelled`), never an action (`Pay`).
|
|
330
|
+
- One initial `[*] --> <state>` (unlabelled); final `<state> --> [*]` only where the
|
|
331
|
+
object's life really ends.
|
|
332
|
+
- **Transitions**: `A --> B : event [guard] / action`; event, guard and action are each
|
|
333
|
+
optional, but every transition has at least the event. Guards leaving the same state
|
|
334
|
+
on the same event must not overlap; use `state check <<choice>>` for a decision.
|
|
335
|
+
- Every state is reachable from the initial state, and every non-final state has a way
|
|
336
|
+
out (no dead ends unless intended).
|
|
337
|
+
- Composite states (`state Active { … }`) only when they remove repeated transitions;
|
|
338
|
+
keep it to about ten states.
|
|
339
|
+
- New states and transitions from the answers or "Planned changes"; existing ones from
|
|
340
|
+
the code are _(inferred)_.
|
|
341
|
+
|
|
342
|
+
```mermaid
|
|
343
|
+
---
|
|
344
|
+
title: "States: Order"
|
|
345
|
+
---
|
|
346
|
+
stateDiagram-v2
|
|
347
|
+
[*] --> Draft
|
|
348
|
+
Draft --> Placed : submit [cart not empty]
|
|
349
|
+
Placed --> Paid : payment received / send receipt
|
|
350
|
+
Placed --> Cancelled : cancel
|
|
351
|
+
Paid --> [*]
|
|
352
|
+
Cancelled --> [*]
|
|
353
|
+
```
|
|
354
|
+
|
|
292
355
|
## Rendering
|
|
293
356
|
|
|
294
357
|
`diagrams_png` in `.featuredoc.yml` [`embed`]: `embed` (below), `file` (the PNG goes to
|
|
@@ -306,7 +369,8 @@ or `off` (no image; the ` ```mermaid ` block stays in the document).
|
|
|
306
369
|
`<output_dir>/diagrams/<slug>-<diagram>.mmd`.
|
|
307
370
|
|
|
308
371
|
1. Write each diagram to `<output_dir>/diagrams/<slug>-<diagram>.mmd` (`<diagram>`:
|
|
309
|
-
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new
|
|
372
|
+
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new`,
|
|
373
|
+
`data-flow`, `state`) and run:
|
|
310
374
|
`npx -y @mermaid-js/mermaid-cli -i <that>.mmd -o <tmp>.png -s 2 -b white -t default -p <puppeteer.json>`
|
|
311
375
|
(`-t default`: Mermaid's normal theme; newer versions otherwise colour every shape).
|
|
312
376
|
2. Set `PUPPETEER_SKIP_DOWNLOAD=true`, and let `puppeteer.json` point at an installed
|
|
@@ -423,6 +487,18 @@ The classes this feature touches and their direct collaborators.
|
|
|
423
487
|
|
|
424
488
|
<sequenceDiagram of the flow after the change>
|
|
425
489
|
|
|
490
|
+
## Data flow diagram (Mermaid)
|
|
491
|
+
|
|
492
|
+
Where the feature's data comes from, what transforms it and where it is stored.
|
|
493
|
+
|
|
494
|
+
<flowchart DFD, or _Not applicable: <reason>._>
|
|
495
|
+
|
|
496
|
+
## State diagram (Mermaid)
|
|
497
|
+
|
|
498
|
+
The states of <the object whose lifecycle the feature changes>.
|
|
499
|
+
|
|
500
|
+
<stateDiagram-v2, or _Not applicable: <reason>._>
|
|
501
|
+
|
|
426
502
|
## Open questions
|
|
427
503
|
|
|
428
504
|
- [ ] <each unanswered clarifying question>
|
|
@@ -470,6 +546,9 @@ Omit "**Answered while planning**" when nothing was answered.
|
|
|
470
546
|
result, with real classes as participants and real method names as messages;
|
|
471
547
|
`activate`/`deactivate` for nested calls, `alt`/`opt` for branches. In **Current**,
|
|
472
548
|
a `Note` marks where it goes wrong.
|
|
549
|
+
- **Data flow diagram** and **State diagram**: rules in
|
|
550
|
+
[diagram-rules.md](diagram-rules.md#data-flow-diagram); _Not applicable: <reason>._ when
|
|
551
|
+
the feature moves no data between parts, or has no object with a lifecycle.
|
|
473
552
|
- **Open changes**: when an uncommitted change or stash touches the feature, also list
|
|
474
553
|
it under Open questions.
|
|
475
554
|
- `language` in `.featuredoc.yml` [`en`]: headings stay English (the CLI's), but fixed
|
|
@@ -52,8 +52,8 @@ brackets); ignore the file if it is absent:
|
|
|
52
52
|
- `analyzer.exclude_dirs` [`.git`, `node_modules`, `.venv`, `venv`, `__pycache__`,
|
|
53
53
|
`dist`, `build`, `*.egg-info`, tool caches], `analyzer.max_files` [`5000`],
|
|
54
54
|
`analyzer.tree_depth` [`3`].
|
|
55
|
-
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`]:
|
|
56
|
-
a diagram.
|
|
55
|
+
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`, `data_flow`, `state`]:
|
|
56
|
+
which sections get a diagram.
|
|
57
57
|
- `diagrams_png` [`embed`]: `embed`, `file` or `off`; see
|
|
58
58
|
[Rendering](#rendering).
|
|
59
59
|
- `language` [`en`]: language of fixed sentences, notes and captions (headings stay English).
|
|
@@ -239,7 +239,7 @@ Show the user the path, the number of deviations, and any failing check.
|
|
|
239
239
|
- **Always labeled**:
|
|
240
240
|
- C4 and `sequenceDiagram`: the first line after the diagram type is `title <text>`
|
|
241
241
|
(`System Context: <project>`, `Containers: <project>`);
|
|
242
|
-
- `classDiagram`, `erDiagram` and `
|
|
242
|
+
- `classDiagram`, `erDiagram`, `flowchart` and `stateDiagram-v2` have no `title` line; put frontmatter
|
|
243
243
|
before the diagram type instead: `---`, `title: "<text>"`, `---` (quote the
|
|
244
244
|
title: an unquoted `:` breaks the YAML and the render);
|
|
245
245
|
- every element has a quoted label: `Person(alias, "Label", "Description")`,
|
|
@@ -285,10 +285,73 @@ C4Context
|
|
|
285
285
|
Rel(shop, sendgrid, "Sends email via")
|
|
286
286
|
```
|
|
287
287
|
|
|
288
|
-
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence
|
|
288
|
+
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence`,
|
|
289
|
+
`data_flow`, `state`]
|
|
289
290
|
selects the diagrams. If one is disabled, keep its section and replace the diagram with
|
|
290
291
|
this line: _Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
291
292
|
|
|
293
|
+
## Data flow diagram
|
|
294
|
+
|
|
295
|
+
Yourdon/DeMarco style (Gane-Sarson draws the same with other shapes) as a `flowchart LR`:
|
|
296
|
+
|
|
297
|
+
- **External entity** (person or system outside the scope): rectangle `user[User]`.
|
|
298
|
+
- **Process** (transforms data): circle with a number and a verb phrase,
|
|
299
|
+
`p1((1. Validate order))`.
|
|
300
|
+
- **Data store** (data at rest): `d1[("D1 Orders")]`, named with a noun, numbered `D1`.
|
|
301
|
+
- **Data flow**: an arrow labelled with the **data** (a noun: `order`, `invoice`), never an
|
|
302
|
+
action; every arrow has a label.
|
|
303
|
+
- Rules: every flow starts or ends at a process (never entity → entity, entity → store
|
|
304
|
+
or store → store); every process has at least one input and one output (no black
|
|
305
|
+
holes, no miracles) and its output can be made from its input (no grey holes); a
|
|
306
|
+
store is both written and read somewhere, or it is outside the feature; no control
|
|
307
|
+
flow, loops or decisions (that is the sequence or state diagram).
|
|
308
|
+
- **Levels**: the Context diagram is level 0; this is level 1 for the feature. The flows
|
|
309
|
+
in and out must balance with the Context diagram (same external systems, same data).
|
|
310
|
+
- Mark new or changed processes and flows _(inferred)_ or from the answers, as usual.
|
|
311
|
+
|
|
312
|
+
```mermaid
|
|
313
|
+
---
|
|
314
|
+
title: "Data flow: place order"
|
|
315
|
+
---
|
|
316
|
+
flowchart LR
|
|
317
|
+
user[Customer] -- order --> p1((1. Validate order))
|
|
318
|
+
p1 -- valid order --> p2((2. Store order))
|
|
319
|
+
p2 -- order --> d1[("D1 Orders")]
|
|
320
|
+
p2 -- confirmation --> user
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## State diagram
|
|
324
|
+
|
|
325
|
+
UML 2 state machine as `stateDiagram-v2`, for the one object whose lifecycle the feature
|
|
326
|
+
changes (an order, a job, a document):
|
|
327
|
+
|
|
328
|
+
- **States** are conditions, named with an adjective or past participle (`Draft`,
|
|
329
|
+
`Paid`, `Cancelled`), never an action (`Pay`).
|
|
330
|
+
- One initial `[*] --> <state>` (unlabelled); final `<state> --> [*]` only where the
|
|
331
|
+
object's life really ends.
|
|
332
|
+
- **Transitions**: `A --> B : event [guard] / action`; event, guard and action are each
|
|
333
|
+
optional, but every transition has at least the event. Guards leaving the same state
|
|
334
|
+
on the same event must not overlap; use `state check <<choice>>` for a decision.
|
|
335
|
+
- Every state is reachable from the initial state, and every non-final state has a way
|
|
336
|
+
out (no dead ends unless intended).
|
|
337
|
+
- Composite states (`state Active { … }`) only when they remove repeated transitions;
|
|
338
|
+
keep it to about ten states.
|
|
339
|
+
- New states and transitions from the answers or "Planned changes"; existing ones from
|
|
340
|
+
the code are _(inferred)_.
|
|
341
|
+
|
|
342
|
+
```mermaid
|
|
343
|
+
---
|
|
344
|
+
title: "States: Order"
|
|
345
|
+
---
|
|
346
|
+
stateDiagram-v2
|
|
347
|
+
[*] --> Draft
|
|
348
|
+
Draft --> Placed : submit [cart not empty]
|
|
349
|
+
Placed --> Paid : payment received / send receipt
|
|
350
|
+
Placed --> Cancelled : cancel
|
|
351
|
+
Paid --> [*]
|
|
352
|
+
Cancelled --> [*]
|
|
353
|
+
```
|
|
354
|
+
|
|
292
355
|
## Rendering
|
|
293
356
|
|
|
294
357
|
`diagrams_png` in `.featuredoc.yml` [`embed`]: `embed` (below), `file` (the PNG goes to
|
|
@@ -306,7 +369,8 @@ or `off` (no image; the ` ```mermaid ` block stays in the document).
|
|
|
306
369
|
`<output_dir>/diagrams/<slug>-<diagram>.mmd`.
|
|
307
370
|
|
|
308
371
|
1. Write each diagram to `<output_dir>/diagrams/<slug>-<diagram>.mmd` (`<diagram>`:
|
|
309
|
-
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new
|
|
372
|
+
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new`,
|
|
373
|
+
`data-flow`, `state`) and run:
|
|
310
374
|
`npx -y @mermaid-js/mermaid-cli -i <that>.mmd -o <tmp>.png -s 2 -b white -t default -p <puppeteer.json>`
|
|
311
375
|
(`-t default`: Mermaid's normal theme; newer versions otherwise colour every shape).
|
|
312
376
|
2. Set `PUPPETEER_SKIP_DOWNLOAD=true`, and let `puppeteer.json` point at an installed
|
|
@@ -423,6 +487,18 @@ The classes this feature touches and their direct collaborators.
|
|
|
423
487
|
|
|
424
488
|
<sequenceDiagram of the flow after the change>
|
|
425
489
|
|
|
490
|
+
## Data flow diagram (Mermaid)
|
|
491
|
+
|
|
492
|
+
Where the feature's data comes from, what transforms it and where it is stored.
|
|
493
|
+
|
|
494
|
+
<flowchart DFD, or _Not applicable: <reason>._>
|
|
495
|
+
|
|
496
|
+
## State diagram (Mermaid)
|
|
497
|
+
|
|
498
|
+
The states of <the object whose lifecycle the feature changes>.
|
|
499
|
+
|
|
500
|
+
<stateDiagram-v2, or _Not applicable: <reason>._>
|
|
501
|
+
|
|
426
502
|
## Open questions
|
|
427
503
|
|
|
428
504
|
- [ ] <each unanswered clarifying question>
|
|
@@ -470,6 +546,9 @@ Omit "**Answered while planning**" when nothing was answered.
|
|
|
470
546
|
result, with real classes as participants and real method names as messages;
|
|
471
547
|
`activate`/`deactivate` for nested calls, `alt`/`opt` for branches. In **Current**,
|
|
472
548
|
a `Note` marks where it goes wrong.
|
|
549
|
+
- **Data flow diagram** and **State diagram**: rules in
|
|
550
|
+
[diagram-rules.md](diagram-rules.md#data-flow-diagram); _Not applicable: <reason>._ when
|
|
551
|
+
the feature moves no data between parts, or has no object with a lifecycle.
|
|
473
552
|
- **Open changes**: when an uncommitted change or stash touches the feature, also list
|
|
474
553
|
it under Open questions.
|
|
475
554
|
- `language` in `.featuredoc.yml` [`en`]: headings stay English (the CLI's), but fixed
|
|
@@ -53,8 +53,8 @@ brackets); ignore the file if it is absent:
|
|
|
53
53
|
- `analyzer.exclude_dirs` [`.git`, `node_modules`, `.venv`, `venv`, `__pycache__`,
|
|
54
54
|
`dist`, `build`, `*.egg-info`, tool caches], `analyzer.max_files` [`5000`],
|
|
55
55
|
`analyzer.tree_depth` [`3`].
|
|
56
|
-
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`]:
|
|
57
|
-
a diagram.
|
|
56
|
+
- `diagrams` [`c4_context`, `c4_container`, `class`, `sequence`, `data_flow`, `state`]:
|
|
57
|
+
which sections get a diagram.
|
|
58
58
|
- `diagrams_png` [`embed`]: `embed`, `file` or `off`; see
|
|
59
59
|
[Rendering](#rendering).
|
|
60
60
|
- `language` [`en`]: language of fixed sentences, notes and captions (headings stay English).
|
|
@@ -240,7 +240,7 @@ Show the user the path, the number of deviations, and any failing check.
|
|
|
240
240
|
- **Always labeled**:
|
|
241
241
|
- C4 and `sequenceDiagram`: the first line after the diagram type is `title <text>`
|
|
242
242
|
(`System Context: <project>`, `Containers: <project>`);
|
|
243
|
-
- `classDiagram`, `erDiagram` and `
|
|
243
|
+
- `classDiagram`, `erDiagram`, `flowchart` and `stateDiagram-v2` have no `title` line; put frontmatter
|
|
244
244
|
before the diagram type instead: `---`, `title: "<text>"`, `---` (quote the
|
|
245
245
|
title: an unquoted `:` breaks the YAML and the render);
|
|
246
246
|
- every element has a quoted label: `Person(alias, "Label", "Description")`,
|
|
@@ -286,10 +286,73 @@ C4Context
|
|
|
286
286
|
Rel(shop, sendgrid, "Sends email via")
|
|
287
287
|
```
|
|
288
288
|
|
|
289
|
-
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence
|
|
289
|
+
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence`,
|
|
290
|
+
`data_flow`, `state`]
|
|
290
291
|
selects the diagrams. If one is disabled, keep its section and replace the diagram with
|
|
291
292
|
this line: _Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
292
293
|
|
|
294
|
+
## Data flow diagram
|
|
295
|
+
|
|
296
|
+
Yourdon/DeMarco style (Gane-Sarson draws the same with other shapes) as a `flowchart LR`:
|
|
297
|
+
|
|
298
|
+
- **External entity** (person or system outside the scope): rectangle `user[User]`.
|
|
299
|
+
- **Process** (transforms data): circle with a number and a verb phrase,
|
|
300
|
+
`p1((1. Validate order))`.
|
|
301
|
+
- **Data store** (data at rest): `d1[("D1 Orders")]`, named with a noun, numbered `D1`.
|
|
302
|
+
- **Data flow**: an arrow labelled with the **data** (a noun: `order`, `invoice`), never an
|
|
303
|
+
action; every arrow has a label.
|
|
304
|
+
- Rules: every flow starts or ends at a process (never entity → entity, entity → store
|
|
305
|
+
or store → store); every process has at least one input and one output (no black
|
|
306
|
+
holes, no miracles) and its output can be made from its input (no grey holes); a
|
|
307
|
+
store is both written and read somewhere, or it is outside the feature; no control
|
|
308
|
+
flow, loops or decisions (that is the sequence or state diagram).
|
|
309
|
+
- **Levels**: the Context diagram is level 0; this is level 1 for the feature. The flows
|
|
310
|
+
in and out must balance with the Context diagram (same external systems, same data).
|
|
311
|
+
- Mark new or changed processes and flows _(inferred)_ or from the answers, as usual.
|
|
312
|
+
|
|
313
|
+
```mermaid
|
|
314
|
+
---
|
|
315
|
+
title: "Data flow: place order"
|
|
316
|
+
---
|
|
317
|
+
flowchart LR
|
|
318
|
+
user[Customer] -- order --> p1((1. Validate order))
|
|
319
|
+
p1 -- valid order --> p2((2. Store order))
|
|
320
|
+
p2 -- order --> d1[("D1 Orders")]
|
|
321
|
+
p2 -- confirmation --> user
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
## State diagram
|
|
325
|
+
|
|
326
|
+
UML 2 state machine as `stateDiagram-v2`, for the one object whose lifecycle the feature
|
|
327
|
+
changes (an order, a job, a document):
|
|
328
|
+
|
|
329
|
+
- **States** are conditions, named with an adjective or past participle (`Draft`,
|
|
330
|
+
`Paid`, `Cancelled`), never an action (`Pay`).
|
|
331
|
+
- One initial `[*] --> <state>` (unlabelled); final `<state> --> [*]` only where the
|
|
332
|
+
object's life really ends.
|
|
333
|
+
- **Transitions**: `A --> B : event [guard] / action`; event, guard and action are each
|
|
334
|
+
optional, but every transition has at least the event. Guards leaving the same state
|
|
335
|
+
on the same event must not overlap; use `state check <<choice>>` for a decision.
|
|
336
|
+
- Every state is reachable from the initial state, and every non-final state has a way
|
|
337
|
+
out (no dead ends unless intended).
|
|
338
|
+
- Composite states (`state Active { … }`) only when they remove repeated transitions;
|
|
339
|
+
keep it to about ten states.
|
|
340
|
+
- New states and transitions from the answers or "Planned changes"; existing ones from
|
|
341
|
+
the code are _(inferred)_.
|
|
342
|
+
|
|
343
|
+
```mermaid
|
|
344
|
+
---
|
|
345
|
+
title: "States: Order"
|
|
346
|
+
---
|
|
347
|
+
stateDiagram-v2
|
|
348
|
+
[*] --> Draft
|
|
349
|
+
Draft --> Placed : submit [cart not empty]
|
|
350
|
+
Placed --> Paid : payment received / send receipt
|
|
351
|
+
Placed --> Cancelled : cancel
|
|
352
|
+
Paid --> [*]
|
|
353
|
+
Cancelled --> [*]
|
|
354
|
+
```
|
|
355
|
+
|
|
293
356
|
## Rendering
|
|
294
357
|
|
|
295
358
|
`diagrams_png` in `.featuredoc.yml` [`embed`]: `embed` (below), `file` (the PNG goes to
|
|
@@ -307,7 +370,8 @@ or `off` (no image; the ` ```mermaid ` block stays in the document).
|
|
|
307
370
|
`<output_dir>/diagrams/<slug>-<diagram>.mmd`.
|
|
308
371
|
|
|
309
372
|
1. Write each diagram to `<output_dir>/diagrams/<slug>-<diagram>.mmd` (`<diagram>`:
|
|
310
|
-
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new
|
|
373
|
+
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new`,
|
|
374
|
+
`data-flow`, `state`) and run:
|
|
311
375
|
`npx -y @mermaid-js/mermaid-cli -i <that>.mmd -o <tmp>.png -s 2 -b white -t default -p <puppeteer.json>`
|
|
312
376
|
(`-t default`: Mermaid's normal theme; newer versions otherwise colour every shape).
|
|
313
377
|
2. Set `PUPPETEER_SKIP_DOWNLOAD=true`, and let `puppeteer.json` point at an installed
|
|
@@ -424,6 +488,18 @@ The classes this feature touches and their direct collaborators.
|
|
|
424
488
|
|
|
425
489
|
<sequenceDiagram of the flow after the change>
|
|
426
490
|
|
|
491
|
+
## Data flow diagram (Mermaid)
|
|
492
|
+
|
|
493
|
+
Where the feature's data comes from, what transforms it and where it is stored.
|
|
494
|
+
|
|
495
|
+
<flowchart DFD, or _Not applicable: <reason>._>
|
|
496
|
+
|
|
497
|
+
## State diagram (Mermaid)
|
|
498
|
+
|
|
499
|
+
The states of <the object whose lifecycle the feature changes>.
|
|
500
|
+
|
|
501
|
+
<stateDiagram-v2, or _Not applicable: <reason>._>
|
|
502
|
+
|
|
427
503
|
## Open questions
|
|
428
504
|
|
|
429
505
|
- [ ] <each unanswered clarifying question>
|
|
@@ -471,6 +547,9 @@ Omit "**Answered while planning**" when nothing was answered.
|
|
|
471
547
|
result, with real classes as participants and real method names as messages;
|
|
472
548
|
`activate`/`deactivate` for nested calls, `alt`/`opt` for branches. In **Current**,
|
|
473
549
|
a `Note` marks where it goes wrong.
|
|
550
|
+
- **Data flow diagram** and **State diagram**: rules in
|
|
551
|
+
[diagram-rules.md](diagram-rules.md#data-flow-diagram); _Not applicable: <reason>._ when
|
|
552
|
+
the feature moves no data between parts, or has no object with a lifecycle.
|
|
474
553
|
- **Open changes**: when an uncommitted change or stash touches the feature, also list
|
|
475
554
|
it under Open questions.
|
|
476
555
|
- `language` in `.featuredoc.yml` [`en`]: headings stay English (the CLI's), but fixed
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
- **Always labeled**:
|
|
9
9
|
- C4 and `sequenceDiagram`: the first line after the diagram type is `title <text>`
|
|
10
10
|
(`System Context: <project>`, `Containers: <project>`);
|
|
11
|
-
- `classDiagram`, `erDiagram` and `
|
|
11
|
+
- `classDiagram`, `erDiagram`, `flowchart` and `stateDiagram-v2` have no `title` line; put frontmatter
|
|
12
12
|
before the diagram type instead: `---`, `title: "<text>"`, `---` (quote the
|
|
13
13
|
title: an unquoted `:` breaks the YAML and the render);
|
|
14
14
|
- every element has a quoted label: `Person(alias, "Label", "Description")`,
|
|
@@ -54,10 +54,73 @@ C4Context
|
|
|
54
54
|
Rel(shop, sendgrid, "Sends email via")
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence
|
|
57
|
+
`diagrams` in `.featuredoc.yml` [`c4_context`, `c4_container`, `class`, `sequence`,
|
|
58
|
+
`data_flow`, `state`]
|
|
58
59
|
selects the diagrams. If one is disabled, keep its section and replace the diagram with
|
|
59
60
|
this line: _Disabled in `.featuredoc.yml` (`diagrams`)._
|
|
60
61
|
|
|
62
|
+
## Data flow diagram
|
|
63
|
+
|
|
64
|
+
Yourdon/DeMarco style (Gane-Sarson draws the same with other shapes) as a `flowchart LR`:
|
|
65
|
+
|
|
66
|
+
- **External entity** (person or system outside the scope): rectangle `user[User]`.
|
|
67
|
+
- **Process** (transforms data): circle with a number and a verb phrase,
|
|
68
|
+
`p1((1. Validate order))`.
|
|
69
|
+
- **Data store** (data at rest): `d1[("D1 Orders")]`, named with a noun, numbered `D1`.
|
|
70
|
+
- **Data flow**: an arrow labelled with the **data** (a noun: `order`, `invoice`), never an
|
|
71
|
+
action; every arrow has a label.
|
|
72
|
+
- Rules: every flow starts or ends at a process (never entity → entity, entity → store
|
|
73
|
+
or store → store); every process has at least one input and one output (no black
|
|
74
|
+
holes, no miracles) and its output can be made from its input (no grey holes); a
|
|
75
|
+
store is both written and read somewhere, or it is outside the feature; no control
|
|
76
|
+
flow, loops or decisions (that is the sequence or state diagram).
|
|
77
|
+
- **Levels**: the Context diagram is level 0; this is level 1 for the feature. The flows
|
|
78
|
+
in and out must balance with the Context diagram (same external systems, same data).
|
|
79
|
+
- Mark new or changed processes and flows _(inferred)_ or from the answers, as usual.
|
|
80
|
+
|
|
81
|
+
```mermaid
|
|
82
|
+
---
|
|
83
|
+
title: "Data flow: place order"
|
|
84
|
+
---
|
|
85
|
+
flowchart LR
|
|
86
|
+
user[Customer] -- order --> p1((1. Validate order))
|
|
87
|
+
p1 -- valid order --> p2((2. Store order))
|
|
88
|
+
p2 -- order --> d1[("D1 Orders")]
|
|
89
|
+
p2 -- confirmation --> user
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## State diagram
|
|
93
|
+
|
|
94
|
+
UML 2 state machine as `stateDiagram-v2`, for the one object whose lifecycle the feature
|
|
95
|
+
changes (an order, a job, a document):
|
|
96
|
+
|
|
97
|
+
- **States** are conditions, named with an adjective or past participle (`Draft`,
|
|
98
|
+
`Paid`, `Cancelled`), never an action (`Pay`).
|
|
99
|
+
- One initial `[*] --> <state>` (unlabelled); final `<state> --> [*]` only where the
|
|
100
|
+
object's life really ends.
|
|
101
|
+
- **Transitions**: `A --> B : event [guard] / action`; event, guard and action are each
|
|
102
|
+
optional, but every transition has at least the event. Guards leaving the same state
|
|
103
|
+
on the same event must not overlap; use `state check <<choice>>` for a decision.
|
|
104
|
+
- Every state is reachable from the initial state, and every non-final state has a way
|
|
105
|
+
out (no dead ends unless intended).
|
|
106
|
+
- Composite states (`state Active { … }`) only when they remove repeated transitions;
|
|
107
|
+
keep it to about ten states.
|
|
108
|
+
- New states and transitions from the answers or "Planned changes"; existing ones from
|
|
109
|
+
the code are _(inferred)_.
|
|
110
|
+
|
|
111
|
+
```mermaid
|
|
112
|
+
---
|
|
113
|
+
title: "States: Order"
|
|
114
|
+
---
|
|
115
|
+
stateDiagram-v2
|
|
116
|
+
[*] --> Draft
|
|
117
|
+
Draft --> Placed : submit [cart not empty]
|
|
118
|
+
Placed --> Paid : payment received / send receipt
|
|
119
|
+
Placed --> Cancelled : cancel
|
|
120
|
+
Paid --> [*]
|
|
121
|
+
Cancelled --> [*]
|
|
122
|
+
```
|
|
123
|
+
|
|
61
124
|
## Rendering
|
|
62
125
|
|
|
63
126
|
`diagrams_png` in `.featuredoc.yml` [`embed`]: `embed` (below), `file` (the PNG goes to
|
|
@@ -75,7 +138,8 @@ or `off` (no image; the ` ```mermaid ` block stays in the document).
|
|
|
75
138
|
`<output_dir>/diagrams/<slug>-<diagram>.mmd`.
|
|
76
139
|
|
|
77
140
|
1. Write each diagram to `<output_dir>/diagrams/<slug>-<diagram>.mmd` (`<diagram>`:
|
|
78
|
-
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new
|
|
141
|
+
`c4-context`, `c4-container`, `class`, `sequence-current`, `sequence-new`,
|
|
142
|
+
`data-flow`, `state`) and run:
|
|
79
143
|
`npx -y @mermaid-js/mermaid-cli -i <that>.mmd -o <tmp>.png -s 2 -b white -t default -p <puppeteer.json>`
|
|
80
144
|
(`-t default`: Mermaid's normal theme; newer versions otherwise colour every shape).
|
|
81
145
|
2. Set `PUPPETEER_SKIP_DOWNLOAD=true`, and let `puppeteer.json` point at an installed
|
|
@@ -93,6 +93,18 @@ The classes this feature touches and their direct collaborators.
|
|
|
93
93
|
|
|
94
94
|
<sequenceDiagram of the flow after the change>
|
|
95
95
|
|
|
96
|
+
## Data flow diagram (Mermaid)
|
|
97
|
+
|
|
98
|
+
Where the feature's data comes from, what transforms it and where it is stored.
|
|
99
|
+
|
|
100
|
+
<flowchart DFD, or _Not applicable: <reason>._>
|
|
101
|
+
|
|
102
|
+
## State diagram (Mermaid)
|
|
103
|
+
|
|
104
|
+
The states of <the object whose lifecycle the feature changes>.
|
|
105
|
+
|
|
106
|
+
<stateDiagram-v2, or _Not applicable: <reason>._>
|
|
107
|
+
|
|
96
108
|
## Open questions
|
|
97
109
|
|
|
98
110
|
- [ ] <each unanswered clarifying question>
|
|
@@ -140,6 +152,9 @@ Omit "**Answered while planning**" when nothing was answered.
|
|
|
140
152
|
result, with real classes as participants and real method names as messages;
|
|
141
153
|
`activate`/`deactivate` for nested calls, `alt`/`opt` for branches. In **Current**,
|
|
142
154
|
a `Note` marks where it goes wrong.
|
|
155
|
+
- **Data flow diagram** and **State diagram**: rules in
|
|
156
|
+
[diagram-rules.md](diagram-rules.md#data-flow-diagram); _Not applicable: <reason>._ when
|
|
157
|
+
the feature moves no data between parts, or has no object with a lifecycle.
|
|
143
158
|
- **Open changes**: when an uncommitted change or stash touches the feature, also list
|
|
144
159
|
it under Open questions.
|
|
145
160
|
- `language` in `.featuredoc.yml` [`en`]: headings stay English (the CLI's), but fixed
|
|
@@ -35,7 +35,9 @@ DEFAULT_EXCLUDE_DIRS: tuple[str, ...] = (
|
|
|
35
35
|
# Hard ceiling on analyzed files, so huge repos cannot make `plan` run away.
|
|
36
36
|
MAX_FILES_LIMIT = 5000
|
|
37
37
|
|
|
38
|
-
SUPPORTED_DIAGRAMS: frozenset[str] = frozenset(
|
|
38
|
+
SUPPORTED_DIAGRAMS: frozenset[str] = frozenset(
|
|
39
|
+
{"c4_context", "c4_container", "class", "sequence", "data_flow", "state"}
|
|
40
|
+
)
|
|
39
41
|
# How the skill embeds a rendered PNG below each Mermaid block (the CLI writes none).
|
|
40
42
|
DIAGRAMS_PNG_MODES: tuple[str, ...] = ("embed", "file", "off")
|
|
41
43
|
# Models each extra design document can contain, in document order. Must match the
|
|
@@ -184,7 +186,9 @@ class FeatureDocConfig:
|
|
|
184
186
|
max_questions: int = 5
|
|
185
187
|
project: ProjectConfig = field(default_factory=ProjectConfig)
|
|
186
188
|
analyzer: AnalyzerConfig = field(default_factory=AnalyzerConfig)
|
|
187
|
-
diagrams: tuple[str, ...] = (
|
|
189
|
+
diagrams: tuple[str, ...] = (
|
|
190
|
+
"c4_context", "c4_container", "class", "sequence", "data_flow", "state",
|
|
191
|
+
)
|
|
188
192
|
diagram_format: str = "mermaid"
|
|
189
193
|
diagrams_png: str = "embed"
|
|
190
194
|
language: str = "en"
|
|
@@ -424,6 +428,8 @@ diagrams:
|
|
|
424
428
|
- c4_container
|
|
425
429
|
- class
|
|
426
430
|
- sequence
|
|
431
|
+
- data_flow
|
|
432
|
+
- state
|
|
427
433
|
|
|
428
434
|
# Diagram language: mermaid, plantuml (C4-PlantUML) or d2.
|
|
429
435
|
diagram_format: mermaid
|
|
@@ -105,6 +105,8 @@ class PlanContext:
|
|
|
105
105
|
c4_container: Fenced C4 Container block ("" if disabled in the config).
|
|
106
106
|
class_diagram: Whether the class diagram section is enabled.
|
|
107
107
|
sequence_diagram: Whether the sequence diagram sections are enabled.
|
|
108
|
+
data_flow_diagram: Whether the data flow diagram section is enabled.
|
|
109
|
+
state_diagram: Whether the state diagram section is enabled.
|
|
108
110
|
generated_at: When the doc was generated.
|
|
109
111
|
version: KingmaDoc version that generated it.
|
|
110
112
|
project_name: Project name (config, or the root directory name).
|
|
@@ -133,6 +135,8 @@ class PlanContext:
|
|
|
133
135
|
files_expected: tuple[str, ...] = ()
|
|
134
136
|
class_diagram: bool = True
|
|
135
137
|
sequence_diagram: bool = True
|
|
138
|
+
data_flow_diagram: bool = True
|
|
139
|
+
state_diagram: bool = True
|
|
136
140
|
|
|
137
141
|
|
|
138
142
|
def build_questions(analysis: CodebaseReport, config: FeatureDocConfig) -> list[str]:
|
|
@@ -217,6 +221,8 @@ def build_plan_context(
|
|
|
217
221
|
files_expected=files_from_answers(answers, report),
|
|
218
222
|
class_diagram="class" in config.diagrams,
|
|
219
223
|
sequence_diagram="sequence" in config.diagrams,
|
|
224
|
+
data_flow_diagram="data_flow" in config.diagrams,
|
|
225
|
+
state_diagram="state" in config.diagrams,
|
|
220
226
|
)
|
|
221
227
|
|
|
222
228
|
|