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.
- elspais-0.11.0/CHANGELOG.md +174 -0
- {elspais-0.9.1 → elspais-0.11.0}/PKG-INFO +78 -26
- {elspais-0.9.1 → elspais-0.11.0}/README.md +62 -20
- elspais-0.11.0/docs/commands.md +672 -0
- {elspais-0.9.1 → elspais-0.11.0}/docs/multi-repo.md +35 -8
- elspais-0.11.0/docs/roadmap/llm-reformatting-integration.md +113 -0
- elspais-0.11.0/docs/roadmap/new-format.md +193 -0
- elspais-0.11.0/docs/roadmap/plantuml-diagram-support.md +90 -0
- elspais-0.11.0/docs/roadmap/requirements-format-enhancements.md +160 -0
- {elspais-0.9.1 → elspais-0.11.0}/docs/rules.md +18 -0
- elspais-0.11.0/docs/trace-view.md +316 -0
- {elspais-0.9.1 → elspais-0.11.0}/pyproject.toml +20 -7
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/cli.py +123 -1
- elspais-0.11.0/src/elspais/commands/changed.py +160 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/hash_cmd.py +72 -26
- elspais-0.11.0/src/elspais/commands/reformat_cmd.py +458 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/trace.py +157 -3
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/validate.py +81 -18
- elspais-0.11.0/src/elspais/core/git.py +352 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/models.py +2 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/parser.py +68 -24
- elspais-0.11.0/src/elspais/reformat/__init__.py +50 -0
- elspais-0.11.0/src/elspais/reformat/detector.py +119 -0
- elspais-0.11.0/src/elspais/reformat/hierarchy.py +246 -0
- elspais-0.11.0/src/elspais/reformat/line_breaks.py +220 -0
- elspais-0.11.0/src/elspais/reformat/prompts.py +123 -0
- elspais-0.11.0/src/elspais/reformat/transformer.py +264 -0
- elspais-0.11.0/src/elspais/sponsors/__init__.py +432 -0
- elspais-0.11.0/src/elspais/trace_view/__init__.py +54 -0
- elspais-0.11.0/src/elspais/trace_view/coverage.py +183 -0
- elspais-0.11.0/src/elspais/trace_view/generators/__init__.py +12 -0
- elspais-0.11.0/src/elspais/trace_view/generators/base.py +329 -0
- elspais-0.11.0/src/elspais/trace_view/generators/csv.py +122 -0
- elspais-0.11.0/src/elspais/trace_view/generators/markdown.py +175 -0
- elspais-0.11.0/src/elspais/trace_view/html/__init__.py +31 -0
- elspais-0.11.0/src/elspais/trace_view/html/generator.py +1006 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/base.html +283 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/components/code_viewer_modal.html +14 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/components/file_picker_modal.html +20 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/components/legend_modal.html +69 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/components/review_panel.html +118 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/help/help-panel.json +244 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/help/onboarding.json +77 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/help/tooltips.json +237 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-comments.js +928 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-data.js +961 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-help.js +679 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-init.js +177 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-line-numbers.js +429 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-packages.js +1029 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-position.js +540 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-resize.js +115 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-status.js +659 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review/review-sync.js +992 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/review-styles.css +2238 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/scripts.js +1741 -0
- elspais-0.11.0/src/elspais/trace_view/html/templates/partials/styles.css +1756 -0
- elspais-0.11.0/src/elspais/trace_view/models.py +353 -0
- elspais-0.11.0/src/elspais/trace_view/review/__init__.py +60 -0
- elspais-0.11.0/src/elspais/trace_view/review/branches.py +1149 -0
- elspais-0.11.0/src/elspais/trace_view/review/models.py +1205 -0
- elspais-0.11.0/src/elspais/trace_view/review/position.py +609 -0
- elspais-0.11.0/src/elspais/trace_view/review/server.py +1056 -0
- elspais-0.11.0/src/elspais/trace_view/review/status.py +470 -0
- elspais-0.11.0/src/elspais/trace_view/review/storage.py +1367 -0
- elspais-0.11.0/src/elspais/trace_view/scanning.py +213 -0
- elspais-0.11.0/src/elspais/trace_view/specs/README.md +84 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00001-template-architecture.md +36 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00002-css-extraction.md +37 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00003-js-extraction.md +43 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00004-build-embedding.md +40 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00005-test-format.md +78 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00010-review-data-models.md +33 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00011-review-storage.md +33 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00012-position-resolution.md +33 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00013-git-branches.md +31 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00014-review-api-server.md +31 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00015-status-modifier.md +27 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-d00016-js-integration.md +33 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-p00001-html-generator.md +33 -0
- elspais-0.11.0/src/elspais/trace_view/specs/tv-p00002-review-system.md +29 -0
- elspais-0.11.0/tests/test_git.py +292 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_parser_resilience.py +216 -0
- elspais-0.11.0/tests/test_sponsors.py +491 -0
- elspais-0.11.0/tests/test_trace_view/__init__.py +1 -0
- elspais-0.11.0/tests/test_trace_view/test_integration.py +225 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_validate_json.py +132 -1
- elspais-0.9.1/CHANGELOG.md +0 -74
- {elspais-0.9.1 → elspais-0.11.0}/.gitignore +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/LICENSE +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/docs/configuration.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/docs/patterns.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/__main__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/analyze.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/config_cmd.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/edit.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/index.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/init.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/commands/rules_cmd.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/config/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/config/defaults.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/config/loader.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/content_rules.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/hasher.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/patterns.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/core/rules.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/__main__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/context.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/serializers.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/mcp/server.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/config.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/mapper.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/result_parser.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/src/elspais/testing/scanner.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/conftest.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/assertions/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/assertions/spec/dev-impl.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/assertions/spec/prd-sample.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/associated-repo/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/associated-repo/spec/dev-sponsor.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/associated-repo/spec/prd-sponsor.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/fda-style/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/fda-style/spec/dev-impl.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/fda-style/spec/prd-core.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/database/schema.sql +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/INDEX.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/dev-impl.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/ops-deploy.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/hht-like/spec/prd-core.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/broken-links/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/broken-links/spec/broken.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/circular-deps/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/circular-deps/spec/circular.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/missing-hash/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/invalid/missing-hash/spec/missing.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/jira-style/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/jira-style/requirements/features.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/named-reqs/.elspais.toml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/fixtures/named-reqs/spec/features.md +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/mcp/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/mcp/test_context.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/mcp/test_serializers.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_config.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_content_rules.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_doc_sync.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_edit.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_hash_bugs.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_hasher.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_models.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_parser.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_patterns.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/test_rules.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/testing/__init__.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/testing/fixtures/junit_results.xml +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/testing/fixtures/pytest_results.json +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/testing/fixtures/sample_test.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/testing/test_config.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/testing/test_mapper.py +0 -0
- {elspais-0.9.1 → elspais-0.11.0}/tests/testing/test_result_parser.py +0 -0
- {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
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: elspais
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.0
|
|
4
4
|
Summary: Requirements validation and traceability tools - L-Space connects all libraries
|
|
5
|
-
|
|
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
|
-
|
|
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
|
-
|
|
230
|
+
# REQ-d00001: Requirement Title
|
|
231
|
+
|
|
232
|
+
**Level**: Dev | **Status**: Active | **Implements**: REQ-p00001
|
|
189
233
|
|
|
190
|
-
|
|
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
|
-
|
|
239
|
+
## Rationale
|
|
195
240
|
|
|
196
|
-
|
|
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
|
|
332
|
-
trace
|
|
333
|
-
hash
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
init
|
|
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
|
-
|
|
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
|
-
|
|
181
|
+
# REQ-d00001: Requirement Title
|
|
182
|
+
|
|
183
|
+
**Level**: Dev | **Status**: Active | **Implements**: REQ-p00001
|
|
150
184
|
|
|
151
|
-
|
|
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
|
-
|
|
190
|
+
## Rationale
|
|
156
191
|
|
|
157
|
-
|
|
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
|
|
293
|
-
trace
|
|
294
|
-
hash
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
init
|
|
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
|