elspais 0.9.1__tar.gz → 0.11.0__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 (166) hide show
  1. elspais-0.11.0/CHANGELOG.md +174 -0
  2. {elspais-0.9.1 → elspais-0.11.0}/PKG-INFO +78 -26
  3. {elspais-0.9.1 → elspais-0.11.0}/README.md +62 -20
  4. elspais-0.11.0/docs/commands.md +672 -0
  5. {elspais-0.9.1 → elspais-0.11.0}/docs/multi-repo.md +35 -8
  6. elspais-0.11.0/docs/roadmap/llm-reformatting-integration.md +113 -0
  7. elspais-0.11.0/docs/roadmap/new-format.md +193 -0
  8. elspais-0.11.0/docs/roadmap/plantuml-diagram-support.md +90 -0
  9. elspais-0.11.0/docs/roadmap/requirements-format-enhancements.md +160 -0
  10. {elspais-0.9.1 → elspais-0.11.0}/docs/rules.md +18 -0
  11. elspais-0.11.0/docs/trace-view.md +316 -0
  12. {elspais-0.9.1 → elspais-0.11.0}/pyproject.toml +20 -7
  13. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/cli.py +123 -1
  14. elspais-0.11.0/src/elspais/commands/changed.py +160 -0
  15. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/hash_cmd.py +72 -26
  16. elspais-0.11.0/src/elspais/commands/reformat_cmd.py +458 -0
  17. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/trace.py +157 -3
  18. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/validate.py +81 -18
  19. elspais-0.11.0/src/elspais/core/git.py +352 -0
  20. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/models.py +2 -0
  21. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/parser.py +68 -24
  22. elspais-0.11.0/src/elspais/reformat/__init__.py +50 -0
  23. elspais-0.11.0/src/elspais/reformat/detector.py +119 -0
  24. elspais-0.11.0/src/elspais/reformat/hierarchy.py +246 -0
  25. elspais-0.11.0/src/elspais/reformat/line_breaks.py +220 -0
  26. elspais-0.11.0/src/elspais/reformat/prompts.py +123 -0
  27. elspais-0.11.0/src/elspais/reformat/transformer.py +264 -0
  28. elspais-0.11.0/src/elspais/sponsors/__init__.py +432 -0
  29. elspais-0.11.0/src/elspais/trace_view/__init__.py +54 -0
  30. elspais-0.11.0/src/elspais/trace_view/coverage.py +183 -0
  31. elspais-0.11.0/src/elspais/trace_view/generators/__init__.py +12 -0
  32. elspais-0.11.0/src/elspais/trace_view/generators/base.py +329 -0
  33. elspais-0.11.0/src/elspais/trace_view/generators/csv.py +122 -0
  34. elspais-0.11.0/src/elspais/trace_view/generators/markdown.py +175 -0
  35. elspais-0.11.0/src/elspais/trace_view/html/__init__.py +31 -0
  36. elspais-0.11.0/src/elspais/trace_view/html/generator.py +1006 -0
  37. elspais-0.11.0/src/elspais/trace_view/html/templates/base.html +283 -0
  38. elspais-0.11.0/src/elspais/trace_view/html/templates/components/code_viewer_modal.html +14 -0
  39. elspais-0.11.0/src/elspais/trace_view/html/templates/components/file_picker_modal.html +20 -0
  40. elspais-0.11.0/src/elspais/trace_view/html/templates/components/legend_modal.html +69 -0
  41. elspais-0.11.0/src/elspais/trace_view/html/templates/components/review_panel.html +118 -0
  42. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/help/help-panel.json +244 -0
  43. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/help/onboarding.json +77 -0
  44. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/help/tooltips.json +237 -0
  45. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-comments.js +928 -0
  46. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-data.js +961 -0
  47. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-help.js +679 -0
  48. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-init.js +177 -0
  49. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-line-numbers.js +429 -0
  50. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-packages.js +1029 -0
  51. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-position.js +540 -0
  52. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-resize.js +115 -0
  53. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-status.js +659 -0
  54. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-sync.js +992 -0
  55. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review-styles.css +2238 -0
  56. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/scripts.js +1741 -0
  57. elspais-0.11.0/src/elspais/trace_view/html/templates/partials/styles.css +1756 -0
  58. elspais-0.11.0/src/elspais/trace_view/models.py +353 -0
  59. elspais-0.11.0/src/elspais/trace_view/review/__init__.py +60 -0
  60. elspais-0.11.0/src/elspais/trace_view/review/branches.py +1149 -0
  61. elspais-0.11.0/src/elspais/trace_view/review/models.py +1205 -0
  62. elspais-0.11.0/src/elspais/trace_view/review/position.py +609 -0
  63. elspais-0.11.0/src/elspais/trace_view/review/server.py +1056 -0
  64. elspais-0.11.0/src/elspais/trace_view/review/status.py +470 -0
  65. elspais-0.11.0/src/elspais/trace_view/review/storage.py +1367 -0
  66. elspais-0.11.0/src/elspais/trace_view/scanning.py +213 -0
  67. elspais-0.11.0/src/elspais/trace_view/specs/README.md +84 -0
  68. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00001-template-architecture.md +36 -0
  69. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00002-css-extraction.md +37 -0
  70. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00003-js-extraction.md +43 -0
  71. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00004-build-embedding.md +40 -0
  72. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00005-test-format.md +78 -0
  73. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00010-review-data-models.md +33 -0
  74. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00011-review-storage.md +33 -0
  75. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00012-position-resolution.md +33 -0
  76. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00013-git-branches.md +31 -0
  77. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00014-review-api-server.md +31 -0
  78. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00015-status-modifier.md +27 -0
  79. elspais-0.11.0/src/elspais/trace_view/specs/tv-d00016-js-integration.md +33 -0
  80. elspais-0.11.0/src/elspais/trace_view/specs/tv-p00001-html-generator.md +33 -0
  81. elspais-0.11.0/src/elspais/trace_view/specs/tv-p00002-review-system.md +29 -0
  82. elspais-0.11.0/tests/test_git.py +292 -0
  83. {elspais-0.9.1 → elspais-0.11.0}/tests/test_parser_resilience.py +216 -0
  84. elspais-0.11.0/tests/test_sponsors.py +491 -0
  85. elspais-0.11.0/tests/test_trace_view/__init__.py +1 -0
  86. elspais-0.11.0/tests/test_trace_view/test_integration.py +225 -0
  87. {elspais-0.9.1 → elspais-0.11.0}/tests/test_validate_json.py +132 -1
  88. elspais-0.9.1/CHANGELOG.md +0 -74
  89. {elspais-0.9.1 → elspais-0.11.0}/.gitignore +0 -0
  90. {elspais-0.9.1 → elspais-0.11.0}/LICENSE +0 -0
  91. {elspais-0.9.1 → elspais-0.11.0}/docs/configuration.md +0 -0
  92. {elspais-0.9.1 → elspais-0.11.0}/docs/patterns.md +0 -0
  93. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/__init__.py +0 -0
  94. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/__main__.py +0 -0
  95. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/__init__.py +0 -0
  96. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/analyze.py +0 -0
  97. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/config_cmd.py +0 -0
  98. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/edit.py +0 -0
  99. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/index.py +0 -0
  100. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/init.py +0 -0
  101. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/rules_cmd.py +0 -0
  102. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/config/__init__.py +0 -0
  103. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/config/defaults.py +0 -0
  104. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/config/loader.py +0 -0
  105. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/__init__.py +0 -0
  106. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/content_rules.py +0 -0
  107. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/hasher.py +0 -0
  108. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/patterns.py +0 -0
  109. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/rules.py +0 -0
  110. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/__init__.py +0 -0
  111. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/__main__.py +0 -0
  112. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/context.py +0 -0
  113. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/serializers.py +0 -0
  114. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/server.py +0 -0
  115. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/__init__.py +0 -0
  116. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/config.py +0 -0
  117. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/mapper.py +0 -0
  118. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/result_parser.py +0 -0
  119. {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/scanner.py +0 -0
  120. {elspais-0.9.1 → elspais-0.11.0}/tests/conftest.py +0 -0
  121. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/assertions/.elspais.toml +0 -0
  122. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/assertions/spec/dev-impl.md +0 -0
  123. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/assertions/spec/prd-sample.md +0 -0
  124. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/associated-repo/.elspais.toml +0 -0
  125. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/associated-repo/spec/dev-sponsor.md +0 -0
  126. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/associated-repo/spec/prd-sponsor.md +0 -0
  127. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/fda-style/.elspais.toml +0 -0
  128. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/fda-style/spec/dev-impl.md +0 -0
  129. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/fda-style/spec/prd-core.md +0 -0
  130. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/.elspais.toml +0 -0
  131. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/database/schema.sql +0 -0
  132. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/INDEX.md +0 -0
  133. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/dev-impl.md +0 -0
  134. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/ops-deploy.md +0 -0
  135. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/prd-core.md +0 -0
  136. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/broken-links/.elspais.toml +0 -0
  137. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/broken-links/spec/broken.md +0 -0
  138. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/circular-deps/.elspais.toml +0 -0
  139. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/circular-deps/spec/circular.md +0 -0
  140. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/missing-hash/.elspais.toml +0 -0
  141. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/missing-hash/spec/missing.md +0 -0
  142. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/jira-style/.elspais.toml +0 -0
  143. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/jira-style/requirements/features.md +0 -0
  144. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/named-reqs/.elspais.toml +0 -0
  145. {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/named-reqs/spec/features.md +0 -0
  146. {elspais-0.9.1 → elspais-0.11.0}/tests/mcp/__init__.py +0 -0
  147. {elspais-0.9.1 → elspais-0.11.0}/tests/mcp/test_context.py +0 -0
  148. {elspais-0.9.1 → elspais-0.11.0}/tests/mcp/test_serializers.py +0 -0
  149. {elspais-0.9.1 → elspais-0.11.0}/tests/test_config.py +0 -0
  150. {elspais-0.9.1 → elspais-0.11.0}/tests/test_content_rules.py +0 -0
  151. {elspais-0.9.1 → elspais-0.11.0}/tests/test_doc_sync.py +0 -0
  152. {elspais-0.9.1 → elspais-0.11.0}/tests/test_edit.py +0 -0
  153. {elspais-0.9.1 → elspais-0.11.0}/tests/test_hash_bugs.py +0 -0
  154. {elspais-0.9.1 → elspais-0.11.0}/tests/test_hasher.py +0 -0
  155. {elspais-0.9.1 → elspais-0.11.0}/tests/test_models.py +0 -0
  156. {elspais-0.9.1 → elspais-0.11.0}/tests/test_parser.py +0 -0
  157. {elspais-0.9.1 → elspais-0.11.0}/tests/test_patterns.py +0 -0
  158. {elspais-0.9.1 → elspais-0.11.0}/tests/test_rules.py +0 -0
  159. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/__init__.py +0 -0
  160. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/fixtures/junit_results.xml +0 -0
  161. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/fixtures/pytest_results.json +0 -0
  162. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/fixtures/sample_test.py +0 -0
  163. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/test_config.py +0 -0
  164. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/test_mapper.py +0 -0
  165. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/test_result_parser.py +0 -0
  166. {elspais-0.9.1 → elspais-0.11.0}/tests/testing/test_scanner.py +0 -0
@@ -0,0 +1,174 @@
1
+ # Changelog
2
+
3
+ All notable changes to elspais will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.11.0] - 2026-01-15
11
+
12
+ ### Added
13
+ - **Cross-repo hierarchy support** for `reformat-with-claude` command
14
+ - Resolves parent requirements from associated/sponsor repositories
15
+ - New `--core-repo` flag to specify core repository path
16
+ - Builds complete hierarchy graph across repository boundaries
17
+
18
+ ### Changed
19
+ - **Performance optimization** for reformat command: Uses validation to filter requirements before reformatting instead of processing all files
20
+ - Reformat module now uses core modules directly for consistent behavior
21
+
22
+ ### Fixed
23
+ - Hash update robustness improved with better error handling and INFO logging
24
+ - `normalize_req_id()` now uses config-based `PatternValidator` for consistent ID normalization
25
+ - Associated prefix case is now preserved in normalized requirement IDs
26
+
27
+ ## [0.10.0] - 2026-01-10
28
+
29
+ ### Added
30
+ - **trace-view integration**: Enhanced traceability visualization with optional dependencies
31
+ - Interactive HTML generation with Jinja2 templates (`elspais[trace-view]`)
32
+ - Collaborative review server with Flask REST API (`elspais[trace-review]`)
33
+ - New CLI flags: `--view`, `--embed-content`, `--edit-mode`, `--review-mode`, `--server`, `--port`
34
+ - **New `trace_view` package** (`src/elspais/trace_view/`)
35
+ - `TraceViewRequirement` adapter wrapping core `Requirement` model
36
+ - Coverage calculation and orphan detection
37
+ - Implementation file scanning
38
+ - Generators for HTML, Markdown, and CSV output
39
+ - **Review system** for collaborative requirement feedback
40
+ - Comment threads with nested replies
41
+ - Review flags and status change requests
42
+ - Git branch management for review workflows
43
+ - JSON-based persistence in `.elspais/reviews/`
44
+ - **AI-assisted requirement reformatting** with `reformat-with-claude` command
45
+ - Transforms legacy "Acceptance Criteria" format to assertion-based format
46
+ - Format detection and validation
47
+ - Line break normalization
48
+ - Claude CLI integration with structured JSON output
49
+ - **New `reformat` module** (`src/elspais/reformat/`)
50
+ - `detect_format()`, `needs_reformatting()` - format analysis
51
+ - `reformat_requirement()`, `assemble_new_format()` - AI transformation
52
+ - `normalize_line_breaks()`, `fix_requirement_line_breaks()` - cleanup
53
+ - `RequirementNode`, `build_hierarchy()` - requirement traversal
54
+ - New optional dependency extras in pyproject.toml:
55
+ - `elspais[trace-view]`: jinja2 for HTML generation
56
+ - `elspais[trace-review]`: flask, flask-cors for review server
57
+ - `elspais[all]`: all optional features
58
+ - New documentation: `docs/trace-view.md` user guide
59
+ - 18 new integration tests for trace-view features
60
+
61
+ ### Changed
62
+ - `elspais trace` command now delegates to trace-view when enhanced features requested
63
+ - CLAUDE.md updated with trace-view architecture documentation
64
+
65
+ ## [0.9.4] - 2026-01-08
66
+
67
+ ### Added
68
+ - **Roadmap conflict entries**: When duplicate requirement IDs exist (e.g., same ID in spec/ and spec/roadmap/), both requirements are now visible in output
69
+ - Duplicate entries stored with `__conflict` suffix key (e.g., `REQ-p00001__conflict`)
70
+ - New `is_conflict` and `conflict_with` fields on Requirement model
71
+ - Conflict entries treated as orphaned (`implements=[]`) for clear visibility
72
+ - Warning generated for each duplicate (surfaced as `id.duplicate` rule)
73
+ - **Sponsor/associated repository spec scanning**: New `--mode` flag and sponsor configuration support
74
+ - `elspais validate --mode core`: Scan only core spec directories
75
+ - `elspais validate --mode combined`: Include sponsor specs (default)
76
+ - New `sponsors` module with zero-dependency YAML parser
77
+ - Configuration via `.github/config/sponsors.yml` with local override support
78
+ - `traceability.include_associated` config option (default: true)
79
+ - 29 new tests for conflict entries and sponsor scanning
80
+
81
+ ### Changed
82
+ - Parser now keeps both requirements when duplicates found (instead of ignoring second)
83
+ - JSON output includes conflict metadata for both original and conflict entries
84
+
85
+ ## [0.9.3] - 2026-01-05
86
+
87
+ ### Added
88
+ - Git-based change detection with new `changed` command
89
+ - `elspais changed`: Show uncommitted changes to spec files
90
+ - `elspais changed --json`: JSON output for programmatic use
91
+ - `elspais changed --all`: Include all changed files, not just spec/
92
+ - `elspais changed --base-branch`: Compare vs different branch
93
+ - New `src/elspais/core/git.py` module with functions:
94
+ - `get_git_changes()`: Main entry point for git change detection
95
+ - `get_modified_files()`: Detect modified/untracked files via git status
96
+ - `get_changed_vs_branch()`: Files changed vs main/master branch
97
+ - `detect_moved_requirements()`: Detect requirements moved between files
98
+ - 23 new tests for git functionality
99
+
100
+ ## [0.9.2] - 2026-01-05
101
+
102
+ ### Added
103
+ - `id.duplicate` rule documentation in `docs/rules.md`
104
+ - Dynamic version detection using `importlib.metadata`
105
+
106
+ ### Changed
107
+ - Enhanced ParseResult API documentation in CLAUDE.md to explain warning handling
108
+ - Updated CLAUDE.md with git.py module description
109
+
110
+ ## [0.9.1] - 2026-01-03
111
+
112
+ ### Changed
113
+ - Updated CLAUDE.md with complete architecture documentation
114
+ - Added testing/, mcp/, and content_rules modules to CLAUDE.md
115
+ - Added ParseResult API design pattern documentation
116
+ - Added Workflow section with contribution guidelines
117
+ - Updated Python version reference from 3.8+ to 3.9+
118
+
119
+ ## [0.9.0] - 2026-01-03
120
+
121
+ ### Added
122
+ - Test mapping and coverage functionality (`elspais.testing` module)
123
+ - `TestScanner`: Scans test files for requirement references
124
+ - `ResultParser`: Parses JUnit XML and pytest JSON test results
125
+ - `TestMapper`: Orchestrates scanning and result mapping
126
+ - Parser resilience with `ParseResult` API and warning system
127
+ - Parser now returns `ParseResult` containing both requirements and warnings
128
+ - Non-fatal issues generate warnings instead of failing parsing
129
+
130
+ ## [0.2.1] - 2025-12-28
131
+
132
+ ### Changed
133
+ - Renamed "sponsor" to "associated" throughout the codebase
134
+ - Config: `[sponsor]` → `[associated]`, `[patterns.sponsor]` → `[patterns.associated]`
135
+ - CLI: `--sponsor-prefix` → `--associated-prefix`, `--type sponsor` → `--type associated`
136
+ - ID template: `{sponsor}` → `{associated}`
137
+ - Made the tool generic by removing standards-specific references
138
+ - Updated documentation to use neutral terminology
139
+
140
+ ## [0.2.0] - 2025-12-28
141
+
142
+ ### Added
143
+ - Multi-directory spec support: `spec = ["spec", "spec/roadmap"]`
144
+ - Generic `get_directories()` function for any config key
145
+ - Recursive directory scanning for code directories
146
+ - `get_code_directories()` convenience function with auto-recursion
147
+ - `ignore` config for excluding directories (node_modules, .git, etc.)
148
+ - Configurable `no_reference_values` for Implements field (-, null, none, N/A)
149
+ - `parse_directories()` method for parsing multiple spec directories
150
+ - `skip_files` config support across all commands
151
+
152
+ ### Fixed
153
+ - Body extraction now matches hht-diary behavior (includes Rationale/Acceptance)
154
+ - Hash calculation strips trailing whitespace for consistency
155
+ - skip_files config now properly passed to parser in all commands
156
+
157
+ ## [0.1.0] - 2025-12-27
158
+
159
+ ### Added
160
+ - Initial release of elspais requirements validation tools
161
+ - Configurable requirement ID patterns (REQ-p00001, PRD-00001, PROJ-123, etc.)
162
+ - Configurable validation rules with hierarchy enforcement
163
+ - TOML-based per-repository configuration (.elspais.toml)
164
+ - CLI commands: validate, trace, hash, index, analyze, init
165
+ - Multi-repository support (core/associated model)
166
+ - Traceability matrix generation (Markdown, HTML, CSV)
167
+ - Hash-based change detection for requirements
168
+ - Zero external dependencies (Python 3.8+ standard library only)
169
+ - Core requirement parsing and validation
170
+ - Pattern matching for multiple ID formats
171
+ - Rule engine for hierarchy validation
172
+ - Configuration system with sensible defaults
173
+ - Test fixtures for multiple requirement formats
174
+ - Comprehensive documentation
@@ -1,15 +1,14 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: elspais
3
- Version: 0.9.1
3
+ Version: 0.11.0
4
4
  Summary: Requirements validation and traceability tools - L-Space connects all libraries
5
- Home-page: https://github.com/anspar/elspais
6
- Author: Anspar
7
- Author-email: dev@anspar.io
8
- License: MIT
5
+ Project-URL: Homepage, https://github.com/anspar/elspais
9
6
  Project-URL: Documentation, https://github.com/anspar/elspais#readme
10
7
  Project-URL: Repository, https://github.com/anspar/elspais
11
8
  Project-URL: Issues, https://github.com/anspar/elspais/issues
12
9
  Project-URL: Changelog, https://github.com/anspar/elspais/blob/main/CHANGELOG.md
10
+ Author-email: Anspar <dev@anspar.io>
11
+ License-File: LICENSE
13
12
  Keywords: documentation,requirements,specifications,traceability,validation
14
13
  Classifier: Development Status :: 4 - Beta
15
14
  Classifier: Environment :: Console
@@ -25,6 +24,11 @@ Classifier: Topic :: Software Development :: Documentation
25
24
  Classifier: Topic :: Software Development :: Quality Assurance
26
25
  Classifier: Typing :: Typed
27
26
  Requires-Python: >=3.9
27
+ Provides-Extra: all
28
+ Requires-Dist: flask-cors>=4.0; extra == 'all'
29
+ Requires-Dist: flask>=2.0; extra == 'all'
30
+ Requires-Dist: jinja2>=3.0; extra == 'all'
31
+ Requires-Dist: mcp>=1.0; extra == 'all'
28
32
  Provides-Extra: binary
29
33
  Requires-Dist: pyinstaller>=6.0; extra == 'binary'
30
34
  Provides-Extra: dev
@@ -35,6 +39,12 @@ Requires-Dist: pytest>=7.0; extra == 'dev'
35
39
  Requires-Dist: ruff>=0.1.0; extra == 'dev'
36
40
  Provides-Extra: mcp
37
41
  Requires-Dist: mcp>=1.0; extra == 'mcp'
42
+ Provides-Extra: trace-review
43
+ Requires-Dist: flask-cors>=4.0; extra == 'trace-review'
44
+ Requires-Dist: flask>=2.0; extra == 'trace-review'
45
+ Requires-Dist: jinja2>=3.0; extra == 'trace-review'
46
+ Provides-Extra: trace-view
47
+ Requires-Dist: jinja2>=3.0; extra == 'trace-view'
38
48
  Description-Content-Type: text/markdown
39
49
 
40
50
  # elspais
@@ -57,18 +67,50 @@ Description-Content-Type: text/markdown
57
67
 
58
68
  ## Installation
59
69
 
70
+ ### For End Users
71
+
60
72
  ```bash
73
+ # Recommended: Isolated installation with pipx
74
+ pipx install elspais
75
+
76
+ # Or standard pip installation
61
77
  pip install elspais
62
78
  ```
63
79
 
64
- Or install from source:
80
+ ### For Development
65
81
 
66
82
  ```bash
67
83
  git clone https://github.com/anspar/elspais.git
68
84
  cd elspais
69
- pip install -e .
85
+ pip install -e ".[dev]"
86
+ ```
87
+
88
+ ### For Docker and CI/CD
89
+
90
+ For faster installation in containerized environments, consider [uv](https://github.com/astral-sh/uv):
91
+
92
+ ```dockerfile
93
+ # Example Dockerfile
94
+ FROM python:3.11-slim
95
+
96
+ # Copy uv binary
97
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
98
+
99
+ # Install elspais (10-100x faster than pip)
100
+ RUN uv pip install --system --no-cache elspais==0.9.3
70
101
  ```
71
102
 
103
+ ```yaml
104
+ # Example GitHub Actions
105
+ - name: Install uv
106
+ uses: astral-sh/setup-uv@v2
107
+
108
+ - name: Install elspais
109
+ run: uv pip install --system elspais==0.9.3
110
+ ```
111
+
112
+ **Note:** For regulated/medical software projects, always pin the exact version for reproducibility.
113
+
72
114
  ## Quick Start
73
115
 
74
116
  ### Initialize a Repository
@@ -185,22 +227,28 @@ See [docs/configuration.md](docs/configuration.md) for full reference.
185
227
  elspais expects requirements in Markdown format:
186
228
 
187
229
  ```markdown
188
- ### REQ-d00001: Requirement Title
230
+ # REQ-d00001: Requirement Title
231
+
232
+ **Level**: Dev | **Status**: Active | **Implements**: REQ-p00001
189
233
 
190
- **Level**: Dev | **Implements**: p00001 | **Status**: Active
234
+ ## Assertions
191
235
 
192
- The system SHALL provide user authentication.
236
+ A. The system SHALL provide user authentication via email/password.
237
+ B. Sessions SHALL expire after 30 minutes of inactivity.
193
238
 
194
- **Rationale**: Security requires identity verification.
239
+ ## Rationale
195
240
 
196
- **Acceptance Criteria**:
197
- - Users can log in with email/password
198
- - Session expires after 30 minutes of inactivity
241
+ Security requires identity verification.
199
242
 
200
243
  *End* *Requirement Title* | **Hash**: a1b2c3d4
201
244
  ---
202
245
  ```
203
246
 
247
+ Key format elements:
248
+ - **Assertions section**: Labeled A-Z, each using SHALL for normative statements
249
+ - **One-way traceability**: Children reference parents via `Implements:`
250
+ - **Hash footer**: SHA-256 hash for change detection
251
+
204
252
  ## ID Pattern Examples
205
253
 
206
254
  elspais supports multiple ID formats:
@@ -328,19 +376,23 @@ Options:
328
376
  --help Show help
329
377
 
330
378
  Commands:
331
- validate Validate requirements format, links, hashes
332
- trace Generate traceability matrix
333
- hash Manage requirement hashes (verify, update)
334
- index Validate or regenerate INDEX.md
335
- analyze Analyze requirement hierarchy
336
- edit Edit requirements in-place (status, implements, move)
337
- config View and modify configuration
338
- rules View and manage content rules
339
- mcp MCP server commands (requires elspais[mcp])
340
- version Show version and check for updates
341
- init Create .elspais.toml configuration
379
+ validate Validate requirements format, links, hashes
380
+ trace Generate traceability matrix
381
+ hash Manage requirement hashes (verify, update)
382
+ reformat-with-claude Transform requirements using AI (Acceptance Criteria → Assertions)
383
+ changed Detect git changes to spec files
384
+ analyze Analyze requirement hierarchy
385
+ edit Edit requirements in-place (status, implements, move)
386
+ config View and modify configuration
387
+ rules View and manage content rules
388
+ index Validate or regenerate INDEX.md
389
+ init Create .elspais.toml configuration
390
+ mcp MCP server commands (requires elspais[mcp])
391
+ version Show version and check for updates
342
392
  ```
343
393
 
394
+ See [docs/commands.md](docs/commands.md) for comprehensive command documentation.
395
+
344
396
  ## Development
345
397
 
346
398
  ```bash
@@ -18,18 +18,50 @@
18
18
 
19
19
  ## Installation
20
20
 
21
+ ### For End Users
22
+
21
23
  ```bash
24
+ # Recommended: Isolated installation with pipx
25
+ pipx install elspais
26
+
27
+ # Or standard pip installation
22
28
  pip install elspais
23
29
  ```
24
30
 
25
- Or install from source:
31
+ ### For Development
26
32
 
27
33
  ```bash
28
34
  git clone https://github.com/anspar/elspais.git
29
35
  cd elspais
30
- pip install -e .
36
+ pip install -e ".[dev]"
37
+ ```
38
+
39
+ ### For Docker and CI/CD
40
+
41
+ For faster installation in containerized environments, consider [uv](https://github.com/astral-sh/uv):
42
+
43
+ ```dockerfile
44
+ # Example Dockerfile
45
+ FROM python:3.11-slim
46
+
47
+ # Copy uv binary
48
+ COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
49
+
50
+ # Install elspais (10-100x faster than pip)
51
+ RUN uv pip install --system --no-cache elspais==0.9.3
31
52
  ```
32
53
 
54
+ ```yaml
55
+ # Example GitHub Actions
56
+ - name: Install uv
57
+ uses: astral-sh/setup-uv@v2
58
+
59
+ - name: Install elspais
60
+ run: uv pip install --system elspais==0.9.3
61
+ ```
62
+
63
+ **Note:** For regulated/medical software projects, always pin the exact version for reproducibility.
64
+
33
65
  ## Quick Start
34
66
 
35
67
  ### Initialize a Repository
@@ -146,22 +178,28 @@ See [docs/configuration.md](docs/configuration.md) for full reference.
146
178
  elspais expects requirements in Markdown format:
147
179
 
148
180
  ```markdown
149
- ### REQ-d00001: Requirement Title
181
+ # REQ-d00001: Requirement Title
182
+
183
+ **Level**: Dev | **Status**: Active | **Implements**: REQ-p00001
150
184
 
151
- **Level**: Dev | **Implements**: p00001 | **Status**: Active
185
+ ## Assertions
152
186
 
153
- The system SHALL provide user authentication.
187
+ A. The system SHALL provide user authentication via email/password.
188
+ B. Sessions SHALL expire after 30 minutes of inactivity.
154
189
 
155
- **Rationale**: Security requires identity verification.
190
+ ## Rationale
156
191
 
157
- **Acceptance Criteria**:
158
- - Users can log in with email/password
159
- - Session expires after 30 minutes of inactivity
192
+ Security requires identity verification.
160
193
 
161
194
  *End* *Requirement Title* | **Hash**: a1b2c3d4
162
195
  ---
163
196
  ```
164
197
 
198
+ Key format elements:
199
+ - **Assertions section**: Labeled A-Z, each using SHALL for normative statements
200
+ - **One-way traceability**: Children reference parents via `Implements:`
201
+ - **Hash footer**: SHA-256 hash for change detection
202
+
165
203
  ## ID Pattern Examples
166
204
 
167
205
  elspais supports multiple ID formats:
@@ -289,19 +327,23 @@ Options:
289
327
  --help Show help
290
328
 
291
329
  Commands:
292
- validate Validate requirements format, links, hashes
293
- trace Generate traceability matrix
294
- hash Manage requirement hashes (verify, update)
295
- index Validate or regenerate INDEX.md
296
- analyze Analyze requirement hierarchy
297
- edit Edit requirements in-place (status, implements, move)
298
- config View and modify configuration
299
- rules View and manage content rules
300
- mcp MCP server commands (requires elspais[mcp])
301
- version Show version and check for updates
302
- init Create .elspais.toml configuration
330
+ validate Validate requirements format, links, hashes
331
+ trace Generate traceability matrix
332
+ hash Manage requirement hashes (verify, update)
333
+ reformat-with-claude Transform requirements using AI (Acceptance Criteria → Assertions)
334
+ changed Detect git changes to spec files
335
+ analyze Analyze requirement hierarchy
336
+ edit Edit requirements in-place (status, implements, move)
337
+ config View and modify configuration
338
+ rules View and manage content rules
339
+ index Validate or regenerate INDEX.md
340
+ init Create .elspais.toml configuration
341
+ mcp MCP server commands (requires elspais[mcp])
342
+ version Show version and check for updates
303
343
  ```
304
344
 
345
+ See [docs/commands.md](docs/commands.md) for comprehensive command documentation.
346
+
305
347
  ## Development
306
348
 
307
349
  ```bash