ai-docs-toolkit 0.2.0__tar.gz → 0.3.1__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.
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/PKG-INFO +55 -9
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/README.md +28 -2
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/packaging/pypi/README.md +54 -8
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/pyproject.toml +1 -1
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/__init__.py +1 -1
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/cli/__init__.py +43 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/changed_files.py +23 -4
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/impact.py +3 -2
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/docs/agent-installation.md +214 -11
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/impact/json_output.py +120 -2
- ai_docs_toolkit-0.3.1/src/ai_docs_toolkit/review/__init__.py +3 -0
- ai_docs_toolkit-0.3.1/src/ai_docs_toolkit/review/check.py +252 -0
- ai_docs_toolkit-0.3.1/src/ai_docs_toolkit/review/record.py +150 -0
- ai_docs_toolkit-0.3.1/src/ai_docs_toolkit/templates/project/.ai-docs/reference/documentation-change-review-skill.md +282 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/documentation-change-review/SKILL.md +5 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit.egg-info/PKG-INFO +55 -9
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit.egg-info/SOURCES.txt +4 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_cli_baseline.py +2 -2
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_document_graph.py +1 -1
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_graph_cli_json.py +20 -2
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_impact_analysis.py +109 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_impact_cli_human.py +57 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_impact_cli_json.py +169 -3
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_mcp_server.py +3 -2
- ai_docs_toolkit-0.3.1/tests/test_review_check.py +459 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_validate_cli_json.py +3 -3
- ai_docs_toolkit-0.2.0/src/ai_docs_toolkit/templates/project/.ai-docs/reference/documentation-change-review-skill.md +0 -128
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/setup.cfg +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/__main__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/context/__init__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/context/markdown_output.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/__init__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/azure_devops_provider.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/config.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/context.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/doctor.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/file_lookup.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/frontmatter.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/graph.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/init.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/planning_operations.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/planning_scaffold.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/registry.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/requirement_capture.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/scanner.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/schema_validation.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/section_fix.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/structure_validation.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/core/task_export.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/graph/__init__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/graph/json_output.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/impact/__init__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/mcp/__init__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/mcp/__main__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/mcp/server.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/mcp/setup.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/examples/skills/release-publication/SKILL.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/reference/documentation-cascade-authoring-skill.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/reference/incoming-request-model.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/reference/incoming-request-triage-skill.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/reference/init-command-contract.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/reference/planning-document-model.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/reference/toolkit-maintenance-context-routing.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/acceptance.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/architecture-decision.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/asset.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/business-rule.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/contract.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/guide.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/implementation-task.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/index.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/inventory.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/module.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/operation.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/plan-stage.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/plan.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/runbook.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/scenario.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/standalone-task.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/task-registry.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/document-types/test-case.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/schemas/frontmatter.schema.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/documentation-cascade-authoring/SKILL.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/incoming-request-triage/SKILL.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/index.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/planning-record-generation/SKILL.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/planning-task-execution/SKILL.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/toolkit-consumer-policy/SKILL.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/skills/update-ai-docs-toolkit/SKILL.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/agent-context-architecture-beta-18.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/archive-validation-beta-12.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/cascade-impact-beta-14.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/consumer-migration-hardening.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/decision-visibility-beta-13.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/doctor-filesystem-traversal-beta-19.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/doctor-json-provenance-beta-20.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/documentation-cascade-authoring-beta-23.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/documentation-change-review-beta-21.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/incoming-request-storage-beta-17.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/incoming-request-triage-beta-22.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/migration-note.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/post-publication-checks.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/release-task.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/routing-restoration-beta-15.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/task-retirement-beta-16.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/validation-evidence.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/templates/release/version-change-checklist.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/workflows/documentation-cascade-adoption.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/workflows/plan-stage-workflow.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/.ai-docs/workflows/toolkit-migration-workflow.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/AGENTS.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/ai-docs-index.md +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/templates/project/ai-docs.config.yaml +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/validation/__init__.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit/validation/human.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit.egg-info/dependency_links.txt +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit.egg-info/entry_points.txt +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit.egg-info/requires.txt +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/src/ai_docs_toolkit.egg-info/top_level.txt +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_azure_devops_provider.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_bootstrap_templates.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_config_loader_and_scanner.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_consumer_matrix.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_context_cli_json.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_context_cli_markdown.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_context_depth.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_context_policy.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_context_selector.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_document_registry.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_execution_evals.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_frontmatter_parser.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_init_cli.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_schema_validation.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_skill_eval_harness.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_structure_validation.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_task_export.py +0 -0
- {ai_docs_toolkit-0.2.0 → ai_docs_toolkit-0.3.1}/tests/test_validate_cli_human.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ai-docs-toolkit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: AI-oriented documentation toolkit.
|
|
5
5
|
Requires-Python: >=3.14
|
|
6
6
|
Description-Content-Type: text/markdown
|
|
@@ -30,40 +30,80 @@ The core idea is that documentation should not be a secondary artifact created a
|
|
|
30
30
|
|
|
31
31
|
## Current Status
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
Version 0.3.1 includes:
|
|
34
|
+
|
|
34
35
|
- schema and structure validation for Markdown documents with YAML front matter;
|
|
35
36
|
- document graph output;
|
|
36
|
-
- impact analysis;
|
|
37
|
+
- impact analysis with linked test cases and changed-path discovery coverage;
|
|
38
|
+
- optional saved review evidence and the read-only `ai-docs review-check` command;
|
|
37
39
|
- context bundle output;
|
|
38
40
|
- an executable `ai-docs` CLI;
|
|
39
41
|
- optional local MCP runtime entrypoint.
|
|
40
42
|
|
|
41
43
|
## Installation
|
|
42
44
|
|
|
43
|
-
Install
|
|
45
|
+
Install this version with Python 3.14 or newer once it is available on PyPI:
|
|
44
46
|
|
|
45
47
|
```bash
|
|
46
|
-
python -m pip install ai-docs-toolkit==0.
|
|
48
|
+
python -m pip install ai-docs-toolkit==0.3.1
|
|
47
49
|
ai-docs --version
|
|
48
50
|
```
|
|
49
51
|
|
|
50
52
|
For ephemeral execution with `uvx`:
|
|
51
53
|
|
|
52
54
|
```bash
|
|
53
|
-
uvx --python 3.14 --from ai-docs-toolkit==0.
|
|
55
|
+
uvx --python 3.14 --from ai-docs-toolkit==0.3.1 ai-docs --version
|
|
54
56
|
```
|
|
55
57
|
|
|
56
58
|
For the optional local MCP runtime:
|
|
57
59
|
|
|
58
60
|
```bash
|
|
59
|
-
python -m pip install "ai-docs-toolkit[mcp]==0.
|
|
61
|
+
python -m pip install "ai-docs-toolkit[mcp]==0.3.1"
|
|
60
62
|
ai-docs-mcp --project-root .
|
|
61
63
|
```
|
|
62
64
|
|
|
63
65
|
For the latest stable release, use `python -m pip install --upgrade ai-docs-toolkit`
|
|
64
66
|
without an exact version pin.
|
|
65
67
|
|
|
66
|
-
##
|
|
68
|
+
## Release 0.3.1
|
|
69
|
+
|
|
70
|
+
The package installation guide now describes preserving review/evidence before
|
|
71
|
+
revert and verifying the restored files and environment. See
|
|
72
|
+
`ai_docs_toolkit/docs/agent-installation.md`, “Rollback Verification”.
|
|
73
|
+
The patch requires no managed-file refresh, schema or project-data migration
|
|
74
|
+
from 0.3.0. After installation, verify the version, run `ai-docs validate --json`,
|
|
75
|
+
`ai-docs doctor --format json`, `ai-docs init --check`, and the project's checks.
|
|
76
|
+
Preserve historical review rounds: the version change causes `tool_changed`
|
|
77
|
+
findings even when project files are unchanged. See “Migration 0.3.0 To 0.3.1”
|
|
78
|
+
in the packaged guide for installation and verification commands.
|
|
79
|
+
|
|
80
|
+
## Release 0.3.0
|
|
81
|
+
|
|
82
|
+
Impact now reaches explicitly linked test cases from business rules, scenarios
|
|
83
|
+
and acceptance criteria. Test cases end traversal. Changed-mode JSON adds a
|
|
84
|
+
`coverage` object with path counts and unmapped reasons; strict JSON clients
|
|
85
|
+
must accept that field. Explicit-id output keeps its shape. Coverage describes
|
|
86
|
+
discovery and does not establish semantic completeness or successful tests.
|
|
87
|
+
|
|
88
|
+
The optional `ai-docs review-check RECORD --format json` command compares a
|
|
89
|
+
saved YAML review with current input hashes, tool identity, impact candidates
|
|
90
|
+
and decisions. It supports YAML files and fenced YAML in Markdown. It is
|
|
91
|
+
read-only; exit 0 means no mechanical discrepancy, not review approval.
|
|
92
|
+
Git discovery preserves literal Unicode/whitespace paths and rename/deletion
|
|
93
|
+
evidence. Existing CLI/MCP entrypoints and independent project gates remain.
|
|
94
|
+
|
|
95
|
+
After upgrading from 0.2.0, review `ai-docs init --check` and `ai-docs init
|
|
96
|
+
--dry-run`, reconcile local overrides, then refresh the existing managed review
|
|
97
|
+
skill/reference with `ai-docs init`. Run project validation and representative
|
|
98
|
+
impact checks. No schema, id, layout or mandatory review-record migration is
|
|
99
|
+
required. Preserve historical review evidence; a new tool identity requires a
|
|
100
|
+
new reviewed round instead of silently rewriting previous evidence.
|
|
101
|
+
|
|
102
|
+
See the packaged `ai_docs_toolkit/docs/agent-installation.md`,
|
|
103
|
+
“Migration 0.2.0 To 0.3.0”, for commands, preservation rules and rollback.
|
|
104
|
+
Consumers on 0.1.0 must also apply the Python/archive prerequisites below.
|
|
105
|
+
|
|
106
|
+
## Earlier Stable 0.2.0
|
|
67
107
|
|
|
68
108
|
Completed task files are retained as execution history. Standalone tasks are
|
|
69
109
|
archived after closure; tasks in a plan stay in place with status `done` until
|
|
@@ -221,6 +261,12 @@ Analyze impact for changed files:
|
|
|
221
261
|
ai-docs impact --changed
|
|
222
262
|
```
|
|
223
263
|
|
|
264
|
+
Check optional saved review evidence:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
ai-docs review-check review.yaml --format json
|
|
268
|
+
```
|
|
269
|
+
|
|
224
270
|
Prepare an agent context bundle for changed files:
|
|
225
271
|
|
|
226
272
|
```bash
|
|
@@ -267,7 +313,7 @@ Operators can give the prompt from that document to an AI agent when asking it t
|
|
|
267
313
|
|
|
268
314
|
## Development
|
|
269
315
|
|
|
270
|
-
|
|
316
|
+
Versions 0.2.0 and later require Python 3.14+. Earlier
|
|
271
317
|
published releases retain their original Python requirements. Recreate older
|
|
272
318
|
environments with Python 3.14+ before upgrading.
|
|
273
319
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
AI Docs Toolkit is a documentation toolkit for AI-assisted software development.
|
|
4
4
|
|
|
5
|
-
It treats documentation as an engineering interface between humans, AI agents, code, tests and change management. Version 0.
|
|
5
|
+
It treats documentation as an engineering interface between humans, AI agents, code, tests and change management. Version 0.3.1 clarifies rollback verification, alongside the linked test cases, changed-path coverage and optional review evidence checks introduced in 0.3.0. Python 3.14 or newer is required.
|
|
6
6
|
|
|
7
7
|
## Purpose
|
|
8
8
|
|
|
@@ -83,11 +83,22 @@ pipx install ai-docs-toolkit
|
|
|
83
83
|
uvx --from ai-docs-toolkit ai-docs validate
|
|
84
84
|
```
|
|
85
85
|
|
|
86
|
-
For upgrades from 0.
|
|
86
|
+
For upgrades from 0.3.0 to 0.3.1, follow the [consumer migration guide](src/ai_docs_toolkit/docs/agent-installation.md#migration-030-to-031).
|
|
87
|
+
Install the exact version only after it is available on PyPI; a source preparation
|
|
88
|
+
commit does not publish the package. Consumers on 0.2.0 must also apply the
|
|
89
|
+
[0.3.0 migration](src/ai_docs_toolkit/docs/agent-installation.md#migration-020-to-030);
|
|
90
|
+
consumers on 0.1.0 must also apply the
|
|
91
|
+
[0.2.0 prerequisites](src/ai_docs_toolkit/docs/agent-installation.md#migration-010-to-020).
|
|
87
92
|
Use Python 3.14+, review managed-file changes and preserve existing project rules
|
|
88
93
|
and task records before refreshing. Completed standalone tasks are archived;
|
|
89
94
|
tasks in a plan remain in place until the whole plan is archived.
|
|
90
95
|
|
|
96
|
+
The 0.3.1 release preparation includes a clarification of
|
|
97
|
+
[rollback verification](src/ai_docs_toolkit/docs/agent-installation.md#rollback-verification):
|
|
98
|
+
preserve review/evidence before revert, then check restored files and the actual
|
|
99
|
+
environment. No managed-file refresh or data migration is required for this
|
|
100
|
+
clarification. Publication is pending; the published 0.3.0 package is unchanged.
|
|
101
|
+
|
|
91
102
|
Docker, npm/npx and standalone binary distribution are deferred.
|
|
92
103
|
See [Distribution Strategy](.ai-docs/reference/distribution-strategy.md) for supported and deferred channels.
|
|
93
104
|
|
|
@@ -135,6 +146,21 @@ ai-docs impact --changed --base <git-ref> --format json
|
|
|
135
146
|
|
|
136
147
|
Projects can opt in to code-to-document impact through `cascade.root_module` and `cascade.module_ownership` in `ai-docs.config.yaml`.
|
|
137
148
|
|
|
149
|
+
Changed-mode output includes discovery coverage and unmapped paths with reasons.
|
|
150
|
+
Impact follows explicit rule, scenario and acceptance links to test cases;
|
|
151
|
+
returned test cases are review candidates and do not prove test execution.
|
|
152
|
+
|
|
153
|
+
Check a saved review record without modifying the project:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
ai-docs review-check review.yaml --format json
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
This optional command reports missing decisions, changed input hashes and changed
|
|
160
|
+
impact candidates. It does not approve semantic correctness. See the
|
|
161
|
+
[review record contract](.ai-docs/reference/documentation-change-review-skill.md#advisory-checker)
|
|
162
|
+
for YAML/Markdown input, tool identity and exit codes.
|
|
163
|
+
|
|
138
164
|
Prepare an agent context bundle for changed files:
|
|
139
165
|
|
|
140
166
|
```bash
|
|
@@ -16,40 +16,80 @@ The core idea is that documentation should not be a secondary artifact created a
|
|
|
16
16
|
|
|
17
17
|
## Current Status
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Version 0.3.1 includes:
|
|
20
|
+
|
|
20
21
|
- schema and structure validation for Markdown documents with YAML front matter;
|
|
21
22
|
- document graph output;
|
|
22
|
-
- impact analysis;
|
|
23
|
+
- impact analysis with linked test cases and changed-path discovery coverage;
|
|
24
|
+
- optional saved review evidence and the read-only `ai-docs review-check` command;
|
|
23
25
|
- context bundle output;
|
|
24
26
|
- an executable `ai-docs` CLI;
|
|
25
27
|
- optional local MCP runtime entrypoint.
|
|
26
28
|
|
|
27
29
|
## Installation
|
|
28
30
|
|
|
29
|
-
Install
|
|
31
|
+
Install this version with Python 3.14 or newer once it is available on PyPI:
|
|
30
32
|
|
|
31
33
|
```bash
|
|
32
|
-
python -m pip install ai-docs-toolkit==0.
|
|
34
|
+
python -m pip install ai-docs-toolkit==0.3.1
|
|
33
35
|
ai-docs --version
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
For ephemeral execution with `uvx`:
|
|
37
39
|
|
|
38
40
|
```bash
|
|
39
|
-
uvx --python 3.14 --from ai-docs-toolkit==0.
|
|
41
|
+
uvx --python 3.14 --from ai-docs-toolkit==0.3.1 ai-docs --version
|
|
40
42
|
```
|
|
41
43
|
|
|
42
44
|
For the optional local MCP runtime:
|
|
43
45
|
|
|
44
46
|
```bash
|
|
45
|
-
python -m pip install "ai-docs-toolkit[mcp]==0.
|
|
47
|
+
python -m pip install "ai-docs-toolkit[mcp]==0.3.1"
|
|
46
48
|
ai-docs-mcp --project-root .
|
|
47
49
|
```
|
|
48
50
|
|
|
49
51
|
For the latest stable release, use `python -m pip install --upgrade ai-docs-toolkit`
|
|
50
52
|
without an exact version pin.
|
|
51
53
|
|
|
52
|
-
##
|
|
54
|
+
## Release 0.3.1
|
|
55
|
+
|
|
56
|
+
The package installation guide now describes preserving review/evidence before
|
|
57
|
+
revert and verifying the restored files and environment. See
|
|
58
|
+
`ai_docs_toolkit/docs/agent-installation.md`, “Rollback Verification”.
|
|
59
|
+
The patch requires no managed-file refresh, schema or project-data migration
|
|
60
|
+
from 0.3.0. After installation, verify the version, run `ai-docs validate --json`,
|
|
61
|
+
`ai-docs doctor --format json`, `ai-docs init --check`, and the project's checks.
|
|
62
|
+
Preserve historical review rounds: the version change causes `tool_changed`
|
|
63
|
+
findings even when project files are unchanged. See “Migration 0.3.0 To 0.3.1”
|
|
64
|
+
in the packaged guide for installation and verification commands.
|
|
65
|
+
|
|
66
|
+
## Release 0.3.0
|
|
67
|
+
|
|
68
|
+
Impact now reaches explicitly linked test cases from business rules, scenarios
|
|
69
|
+
and acceptance criteria. Test cases end traversal. Changed-mode JSON adds a
|
|
70
|
+
`coverage` object with path counts and unmapped reasons; strict JSON clients
|
|
71
|
+
must accept that field. Explicit-id output keeps its shape. Coverage describes
|
|
72
|
+
discovery and does not establish semantic completeness or successful tests.
|
|
73
|
+
|
|
74
|
+
The optional `ai-docs review-check RECORD --format json` command compares a
|
|
75
|
+
saved YAML review with current input hashes, tool identity, impact candidates
|
|
76
|
+
and decisions. It supports YAML files and fenced YAML in Markdown. It is
|
|
77
|
+
read-only; exit 0 means no mechanical discrepancy, not review approval.
|
|
78
|
+
Git discovery preserves literal Unicode/whitespace paths and rename/deletion
|
|
79
|
+
evidence. Existing CLI/MCP entrypoints and independent project gates remain.
|
|
80
|
+
|
|
81
|
+
After upgrading from 0.2.0, review `ai-docs init --check` and `ai-docs init
|
|
82
|
+
--dry-run`, reconcile local overrides, then refresh the existing managed review
|
|
83
|
+
skill/reference with `ai-docs init`. Run project validation and representative
|
|
84
|
+
impact checks. No schema, id, layout or mandatory review-record migration is
|
|
85
|
+
required. Preserve historical review evidence; a new tool identity requires a
|
|
86
|
+
new reviewed round instead of silently rewriting previous evidence.
|
|
87
|
+
|
|
88
|
+
See the packaged `ai_docs_toolkit/docs/agent-installation.md`,
|
|
89
|
+
“Migration 0.2.0 To 0.3.0”, for commands, preservation rules and rollback.
|
|
90
|
+
Consumers on 0.1.0 must also apply the Python/archive prerequisites below.
|
|
91
|
+
|
|
92
|
+
## Earlier Stable 0.2.0
|
|
53
93
|
|
|
54
94
|
Completed task files are retained as execution history. Standalone tasks are
|
|
55
95
|
archived after closure; tasks in a plan stay in place with status `done` until
|
|
@@ -207,6 +247,12 @@ Analyze impact for changed files:
|
|
|
207
247
|
ai-docs impact --changed
|
|
208
248
|
```
|
|
209
249
|
|
|
250
|
+
Check optional saved review evidence:
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
ai-docs review-check review.yaml --format json
|
|
254
|
+
```
|
|
255
|
+
|
|
210
256
|
Prepare an agent context bundle for changed files:
|
|
211
257
|
|
|
212
258
|
```bash
|
|
@@ -253,7 +299,7 @@ Operators can give the prompt from that document to an AI agent when asking it t
|
|
|
253
299
|
|
|
254
300
|
## Development
|
|
255
301
|
|
|
256
|
-
|
|
302
|
+
Versions 0.2.0 and later require Python 3.14+. Earlier
|
|
257
303
|
published releases retain their original Python requirements. Recreate older
|
|
258
304
|
environments with Python 3.14+ before upgrading.
|
|
259
305
|
|
|
@@ -91,6 +91,7 @@ def _help_text() -> str:
|
|
|
91
91
|
" ai-docs tasks push --provider azure-devops (--task TASK-ID | --stage STAGE-ID | --plan PLAN-ID) --organization ORG --project PROJECT [--dry-run] [--write-back] [--format json]",
|
|
92
92
|
" ai-docs graph --format json [--type TYPE] [--module MODULE] [--id ID]",
|
|
93
93
|
" ai-docs impact (--id ID | --changed [--base REF]) [--format json]",
|
|
94
|
+
" ai-docs review-check RECORD [--record N] [--format json|--json]",
|
|
94
95
|
" ai-docs context (--id ID | --module MODULE | --feature FEATURE | --changed) [--format json] [--history exclude|include|legacy] [--body-budget-bytes N] [--depth N]",
|
|
95
96
|
" ai-docs mcp status [--project-root PATH] [--config FILE]",
|
|
96
97
|
" ai-docs mcp configure --client jetbrains --print-json [--project-root PATH] [--config FILE]",
|
|
@@ -116,6 +117,21 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
116
117
|
print(__version__)
|
|
117
118
|
return 0
|
|
118
119
|
|
|
120
|
+
if args[0] == "review-check":
|
|
121
|
+
import json
|
|
122
|
+
import sys
|
|
123
|
+
from ai_docs_toolkit.review import check_review, format_review_human
|
|
124
|
+
|
|
125
|
+
review_args = _parse_review_args(args)
|
|
126
|
+
if review_args is None:
|
|
127
|
+
print("Usage: ai-docs review-check RECORD [--record N] [--format json|--json]", file=sys.stderr)
|
|
128
|
+
return 3
|
|
129
|
+
path, number, output_format = review_args
|
|
130
|
+
result = check_review(path, ".", record_number=number)
|
|
131
|
+
print(json.dumps(result, ensure_ascii=False, indent=2, sort_keys=True)
|
|
132
|
+
if output_format == "json" else format_review_human(result))
|
|
133
|
+
return result["exit_code"]
|
|
134
|
+
|
|
119
135
|
init_args = _parse_init_args(args)
|
|
120
136
|
if init_args is not None:
|
|
121
137
|
profile, force, dry_run, check = init_args
|
|
@@ -1151,3 +1167,30 @@ def _parse_planning_args(args: list[str]):
|
|
|
1151
1167
|
parsed["--task-id"],
|
|
1152
1168
|
plan_date,
|
|
1153
1169
|
)
|
|
1170
|
+
|
|
1171
|
+
|
|
1172
|
+
def _parse_review_args(args):
|
|
1173
|
+
if len(args) < 2 or args[1].startswith('-'):
|
|
1174
|
+
return None
|
|
1175
|
+
options = {}
|
|
1176
|
+
index = 2
|
|
1177
|
+
while index < len(args):
|
|
1178
|
+
option = args[index]
|
|
1179
|
+
if option not in {'--record', '--format', '--json'} or option in options:
|
|
1180
|
+
return None
|
|
1181
|
+
if option == '--json':
|
|
1182
|
+
options[option] = True
|
|
1183
|
+
index += 1
|
|
1184
|
+
elif index + 1 < len(args):
|
|
1185
|
+
options[option] = args[index + 1]
|
|
1186
|
+
index += 2
|
|
1187
|
+
else:
|
|
1188
|
+
return None
|
|
1189
|
+
if '--format' in options and ('--json' in options or options['--format'] != 'json'):
|
|
1190
|
+
return None
|
|
1191
|
+
number = options.get('--record')
|
|
1192
|
+
if number is not None:
|
|
1193
|
+
if not number.isascii() or not number.isdigit() or len(number) > 9 or int(number) < 1:
|
|
1194
|
+
return None
|
|
1195
|
+
number = int(number)
|
|
1196
|
+
return args[1], number, 'json' if '--format' in options or '--json' in options else 'human'
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import subprocess
|
|
4
5
|
from dataclasses import dataclass
|
|
5
6
|
from fnmatch import fnmatchcase
|
|
@@ -50,11 +51,12 @@ def read_git_changed_files(
|
|
|
50
51
|
base_ref: str | None = None,
|
|
51
52
|
) -> GitChangedFilesResult:
|
|
52
53
|
process = subprocess.run(
|
|
53
|
-
["git", "status", "--porcelain", "--untracked-files=all"],
|
|
54
|
+
["git", "status", "--porcelain", "-z", "--untracked-files=all"],
|
|
54
55
|
cwd=root,
|
|
55
56
|
capture_output=True,
|
|
56
57
|
text=True,
|
|
57
58
|
check=False,
|
|
59
|
+
env={**os.environ, "GIT_OPTIONAL_LOCKS": "0"},
|
|
58
60
|
)
|
|
59
61
|
if process.returncode != 0:
|
|
60
62
|
return GitChangedFilesResult(
|
|
@@ -69,20 +71,23 @@ def read_git_changed_files(
|
|
|
69
71
|
),
|
|
70
72
|
)
|
|
71
73
|
|
|
72
|
-
changed_files = set(
|
|
74
|
+
changed_files = set(_parse_git_status_z(process.stdout))
|
|
73
75
|
if base_ref is not None:
|
|
74
76
|
diff_process = subprocess.run(
|
|
75
77
|
[
|
|
76
78
|
"git",
|
|
77
79
|
"diff",
|
|
78
80
|
"--name-only",
|
|
79
|
-
"
|
|
81
|
+
"-z",
|
|
82
|
+
"--no-renames",
|
|
83
|
+
"--diff-filter=ACDMRTUXB",
|
|
80
84
|
f"{base_ref}...HEAD",
|
|
81
85
|
],
|
|
82
86
|
cwd=root,
|
|
83
87
|
capture_output=True,
|
|
84
88
|
text=True,
|
|
85
89
|
check=False,
|
|
90
|
+
env={**os.environ, "GIT_OPTIONAL_LOCKS": "0"},
|
|
86
91
|
)
|
|
87
92
|
if diff_process.returncode != 0:
|
|
88
93
|
return GitChangedFilesResult(
|
|
@@ -97,12 +102,26 @@ def read_git_changed_files(
|
|
|
97
102
|
),
|
|
98
103
|
)
|
|
99
104
|
changed_files.update(
|
|
100
|
-
path for path in diff_process.stdout.
|
|
105
|
+
path for path in diff_process.stdout.split("\0") if path
|
|
101
106
|
)
|
|
102
107
|
|
|
103
108
|
return GitChangedFilesResult(changed_files=tuple(sorted(changed_files)))
|
|
104
109
|
|
|
105
110
|
|
|
111
|
+
def _parse_git_status_z(output: str) -> tuple[str, ...]:
|
|
112
|
+
fields = iter(output.split("\0"))
|
|
113
|
+
paths = []
|
|
114
|
+
for entry in fields:
|
|
115
|
+
if len(entry) < 4:
|
|
116
|
+
continue
|
|
117
|
+
paths.append(entry[3:])
|
|
118
|
+
if "R" in entry[:2] or "C" in entry[:2]:
|
|
119
|
+
original = next(fields, "")
|
|
120
|
+
if original:
|
|
121
|
+
paths.append(original)
|
|
122
|
+
return tuple(paths)
|
|
123
|
+
|
|
124
|
+
|
|
106
125
|
def parse_git_status_porcelain(output: str) -> tuple[str, ...]:
|
|
107
126
|
changed_files: list[str] = []
|
|
108
127
|
for line in output.splitlines():
|
|
@@ -15,6 +15,7 @@ IMPACT_TRANSITIONS: dict[str, frozenset[str]] = {
|
|
|
15
15
|
"module",
|
|
16
16
|
"scenario",
|
|
17
17
|
"acceptance",
|
|
18
|
+
"test_case",
|
|
18
19
|
"guide",
|
|
19
20
|
"operation",
|
|
20
21
|
"runbook",
|
|
@@ -37,8 +38,8 @@ IMPACT_TRANSITIONS: dict[str, frozenset[str]] = {
|
|
|
37
38
|
"module": frozenset(
|
|
38
39
|
{"contract", "scenario", "acceptance", "guide", "operation", "runbook"}
|
|
39
40
|
),
|
|
40
|
-
"scenario": frozenset({"acceptance", "guide", "operation", "runbook"}),
|
|
41
|
-
"acceptance": frozenset({"operation", "runbook"}),
|
|
41
|
+
"scenario": frozenset({"acceptance", "test_case", "guide", "operation", "runbook"}),
|
|
42
|
+
"acceptance": frozenset({"test_case", "operation", "runbook"}),
|
|
42
43
|
"guide": frozenset({"operation", "runbook"}),
|
|
43
44
|
"operation": frozenset(),
|
|
44
45
|
"runbook": frozenset({"operation"}),
|