requirements-as-code 0.7.2__tar.gz → 0.7.13__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.
- requirements_as_code-0.7.13/.DS_Store +0 -0
- requirements_as_code-0.7.13/.github/workflows/ci.yml +20 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/.github/workflows/python-publish.yml +6 -0
- requirements_as_code-0.7.13/.github/workflows/tests.yml +78 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/.gitignore +3 -0
- requirements_as_code-0.7.13/.rac/config.yaml +1 -0
- requirements_as_code-0.7.13/CHANGELOG.md +173 -0
- requirements_as_code-0.7.13/CONTRIBUTING.md +78 -0
- requirements_as_code-0.7.13/PKG-INFO +138 -0
- requirements_as_code-0.7.13/README.md +97 -0
- requirements_as_code-0.7.13/docs/artifacts.md +112 -0
- requirements_as_code-0.7.13/docs/cli.md +559 -0
- requirements_as_code-0.7.13/docs/examples.md +141 -0
- requirements_as_code-0.7.13/docs/quickstart.md +134 -0
- requirements_as_code-0.7.13/docs/relationships.md +85 -0
- requirements_as_code-0.7.13/docs/repo-workflow.md +74 -0
- requirements_as_code-0.7.13/docs/testing.md +82 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/pyproject.toml +15 -2
- requirements_as_code-0.7.13/rac/assets/images/rac_explorer_mascot.png +0 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-001-markdown-first.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-002-ai-optional.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-003-structured-outputs-first.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-004-artifact-model.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-005-cli-first.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-006-ingest-over-rewrite.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-007-json-contract-stability.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-008-agent-ready-architecture.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-009-ai-assisted-development.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-010-documents-are-not-artifacts.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-011-file-first-pipeline.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-012-open-core-strategy.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-013-leverage-existing-source-control-systems.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-014-viewer-agnostic-knowledge-artifacts.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-015-explorer-as-consumer.md +5 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-016-relationships-as-structural-references.md +7 -0
- {requirements_as_code-0.7.2/planning/adr → requirements_as_code-0.7.13/rac/decisions}/adr-017-rac-managed-knowledge-not-work.md +5 -0
- requirements_as_code-0.7.13/rac/decisions/adr-018-rac-directory-as-root.md +318 -0
- requirements_as_code-0.7.13/rac/decisions/adr-019-asset-management.md +196 -0
- requirements_as_code-0.7.13/rac/decisions/adr-020-requirements-as-capabilities.md +289 -0
- requirements_as_code-0.7.13/rac/decisions/adr-021-templates-product-contracts.md +291 -0
- requirements_as_code-0.7.13/rac/decisions/adr-022-documentation-boundaries.md +342 -0
- requirements_as_code-0.7.13/rac/decisions/adr-023-clean-break-internal-refactors.md +202 -0
- requirements_as_code-0.7.13/rac/decisions/adr-024-rac-not-content-store.md +330 -0
- requirements_as_code-0.7.13/rac/decisions/adr-025-hybrid-artifact-metadata.md +332 -0
- requirements_as_code-0.7.13/rac/decisions/adr-026-opaque-artifact-identities.md +392 -0
- requirements_as_code-0.7.13/rac/decisions/adr-027-ci-test-topology.md +222 -0
- requirements_as_code-0.7.13/rac/decisions/adr-028-explorer-surface.md +140 -0
- requirements_as_code-0.7.13/rac/designs/explorer-action-workflows.md +101 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac}/designs/explorer-command-surface.md +9 -5
- requirements_as_code-0.7.13/rac/designs/explorer-editor-integrations.md +88 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac}/designs/explorer-first-run-experience.md +8 -3
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac}/designs/explorer-health-model.md +9 -4
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac}/designs/explorer-import-workflow.md +8 -3
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac}/designs/explorer-knowledge-graph.md +8 -3
- requirements_as_code-0.7.13/rac/designs/explorer-mascot-animations.md +216 -0
- requirements_as_code-0.7.13/rac/designs/explorer-mascot-interaction.md +175 -0
- requirements_as_code-0.7.13/rac/designs/explorer-mascot.md +182 -0
- requirements_as_code-0.7.13/rac/designs/explorer-recommendations.md +107 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac}/designs/explorer-visual-system.md +6 -1
- requirements_as_code-0.7.13/rac/prompts/rac-agent-commit-guidelines.md +271 -0
- requirements_as_code-0.7.13/rac/prompts/rac-agent-pr-guidelines.md +228 -0
- requirements_as_code-0.7.13/rac/prompts/rac-agent-simplification-guidelines.md +80 -0
- requirements_as_code-0.7.13/rac/requirements/rac-documentation-structure.md +303 -0
- requirements_as_code-0.7.13/rac/requirements/rac-product-intent-ci-watchkeeper.md +529 -0
- requirements_as_code-0.7.13/rac/requirements/rac-product-knowledge-navigator-explorer.md +327 -0
- requirements_as_code-0.7.13/rac/requirements/rac-repository-review-mode.md +236 -0
- requirements_as_code-0.7.13/rac/requirements/rac-trust-transparency.md +175 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/archive/v0.5-decisions.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/archive/v0.7-prompts.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.2.x-stats}/v0.2-stats.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.3.x-inspect}/v0.3-ingest.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.3.x-inspect}/v0.3.1-formats.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.4.x-intelligence}/v0.4-inspect.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.4.x-intelligence}/v0.4.1-expansion.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.4.x-intelligence}/v0.4.1-inspect-expansion.md +9 -4
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.4.x-intelligence}/v0.4.2-decision-metadata.md +6 -1
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.5.x-awareness}/v0.5.0-artifact-improvement.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.5.x-awareness}/v0.5.1-guided-improvement.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.5.x-awareness}/v0.5.2-schema.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.6.x-relationships}/v0.6.0-roadmap-artifacts.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.6.x-relationships}/v0.6.1-roadmap-improvement.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.6.x-relationships}/v0.6.2-prompt-artifact.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.6.x-relationships}/v0.6.3-design-artifacts.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust}/v0.7.0-relationship-metadata.md +5 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust}/v0.7.1-relationship-inspection.md +10 -5
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.10-artifact-templates.md +608 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.11-hybrid-metadata-system-identity.md +399 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.12-lookup-and-resolution.md +505 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.13-metadata-migration.md +214 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust}/v0.7.2-relationship-validation.md +10 -5
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.4-internal-refactor.md +200 -0
- requirements_as_code-0.7.2/planning/roadmap/v0.7.4-repo-indexing.md → requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.5-repo-indexing.md +17 -10
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.6-document-structure.md +217 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.7-readme-simplification.md +130 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.8-repo-trust.md +149 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust/v0.7.9-repository-review.md +142 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.8.0-service-api.md +6 -1
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.8.1-repository-model.md +7 -2
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.8.2-interactive-runtime-readiness.md +7 -2
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.8.3-integration-freeze.md +7 -2
- requirements_as_code-0.7.13/rac/roadmaps/v0.8.x-explorer/v0.8.0-explorer-foundation.md +0 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.8.x-explorer/v0.8.1-explorer-navigation.md +0 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.8.x-explorer/v0.8.2-explorer-health.md +0 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.8.x-explorer/v0.8.3-explorer-recommendations.md +0 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.8.x-explorer/v0.8.4-explorer-action-workflow.md +25 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.8.x-explorer/v0.8.5-explorer-relationship-navigation.md +23 -0
- requirements_as_code-0.7.13/rac/roadmaps/v0.8.x-explorer/v0.8.6-explorer-maturity.md +25 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.9.0-explorer-foundation.md +13 -1
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.9.1-explorer-experience.md +13 -1
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.9.2-knowledge-operations.md +13 -2
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps}/v0.9.3-intelligence-views.md +8 -3
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13/src}/rac/__init__.py +1 -1
- requirements_as_code-0.7.13/src/rac/cli.py +925 -0
- requirements_as_code-0.7.13/src/rac/core/__init__.py +6 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/core}/artifacts.py +5 -5
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/core}/classification.py +2 -2
- requirements_as_code-0.7.13/src/rac/core/frontmatter.py +225 -0
- requirements_as_code-0.7.13/src/rac/core/identity.py +135 -0
- requirements_as_code-0.7.13/src/rac/core/idgen.py +51 -0
- requirements_as_code-0.7.2/rac/parser.py → requirements_as_code-0.7.13/src/rac/core/markdown.py +35 -7
- requirements_as_code-0.7.13/src/rac/core/metadata.py +56 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/core}/models.py +11 -2
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/core}/schema.py +1 -1
- requirements_as_code-0.7.13/src/rac/core/templates.py +62 -0
- requirements_as_code-0.7.2/rac/validate.py → requirements_as_code-0.7.13/src/rac/core/validation.py +34 -7
- requirements_as_code-0.7.13/src/rac/explorer/__init__.py +8 -0
- requirements_as_code-0.7.13/src/rac/output/__init__.py +104 -0
- requirements_as_code-0.7.13/src/rac/output/_shared.py +27 -0
- requirements_as_code-0.7.2/rac/outputs.py → requirements_as_code-0.7.13/src/rac/output/human.py +348 -237
- requirements_as_code-0.7.13/src/rac/output/json.py +305 -0
- requirements_as_code-0.7.13/src/rac/output/templates.py +48 -0
- requirements_as_code-0.7.13/src/rac/services/__init__.py +8 -0
- requirements_as_code-0.7.13/src/rac/services/create.py +169 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/services}/diff.py +2 -2
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/services}/improve.py +5 -5
- requirements_as_code-0.7.13/src/rac/services/index.py +102 -0
- requirements_as_code-0.7.13/src/rac/services/init.py +146 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/services}/inspect.py +7 -6
- requirements_as_code-0.7.13/src/rac/services/migrate.py +171 -0
- requirements_as_code-0.7.13/src/rac/services/portfolio.py +260 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/services}/relationships.py +196 -84
- requirements_as_code-0.7.13/src/rac/services/resolve.py +164 -0
- requirements_as_code-0.7.13/src/rac/services/review.py +195 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/services}/stats.py +46 -8
- requirements_as_code-0.7.13/src/rac/services/validate.py +128 -0
- requirements_as_code-0.7.13/src/rac/templates/__init__.py +8 -0
- requirements_as_code-0.7.13/src/rac/templates/decision.md +43 -0
- requirements_as_code-0.7.13/src/rac/templates/design.md +64 -0
- requirements_as_code-0.7.13/src/rac/templates/prompt.md +49 -0
- requirements_as_code-0.7.13/src/rac/templates/requirement.md +36 -0
- requirements_as_code-0.7.13/src/rac/templates/roadmap.md +34 -0
- requirements_as_code-0.7.13/src/requirements_as_code.egg-info/PKG-INFO +138 -0
- requirements_as_code-0.7.13/src/requirements_as_code.egg-info/SOURCES.txt +300 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13/src}/requirements_as_code.egg-info/requires.txt +1 -0
- requirements_as_code-0.7.13/tests/fixtures/migrate/.rac/config.yaml +1 -0
- requirements_as_code-0.7.13/tests/fixtures/migrate/adr-001-legacy.md +13 -0
- requirements_as_code-0.7.13/tests/fixtures/migrate/canonical.md +18 -0
- requirements_as_code-0.7.13/tests/fixtures/migrate/notes.md +3 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/all_types/adr.md +13 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/all_types/design.md +17 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/all_types/prompt.md +17 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/all_types/req.md +17 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/all_types/roadmap.md +9 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/all_types/unknown.md +3 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/broken_rels/source.md +13 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/invalid_known/req-no-title.md +19 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/unknown_only/unknown.md +3 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/valid_clean/adr-001.md +25 -0
- requirements_as_code-0.7.13/tests/fixtures/portfolio_summary/valid_clean/req-001.md +26 -0
- requirements_as_code-0.7.13/tests/fixtures/resolve/markdown-first.md +22 -0
- requirements_as_code-0.7.13/tests/fixtures/resolve/v0-canonical-format.md +9 -0
- requirements_as_code-0.7.13/tests/golden/diff_human.txt +29 -0
- requirements_as_code-0.7.13/tests/golden/diff_json.txt +35 -0
- requirements_as_code-0.7.13/tests/golden/find_human.txt +3 -0
- requirements_as_code-0.7.13/tests/golden/find_json.txt +14 -0
- requirements_as_code-0.7.13/tests/golden/migrate_dry_run_human.txt +9 -0
- requirements_as_code-0.7.13/tests/golden/migrate_dry_run_json.txt +32 -0
- requirements_as_code-0.7.13/tests/golden/relationships_resolved_human.txt +12 -0
- requirements_as_code-0.7.13/tests/golden/resolve_human.txt +5 -0
- requirements_as_code-0.7.13/tests/golden/resolve_json.txt +7 -0
- requirements_as_code-0.7.13/tests/golden/resolve_not_found_json.txt +5 -0
- requirements_as_code-0.7.13/tests/golden/review_human.txt +51 -0
- requirements_as_code-0.7.13/tests/golden/review_json.txt +86 -0
- requirements_as_code-0.7.13/tests/golden/schema_requirement_human.txt +40 -0
- requirements_as_code-0.7.13/tests/golden/schema_requirement_template.txt +37 -0
- requirements_as_code-0.7.13/tests/golden/stats_human.txt +27 -0
- requirements_as_code-0.7.13/tests/golden/stats_json.txt +43 -0
- requirements_as_code-0.7.13/tests/golden/templates_human.txt +7 -0
- requirements_as_code-0.7.13/tests/golden/templates_json.txt +10 -0
- requirements_as_code-0.7.13/tests/golden/validate_dir_human.txt +5 -0
- requirements_as_code-0.7.13/tests/golden/validate_dir_json.txt +84 -0
- requirements_as_code-0.7.13/tests/golden/validate_invalid_human.txt +9 -0
- requirements_as_code-0.7.13/tests/golden/validate_invalid_json.txt +26 -0
- requirements_as_code-0.7.13/tests/golden/validate_valid_human.txt +3 -0
- requirements_as_code-0.7.13/tests/golden/validate_valid_json.txt +6 -0
- requirements_as_code-0.7.13/tests/test_create.py +266 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_decision_metadata.py +8 -8
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_design.py +10 -10
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_diff.py +2 -2
- requirements_as_code-0.7.13/tests/test_dogfood.py +43 -0
- requirements_as_code-0.7.13/tests/test_frontmatter.py +208 -0
- requirements_as_code-0.7.13/tests/test_golden.py +83 -0
- requirements_as_code-0.7.13/tests/test_identity.py +41 -0
- requirements_as_code-0.7.13/tests/test_idgen.py +62 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_improve.py +7 -7
- requirements_as_code-0.7.13/tests/test_index.py +210 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_ingest.py +3 -3
- requirements_as_code-0.7.13/tests/test_init.py +121 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_inspect.py +10 -10
- requirements_as_code-0.7.13/tests/test_metadata_identity.py +134 -0
- requirements_as_code-0.7.13/tests/test_migrate.py +220 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_parser.py +1 -1
- requirements_as_code-0.7.13/tests/test_portfolio.py +337 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_prompt.py +10 -10
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_relationship_validation.py +3 -31
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_relationships.py +6 -6
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_relationships_cmd.py +1 -1
- requirements_as_code-0.7.13/tests/test_resolve.py +324 -0
- requirements_as_code-0.7.13/tests/test_review.py +205 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_roadmap.py +10 -10
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_schema.py +2 -2
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_stats.py +71 -1
- requirements_as_code-0.7.13/tests/test_templates.py +71 -0
- requirements_as_code-0.7.13/tests/test_validate.py +198 -0
- requirements_as_code-0.7.2/PKG-INFO +0 -1000
- requirements_as_code-0.7.2/README.md +0 -960
- requirements_as_code-0.7.2/rac/cli.py +0 -483
- requirements_as_code-0.7.2/requirements_as_code.egg-info/PKG-INFO +0 -1000
- requirements_as_code-0.7.2/requirements_as_code.egg-info/SOURCES.txt +0 -164
- requirements_as_code-0.7.2/tests/test_validate.py +0 -99
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/LICENSE +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/examples/example_dashboard_v1.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/examples/example_dashboard_v2.md +0 -0
- {requirements_as_code-0.7.2/planning/prompt → requirements_as_code-0.7.13/rac/prompts}/rac-agent-compression.md +0 -0
- {requirements_as_code-0.7.2/planning/prompt → requirements_as_code-0.7.13/rac/prompts}/rac-agent-instructions.md +0 -0
- {requirements_as_code-0.7.2/planning/prompt → requirements_as_code-0.7.13/rac/prompts}/rac-agent-release-gate-major.md +0 -0
- {requirements_as_code-0.7.2/planning/prompt → requirements_as_code-0.7.13/rac/prompts}/rac-agent-release-gate-minor.md +0 -0
- {requirements_as_code-0.7.2/planning/prompt → requirements_as_code-0.7.13/rac/prompts}/rac-agent-session-start.md +0 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac/roadmaps}/future/v1.0-workspace-analysis.md +0 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac/roadmaps}/future/v1.1-review-engine.md +0 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac/roadmaps}/future/v1.2-mcp-server.md +0 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac/roadmaps}/future/v1.4-claude-skills.md +0 -0
- {requirements_as_code-0.7.2/planning → requirements_as_code-0.7.13/rac/roadmaps}/future/v1.4-python-sdk.md +0 -0
- {requirements_as_code-0.7.2/planning/roadmap → requirements_as_code-0.7.13/rac/roadmaps/v0.7.x-trust}/v0.7.3-repo-intelligence.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/setup.cfg +0 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/core}/fs.py +0 -0
- {requirements_as_code-0.7.2/rac → requirements_as_code-0.7.13/src/rac/services}/ingest.py +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13/src}/requirements_as_code.egg-info/dependency_links.txt +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13/src}/requirements_as_code.egg-info/entry_points.txt +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13/src}/requirements_as_code.egg-info/top_level.txt +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/conftest.py +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/decision/bad_category.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/decision/bad_status.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/decision/minimal.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/decision/portfolio/01_accepted_arch.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/decision/portfolio/02_proposed_process.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/decision/portfolio/03_no_metadata.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/decision/with_metadata.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/design/minimal.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/design/missing_constraints.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/design/valid.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/diff/new.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/diff/old.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/ingest/sample.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/inspect/ambiguous.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/inspect/decision.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/inspect/nested/another_requirement.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/inspect/requirement.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/duplicate_ids.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/empty_req_text.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/malformed_id.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/missing_id.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/missing_problem.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/missing_requirements.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/missing_title.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/invalid/multiple_titles.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/no_relationships/decision.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/no_relationships/requirement.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/portfolio/broken.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/portfolio/feature_a.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/portfolio/feature_b.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/portfolio/sub/feature_c.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/prompt/minimal.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/prompt/missing_output.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/prompt/valid.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/ambiguous_target/adr-004-alt.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/ambiguous_target/adr-004.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/ambiguous_target/req-001.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/broken/search.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/duplicate/adr-004-alt.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/duplicate/adr-004.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/resolved/adr-004.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/resolved/req-001.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/resolved/roadmap-q3.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationship_validation/self_reference/adr-004.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationships/decision_with_links.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationships/design_with_links.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationships/prompt_with_links.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationships/requirement_with_links.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/relationships/roadmap_with_links.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/roadmap/minimal.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/roadmap/missing_initiatives.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/roadmap/valid.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/valid/bullet_requirements.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/valid/feature.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/valid/minimal.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/fixtures/valid/warnings.md +0 -0
- {requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/tests/test_cli.py +0 -0
|
Binary file
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
# Run the test suite only when changes land on main (a merged PR or a direct
|
|
4
|
+
# push). Tests intentionally do NOT run on pull requests — see ADR-027 for the
|
|
5
|
+
# trigger policy and its post-merge-feedback tradeoff. workflow_dispatch allows
|
|
6
|
+
# running the full battery grid manually (e.g. to check a branch before merge).
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [main]
|
|
10
|
+
workflow_dispatch:
|
|
11
|
+
|
|
12
|
+
# Serialize runs on the same ref. Don't cancel an in-progress run: every merge
|
|
13
|
+
# to main should be fully tested, since these runs are what gate releases.
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ci-${{ github.ref }}
|
|
16
|
+
cancel-in-progress: false
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
tests:
|
|
20
|
+
uses: ./.github/workflows/tests.yml
|
{requirements_as_code-0.7.2 → requirements_as_code-0.7.13}/.github/workflows/python-publish.yml
RENAMED
|
@@ -16,7 +16,13 @@ permissions:
|
|
|
16
16
|
contents: read
|
|
17
17
|
|
|
18
18
|
jobs:
|
|
19
|
+
test:
|
|
20
|
+
# Gate the release on the full test suite (reusable workflow). Tests must
|
|
21
|
+
# pass before anything is built or published.
|
|
22
|
+
uses: ./.github/workflows/tests.yml
|
|
23
|
+
|
|
19
24
|
release-build:
|
|
25
|
+
needs: test
|
|
20
26
|
runs-on: ubuntu-latest
|
|
21
27
|
|
|
22
28
|
steps:
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
# Reusable workflow — the single definition of how RAC's test suite runs.
|
|
4
|
+
# Called by ci.yml (push to main) and by python-publish.yml (release gate),
|
|
5
|
+
# so the test steps live in one place rather than being duplicated.
|
|
6
|
+
#
|
|
7
|
+
# Tests are split into one "battery" per .py service (plus grouped core / cli /
|
|
8
|
+
# artifacts) and run across every supported Python version, so the Actions UI
|
|
9
|
+
# names the service + version that failed (e.g. "relationships (py3.11)")
|
|
10
|
+
# instead of a single opaque "pytest (3.11)". See ADR-027.
|
|
11
|
+
|
|
12
|
+
on:
|
|
13
|
+
workflow_call:
|
|
14
|
+
|
|
15
|
+
permissions:
|
|
16
|
+
contents: read
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
pytest:
|
|
20
|
+
name: ${{ matrix.battery.name }} (py${{ matrix.python-version }})
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
strategy:
|
|
23
|
+
fail-fast: false
|
|
24
|
+
matrix:
|
|
25
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
26
|
+
# One battery per .py service, plus grouped core / cli / artifacts.
|
|
27
|
+
# Every tests/test_*.py belongs to exactly one battery (no orphans).
|
|
28
|
+
battery:
|
|
29
|
+
- name: core
|
|
30
|
+
paths: "tests/test_validate.py tests/test_parser.py tests/test_schema.py tests/test_identity.py"
|
|
31
|
+
- name: cli
|
|
32
|
+
paths: "tests/test_cli.py"
|
|
33
|
+
- name: artifacts
|
|
34
|
+
paths: "tests/test_design.py tests/test_roadmap.py tests/test_prompt.py tests/test_decision_metadata.py"
|
|
35
|
+
- name: diff
|
|
36
|
+
paths: "tests/test_diff.py"
|
|
37
|
+
- name: improve
|
|
38
|
+
paths: "tests/test_improve.py"
|
|
39
|
+
- name: index
|
|
40
|
+
paths: "tests/test_index.py"
|
|
41
|
+
- name: ingest
|
|
42
|
+
paths: "tests/test_ingest.py"
|
|
43
|
+
- name: inspect
|
|
44
|
+
paths: "tests/test_inspect.py"
|
|
45
|
+
- name: portfolio
|
|
46
|
+
paths: "tests/test_portfolio.py"
|
|
47
|
+
- name: relationships
|
|
48
|
+
paths: "tests/test_relationships.py tests/test_relationships_cmd.py tests/test_relationship_validation.py"
|
|
49
|
+
- name: review
|
|
50
|
+
paths: "tests/test_review.py"
|
|
51
|
+
- name: stats
|
|
52
|
+
paths: "tests/test_stats.py"
|
|
53
|
+
# Trust gates (v0.7.9): dogfood validates RAC's own rac/ corpus,
|
|
54
|
+
# golden pins CLI stdout byte-for-byte against committed files.
|
|
55
|
+
- name: dogfood
|
|
56
|
+
paths: "tests/test_dogfood.py"
|
|
57
|
+
- name: golden
|
|
58
|
+
paths: "tests/test_golden.py"
|
|
59
|
+
steps:
|
|
60
|
+
- uses: actions/checkout@v4
|
|
61
|
+
with:
|
|
62
|
+
# setuptools-scm derives the version from git tags; fetch them so the
|
|
63
|
+
# editable install can resolve a version (mirrors python-publish.yml).
|
|
64
|
+
fetch-depth: 0
|
|
65
|
+
|
|
66
|
+
- uses: actions/setup-python@v5
|
|
67
|
+
with:
|
|
68
|
+
python-version: ${{ matrix.python-version }}
|
|
69
|
+
|
|
70
|
+
- name: Install package with dev/test extras
|
|
71
|
+
run: |
|
|
72
|
+
python -m pip install --upgrade pip
|
|
73
|
+
# The dev extra pulls pytest plus the document libraries that
|
|
74
|
+
# tests/test_ingest.py uses to generate fixtures.
|
|
75
|
+
python -m pip install -e .[dev]
|
|
76
|
+
|
|
77
|
+
- name: Run ${{ matrix.battery.name }} battery
|
|
78
|
+
run: python -m pytest -q ${{ matrix.battery.paths }}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
repository_key: RAC
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
User-visible changes to RAC, by release. Follows the spirit of
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/): user impact over implementation
|
|
5
|
+
details, release history over commit history.
|
|
6
|
+
|
|
7
|
+
## Unreleased
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- `rac migrate metadata <directory>` — migrate existing recognized artifacts
|
|
12
|
+
onto canonical frontmatter identity: idempotent, byte-preserving, with
|
|
13
|
+
`--dry-run` preview; unrecognized documents are reported, never guessed at
|
|
14
|
+
(v0.7.13).
|
|
15
|
+
|
|
16
|
+
- `rac resolve <ID>` — resolve any artifact ID (canonical or legacy alias) to
|
|
17
|
+
its type, title, and path; duplicates are reported with every path, never
|
|
18
|
+
silently resolved (v0.7.12).
|
|
19
|
+
- `rac find <query>` — deterministic artifact search by ID, title, filename,
|
|
20
|
+
or path, with `--type` filtering and JSON output (v0.7.12).
|
|
21
|
+
- `rac relationships` human output resolves references to human-friendly
|
|
22
|
+
labels — `Title (type · ID)` — while JSON keeps stored references unchanged
|
|
23
|
+
(v0.7.12).
|
|
24
|
+
- `rac index` entries gain an additive `aliases` field: every identifier an
|
|
25
|
+
artifact answers to, canonical first (v0.7.12).
|
|
26
|
+
|
|
27
|
+
- `rac init` — establish the repository identity namespace
|
|
28
|
+
(`.rac/config.yaml` with a `repository_key`); idempotent, and an
|
|
29
|
+
established key is never silently changed (v0.7.11).
|
|
30
|
+
- Hybrid artifact metadata: a leading YAML frontmatter block
|
|
31
|
+
(`schema_version`, `id`, `type`, `relationships`) is parsed, strictly
|
|
32
|
+
schema-validated, and exposed as canonical machine-operational metadata;
|
|
33
|
+
artifacts without frontmatter remain fully supported (v0.7.11).
|
|
34
|
+
- System-assigned opaque artifact IDs (e.g. `RAC-01JY4M8X2QZ7`): branch-safe,
|
|
35
|
+
offline, stable across renames, moves, and type changes; `rac new` assigns
|
|
36
|
+
one automatically and `rac index` reports it (v0.7.11).
|
|
37
|
+
- Identity validation: conflicting frontmatter/legacy identity and duplicate
|
|
38
|
+
canonical IDs are deterministic errors — RAC never silently picks one
|
|
39
|
+
(v0.7.11).
|
|
40
|
+
- Relationship references resolve against legacy identity aliases (`## ID`
|
|
41
|
+
values, filename prefixes, stems), so adopting canonical IDs does not break
|
|
42
|
+
existing human-readable references; RAC's own corpus now carries canonical
|
|
43
|
+
frontmatter identity (v0.7.11).
|
|
44
|
+
- `rac new <type> <output-path>` — create a valid artifact from its canonical
|
|
45
|
+
bundled template; deterministic, AI-free, and never overwrites an existing
|
|
46
|
+
file (v0.7.10).
|
|
47
|
+
- `rac templates` — list the canonical artifact templates available to
|
|
48
|
+
`rac new`, with `--json` for tools (v0.7.10).
|
|
49
|
+
- `rac validate <directory>` — validate every recognized artifact in a tree in
|
|
50
|
+
one command; unrecognized documents are skipped, not failed.
|
|
51
|
+
- `rac review <directory>` — full repository review: validation, relationship
|
|
52
|
+
integrity, and completeness as one prioritized worklist (invalid artifacts
|
|
53
|
+
first, then broken relationships, then advisory findings), each finding with
|
|
54
|
+
a concrete suggested action. Exits `1` only on blocking issues.
|
|
55
|
+
- CI trust gates: RAC's own `rac/` corpus must pass `rac validate`,
|
|
56
|
+
`rac relationships --validate`, and `rac review` (dogfood battery), and CLI
|
|
57
|
+
output is pinned byte-for-byte by golden tests.
|
|
58
|
+
- README build badge, "How RAC earns trust" section, CHANGELOG.md, and
|
|
59
|
+
CONTRIBUTING.md.
|
|
60
|
+
- `rac portfolio --json` now lists `artifacts.unknown_paths` (additive).
|
|
61
|
+
- `rac index` — flat artifact inventory (id, type, title, path) for tools and
|
|
62
|
+
agents (v0.7.5).
|
|
63
|
+
|
|
64
|
+
### Changed
|
|
65
|
+
|
|
66
|
+
- Documentation restructured around task-focused guides under `docs/`
|
|
67
|
+
(quickstart, CLI reference, artifacts, relationships, repository workflow,
|
|
68
|
+
testing); README simplified to an overview (v0.7.6–v0.7.7).
|
|
69
|
+
|
|
70
|
+
### Fixed
|
|
71
|
+
|
|
72
|
+
- RAC's own planning corpus now passes its own validation: one invalid roadmap
|
|
73
|
+
repaired and all cross-artifact references resolve.
|
|
74
|
+
|
|
75
|
+
## v0.7.3 — 2026-06-06
|
|
76
|
+
|
|
77
|
+
### Added
|
|
78
|
+
|
|
79
|
+
- `rac portfolio` — one-screen repository intelligence: counts by type,
|
|
80
|
+
validity, completeness, relationship coverage, attention list, health score.
|
|
81
|
+
|
|
82
|
+
## v0.7.2 — 2026-06-06
|
|
83
|
+
|
|
84
|
+
### Added
|
|
85
|
+
|
|
86
|
+
- `rac relationships --validate` — resolve every cross-artifact reference and
|
|
87
|
+
report broken, ambiguous, self-referencing, or duplicate-identifier findings.
|
|
88
|
+
|
|
89
|
+
## v0.7.1 — 2026-06-06
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
|
|
93
|
+
- `rac relationships` — discover and report the explicit references artifacts
|
|
94
|
+
declare to each other.
|
|
95
|
+
|
|
96
|
+
## v0.7.0 — 2026-06-06
|
|
97
|
+
|
|
98
|
+
### Added
|
|
99
|
+
|
|
100
|
+
- Relationship metadata: artifacts can declare `## Related Requirements`,
|
|
101
|
+
`## Related Decisions`, and similar sections that RAC recognizes and counts.
|
|
102
|
+
|
|
103
|
+
## v0.6.3 — 2026-06-05
|
|
104
|
+
|
|
105
|
+
### Added
|
|
106
|
+
|
|
107
|
+
- Design artifact type: validate and inspect product-design documents.
|
|
108
|
+
|
|
109
|
+
## v0.6.2 — 2026-06-05
|
|
110
|
+
|
|
111
|
+
### Added
|
|
112
|
+
|
|
113
|
+
- Prompt artifact type: validate and inspect reusable AI prompts.
|
|
114
|
+
|
|
115
|
+
## v0.6.1 — 2026-06-05
|
|
116
|
+
|
|
117
|
+
### Added
|
|
118
|
+
|
|
119
|
+
- Guided improvement for roadmaps (`rac improve` understands roadmap sections).
|
|
120
|
+
|
|
121
|
+
## v0.6.0 — 2026-06-05
|
|
122
|
+
|
|
123
|
+
### Added
|
|
124
|
+
|
|
125
|
+
- Roadmap artifact type: validate and inspect roadmap documents.
|
|
126
|
+
|
|
127
|
+
## v0.5.2 — 2026-06-05
|
|
128
|
+
|
|
129
|
+
### Added
|
|
130
|
+
|
|
131
|
+
- `rac schema` — show the expected structure of any artifact type, with
|
|
132
|
+
`--template` to emit a starting document.
|
|
133
|
+
|
|
134
|
+
## v0.5.0 — 2026-06-05
|
|
135
|
+
|
|
136
|
+
### Added
|
|
137
|
+
|
|
138
|
+
- `rac improve` — actionable suggestions (and templates) for incomplete
|
|
139
|
+
artifacts.
|
|
140
|
+
|
|
141
|
+
## v0.4.2 — 2026-06-05
|
|
142
|
+
|
|
143
|
+
### Added
|
|
144
|
+
|
|
145
|
+
- Decision (ADR) artifact type with status/category metadata.
|
|
146
|
+
- `rac inspect` — classify a document and report its completeness.
|
|
147
|
+
|
|
148
|
+
## v0.3.1 — 2026-06-04
|
|
149
|
+
|
|
150
|
+
### Added
|
|
151
|
+
|
|
152
|
+
- More ingest formats (HTML, PPTX, XLSX).
|
|
153
|
+
|
|
154
|
+
## v0.3.0 — 2026-06-03
|
|
155
|
+
|
|
156
|
+
### Added
|
|
157
|
+
|
|
158
|
+
- `rac ingest` — convert DOCX/PDF documents into RAC-compatible Markdown.
|
|
159
|
+
|
|
160
|
+
## v0.2.0 — 2026-06-02
|
|
161
|
+
|
|
162
|
+
### Added
|
|
163
|
+
|
|
164
|
+
- `rac stats` — summarize a directory of artifacts: counts, quality signals,
|
|
165
|
+
missing recommended sections.
|
|
166
|
+
|
|
167
|
+
## v0.1.0 – v0.1.3 — 2026-06-01
|
|
168
|
+
|
|
169
|
+
### Added
|
|
170
|
+
|
|
171
|
+
- Initial release: `rac validate` and `rac diff` for requirement documents,
|
|
172
|
+
human and `--json` output, stable exit codes (`0` ok, `1` validation failed,
|
|
173
|
+
`2` usage error).
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Contributing to RAC
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in improving RAC. The project is early and evolving
|
|
4
|
+
quickly — contributions, ideas, and experiments are welcome.
|
|
5
|
+
|
|
6
|
+
## Local setup
|
|
7
|
+
|
|
8
|
+
Requires **Python 3.11+**.
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
git clone https://github.com/tcballard/requirements-as-code.git
|
|
12
|
+
cd requirements-as-code
|
|
13
|
+
python3 -m venv .venv
|
|
14
|
+
source .venv/bin/activate
|
|
15
|
+
pip install -e '.[dev]'
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Verify a change
|
|
19
|
+
|
|
20
|
+
Three commands; all must pass before you open a pull request:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
pytest
|
|
24
|
+
|
|
25
|
+
rac validate rac/
|
|
26
|
+
|
|
27
|
+
rac relationships rac/ --validate
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- `pytest` runs the full suite, including the **dogfood gate** (RAC's own
|
|
31
|
+
planning corpus under `rac/` must pass RAC) and **golden output tests**
|
|
32
|
+
(CLI output is pinned byte-for-byte).
|
|
33
|
+
- If you intentionally changed what the CLI prints, refresh the goldens and
|
|
34
|
+
commit the diff — it will be reviewed as a product change:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
RAC_UPDATE_GOLDEN=1 python -m pytest tests/test_golden.py
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
See [docs/testing.md](docs/testing.md) for test layout, fixtures, and useful
|
|
41
|
+
pytest variations.
|
|
42
|
+
|
|
43
|
+
## Documentation expectations
|
|
44
|
+
|
|
45
|
+
- `docs/` is the public documentation: quickstart, CLI reference, artifact
|
|
46
|
+
types, relationships, repository workflow. If your change alters a command's
|
|
47
|
+
behavior, flags, output, or exit codes, update [docs/cli.md](docs/cli.md) in
|
|
48
|
+
the same pull request.
|
|
49
|
+
- User-visible changes get a line in [CHANGELOG.md](CHANGELOG.md) under
|
|
50
|
+
**Unreleased** — user impact over implementation details.
|
|
51
|
+
- JSON output is a stable, versioned contract: field changes must be additive
|
|
52
|
+
and `schema_version`-gated (see `rac/decisions/`).
|
|
53
|
+
|
|
54
|
+
## RAC artifact expectations
|
|
55
|
+
|
|
56
|
+
The `rac/` directory is RAC's own product knowledge — requirements, decisions
|
|
57
|
+
(ADRs), roadmaps, prompts, and designs — maintained with the same care as code:
|
|
58
|
+
|
|
59
|
+
- Behavior changes that reflect a product decision should trace to an artifact
|
|
60
|
+
under `rac/` (a roadmap initiative or an ADR).
|
|
61
|
+
- Artifacts you add or edit must keep the corpus green: `rac validate rac/`,
|
|
62
|
+
`rac relationships rac/ --validate`, and `rac review rac/` all run in CI.
|
|
63
|
+
|
|
64
|
+
## Commit conventions
|
|
65
|
+
|
|
66
|
+
Follow [`rac/prompts/rac-agent-commit-guidelines.md`](rac/prompts/rac-agent-commit-guidelines.md):
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
<type>(<area>): <imperative summary> [roadmap:vX.Y.Z]
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
with `type` one of `feat`, `fix`, `test`, `docs`, `refactor`, `chore`. Keep
|
|
73
|
+
commits small and single-purpose.
|
|
74
|
+
|
|
75
|
+
## License
|
|
76
|
+
|
|
77
|
+
By contributing you agree your contributions are licensed under the
|
|
78
|
+
[MIT License](LICENSE).
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: requirements-as-code
|
|
3
|
+
Version: 0.7.13
|
|
4
|
+
Summary: RAC — lint and diff product requirements written in Markdown.
|
|
5
|
+
Author: tcballard
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/tcballard/requirements-as-code
|
|
8
|
+
Project-URL: Repository, https://github.com/tcballard/requirements-as-code
|
|
9
|
+
Project-URL: Issues, https://github.com/tcballard/requirements-as-code/issues
|
|
10
|
+
Keywords: requirements,product-management,markdown,linter,cli,diff
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
19
|
+
Classifier: Topic :: Documentation
|
|
20
|
+
Requires-Python: >=3.11
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: LICENSE
|
|
23
|
+
Requires-Dist: markdown-it-py>=3.0
|
|
24
|
+
Requires-Dist: pyyaml>=6.0
|
|
25
|
+
Provides-Extra: ingest
|
|
26
|
+
Requires-Dist: markitdown[docx]; extra == "ingest"
|
|
27
|
+
Provides-Extra: ingest-pdf
|
|
28
|
+
Requires-Dist: markitdown[pdf]; extra == "ingest-pdf"
|
|
29
|
+
Provides-Extra: ingest-office
|
|
30
|
+
Requires-Dist: markitdown[pptx,xls,xlsx]; extra == "ingest-office"
|
|
31
|
+
Provides-Extra: ingest-all
|
|
32
|
+
Requires-Dist: markitdown[docx,pdf,pptx,xls,xlsx]; extra == "ingest-all"
|
|
33
|
+
Provides-Extra: dev
|
|
34
|
+
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
35
|
+
Requires-Dist: markitdown[docx,pdf,pptx,xls,xlsx]; extra == "dev"
|
|
36
|
+
Requires-Dist: python-docx; extra == "dev"
|
|
37
|
+
Requires-Dist: python-pptx; extra == "dev"
|
|
38
|
+
Requires-Dist: openpyxl; extra == "dev"
|
|
39
|
+
Requires-Dist: reportlab; extra == "dev"
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
|
|
42
|
+
# Requirements as Code
|
|
43
|
+
|
|
44
|
+
[](https://github.com/tcballard/requirements-as-code/actions/workflows/ci.yml)
|
|
45
|
+
[](https://pypi.org/project/requirements-as-code/)
|
|
46
|
+
|
|
47
|
+
> **Treat product knowledge like source code.**
|
|
48
|
+
|
|
49
|
+
RAC is a command-line tool for managing requirements, decisions, roadmaps, prompts,
|
|
50
|
+
and design artifacts as plain Markdown, right inside your Git repository.
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pip install requirements-as-code
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## What is RAC?
|
|
57
|
+
|
|
58
|
+
The code is structured, the tests are automated, the infrastructure is versioned —
|
|
59
|
+
but the *reasoning* behind what you build is scattered across documents, tickets,
|
|
60
|
+
chats, and AI conversations. RAC brings that knowledge back into the repository.
|
|
61
|
+
|
|
62
|
+
You write product thinking in Markdown; RAC validates it, inspects it, and connects
|
|
63
|
+
it — so it stays durable, reviewable, and usable as context for both humans and AI.
|
|
64
|
+
No proprietary formats, no hosted platform, no lock-in.
|
|
65
|
+
|
|
66
|
+
## Who is it for?
|
|
67
|
+
|
|
68
|
+
- **Software and product teams** who want the *why* behind their software versioned
|
|
69
|
+
alongside the code.
|
|
70
|
+
- **AI-native teams** who need structured, durable context instead of more scattered
|
|
71
|
+
chat history.
|
|
72
|
+
|
|
73
|
+
## Install
|
|
74
|
+
|
|
75
|
+
Requires Python 3.11+.
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
pip install requirements-as-code
|
|
79
|
+
# or
|
|
80
|
+
uv tool install requirements-as-code
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Quick Start
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
rac validate requirement.md # check one artifact
|
|
87
|
+
rac validate rac/ # check every artifact in a directory
|
|
88
|
+
rac inspect requirement.md # see its type and completeness
|
|
89
|
+
rac stats rac/ # summarize a directory of artifacts
|
|
90
|
+
rac review rac/ # full repository review, worst problems first
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
New to RAC? Walk through your first artifact in five minutes:
|
|
94
|
+
**[docs/quickstart.md](docs/quickstart.md)**.
|
|
95
|
+
|
|
96
|
+
## Supported Artifact Types
|
|
97
|
+
|
|
98
|
+
- **Requirements** — what needs to exist
|
|
99
|
+
- **Decisions** — why choices were made (ADRs)
|
|
100
|
+
- **Roadmaps** — where the product is heading
|
|
101
|
+
- **Prompts** — reusable AI collaboration patterns
|
|
102
|
+
- **Designs** — product experience thinking
|
|
103
|
+
|
|
104
|
+
Everything stays plain Markdown — see **[docs/artifacts.md](docs/artifacts.md)**.
|
|
105
|
+
|
|
106
|
+
## Documentation
|
|
107
|
+
|
|
108
|
+
- [Quickstart](docs/quickstart.md) — install and try RAC in five minutes
|
|
109
|
+
- [CLI reference](docs/cli.md) — every command, flag, and exit code
|
|
110
|
+
- [Artifact types](docs/artifacts.md) — the five types and their sections
|
|
111
|
+
- [Relationships](docs/relationships.md) — link artifacts and validate the links
|
|
112
|
+
- [Repository workflow](docs/repo-workflow.md) — organize a repo with RAC
|
|
113
|
+
- [Testing & contributing](docs/testing.md) — local setup and verification
|
|
114
|
+
- [Examples](docs/examples.md) — small, realistic artifacts
|
|
115
|
+
|
|
116
|
+
## How RAC earns trust
|
|
117
|
+
|
|
118
|
+
RAC asks you to trust it with your product knowledge, so it holds itself to the
|
|
119
|
+
same standard it applies to your repository:
|
|
120
|
+
|
|
121
|
+
- **It dogfoods itself.** RAC's own planning corpus under [`rac/`](rac/) is
|
|
122
|
+
validated by RAC in CI (`rac validate rac/`, `rac relationships rac/ --validate`,
|
|
123
|
+
`rac review rac/`) — if the tool's rules break the tool's own artifacts, the
|
|
124
|
+
build fails.
|
|
125
|
+
- **Output is a contract.** Golden tests pin the CLI's human and JSON output
|
|
126
|
+
byte-for-byte; any change to what RAC prints is reviewed as a product change.
|
|
127
|
+
- **JSON is versioned.** Machine-readable output carries a `schema_version` and
|
|
128
|
+
only changes additively.
|
|
129
|
+
|
|
130
|
+
## Project Status
|
|
131
|
+
|
|
132
|
+
RAC is early and evolving quickly. A terminal Explorer for browsing your knowledge
|
|
133
|
+
base is planned. Contributions, ideas, and experiments are welcome — see
|
|
134
|
+
[CONTRIBUTING.md](CONTRIBUTING.md).
|
|
135
|
+
|
|
136
|
+
## License
|
|
137
|
+
|
|
138
|
+
MIT
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Requirements as Code
|
|
2
|
+
|
|
3
|
+
[](https://github.com/tcballard/requirements-as-code/actions/workflows/ci.yml)
|
|
4
|
+
[](https://pypi.org/project/requirements-as-code/)
|
|
5
|
+
|
|
6
|
+
> **Treat product knowledge like source code.**
|
|
7
|
+
|
|
8
|
+
RAC is a command-line tool for managing requirements, decisions, roadmaps, prompts,
|
|
9
|
+
and design artifacts as plain Markdown, right inside your Git repository.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pip install requirements-as-code
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## What is RAC?
|
|
16
|
+
|
|
17
|
+
The code is structured, the tests are automated, the infrastructure is versioned —
|
|
18
|
+
but the *reasoning* behind what you build is scattered across documents, tickets,
|
|
19
|
+
chats, and AI conversations. RAC brings that knowledge back into the repository.
|
|
20
|
+
|
|
21
|
+
You write product thinking in Markdown; RAC validates it, inspects it, and connects
|
|
22
|
+
it — so it stays durable, reviewable, and usable as context for both humans and AI.
|
|
23
|
+
No proprietary formats, no hosted platform, no lock-in.
|
|
24
|
+
|
|
25
|
+
## Who is it for?
|
|
26
|
+
|
|
27
|
+
- **Software and product teams** who want the *why* behind their software versioned
|
|
28
|
+
alongside the code.
|
|
29
|
+
- **AI-native teams** who need structured, durable context instead of more scattered
|
|
30
|
+
chat history.
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
Requires Python 3.11+.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pip install requirements-as-code
|
|
38
|
+
# or
|
|
39
|
+
uv tool install requirements-as-code
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Quick Start
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
rac validate requirement.md # check one artifact
|
|
46
|
+
rac validate rac/ # check every artifact in a directory
|
|
47
|
+
rac inspect requirement.md # see its type and completeness
|
|
48
|
+
rac stats rac/ # summarize a directory of artifacts
|
|
49
|
+
rac review rac/ # full repository review, worst problems first
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
New to RAC? Walk through your first artifact in five minutes:
|
|
53
|
+
**[docs/quickstart.md](docs/quickstart.md)**.
|
|
54
|
+
|
|
55
|
+
## Supported Artifact Types
|
|
56
|
+
|
|
57
|
+
- **Requirements** — what needs to exist
|
|
58
|
+
- **Decisions** — why choices were made (ADRs)
|
|
59
|
+
- **Roadmaps** — where the product is heading
|
|
60
|
+
- **Prompts** — reusable AI collaboration patterns
|
|
61
|
+
- **Designs** — product experience thinking
|
|
62
|
+
|
|
63
|
+
Everything stays plain Markdown — see **[docs/artifacts.md](docs/artifacts.md)**.
|
|
64
|
+
|
|
65
|
+
## Documentation
|
|
66
|
+
|
|
67
|
+
- [Quickstart](docs/quickstart.md) — install and try RAC in five minutes
|
|
68
|
+
- [CLI reference](docs/cli.md) — every command, flag, and exit code
|
|
69
|
+
- [Artifact types](docs/artifacts.md) — the five types and their sections
|
|
70
|
+
- [Relationships](docs/relationships.md) — link artifacts and validate the links
|
|
71
|
+
- [Repository workflow](docs/repo-workflow.md) — organize a repo with RAC
|
|
72
|
+
- [Testing & contributing](docs/testing.md) — local setup and verification
|
|
73
|
+
- [Examples](docs/examples.md) — small, realistic artifacts
|
|
74
|
+
|
|
75
|
+
## How RAC earns trust
|
|
76
|
+
|
|
77
|
+
RAC asks you to trust it with your product knowledge, so it holds itself to the
|
|
78
|
+
same standard it applies to your repository:
|
|
79
|
+
|
|
80
|
+
- **It dogfoods itself.** RAC's own planning corpus under [`rac/`](rac/) is
|
|
81
|
+
validated by RAC in CI (`rac validate rac/`, `rac relationships rac/ --validate`,
|
|
82
|
+
`rac review rac/`) — if the tool's rules break the tool's own artifacts, the
|
|
83
|
+
build fails.
|
|
84
|
+
- **Output is a contract.** Golden tests pin the CLI's human and JSON output
|
|
85
|
+
byte-for-byte; any change to what RAC prints is reviewed as a product change.
|
|
86
|
+
- **JSON is versioned.** Machine-readable output carries a `schema_version` and
|
|
87
|
+
only changes additively.
|
|
88
|
+
|
|
89
|
+
## Project Status
|
|
90
|
+
|
|
91
|
+
RAC is early and evolving quickly. A terminal Explorer for browsing your knowledge
|
|
92
|
+
base is planned. Contributions, ideas, and experiments are welcome — see
|
|
93
|
+
[CONTRIBUTING.md](CONTRIBUTING.md).
|
|
94
|
+
|
|
95
|
+
## License
|
|
96
|
+
|
|
97
|
+
MIT
|