elspais 0.11.2__tar.gz → 0.43.5__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.
- {elspais-0.11.2 → elspais-0.43.5}/.gitignore +6 -0
- elspais-0.43.5/CHANGELOG.md +359 -0
- {elspais-0.11.2 → elspais-0.43.5}/PKG-INFO +7 -4
- {elspais-0.11.2 → elspais-0.43.5}/README.md +3 -3
- elspais-0.43.5/docs/GAPS-requirement-verification.md +148 -0
- elspais-0.43.5/docs/NEW_SPECS.md +123 -0
- elspais-0.43.5/docs/cli/assertions.md +67 -0
- elspais-0.43.5/docs/cli/commands.md +304 -0
- elspais-0.43.5/docs/cli/config.md +262 -0
- elspais-0.43.5/docs/cli/format.md +66 -0
- elspais-0.43.5/docs/cli/git.md +45 -0
- elspais-0.43.5/docs/cli/health.md +190 -0
- elspais-0.43.5/docs/cli/hierarchy.md +60 -0
- elspais-0.43.5/docs/cli/ignore.md +72 -0
- elspais-0.43.5/docs/cli/mcp.md +245 -0
- elspais-0.43.5/docs/cli/quickstart.md +58 -0
- elspais-0.43.5/docs/cli/traceability.md +89 -0
- elspais-0.43.5/docs/cli/validation.md +96 -0
- {elspais-0.11.2 → elspais-0.43.5}/docs/commands.md +39 -163
- {elspais-0.11.2 → elspais-0.43.5}/docs/configuration.md +40 -3
- elspais-0.43.5/docs/design_decisions.md +305 -0
- elspais-0.43.5/docs/mcp.md +487 -0
- {elspais-0.11.2 → elspais-0.43.5}/docs/multi-repo.md +4 -3
- elspais-0.43.5/docs/overview.md +115 -0
- {elspais-0.11.2 → elspais-0.43.5}/docs/patterns.md +6 -0
- elspais-0.43.5/docs/phase5-dogfooding-report.md +206 -0
- elspais-0.43.5/docs/roadmap/executive_summary_auditors.md +61 -0
- elspais-0.43.5/docs/roadmap/executive_summary_developers.md +67 -0
- elspais-0.43.5/docs/roadmap/executive_summary_sponsors.md +67 -0
- elspais-0.43.5/docs/roadmap/review_design_decisions.md +425 -0
- elspais-0.43.5/docs/roadmap/review_executive_summary_auditors.md +362 -0
- elspais-0.43.5/docs/roadmap/review_executive_summary_developers.md +272 -0
- elspais-0.43.5/docs/roadmap/review_executive_summary_sponsors.md +232 -0
- {elspais-0.11.2 → elspais-0.43.5}/docs/rules.md +56 -53
- elspais-0.43.5/docs/spec/config-schema.md +346 -0
- elspais-0.43.5/docs/spec/report-schema.md +308 -0
- {elspais-0.11.2 → elspais-0.43.5}/docs/trace-view.md +24 -18
- elspais-0.43.5/docs/traceability-report.md +40 -0
- elspais-0.43.5/docs/traceability-tree.md +182 -0
- {elspais-0.11.2 → elspais-0.43.5}/pyproject.toml +9 -2
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/__init__.py +1 -10
- elspais-0.11.2/src/elspais/sponsors/__init__.py → elspais-0.43.5/src/elspais/associates.py +102 -56
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/cli.py +366 -69
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/commands/__init__.py +9 -3
- elspais-0.43.5/src/elspais/commands/analyze.py +166 -0
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/commands/changed.py +12 -23
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/commands/config_cmd.py +10 -13
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/commands/edit.py +33 -13
- elspais-0.43.5/src/elspais/commands/example_cmd.py +319 -0
- elspais-0.43.5/src/elspais/commands/hash_cmd.py +204 -0
- elspais-0.43.5/src/elspais/commands/health.py +1177 -0
- elspais-0.43.5/src/elspais/commands/index.py +150 -0
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/commands/init.py +99 -22
- elspais-0.43.5/src/elspais/commands/reformat_cmd.py +55 -0
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/commands/rules_cmd.py +2 -2
- elspais-0.43.5/src/elspais/commands/trace.py +485 -0
- elspais-0.43.5/src/elspais/commands/validate.py +231 -0
- elspais-0.43.5/src/elspais/config/__init__.py +807 -0
- {elspais-0.11.2/src/elspais/core → elspais-0.43.5/src/elspais}/content_rules.py +20 -2
- elspais-0.43.5/src/elspais/graph/GraphNode.py +383 -0
- elspais-0.43.5/src/elspais/graph/__init__.py +40 -0
- elspais-0.43.5/src/elspais/graph/annotators.py +927 -0
- elspais-0.43.5/src/elspais/graph/builder.py +1886 -0
- elspais-0.43.5/src/elspais/graph/deserializer.py +248 -0
- elspais-0.43.5/src/elspais/graph/factory.py +284 -0
- elspais-0.43.5/src/elspais/graph/metrics.py +127 -0
- elspais-0.43.5/src/elspais/graph/mutations.py +161 -0
- elspais-0.43.5/src/elspais/graph/parsers/__init__.py +156 -0
- elspais-0.43.5/src/elspais/graph/parsers/code.py +213 -0
- elspais-0.43.5/src/elspais/graph/parsers/comments.py +112 -0
- elspais-0.43.5/src/elspais/graph/parsers/config_helpers.py +29 -0
- elspais-0.43.5/src/elspais/graph/parsers/heredocs.py +225 -0
- elspais-0.43.5/src/elspais/graph/parsers/journey.py +131 -0
- elspais-0.43.5/src/elspais/graph/parsers/remainder.py +79 -0
- elspais-0.43.5/src/elspais/graph/parsers/requirement.py +347 -0
- elspais-0.43.5/src/elspais/graph/parsers/results/__init__.py +6 -0
- elspais-0.43.5/src/elspais/graph/parsers/results/junit_xml.py +229 -0
- elspais-0.43.5/src/elspais/graph/parsers/results/pytest_json.py +313 -0
- elspais-0.43.5/src/elspais/graph/parsers/test.py +305 -0
- elspais-0.43.5/src/elspais/graph/relations.py +78 -0
- elspais-0.43.5/src/elspais/graph/serialize.py +216 -0
- elspais-0.43.5/src/elspais/html/__init__.py +8 -0
- elspais-0.43.5/src/elspais/html/generator.py +731 -0
- elspais-0.43.5/src/elspais/html/templates/trace_view.html.j2 +2151 -0
- elspais-0.43.5/src/elspais/mcp/__init__.py +60 -0
- elspais-0.43.5/src/elspais/mcp/__main__.py +10 -0
- elspais-0.43.5/src/elspais/mcp/file_mutations.py +138 -0
- elspais-0.43.5/src/elspais/mcp/server.py +2108 -0
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/testing/__init__.py +3 -3
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/testing/config.py +3 -0
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/testing/mapper.py +1 -1
- elspais-0.43.5/src/elspais/testing/scanner.py +495 -0
- elspais-0.43.5/src/elspais/utilities/__init__.py +1 -0
- elspais-0.43.5/src/elspais/utilities/docs_loader.py +115 -0
- elspais-0.43.5/src/elspais/utilities/git.py +607 -0
- {elspais-0.11.2/src/elspais/core → elspais-0.43.5/src/elspais/utilities}/hasher.py +8 -22
- elspais-0.43.5/src/elspais/utilities/md_renderer.py +189 -0
- {elspais-0.11.2/src/elspais/core → elspais-0.43.5/src/elspais/utilities}/patterns.py +56 -51
- elspais-0.43.5/src/elspais/utilities/reference_config.py +626 -0
- elspais-0.43.5/src/elspais/validation/__init__.py +19 -0
- elspais-0.43.5/src/elspais/validation/format.py +264 -0
- elspais-0.43.5/tests/__init__.py +0 -0
- elspais-0.43.5/tests/commands/__init__.py +1 -0
- elspais-0.43.5/tests/commands/test_hash_update.py +556 -0
- elspais-0.43.5/tests/commands/test_validate_fix.py +301 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/conftest.py +2 -3
- elspais-0.43.5/tests/core/__init__.py +0 -0
- elspais-0.43.5/tests/core/conftest.py +118 -0
- elspais-0.43.5/tests/core/graph_test_helpers.py +455 -0
- elspais-0.43.5/tests/core/test_annotators.py +481 -0
- elspais-0.43.5/tests/core/test_assertion_mutations.py +604 -0
- elspais-0.43.5/tests/core/test_builder.py +467 -0
- elspais-0.43.5/tests/core/test_config.py +139 -0
- elspais-0.43.5/tests/core/test_coverage_metrics.py +568 -0
- elspais-0.43.5/tests/core/test_deserializer/conftest.py +63 -0
- elspais-0.43.5/tests/core/test_deserializer/test_domain_base.py +34 -0
- elspais-0.43.5/tests/core/test_deserializer/test_domain_file.py +154 -0
- elspais-0.43.5/tests/core/test_detection.py +256 -0
- elspais-0.43.5/tests/core/test_edge_mutations.py +586 -0
- elspais-0.43.5/tests/core/test_git.py +317 -0
- elspais-0.43.5/tests/core/test_graph_node.py +307 -0
- elspais-0.43.5/tests/core/test_hasher.py +112 -0
- elspais-0.43.5/tests/core/test_html/__init__.py +0 -0
- elspais-0.43.5/tests/core/test_html/test_generator.py +358 -0
- elspais-0.43.5/tests/core/test_integration/conftest.py +122 -0
- elspais-0.43.5/tests/core/test_integration/test_pipeline.py +163 -0
- elspais-0.43.5/tests/core/test_integration/test_real_world.py +151 -0
- elspais-0.43.5/tests/core/test_mutation_hash_consistency.py +366 -0
- elspais-0.43.5/tests/core/test_mutations.py +371 -0
- elspais-0.43.5/tests/core/test_node_mutations.py +526 -0
- elspais-0.43.5/tests/core/test_parsers/conftest.py +54 -0
- elspais-0.43.5/tests/core/test_parsers/test_code_parser.py +686 -0
- elspais-0.43.5/tests/core/test_parsers/test_comments_parser.py +130 -0
- elspais-0.43.5/tests/core/test_parsers/test_heredocs_parser.py +192 -0
- elspais-0.43.5/tests/core/test_parsers/test_journey_parser.py +52 -0
- elspais-0.43.5/tests/core/test_parsers/test_junit_xml_parser.py +314 -0
- elspais-0.43.5/tests/core/test_parsers/test_mdparser_base.py +192 -0
- elspais-0.43.5/tests/core/test_parsers/test_pytest_json_parser.py +430 -0
- elspais-0.43.5/tests/core/test_parsers/test_remainder_parser.py +102 -0
- elspais-0.43.5/tests/core/test_parsers/test_requirement_parser.py +215 -0
- elspais-0.43.5/tests/core/test_parsers/test_test_parser.py +206 -0
- elspais-0.43.5/tests/core/test_patterns.py +193 -0
- elspais-0.43.5/tests/core/test_reference_config.py +554 -0
- elspais-0.43.5/tests/core/test_relations.py +202 -0
- elspais-0.43.5/tests/core/test_serialize.py +277 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/hht-like/.elspais.toml +0 -1
- elspais-0.43.5/tests/fixtures/hht-like/traceability.md +29 -0
- elspais-0.43.5/tests/fixtures/hht-like/traceability_tree.html +80 -0
- elspais-0.43.5/tests/fixtures/hht-like/traceability_tree.md +30 -0
- elspais-0.43.5/tests/graph/test_clone.py +124 -0
- elspais-0.43.5/tests/graph/test_keyword_extraction.py +373 -0
- elspais-0.43.5/tests/graph/test_keyword_extraction_generalized.py +287 -0
- elspais-0.43.5/tests/mcp/__init__.py +1 -0
- elspais-0.43.5/tests/mcp/test_file_mutations.py +456 -0
- elspais-0.43.5/tests/mcp/test_mcp_core.py +599 -0
- elspais-0.43.5/tests/mcp/test_mcp_coverage.py +315 -0
- elspais-0.43.5/tests/mcp/test_mcp_keywords.py +220 -0
- elspais-0.43.5/tests/mcp/test_mcp_mutations.py +721 -0
- elspais-0.43.5/tests/test_doc_sync.py +237 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/test_edit.py +84 -44
- elspais-0.43.5/tests/test_example_cmd.py +292 -0
- elspais-0.43.5/tests/test_health.py +366 -0
- elspais-0.43.5/tests/test_init.py +348 -0
- elspais-0.43.5/tests/test_trace_command.py +638 -0
- elspais-0.11.2/CHANGELOG.md +0 -198
- elspais-0.11.2/docs/roadmap/llm-reformatting-integration.md +0 -113
- elspais-0.11.2/docs/roadmap/new-format.md +0 -193
- elspais-0.11.2/docs/roadmap/plantuml-diagram-support.md +0 -90
- elspais-0.11.2/docs/roadmap/requirements-format-enhancements.md +0 -160
- elspais-0.11.2/src/elspais/commands/analyze.py +0 -217
- elspais-0.11.2/src/elspais/commands/hash_cmd.py +0 -226
- elspais-0.11.2/src/elspais/commands/index.py +0 -167
- elspais-0.11.2/src/elspais/commands/reformat_cmd.py +0 -447
- elspais-0.11.2/src/elspais/commands/trace.py +0 -366
- elspais-0.11.2/src/elspais/commands/validate.py +0 -449
- elspais-0.11.2/src/elspais/config/__init__.py +0 -13
- elspais-0.11.2/src/elspais/config/defaults.py +0 -179
- elspais-0.11.2/src/elspais/config/loader.py +0 -494
- elspais-0.11.2/src/elspais/core/__init__.py +0 -21
- elspais-0.11.2/src/elspais/core/git.py +0 -346
- elspais-0.11.2/src/elspais/core/models.py +0 -320
- elspais-0.11.2/src/elspais/core/parser.py +0 -639
- elspais-0.11.2/src/elspais/core/rules.py +0 -509
- elspais-0.11.2/src/elspais/mcp/__init__.py +0 -44
- elspais-0.11.2/src/elspais/mcp/__main__.py +0 -6
- elspais-0.11.2/src/elspais/mcp/context.py +0 -172
- elspais-0.11.2/src/elspais/mcp/serializers.py +0 -112
- elspais-0.11.2/src/elspais/mcp/server.py +0 -354
- elspais-0.11.2/src/elspais/reformat/__init__.py +0 -50
- elspais-0.11.2/src/elspais/reformat/detector.py +0 -112
- elspais-0.11.2/src/elspais/reformat/hierarchy.py +0 -247
- elspais-0.11.2/src/elspais/reformat/line_breaks.py +0 -218
- elspais-0.11.2/src/elspais/reformat/prompts.py +0 -133
- elspais-0.11.2/src/elspais/reformat/transformer.py +0 -266
- elspais-0.11.2/src/elspais/testing/scanner.py +0 -206
- elspais-0.11.2/src/elspais/trace_view/__init__.py +0 -55
- elspais-0.11.2/src/elspais/trace_view/coverage.py +0 -183
- elspais-0.11.2/src/elspais/trace_view/generators/__init__.py +0 -12
- elspais-0.11.2/src/elspais/trace_view/generators/base.py +0 -334
- elspais-0.11.2/src/elspais/trace_view/generators/csv.py +0 -118
- elspais-0.11.2/src/elspais/trace_view/generators/markdown.py +0 -170
- elspais-0.11.2/src/elspais/trace_view/html/__init__.py +0 -33
- elspais-0.11.2/src/elspais/trace_view/html/generator.py +0 -1140
- elspais-0.11.2/src/elspais/trace_view/html/templates/base.html +0 -283
- elspais-0.11.2/src/elspais/trace_view/html/templates/components/code_viewer_modal.html +0 -14
- elspais-0.11.2/src/elspais/trace_view/html/templates/components/file_picker_modal.html +0 -20
- elspais-0.11.2/src/elspais/trace_view/html/templates/components/legend_modal.html +0 -69
- elspais-0.11.2/src/elspais/trace_view/html/templates/components/review_panel.html +0 -118
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/help/help-panel.json +0 -244
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/help/onboarding.json +0 -77
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/help/tooltips.json +0 -237
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-comments.js +0 -928
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-data.js +0 -961
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-help.js +0 -679
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-init.js +0 -177
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-line-numbers.js +0 -429
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-packages.js +0 -1029
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-position.js +0 -540
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-resize.js +0 -115
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-status.js +0 -659
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review/review-sync.js +0 -992
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/review-styles.css +0 -2238
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/scripts.js +0 -1741
- elspais-0.11.2/src/elspais/trace_view/html/templates/partials/styles.css +0 -1756
- elspais-0.11.2/src/elspais/trace_view/models.py +0 -378
- elspais-0.11.2/src/elspais/trace_view/review/__init__.py +0 -63
- elspais-0.11.2/src/elspais/trace_view/review/branches.py +0 -1142
- elspais-0.11.2/src/elspais/trace_view/review/models.py +0 -1200
- elspais-0.11.2/src/elspais/trace_view/review/position.py +0 -591
- elspais-0.11.2/src/elspais/trace_view/review/server.py +0 -1032
- elspais-0.11.2/src/elspais/trace_view/review/status.py +0 -455
- elspais-0.11.2/src/elspais/trace_view/review/storage.py +0 -1343
- elspais-0.11.2/src/elspais/trace_view/scanning.py +0 -213
- elspais-0.11.2/src/elspais/trace_view/specs/README.md +0 -84
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00001-template-architecture.md +0 -36
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00002-css-extraction.md +0 -37
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00003-js-extraction.md +0 -43
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00004-build-embedding.md +0 -40
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00005-test-format.md +0 -78
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00010-review-data-models.md +0 -33
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00011-review-storage.md +0 -33
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00012-position-resolution.md +0 -33
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00013-git-branches.md +0 -31
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00014-review-api-server.md +0 -31
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00015-status-modifier.md +0 -27
- elspais-0.11.2/src/elspais/trace_view/specs/tv-d00016-js-integration.md +0 -33
- elspais-0.11.2/src/elspais/trace_view/specs/tv-p00001-html-generator.md +0 -33
- elspais-0.11.2/src/elspais/trace_view/specs/tv-p00002-review-system.md +0 -29
- elspais-0.11.2/tests/mcp/__init__.py +0 -1
- elspais-0.11.2/tests/mcp/test_context.py +0 -118
- elspais-0.11.2/tests/mcp/test_serializers.py +0 -141
- elspais-0.11.2/tests/test_config.py +0 -756
- elspais-0.11.2/tests/test_content_rules.py +0 -312
- elspais-0.11.2/tests/test_doc_sync.py +0 -203
- elspais-0.11.2/tests/test_git.py +0 -292
- elspais-0.11.2/tests/test_hash_bugs.py +0 -549
- elspais-0.11.2/tests/test_hasher.py +0 -265
- elspais-0.11.2/tests/test_models.py +0 -206
- elspais-0.11.2/tests/test_parser.py +0 -1005
- elspais-0.11.2/tests/test_parser_resilience.py +0 -606
- elspais-0.11.2/tests/test_patterns.py +0 -192
- elspais-0.11.2/tests/test_rules.py +0 -253
- elspais-0.11.2/tests/test_sponsors.py +0 -491
- elspais-0.11.2/tests/test_trace_view/__init__.py +0 -1
- elspais-0.11.2/tests/test_trace_view/test_integration.py +0 -225
- elspais-0.11.2/tests/test_validate_json.py +0 -373
- elspais-0.11.2/tests/testing/__init__.py +0 -1
- elspais-0.11.2/tests/testing/fixtures/junit_results.xml +0 -18
- elspais-0.11.2/tests/testing/fixtures/pytest_results.json +0 -34
- elspais-0.11.2/tests/testing/fixtures/sample_test.py +0 -38
- elspais-0.11.2/tests/testing/test_config.py +0 -64
- elspais-0.11.2/tests/testing/test_mapper.py +0 -118
- elspais-0.11.2/tests/testing/test_result_parser.py +0 -137
- elspais-0.11.2/tests/testing/test_scanner.py +0 -114
- {elspais-0.11.2 → elspais-0.43.5}/LICENSE +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/__main__.py +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/src/elspais/testing/result_parser.py +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/assertions/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/assertions/spec/dev-impl.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/assertions/spec/prd-sample.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/associated-repo/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/associated-repo/spec/dev-sponsor.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/associated-repo/spec/prd-sponsor.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/fda-style/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/fda-style/spec/dev-impl.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/fda-style/spec/prd-core.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/hht-like/database/schema.sql +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/hht-like/spec/INDEX.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/hht-like/spec/dev-impl.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/hht-like/spec/ops-deploy.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/hht-like/spec/prd-core.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/invalid/broken-links/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/invalid/broken-links/spec/broken.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/invalid/circular-deps/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/invalid/circular-deps/spec/circular.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/invalid/missing-hash/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/invalid/missing-hash/spec/missing.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/jira-style/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/jira-style/requirements/features.md +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/named-reqs/.elspais.toml +0 -0
- {elspais-0.11.2 → elspais-0.43.5}/tests/fixtures/named-reqs/spec/features.md +0 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to elspais will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.43.5] - 2026-01-29
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
- **Generalized keyword search API for all node kinds** (`graph/annotators.py`):
|
|
10
|
+
- `annotate_keywords()` now annotates ALL node kinds with text content:
|
|
11
|
+
- REQUIREMENT: title + child assertion text
|
|
12
|
+
- ASSERTION: SHALL statement (label)
|
|
13
|
+
- USER_JOURNEY: title + actor + goal + description
|
|
14
|
+
- REMAINDER: label + raw_text
|
|
15
|
+
- CODE, TEST, TEST_RESULT: label only
|
|
16
|
+
- `find_by_keywords()` accepts optional `kind: NodeKind | None` parameter
|
|
17
|
+
- `kind=None` (default) searches all nodes
|
|
18
|
+
- `kind=NodeKind.ASSERTION` searches only assertions
|
|
19
|
+
- `collect_all_keywords()` accepts optional `kind` parameter similarly
|
|
20
|
+
- 12 new tests in `tests/graph/test_keyword_extraction_generalized.py`
|
|
21
|
+
|
|
22
|
+
- **MCP server refactored to use public graph API**:
|
|
23
|
+
- `_find_assertions_by_keywords()` now uses `find_by_keywords(..., kind=NodeKind.ASSERTION)`
|
|
24
|
+
- `_get_uncovered_assertions()` uses `nodes_by_kind(NodeKind.ASSERTION)`
|
|
25
|
+
- Removed direct `_index.values()` access (encapsulation violation)
|
|
26
|
+
|
|
27
|
+
## [0.43.4] - 2026-01-29
|
|
28
|
+
|
|
29
|
+
### Changed
|
|
30
|
+
|
|
31
|
+
- **TestParser, JUnitXMLParser, PytestJSONParser refactored** to use shared reference config:
|
|
32
|
+
- All three parsers now accept optional `PatternConfig` and `ReferenceResolver`
|
|
33
|
+
- Removed hardcoded regex patterns from all parsers
|
|
34
|
+
- TestParser: Custom comment pattern for `# Tests REQ-xxx` syntax (no colon)
|
|
35
|
+
- Result parsers: Use `extract_ids_from_text()` from reference_config.py
|
|
36
|
+
- Backward compatible - all work without explicit config
|
|
37
|
+
|
|
38
|
+
### Fixed
|
|
39
|
+
|
|
40
|
+
- **Assertion matching negative lookahead**: Added `(?![a-z])` in `build_id_pattern()` to prevent
|
|
41
|
+
matching lowercase letters as assertion suffixes (e.g., `test_REQ_p00001_login` no longer
|
|
42
|
+
captures "l" as an assertion)
|
|
43
|
+
|
|
44
|
+
## [0.43.3] - 2026-01-29
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
|
|
48
|
+
- **CodeParser refactored to use shared reference config** (`graph/parsers/code.py`):
|
|
49
|
+
- Now accepts optional `PatternConfig` and `ReferenceResolver` in constructor
|
|
50
|
+
- Patterns built dynamically per-file using `reference_config.py` infrastructure
|
|
51
|
+
- Removed hardcoded class-level regex patterns (`IMPLEMENTS_PATTERN`, `VALIDATES_PATTERN`, etc.)
|
|
52
|
+
- Preserves full multi-line block parsing capability
|
|
53
|
+
- Backward compatible - works without config (uses defaults)
|
|
54
|
+
- 20 new tests covering custom configs, separators, case sensitivity, and block styles
|
|
55
|
+
|
|
56
|
+
## [0.43.2] - 2026-01-29
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **Reference Pattern Builder Module** (`utilities/reference_config.py`): New module for unified pattern building
|
|
61
|
+
- `ReferenceConfig` dataclass: Configuration for reference pattern matching (separators, case sensitivity, etc.)
|
|
62
|
+
- `ReferenceOverride` dataclass: File-type/directory-based override rules with glob matching
|
|
63
|
+
- `ReferenceResolver` class: Single entry point for parsers to get merged configuration
|
|
64
|
+
- Pattern builder functions:
|
|
65
|
+
- `build_id_pattern()`: Build regex for requirement IDs with configurable separators
|
|
66
|
+
- `build_comment_pattern()`: Build regex for `# Implements:` style comments
|
|
67
|
+
- `build_block_header_pattern()`: Build regex for multi-line block headers
|
|
68
|
+
- `build_block_ref_pattern()`: Build regex for block reference lines
|
|
69
|
+
- `extract_ids_from_text()`: Extract all requirement IDs from text
|
|
70
|
+
- `normalize_extracted_id()`: Normalize IDs to canonical format
|
|
71
|
+
- 40 comprehensive unit tests in `tests/core/test_reference_config.py`
|
|
72
|
+
|
|
73
|
+
## [0.43.1] - 2026-01-29
|
|
74
|
+
|
|
75
|
+
### Added
|
|
76
|
+
|
|
77
|
+
- **Unified `[references]` configuration**: New config section for configurable reference parsing
|
|
78
|
+
- `references.defaults.separators`: Separator characters for requirement IDs (default: `["-", "_"]`)
|
|
79
|
+
- `references.defaults.case_sensitive`: Case sensitivity for matching (default: `false`)
|
|
80
|
+
- `references.defaults.prefix_optional`: Whether REQ prefix is required (default: `false`)
|
|
81
|
+
- `references.defaults.comment_styles`: Recognized comment markers (default: `["#", "//", "--"]`)
|
|
82
|
+
- `references.defaults.keywords`: Keywords for implements/validates/refines references
|
|
83
|
+
- `references.overrides`: File-type specific override patterns (empty by default)
|
|
84
|
+
|
|
85
|
+
## [0.43.0] - 2026-01-29
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
|
|
89
|
+
- **TestParser regex bug**: Fixed assertion-level test references not being captured.
|
|
90
|
+
- Tests named `test_REQ_d00060_A_description` now correctly validate assertion `REQ-d00060-A`
|
|
91
|
+
- Supports multi-assertion syntax: `test_REQ_d00060_A_B_description` → validates `REQ-d00060-A-B`
|
|
92
|
+
- Coverage percentage now correctly reflects assertion-level test coverage
|
|
93
|
+
|
|
94
|
+
### Added
|
|
95
|
+
|
|
96
|
+
- New tests for assertion-level reference parsing in `test_test_parser.py`
|
|
97
|
+
- Created `docs/NEW_SPECS.md` for tracking proposed requirements during coverage analysis
|
|
98
|
+
|
|
99
|
+
## [0.42.0] - 2026-01-29
|
|
100
|
+
|
|
101
|
+
### Added
|
|
102
|
+
|
|
103
|
+
- **MCP Test Coverage Tools (Phase 6)**: New tools for analyzing test-requirement relationships:
|
|
104
|
+
- `get_test_coverage(req_id)` - Returns TEST nodes that reference a requirement:
|
|
105
|
+
- Lists test_nodes with their file and name
|
|
106
|
+
- Lists result_nodes with pass/fail status
|
|
107
|
+
- Identifies covered and uncovered assertions
|
|
108
|
+
- Calculates coverage percentage
|
|
109
|
+
- `get_uncovered_assertions(req_id=None)` - Finds assertions lacking test coverage:
|
|
110
|
+
- When req_id is None, scans all requirements
|
|
111
|
+
- Returns assertion id, text, label, and parent requirement context
|
|
112
|
+
- Results sorted by parent requirement ID
|
|
113
|
+
- `find_assertions_by_keywords(keywords, match_all=True)` - Searches assertion text:
|
|
114
|
+
- Complements `find_by_keywords()` which searches requirement titles
|
|
115
|
+
- Supports AND (match_all=True) and OR (match_all=False) logic
|
|
116
|
+
- Case-insensitive matching
|
|
117
|
+
|
|
118
|
+
### Specification
|
|
119
|
+
|
|
120
|
+
- Added requirements to `spec/08-mcp-server.md`:
|
|
121
|
+
- REQ-o00064: MCP Test Coverage Analysis Tools (OPS level)
|
|
122
|
+
- REQ-d00066: Test Coverage Tool Implementation
|
|
123
|
+
- REQ-d00067: Uncovered Assertions Tool Implementation
|
|
124
|
+
- REQ-d00068: Assertion Keyword Search Tool Implementation
|
|
125
|
+
|
|
126
|
+
### Technical
|
|
127
|
+
|
|
128
|
+
- 14 new tests in `tests/mcp/test_mcp_coverage.py` with REQ-assertion naming pattern
|
|
129
|
+
- All coverage tools use iterator-only graph API per REQ-p00050-B
|
|
130
|
+
|
|
131
|
+
## [0.41.0] - 2026-01-29
|
|
132
|
+
|
|
133
|
+
### Added
|
|
134
|
+
|
|
135
|
+
- **MCP Dogfooding (Phase 5)**: Validated MCP server utility by improving test traceability:
|
|
136
|
+
- Added 5 new tests with REQ-assertion naming pattern (e.g., `test_REQ_d00050_E_idempotent`)
|
|
137
|
+
- Tests for REQ-d00050-E (annotator idempotency) and REQ-d00051-F (no duplicate iteration)
|
|
138
|
+
- TEST nodes now automatically link to requirements via name pattern matching
|
|
139
|
+
|
|
140
|
+
### Documentation
|
|
141
|
+
|
|
142
|
+
- `docs/phase5-dogfooding-report.md`: Comprehensive dogfooding analysis with:
|
|
143
|
+
- Test-requirement mapping table for `tests/core/test_annotators.py`
|
|
144
|
+
- MCP tool ergonomic issues and suggested improvements
|
|
145
|
+
- Before/after traceability metrics verification
|
|
146
|
+
|
|
147
|
+
### Technical
|
|
148
|
+
|
|
149
|
+
- Graph node count increased from 346 to 398 after test improvements
|
|
150
|
+
- TEST nodes: 36 → 75, TEST_RESULT nodes: 17 → 30
|
|
151
|
+
|
|
152
|
+
## [0.40.0] - 2026-01-29
|
|
153
|
+
|
|
154
|
+
### Added
|
|
155
|
+
|
|
156
|
+
- **Keyword Extraction & Search (Phase 4)**: Automatic keyword extraction and search for requirements:
|
|
157
|
+
- `extract_keywords(text)` - Extract meaningful keywords from text, filtering stopwords
|
|
158
|
+
- `annotate_keywords(graph)` - Annotate all requirements with keywords from title and assertions
|
|
159
|
+
- `find_by_keywords(graph, keywords)` - Find requirements matching keywords (AND/OR logic)
|
|
160
|
+
- `collect_all_keywords(graph)` - Get all unique keywords in the graph
|
|
161
|
+
- Keywords stored in `node.get_field("keywords")` as list of lowercase strings
|
|
162
|
+
|
|
163
|
+
- **MCP Keyword Search Tools**: New MCP tools for keyword-based requirement discovery:
|
|
164
|
+
- `find_by_keywords(keywords, match_all)` - Search by keywords with AND/OR matching
|
|
165
|
+
- `get_all_keywords()` - List all available keywords for discovery
|
|
166
|
+
- Enhanced `search()` to support `field="keywords"` for keyword searches
|
|
167
|
+
|
|
168
|
+
### Technical
|
|
169
|
+
|
|
170
|
+
- 29 new keyword tests (19 annotator + 10 MCP)
|
|
171
|
+
- STOPWORDS constant with 100+ common words filtered from keywords
|
|
172
|
+
|
|
173
|
+
## [0.39.0] - 2026-01-29
|
|
174
|
+
|
|
175
|
+
### Added
|
|
176
|
+
|
|
177
|
+
- **MCP File Mutation Tools (Phase 3.1)**: File-based mutation API for AI agents to modify spec files on disk:
|
|
178
|
+
- `change_reference_type(req_id, target_id, new_type, save_branch)` - Change Implements/Refines relationships
|
|
179
|
+
- `move_requirement(req_id, target_file, save_branch)` - Relocate requirements between spec files
|
|
180
|
+
- `restore_from_safety_branch(branch_name)` - Revert file changes from safety branch
|
|
181
|
+
- `list_safety_branches()` - List available safety branches for rollback
|
|
182
|
+
- Auto-refresh graph after file mutations (REQ-o00063-F)
|
|
183
|
+
- Optional `save_branch=True` creates timestamped safety branch before modification
|
|
184
|
+
|
|
185
|
+
- **Git Safety Branch Utilities**: New utilities in `utilities/git.py` for file mutation safety:
|
|
186
|
+
- `create_safety_branch(repo_root, req_id)` - Create timestamped safety branch
|
|
187
|
+
- `list_safety_branches(repo_root)` - List all `safety/*` branches
|
|
188
|
+
- `get_current_branch(repo_root)` - Get current branch name
|
|
189
|
+
- `restore_from_safety_branch(repo_root, branch_name)` - Restore spec/ from branch
|
|
190
|
+
- `delete_safety_branch(repo_root, branch_name)` - Remove safety branch
|
|
191
|
+
|
|
192
|
+
### Technical
|
|
193
|
+
|
|
194
|
+
- Implements REQ-o00063: MCP File Mutation Tools (4 new tools)
|
|
195
|
+
- 14 new file mutation tests, 82 total MCP tests
|
|
196
|
+
|
|
197
|
+
## [0.38.0] - 2026-01-28
|
|
198
|
+
|
|
199
|
+
### Added
|
|
200
|
+
|
|
201
|
+
- **MCP Graph Mutation Tools (Phase 3.2)**: Complete in-memory graph mutation API for AI agents:
|
|
202
|
+
- **Node mutations**: `mutate_rename_node()`, `mutate_update_title()`, `mutate_change_status()`, `mutate_add_requirement()`, `mutate_delete_requirement()`
|
|
203
|
+
- **Assertion mutations**: `mutate_add_assertion()`, `mutate_update_assertion()`, `mutate_delete_assertion()`, `mutate_rename_assertion()`
|
|
204
|
+
- **Edge mutations**: `mutate_add_edge()`, `mutate_change_edge_kind()`, `mutate_delete_edge()`, `mutate_fix_broken_reference()`
|
|
205
|
+
- **Undo operations**: `undo_last_mutation()`, `undo_to_mutation()`, `get_mutation_log()`
|
|
206
|
+
- **Inspection tools**: `get_orphaned_nodes()`, `get_broken_references()`
|
|
207
|
+
- All destructive operations require `confirm=True` for safety (REQ-o00062-F)
|
|
208
|
+
- All mutations return `MutationEntry` for audit trail (REQ-o00062-E)
|
|
209
|
+
- Pure delegation pattern - MCP layer only validates params and calls TraceGraph methods (REQ-d00065)
|
|
210
|
+
|
|
211
|
+
### Technical
|
|
212
|
+
|
|
213
|
+
- Implements REQ-o00062: MCP Graph Mutation Tools (17 new tools)
|
|
214
|
+
- Implements REQ-d00065: Mutation Tool Delegation pattern
|
|
215
|
+
- 39 new mutation tests, 68 total MCP tests
|
|
216
|
+
|
|
217
|
+
## [0.37.0] - 2026-01-28
|
|
218
|
+
|
|
219
|
+
### Added
|
|
220
|
+
|
|
221
|
+
- **MCP Server Documentation (Phase 2.2)**: Comprehensive documentation for AI agents and users:
|
|
222
|
+
- `docs/cli/mcp.md` - User-facing documentation for the MCP server with all tool descriptions
|
|
223
|
+
- MCP server `instructions` parameter for AI agents with quick start guide and usage patterns
|
|
224
|
+
- New `elspais docs mcp` command to view MCP documentation from CLI
|
|
225
|
+
- Updated docs topic list to include mcp topic (11 topics total)
|
|
226
|
+
|
|
227
|
+
### Technical
|
|
228
|
+
|
|
229
|
+
- 4 new documentation tests (64 total doc sync tests, 93 total MCP + doc tests)
|
|
230
|
+
|
|
231
|
+
## [0.36.0] - 2026-01-28
|
|
232
|
+
|
|
233
|
+
### Added
|
|
234
|
+
|
|
235
|
+
- **MCP Workspace Context Tools (Phase 2.1)**: New tools for workspace and project information:
|
|
236
|
+
- `get_workspace_info()` - Returns repo path, project name, and configuration summary
|
|
237
|
+
- `get_project_summary()` - Returns requirement counts by level, coverage statistics, and change metrics
|
|
238
|
+
- Uses `count_by_level()` from annotators module per REQ-o00061-C
|
|
239
|
+
- Reads config from unified config system per REQ-o00061-D
|
|
240
|
+
- 10 new tests for workspace tools (29 total MCP tests)
|
|
241
|
+
|
|
242
|
+
### Technical
|
|
243
|
+
|
|
244
|
+
- Implements REQ-o00061: MCP Workspace Context Tools
|
|
245
|
+
|
|
246
|
+
## [0.35.0] - 2026-01-28
|
|
247
|
+
|
|
248
|
+
### Added
|
|
249
|
+
|
|
250
|
+
- **MCP Server Core Tools (Phase 1)**: Minimal MCP server implementation with graph-as-single-source-of-truth:
|
|
251
|
+
- `get_graph_status()` - Node counts, root count, detection flags
|
|
252
|
+
- `refresh_graph(full)` - Force graph rebuild from spec files
|
|
253
|
+
- `search(query, field, regex)` - Search requirements by ID, title, or content
|
|
254
|
+
- `get_requirement(req_id)` - Full requirement details with assertions
|
|
255
|
+
- `get_hierarchy(req_id)` - Ancestors and children navigation
|
|
256
|
+
- All tools consume TraceGraph directly via iterator-only API (REQ-p00060-B)
|
|
257
|
+
- Serializers read from `node.get_field()` and `node.get_label()`
|
|
258
|
+
- 19 tests verifying proper graph API usage
|
|
259
|
+
|
|
260
|
+
### Technical
|
|
261
|
+
|
|
262
|
+
- Implements REQ-o00060: MCP Core Query Tools
|
|
263
|
+
- Implements REQ-d00060-65: Tool implementations and serializers
|
|
264
|
+
|
|
265
|
+
## [0.34.1] - 2026-01-28
|
|
266
|
+
|
|
267
|
+
### Added
|
|
268
|
+
|
|
269
|
+
- **MCP Server Specification**: Created `spec/08-mcp-server.md` defining the MCP server architecture:
|
|
270
|
+
- PRD-level: REQ-p00060 - MCP Server for AI-Driven Requirements Management
|
|
271
|
+
- OPS-level: REQ-o00060 (Core Query), REQ-o00061 (Workspace Context), REQ-o00062 (Graph Mutations), REQ-o00063 (File Mutations)
|
|
272
|
+
- DEV-level: REQ-d00060-65 (Tool implementations, serializers, mutation delegation)
|
|
273
|
+
- **Graph-as-Source-of-Truth**: MCP spec enforces REQ-p00050-B - all tools consume TraceGraph directly without intermediate data structures
|
|
274
|
+
- **Architecture Diagram**: Spec includes diagram showing MCP server layer consuming TraceGraph via iterator and mutation APIs
|
|
275
|
+
|
|
276
|
+
## [0.31.0] - 2026-01-28
|
|
277
|
+
|
|
278
|
+
### Added
|
|
279
|
+
|
|
280
|
+
- **MCP Mutator Tools**: The MCP server now exposes TraceGraph mutation methods for AI-driven requirement management:
|
|
281
|
+
- **Node Mutations**: `mutate_rename_node()`, `mutate_update_title()`, `mutate_change_status()`, `mutate_add_requirement()`, `mutate_delete_requirement(confirm=True)`
|
|
282
|
+
- **Assertion Mutations**: `mutate_add_assertion()`, `mutate_update_assertion()`, `mutate_delete_assertion(confirm=True)`, `mutate_rename_assertion()`
|
|
283
|
+
- **Edge Mutations**: `mutate_add_edge()`, `mutate_change_edge_kind()`, `mutate_delete_edge(confirm=True)`, `mutate_fix_broken_reference()`
|
|
284
|
+
- **Undo Operations**: `undo_last_mutation()` and `undo_to_mutation(mutation_id)` for reverting graph changes
|
|
285
|
+
- **Inspection Tools**: `get_mutation_log(limit)`, `get_orphaned_nodes()`, `get_broken_references()` for graph state inspection
|
|
286
|
+
- **Safety Checks**: Destructive mutation operations (`mutate_delete_*`) require explicit `confirm=True` parameter to prevent accidental data loss
|
|
287
|
+
- **Mutation Serialization**: New `serialize_mutation_entry()` and `serialize_broken_reference()` functions in MCP serializers
|
|
288
|
+
|
|
289
|
+
## [0.30.0] - 2026-01-28
|
|
290
|
+
|
|
291
|
+
### Added
|
|
292
|
+
|
|
293
|
+
- **Edge Mutation API**: TraceGraph now supports edge (relationship) mutations:
|
|
294
|
+
- `add_edge(source_id, target_id, edge_kind, assertion_targets)` - Adds new edge, creates BrokenReference if target doesn't exist
|
|
295
|
+
- `change_edge_kind(source_id, target_id, new_kind)` - Changes edge type (IMPLEMENTS -> REFINES)
|
|
296
|
+
- `delete_edge(source_id, target_id)` - Removes edge, marks source as orphan if no other parents
|
|
297
|
+
- `fix_broken_reference(source_id, old_target_id, new_target_id)` - Redirects broken reference to new target
|
|
298
|
+
- **Orphan Management**: Edge mutations automatically update `_orphaned_ids` set when parent relationships change
|
|
299
|
+
- **Broken Reference Tracking**: `add_edge` to non-existent target creates BrokenReference; `fix_broken_reference` can redirect these
|
|
300
|
+
|
|
301
|
+
## [0.29.0] - 2026-01-28
|
|
302
|
+
|
|
303
|
+
### Added
|
|
304
|
+
|
|
305
|
+
- **Assertion Mutation API**: TraceGraph now supports assertion-specific mutations:
|
|
306
|
+
- `rename_assertion(old_id, new_label)` - Renames assertion label (e.g., A -> D), updates edges
|
|
307
|
+
- `update_assertion(assertion_id, new_text)` - Updates assertion text
|
|
308
|
+
- `add_assertion(req_id, label, text)` - Adds new assertion to requirement
|
|
309
|
+
- `delete_assertion(assertion_id, compact=True)` - Deletes assertion with optional compaction
|
|
310
|
+
- **Assertion Compaction**: When deleting middle assertion (e.g., B from [A,B,C,D]), subsequent labels shift down (C->B, D->C) and all edge references update automatically
|
|
311
|
+
- **Hash Recomputation**: All assertion mutations recompute parent requirement hash via `_recompute_requirement_hash()`
|
|
312
|
+
|
|
313
|
+
## [0.28.0] - 2026-01-28
|
|
314
|
+
|
|
315
|
+
### Added
|
|
316
|
+
|
|
317
|
+
- **Node Mutation API**: TraceGraph now supports CRUD operations with full undo:
|
|
318
|
+
- `rename_node(old_id, new_id)` - Renames node and its assertion children
|
|
319
|
+
- `update_title(node_id, new_title)` - Updates requirement title
|
|
320
|
+
- `change_status(node_id, new_status)` - Changes requirement status
|
|
321
|
+
- `add_requirement(...)` - Creates new requirement with optional parent link
|
|
322
|
+
- `delete_requirement(node_id)` - Deletes requirement, tracks in `_deleted_nodes`
|
|
323
|
+
- **Mutation Logging**: All mutations log `MutationEntry` to `graph.mutation_log` for audit
|
|
324
|
+
- **Undo Support**: `graph.undo_last()` and `graph.undo_to(mutation_id)` for reverting changes
|
|
325
|
+
- **GraphNode.set_id()**: Mutable node IDs for rename operations
|
|
326
|
+
- **GraphNode.remove_child()**: Removes child node with bidirectional link cleanup
|
|
327
|
+
|
|
328
|
+
## [0.27.0] - 2026-01-27
|
|
329
|
+
|
|
330
|
+
### Fixed
|
|
331
|
+
|
|
332
|
+
- **trace --view**: Fixed Assoc (Associated) toggle - now uses HIDE semantic consistent with PRD/OPS/DEV badges
|
|
333
|
+
- **trace --view**: Fixed Core toggle - clicking now hides core (non-associated) requirements with proper styling
|
|
334
|
+
- **trace --view**: Added tree collapse/expand state persistence via cookies - tree state now survives page refresh
|
|
335
|
+
- **trace --view**: Children implementing multiple assertions now show single row with combined badges `[A][B][C]`
|
|
336
|
+
- **trace --report**: Implemented report presets that were previously ignored
|
|
337
|
+
|
|
338
|
+
### Changed
|
|
339
|
+
|
|
340
|
+
- **CLI**: Removed 19 dead arguments that were defined but never implemented:
|
|
341
|
+
- `validate`: --fix, --core-repo, --tests, --no-tests, --mode
|
|
342
|
+
- `trace`: --port, --mode, --sponsor, --graph, --depth
|
|
343
|
+
- `reformat-with-claude`: Simplified to placeholder stub (entire command not yet implemented)
|
|
344
|
+
- **CLI**: `trace --report` now uses `choices` for tab completion - shows `{minimal,standard,full}` in help
|
|
345
|
+
- `--report minimal`: ID, Title, Status only (quick overview)
|
|
346
|
+
- `--report standard`: ID, Title, Level, Status, Implements (default)
|
|
347
|
+
- `--report full`: All fields including Body, Assertions, Hash, Code/Test refs
|
|
348
|
+
|
|
349
|
+
- **trace --view**: Version badge now shows actual elspais version (e.g., "v0.27.0") instead of hardcoded "v1"
|
|
350
|
+
|
|
351
|
+
- **trace --view**: Replaced confusing "Files" filter with "Tests" filter
|
|
352
|
+
- Shows TEST nodes in tree hierarchy (with 🧪 icon)
|
|
353
|
+
- Badge displays count of test nodes instead of file count
|
|
354
|
+
- Clicking badge shows test rows that validate requirements
|
|
355
|
+
|
|
356
|
+
## [0.26.0] - Previous
|
|
357
|
+
|
|
358
|
+
- Multiline block comment support for code/test references
|
|
359
|
+
- Various bug fixes and improvements
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: elspais
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.43.5
|
|
4
4
|
Summary: Requirements validation and traceability tools - L-Space connects all libraries
|
|
5
5
|
Project-URL: Homepage, https://github.com/anspar/elspais
|
|
6
6
|
Project-URL: Documentation, https://github.com/anspar/elspais#readme
|
|
@@ -25,12 +25,15 @@ Classifier: Topic :: Software Development :: Quality Assurance
|
|
|
25
25
|
Classifier: Typing :: Typed
|
|
26
26
|
Requires-Python: >=3.9
|
|
27
27
|
Provides-Extra: all
|
|
28
|
+
Requires-Dist: argcomplete>=3.0; extra == 'all'
|
|
28
29
|
Requires-Dist: flask-cors>=4.0; extra == 'all'
|
|
29
30
|
Requires-Dist: flask>=2.0; extra == 'all'
|
|
30
31
|
Requires-Dist: jinja2>=3.0; extra == 'all'
|
|
31
32
|
Requires-Dist: mcp>=1.0; extra == 'all'
|
|
32
33
|
Provides-Extra: binary
|
|
33
34
|
Requires-Dist: pyinstaller>=6.0; extra == 'binary'
|
|
35
|
+
Provides-Extra: completion
|
|
36
|
+
Requires-Dist: argcomplete>=3.0; extra == 'completion'
|
|
34
37
|
Provides-Extra: dev
|
|
35
38
|
Requires-Dist: black>=23.0; extra == 'dev'
|
|
36
39
|
Requires-Dist: mypy>=1.0; extra == 'dev'
|
|
@@ -97,7 +100,7 @@ FROM python:3.11-slim
|
|
|
97
100
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
98
101
|
|
|
99
102
|
# Install elspais (10-100x faster than pip)
|
|
100
|
-
RUN uv pip install --system --no-cache elspais==0.
|
|
103
|
+
RUN uv pip install --system --no-cache elspais==0.24.3
|
|
101
104
|
```
|
|
102
105
|
|
|
103
106
|
```yaml
|
|
@@ -106,7 +109,7 @@ RUN uv pip install --system --no-cache elspais==0.9.3
|
|
|
106
109
|
uses: astral-sh/setup-uv@v2
|
|
107
110
|
|
|
108
111
|
- name: Install elspais
|
|
109
|
-
run: uv pip install --system elspais==0.
|
|
112
|
+
run: uv pip install --system elspais==0.24.3
|
|
110
113
|
```
|
|
111
114
|
|
|
112
115
|
**Note:** For regulated/medical software projects, always pin the exact version for reproducibility.
|
|
@@ -424,7 +427,7 @@ For reproducible builds, pin the version in your project:
|
|
|
424
427
|
|
|
425
428
|
```bash
|
|
426
429
|
# .github/versions.env
|
|
427
|
-
ELSPAIS_VERSION=0.
|
|
430
|
+
ELSPAIS_VERSION=0.24.3
|
|
428
431
|
```
|
|
429
432
|
|
|
430
433
|
```yaml
|
|
@@ -48,7 +48,7 @@ FROM python:3.11-slim
|
|
|
48
48
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
|
49
49
|
|
|
50
50
|
# Install elspais (10-100x faster than pip)
|
|
51
|
-
RUN uv pip install --system --no-cache elspais==0.
|
|
51
|
+
RUN uv pip install --system --no-cache elspais==0.24.3
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
```yaml
|
|
@@ -57,7 +57,7 @@ RUN uv pip install --system --no-cache elspais==0.9.3
|
|
|
57
57
|
uses: astral-sh/setup-uv@v2
|
|
58
58
|
|
|
59
59
|
- name: Install elspais
|
|
60
|
-
run: uv pip install --system elspais==0.
|
|
60
|
+
run: uv pip install --system elspais==0.24.3
|
|
61
61
|
```
|
|
62
62
|
|
|
63
63
|
**Note:** For regulated/medical software projects, always pin the exact version for reproducibility.
|
|
@@ -375,7 +375,7 @@ For reproducible builds, pin the version in your project:
|
|
|
375
375
|
|
|
376
376
|
```bash
|
|
377
377
|
# .github/versions.env
|
|
378
|
-
ELSPAIS_VERSION=0.
|
|
378
|
+
ELSPAIS_VERSION=0.24.3
|
|
379
379
|
```
|
|
380
380
|
|
|
381
381
|
```yaml
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# GAPS: Requirement Verification Workflow
|
|
2
|
+
|
|
3
|
+
This document describes capabilities that are **NOT available** in elspais but are needed for a complete requirement verification workflow.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
elspais provides hash-based verification of requirement content, but lacks the higher-level workflow features needed to track which requirements need implementation re-verification after changes.
|
|
8
|
+
|
|
9
|
+
## Current elspais Capabilities
|
|
10
|
+
|
|
11
|
+
| Command | Purpose |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `elspais hash verify` | Check if hashes match current content |
|
|
14
|
+
| `elspais hash update` | Update hashes in spec files |
|
|
15
|
+
| `elspais changed` | Show git-level changes to spec files |
|
|
16
|
+
| `elspais trace` | Generate traceability matrix |
|
|
17
|
+
| `elspais analyze hierarchy` | Show requirement hierarchy |
|
|
18
|
+
|
|
19
|
+
## Missing Capabilities
|
|
20
|
+
|
|
21
|
+
### 1. Changed Requirements Detection
|
|
22
|
+
|
|
23
|
+
**Gap**: No command to compare INDEX.md hashes with current requirement content to identify which specific requirements changed.
|
|
24
|
+
|
|
25
|
+
**Current workaround**: External script `detect-changes.py` that:
|
|
26
|
+
- Reads hashes from INDEX.md
|
|
27
|
+
- Computes current hashes using `elspais hash verify`
|
|
28
|
+
- Compares and reports differences
|
|
29
|
+
|
|
30
|
+
**Proposed elspais command**:
|
|
31
|
+
```bash
|
|
32
|
+
elspais changed-requirements # Compare INDEX.md hashes with current
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
### 2. Outdated Implementations Tracking
|
|
38
|
+
|
|
39
|
+
**Gap**: No mechanism to persist a list of requirements that need implementation verification after content changes.
|
|
40
|
+
|
|
41
|
+
**Current workaround**: External JSON file `outdated-implementations.json` tracking:
|
|
42
|
+
- Requirement ID
|
|
43
|
+
- Old hash (from INDEX.md)
|
|
44
|
+
- New hash (current content)
|
|
45
|
+
- Detection timestamp
|
|
46
|
+
|
|
47
|
+
**Proposed elspais command**:
|
|
48
|
+
```bash
|
|
49
|
+
elspais verify status # Show requirements needing re-verification
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### 3. Mark Verified Command
|
|
55
|
+
|
|
56
|
+
**Gap**: No command to mark a requirement as "verified" after implementation review.
|
|
57
|
+
|
|
58
|
+
**Current workaround**: External script `mark-verified.py` that:
|
|
59
|
+
- Removes requirement from tracking file
|
|
60
|
+
- Records verification timestamp and user
|
|
61
|
+
|
|
62
|
+
**Proposed elspais commands**:
|
|
63
|
+
```bash
|
|
64
|
+
elspais verify mark REQ-xxx # Mark single requirement as verified
|
|
65
|
+
elspais verify mark --all # Mark all as verified
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
### 4. Post-Commit Integration
|
|
71
|
+
|
|
72
|
+
**Gap**: No git hook integration to auto-detect requirement changes after commits.
|
|
73
|
+
|
|
74
|
+
**Current workaround**: External post-commit hook that:
|
|
75
|
+
- Runs change detection after each commit
|
|
76
|
+
- Adds changed requirements to tracking file
|
|
77
|
+
- Notifies user of new outdated implementations
|
|
78
|
+
|
|
79
|
+
**Proposed elspais feature**:
|
|
80
|
+
```bash
|
|
81
|
+
elspais hooks install # Install git hooks for auto-detection
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
### 5. Validate "Implements:" Claims
|
|
87
|
+
|
|
88
|
+
**Gap**: No command to verify that code claiming to implement a requirement actually does so.
|
|
89
|
+
|
|
90
|
+
**Current status**: Not implemented anywhere (neither elspais nor local scripts).
|
|
91
|
+
|
|
92
|
+
**Proposed elspais command**:
|
|
93
|
+
```bash
|
|
94
|
+
elspais verify implements REQ-xxx # Find files claiming to implement REQ
|
|
95
|
+
elspais verify coverage # Report implementation coverage
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Workflow Comparison
|
|
101
|
+
|
|
102
|
+
### With elspais only (current)
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Manual process - no tracking
|
|
106
|
+
elspais hash verify # See which hashes changed
|
|
107
|
+
# ... manually remember what needs verification ...
|
|
108
|
+
elspais hash update # Update hashes when done
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### With external scripts (current workaround)
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Automated tracking workflow
|
|
115
|
+
python3 detect-changes.py # Find changed requirements
|
|
116
|
+
cat outdated-implementations.json # See what needs verification
|
|
117
|
+
# ... review implementation ...
|
|
118
|
+
python3 mark-verified.py REQ-xxx # Mark as verified
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Desired elspais workflow (future)
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Integrated tracking workflow
|
|
125
|
+
elspais verify status # See what needs verification
|
|
126
|
+
# ... review implementation ...
|
|
127
|
+
elspais verify mark REQ-xxx # Mark as verified
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Feature Request Summary
|
|
133
|
+
|
|
134
|
+
| Priority | Feature | Command |
|
|
135
|
+
| --- | --- | --- |
|
|
136
|
+
| High | Show outdated implementations | `elspais verify status` |
|
|
137
|
+
| High | Mark requirement verified | `elspais verify mark REQ-xxx` |
|
|
138
|
+
| Medium | Compare with INDEX.md | `elspais changed-requirements` |
|
|
139
|
+
| Medium | Install git hooks | `elspais hooks install` |
|
|
140
|
+
| Low | Validate implements claims | `elspais verify implements REQ-xxx` |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## References
|
|
145
|
+
|
|
146
|
+
- Local scripts location: `tools/anspar-cc-plugins/plugins/simple-requirements/scripts/`
|
|
147
|
+
- Tracking file: `untracked-notes/outdated-implementations.json`
|
|
148
|
+
- Related: INDEX.md hash format documentation
|