elspais 0.11.1__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.
Files changed (302) hide show
  1. {elspais-0.11.1 → elspais-0.43.5}/.gitignore +6 -0
  2. elspais-0.43.5/CHANGELOG.md +359 -0
  3. {elspais-0.11.1 → elspais-0.43.5}/PKG-INFO +7 -4
  4. {elspais-0.11.1 → elspais-0.43.5}/README.md +3 -3
  5. elspais-0.43.5/docs/GAPS-requirement-verification.md +148 -0
  6. elspais-0.43.5/docs/NEW_SPECS.md +123 -0
  7. elspais-0.43.5/docs/cli/assertions.md +67 -0
  8. elspais-0.43.5/docs/cli/commands.md +304 -0
  9. elspais-0.43.5/docs/cli/config.md +262 -0
  10. elspais-0.43.5/docs/cli/format.md +66 -0
  11. elspais-0.43.5/docs/cli/git.md +45 -0
  12. elspais-0.43.5/docs/cli/health.md +190 -0
  13. elspais-0.43.5/docs/cli/hierarchy.md +60 -0
  14. elspais-0.43.5/docs/cli/ignore.md +72 -0
  15. elspais-0.43.5/docs/cli/mcp.md +245 -0
  16. elspais-0.43.5/docs/cli/quickstart.md +58 -0
  17. elspais-0.43.5/docs/cli/traceability.md +89 -0
  18. elspais-0.43.5/docs/cli/validation.md +96 -0
  19. {elspais-0.11.1 → elspais-0.43.5}/docs/commands.md +39 -163
  20. {elspais-0.11.1 → elspais-0.43.5}/docs/configuration.md +40 -3
  21. elspais-0.43.5/docs/design_decisions.md +305 -0
  22. elspais-0.43.5/docs/mcp.md +487 -0
  23. {elspais-0.11.1 → elspais-0.43.5}/docs/multi-repo.md +4 -3
  24. elspais-0.43.5/docs/overview.md +115 -0
  25. {elspais-0.11.1 → elspais-0.43.5}/docs/patterns.md +6 -0
  26. elspais-0.43.5/docs/phase5-dogfooding-report.md +206 -0
  27. elspais-0.43.5/docs/roadmap/executive_summary_auditors.md +61 -0
  28. elspais-0.43.5/docs/roadmap/executive_summary_developers.md +67 -0
  29. elspais-0.43.5/docs/roadmap/executive_summary_sponsors.md +67 -0
  30. elspais-0.43.5/docs/roadmap/review_design_decisions.md +425 -0
  31. elspais-0.43.5/docs/roadmap/review_executive_summary_auditors.md +362 -0
  32. elspais-0.43.5/docs/roadmap/review_executive_summary_developers.md +272 -0
  33. elspais-0.43.5/docs/roadmap/review_executive_summary_sponsors.md +232 -0
  34. {elspais-0.11.1 → elspais-0.43.5}/docs/rules.md +56 -53
  35. elspais-0.43.5/docs/spec/config-schema.md +346 -0
  36. elspais-0.43.5/docs/spec/report-schema.md +308 -0
  37. {elspais-0.11.1 → elspais-0.43.5}/docs/trace-view.md +24 -18
  38. elspais-0.43.5/docs/traceability-report.md +40 -0
  39. elspais-0.43.5/docs/traceability-tree.md +182 -0
  40. {elspais-0.11.1 → elspais-0.43.5}/pyproject.toml +9 -2
  41. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/__init__.py +2 -11
  42. elspais-0.11.1/src/elspais/sponsors/__init__.py → elspais-0.43.5/src/elspais/associates.py +102 -58
  43. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/cli.py +395 -79
  44. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/commands/__init__.py +9 -3
  45. elspais-0.43.5/src/elspais/commands/analyze.py +166 -0
  46. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/commands/changed.py +15 -30
  47. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/commands/config_cmd.py +13 -16
  48. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/commands/edit.py +60 -44
  49. elspais-0.43.5/src/elspais/commands/example_cmd.py +319 -0
  50. elspais-0.43.5/src/elspais/commands/hash_cmd.py +204 -0
  51. elspais-0.43.5/src/elspais/commands/health.py +1177 -0
  52. elspais-0.43.5/src/elspais/commands/index.py +150 -0
  53. elspais-0.43.5/src/elspais/commands/init.py +254 -0
  54. elspais-0.43.5/src/elspais/commands/reformat_cmd.py +55 -0
  55. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/commands/rules_cmd.py +7 -3
  56. elspais-0.43.5/src/elspais/commands/trace.py +485 -0
  57. elspais-0.43.5/src/elspais/commands/validate.py +231 -0
  58. elspais-0.43.5/src/elspais/config/__init__.py +807 -0
  59. {elspais-0.11.1/src/elspais/core → elspais-0.43.5/src/elspais}/content_rules.py +20 -3
  60. elspais-0.43.5/src/elspais/graph/GraphNode.py +383 -0
  61. elspais-0.43.5/src/elspais/graph/__init__.py +40 -0
  62. elspais-0.43.5/src/elspais/graph/annotators.py +927 -0
  63. elspais-0.43.5/src/elspais/graph/builder.py +1886 -0
  64. elspais-0.43.5/src/elspais/graph/deserializer.py +248 -0
  65. elspais-0.43.5/src/elspais/graph/factory.py +284 -0
  66. elspais-0.43.5/src/elspais/graph/metrics.py +127 -0
  67. elspais-0.43.5/src/elspais/graph/mutations.py +161 -0
  68. elspais-0.43.5/src/elspais/graph/parsers/__init__.py +156 -0
  69. elspais-0.43.5/src/elspais/graph/parsers/code.py +213 -0
  70. elspais-0.43.5/src/elspais/graph/parsers/comments.py +112 -0
  71. elspais-0.43.5/src/elspais/graph/parsers/config_helpers.py +29 -0
  72. elspais-0.43.5/src/elspais/graph/parsers/heredocs.py +225 -0
  73. elspais-0.43.5/src/elspais/graph/parsers/journey.py +131 -0
  74. elspais-0.43.5/src/elspais/graph/parsers/remainder.py +79 -0
  75. elspais-0.43.5/src/elspais/graph/parsers/requirement.py +347 -0
  76. elspais-0.43.5/src/elspais/graph/parsers/results/__init__.py +6 -0
  77. elspais-0.43.5/src/elspais/graph/parsers/results/junit_xml.py +229 -0
  78. elspais-0.43.5/src/elspais/graph/parsers/results/pytest_json.py +313 -0
  79. elspais-0.43.5/src/elspais/graph/parsers/test.py +305 -0
  80. elspais-0.43.5/src/elspais/graph/relations.py +78 -0
  81. elspais-0.43.5/src/elspais/graph/serialize.py +216 -0
  82. elspais-0.43.5/src/elspais/html/__init__.py +8 -0
  83. elspais-0.43.5/src/elspais/html/generator.py +731 -0
  84. elspais-0.43.5/src/elspais/html/templates/trace_view.html.j2 +2151 -0
  85. elspais-0.43.5/src/elspais/mcp/__init__.py +60 -0
  86. elspais-0.43.5/src/elspais/mcp/__main__.py +10 -0
  87. elspais-0.43.5/src/elspais/mcp/file_mutations.py +138 -0
  88. elspais-0.43.5/src/elspais/mcp/server.py +2108 -0
  89. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/testing/__init__.py +4 -4
  90. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/testing/config.py +3 -0
  91. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/testing/mapper.py +1 -1
  92. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/testing/result_parser.py +25 -21
  93. elspais-0.43.5/src/elspais/testing/scanner.py +495 -0
  94. elspais-0.43.5/src/elspais/utilities/__init__.py +1 -0
  95. elspais-0.43.5/src/elspais/utilities/docs_loader.py +115 -0
  96. elspais-0.43.5/src/elspais/utilities/git.py +607 -0
  97. {elspais-0.11.1/src/elspais/core → elspais-0.43.5/src/elspais/utilities}/hasher.py +8 -22
  98. elspais-0.43.5/src/elspais/utilities/md_renderer.py +189 -0
  99. {elspais-0.11.1/src/elspais/core → elspais-0.43.5/src/elspais/utilities}/patterns.py +58 -57
  100. elspais-0.43.5/src/elspais/utilities/reference_config.py +626 -0
  101. elspais-0.43.5/src/elspais/validation/__init__.py +19 -0
  102. elspais-0.43.5/src/elspais/validation/format.py +264 -0
  103. elspais-0.43.5/tests/__init__.py +0 -0
  104. elspais-0.43.5/tests/commands/__init__.py +1 -0
  105. elspais-0.43.5/tests/commands/test_hash_update.py +556 -0
  106. elspais-0.43.5/tests/commands/test_validate_fix.py +301 -0
  107. {elspais-0.11.1 → elspais-0.43.5}/tests/conftest.py +2 -3
  108. elspais-0.43.5/tests/core/__init__.py +0 -0
  109. elspais-0.43.5/tests/core/conftest.py +118 -0
  110. elspais-0.43.5/tests/core/graph_test_helpers.py +455 -0
  111. elspais-0.43.5/tests/core/test_annotators.py +481 -0
  112. elspais-0.43.5/tests/core/test_assertion_mutations.py +604 -0
  113. elspais-0.43.5/tests/core/test_builder.py +467 -0
  114. elspais-0.43.5/tests/core/test_config.py +139 -0
  115. elspais-0.43.5/tests/core/test_coverage_metrics.py +568 -0
  116. elspais-0.43.5/tests/core/test_deserializer/conftest.py +63 -0
  117. elspais-0.43.5/tests/core/test_deserializer/test_domain_base.py +34 -0
  118. elspais-0.43.5/tests/core/test_deserializer/test_domain_file.py +154 -0
  119. elspais-0.43.5/tests/core/test_detection.py +256 -0
  120. elspais-0.43.5/tests/core/test_edge_mutations.py +586 -0
  121. elspais-0.43.5/tests/core/test_git.py +317 -0
  122. elspais-0.43.5/tests/core/test_graph_node.py +307 -0
  123. elspais-0.43.5/tests/core/test_hasher.py +112 -0
  124. elspais-0.43.5/tests/core/test_html/__init__.py +0 -0
  125. elspais-0.43.5/tests/core/test_html/test_generator.py +358 -0
  126. elspais-0.43.5/tests/core/test_integration/conftest.py +122 -0
  127. elspais-0.43.5/tests/core/test_integration/test_pipeline.py +163 -0
  128. elspais-0.43.5/tests/core/test_integration/test_real_world.py +151 -0
  129. elspais-0.43.5/tests/core/test_mutation_hash_consistency.py +366 -0
  130. elspais-0.43.5/tests/core/test_mutations.py +371 -0
  131. elspais-0.43.5/tests/core/test_node_mutations.py +526 -0
  132. elspais-0.43.5/tests/core/test_parsers/conftest.py +54 -0
  133. elspais-0.43.5/tests/core/test_parsers/test_code_parser.py +686 -0
  134. elspais-0.43.5/tests/core/test_parsers/test_comments_parser.py +130 -0
  135. elspais-0.43.5/tests/core/test_parsers/test_heredocs_parser.py +192 -0
  136. elspais-0.43.5/tests/core/test_parsers/test_journey_parser.py +52 -0
  137. elspais-0.43.5/tests/core/test_parsers/test_junit_xml_parser.py +314 -0
  138. elspais-0.43.5/tests/core/test_parsers/test_mdparser_base.py +192 -0
  139. elspais-0.43.5/tests/core/test_parsers/test_pytest_json_parser.py +430 -0
  140. elspais-0.43.5/tests/core/test_parsers/test_remainder_parser.py +102 -0
  141. elspais-0.43.5/tests/core/test_parsers/test_requirement_parser.py +215 -0
  142. elspais-0.43.5/tests/core/test_parsers/test_test_parser.py +206 -0
  143. elspais-0.43.5/tests/core/test_patterns.py +193 -0
  144. elspais-0.43.5/tests/core/test_reference_config.py +554 -0
  145. elspais-0.43.5/tests/core/test_relations.py +202 -0
  146. elspais-0.43.5/tests/core/test_serialize.py +277 -0
  147. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/hht-like/.elspais.toml +0 -1
  148. elspais-0.43.5/tests/fixtures/hht-like/traceability.md +29 -0
  149. elspais-0.43.5/tests/fixtures/hht-like/traceability_tree.html +80 -0
  150. elspais-0.43.5/tests/fixtures/hht-like/traceability_tree.md +30 -0
  151. elspais-0.43.5/tests/graph/test_clone.py +124 -0
  152. elspais-0.43.5/tests/graph/test_keyword_extraction.py +373 -0
  153. elspais-0.43.5/tests/graph/test_keyword_extraction_generalized.py +287 -0
  154. elspais-0.43.5/tests/mcp/__init__.py +1 -0
  155. elspais-0.43.5/tests/mcp/test_file_mutations.py +456 -0
  156. elspais-0.43.5/tests/mcp/test_mcp_core.py +599 -0
  157. elspais-0.43.5/tests/mcp/test_mcp_coverage.py +315 -0
  158. elspais-0.43.5/tests/mcp/test_mcp_keywords.py +220 -0
  159. elspais-0.43.5/tests/mcp/test_mcp_mutations.py +721 -0
  160. elspais-0.43.5/tests/test_doc_sync.py +237 -0
  161. {elspais-0.11.1 → elspais-0.43.5}/tests/test_edit.py +84 -44
  162. elspais-0.43.5/tests/test_example_cmd.py +292 -0
  163. elspais-0.43.5/tests/test_health.py +366 -0
  164. elspais-0.43.5/tests/test_init.py +348 -0
  165. elspais-0.43.5/tests/test_trace_command.py +638 -0
  166. elspais-0.11.1/CHANGELOG.md +0 -179
  167. elspais-0.11.1/docs/roadmap/llm-reformatting-integration.md +0 -113
  168. elspais-0.11.1/docs/roadmap/new-format.md +0 -193
  169. elspais-0.11.1/docs/roadmap/plantuml-diagram-support.md +0 -90
  170. elspais-0.11.1/docs/roadmap/requirements-format-enhancements.md +0 -160
  171. elspais-0.11.1/src/elspais/commands/analyze.py +0 -218
  172. elspais-0.11.1/src/elspais/commands/hash_cmd.py +0 -220
  173. elspais-0.11.1/src/elspais/commands/index.py +0 -166
  174. elspais-0.11.1/src/elspais/commands/init.py +0 -177
  175. elspais-0.11.1/src/elspais/commands/reformat_cmd.py +0 -458
  176. elspais-0.11.1/src/elspais/commands/trace.py +0 -362
  177. elspais-0.11.1/src/elspais/commands/validate.py +0 -451
  178. elspais-0.11.1/src/elspais/config/__init__.py +0 -13
  179. elspais-0.11.1/src/elspais/config/defaults.py +0 -173
  180. elspais-0.11.1/src/elspais/config/loader.py +0 -494
  181. elspais-0.11.1/src/elspais/core/__init__.py +0 -21
  182. elspais-0.11.1/src/elspais/core/git.py +0 -352
  183. elspais-0.11.1/src/elspais/core/models.py +0 -320
  184. elspais-0.11.1/src/elspais/core/parser.py +0 -640
  185. elspais-0.11.1/src/elspais/core/rules.py +0 -514
  186. elspais-0.11.1/src/elspais/mcp/__init__.py +0 -42
  187. elspais-0.11.1/src/elspais/mcp/__main__.py +0 -6
  188. elspais-0.11.1/src/elspais/mcp/context.py +0 -171
  189. elspais-0.11.1/src/elspais/mcp/serializers.py +0 -112
  190. elspais-0.11.1/src/elspais/mcp/server.py +0 -339
  191. elspais-0.11.1/src/elspais/reformat/__init__.py +0 -50
  192. elspais-0.11.1/src/elspais/reformat/detector.py +0 -119
  193. elspais-0.11.1/src/elspais/reformat/hierarchy.py +0 -246
  194. elspais-0.11.1/src/elspais/reformat/line_breaks.py +0 -220
  195. elspais-0.11.1/src/elspais/reformat/prompts.py +0 -123
  196. elspais-0.11.1/src/elspais/reformat/transformer.py +0 -264
  197. elspais-0.11.1/src/elspais/testing/scanner.py +0 -206
  198. elspais-0.11.1/src/elspais/trace_view/__init__.py +0 -54
  199. elspais-0.11.1/src/elspais/trace_view/coverage.py +0 -183
  200. elspais-0.11.1/src/elspais/trace_view/generators/__init__.py +0 -12
  201. elspais-0.11.1/src/elspais/trace_view/generators/base.py +0 -329
  202. elspais-0.11.1/src/elspais/trace_view/generators/csv.py +0 -122
  203. elspais-0.11.1/src/elspais/trace_view/generators/markdown.py +0 -175
  204. elspais-0.11.1/src/elspais/trace_view/html/__init__.py +0 -31
  205. elspais-0.11.1/src/elspais/trace_view/html/generator.py +0 -1006
  206. elspais-0.11.1/src/elspais/trace_view/html/templates/base.html +0 -283
  207. elspais-0.11.1/src/elspais/trace_view/html/templates/components/code_viewer_modal.html +0 -14
  208. elspais-0.11.1/src/elspais/trace_view/html/templates/components/file_picker_modal.html +0 -20
  209. elspais-0.11.1/src/elspais/trace_view/html/templates/components/legend_modal.html +0 -69
  210. elspais-0.11.1/src/elspais/trace_view/html/templates/components/review_panel.html +0 -118
  211. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/help/help-panel.json +0 -244
  212. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/help/onboarding.json +0 -77
  213. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/help/tooltips.json +0 -237
  214. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-comments.js +0 -928
  215. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-data.js +0 -961
  216. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-help.js +0 -679
  217. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-init.js +0 -177
  218. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-line-numbers.js +0 -429
  219. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-packages.js +0 -1029
  220. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-position.js +0 -540
  221. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-resize.js +0 -115
  222. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-status.js +0 -659
  223. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review/review-sync.js +0 -992
  224. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/review-styles.css +0 -2238
  225. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/scripts.js +0 -1741
  226. elspais-0.11.1/src/elspais/trace_view/html/templates/partials/styles.css +0 -1756
  227. elspais-0.11.1/src/elspais/trace_view/models.py +0 -353
  228. elspais-0.11.1/src/elspais/trace_view/review/__init__.py +0 -60
  229. elspais-0.11.1/src/elspais/trace_view/review/branches.py +0 -1149
  230. elspais-0.11.1/src/elspais/trace_view/review/models.py +0 -1205
  231. elspais-0.11.1/src/elspais/trace_view/review/position.py +0 -609
  232. elspais-0.11.1/src/elspais/trace_view/review/server.py +0 -1056
  233. elspais-0.11.1/src/elspais/trace_view/review/status.py +0 -470
  234. elspais-0.11.1/src/elspais/trace_view/review/storage.py +0 -1367
  235. elspais-0.11.1/src/elspais/trace_view/scanning.py +0 -213
  236. elspais-0.11.1/src/elspais/trace_view/specs/README.md +0 -84
  237. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00001-template-architecture.md +0 -36
  238. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00002-css-extraction.md +0 -37
  239. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00003-js-extraction.md +0 -43
  240. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00004-build-embedding.md +0 -40
  241. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00005-test-format.md +0 -78
  242. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00010-review-data-models.md +0 -33
  243. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00011-review-storage.md +0 -33
  244. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00012-position-resolution.md +0 -33
  245. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00013-git-branches.md +0 -31
  246. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00014-review-api-server.md +0 -31
  247. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00015-status-modifier.md +0 -27
  248. elspais-0.11.1/src/elspais/trace_view/specs/tv-d00016-js-integration.md +0 -33
  249. elspais-0.11.1/src/elspais/trace_view/specs/tv-p00001-html-generator.md +0 -33
  250. elspais-0.11.1/src/elspais/trace_view/specs/tv-p00002-review-system.md +0 -29
  251. elspais-0.11.1/tests/mcp/__init__.py +0 -1
  252. elspais-0.11.1/tests/mcp/test_context.py +0 -118
  253. elspais-0.11.1/tests/mcp/test_serializers.py +0 -141
  254. elspais-0.11.1/tests/test_config.py +0 -756
  255. elspais-0.11.1/tests/test_content_rules.py +0 -312
  256. elspais-0.11.1/tests/test_doc_sync.py +0 -203
  257. elspais-0.11.1/tests/test_git.py +0 -292
  258. elspais-0.11.1/tests/test_hash_bugs.py +0 -549
  259. elspais-0.11.1/tests/test_hasher.py +0 -265
  260. elspais-0.11.1/tests/test_models.py +0 -206
  261. elspais-0.11.1/tests/test_parser.py +0 -1005
  262. elspais-0.11.1/tests/test_parser_resilience.py +0 -606
  263. elspais-0.11.1/tests/test_patterns.py +0 -192
  264. elspais-0.11.1/tests/test_rules.py +0 -253
  265. elspais-0.11.1/tests/test_sponsors.py +0 -491
  266. elspais-0.11.1/tests/test_trace_view/__init__.py +0 -1
  267. elspais-0.11.1/tests/test_trace_view/test_integration.py +0 -225
  268. elspais-0.11.1/tests/test_validate_json.py +0 -373
  269. elspais-0.11.1/tests/testing/__init__.py +0 -1
  270. elspais-0.11.1/tests/testing/fixtures/junit_results.xml +0 -18
  271. elspais-0.11.1/tests/testing/fixtures/pytest_results.json +0 -34
  272. elspais-0.11.1/tests/testing/fixtures/sample_test.py +0 -38
  273. elspais-0.11.1/tests/testing/test_config.py +0 -64
  274. elspais-0.11.1/tests/testing/test_mapper.py +0 -118
  275. elspais-0.11.1/tests/testing/test_result_parser.py +0 -137
  276. elspais-0.11.1/tests/testing/test_scanner.py +0 -114
  277. {elspais-0.11.1 → elspais-0.43.5}/LICENSE +0 -0
  278. {elspais-0.11.1 → elspais-0.43.5}/src/elspais/__main__.py +0 -0
  279. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/assertions/.elspais.toml +0 -0
  280. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/assertions/spec/dev-impl.md +0 -0
  281. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/assertions/spec/prd-sample.md +0 -0
  282. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/associated-repo/.elspais.toml +0 -0
  283. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/associated-repo/spec/dev-sponsor.md +0 -0
  284. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/associated-repo/spec/prd-sponsor.md +0 -0
  285. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/fda-style/.elspais.toml +0 -0
  286. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/fda-style/spec/dev-impl.md +0 -0
  287. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/fda-style/spec/prd-core.md +0 -0
  288. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/hht-like/database/schema.sql +0 -0
  289. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/hht-like/spec/INDEX.md +0 -0
  290. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/hht-like/spec/dev-impl.md +0 -0
  291. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/hht-like/spec/ops-deploy.md +0 -0
  292. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/hht-like/spec/prd-core.md +0 -0
  293. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/invalid/broken-links/.elspais.toml +0 -0
  294. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/invalid/broken-links/spec/broken.md +0 -0
  295. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/invalid/circular-deps/.elspais.toml +0 -0
  296. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/invalid/circular-deps/spec/circular.md +0 -0
  297. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/invalid/missing-hash/.elspais.toml +0 -0
  298. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/invalid/missing-hash/spec/missing.md +0 -0
  299. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/jira-style/.elspais.toml +0 -0
  300. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/jira-style/requirements/features.md +0 -0
  301. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/named-reqs/.elspais.toml +0 -0
  302. {elspais-0.11.1 → elspais-0.43.5}/tests/fixtures/named-reqs/spec/features.md +0 -0
@@ -74,3 +74,9 @@ dmypy.json
74
74
  # OS
75
75
  .DS_Store
76
76
  Thumbs.db
77
+
78
+ # Generated traceability output
79
+ /trace*
80
+ traceability_graph.html
81
+ traceability_graph.md
82
+ traceability_matrix.html
@@ -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.11.1
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.9.3
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.9.3
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.1.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.9.3
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.9.3
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.1.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