documentation-engine 0.1.2__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/workflows/release.yml +3 -0
  2. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.gitignore +1 -0
  3. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/CHANGELOG.md +26 -1
  4. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/PKG-INFO +10 -1
  5. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/README.md +9 -0
  6. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/adoption.md +6 -0
  7. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/agent-contract.md +7 -0
  8. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/architecture.md +8 -0
  9. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/mcp-adapter.md +7 -0
  10. documentation_engine-0.2.0/docs/workspace-sources.md +155 -0
  11. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/__init__.py +1 -1
  12. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/cli.py +350 -54
  13. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/mcp_server.py +156 -38
  14. documentation_engine-0.2.0/src/docsystem/workspace.py +372 -0
  15. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_mcp_adapter.py +76 -0
  16. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_release_workflows.py +1 -0
  17. documentation_engine-0.2.0/tests/test_workspace.py +923 -0
  18. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/ISSUE_TEMPLATE/adoption-finding.yml +0 -0
  19. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  20. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/ISSUE_TEMPLATE/core-bug.yml +0 -0
  21. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/ISSUE_TEMPLATE/docs-pattern-request.yml +0 -0
  22. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/ISSUE_TEMPLATE/runtime-report.yml +0 -0
  23. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  24. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/copilot-instructions.md +0 -0
  25. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/.github/workflows/ci.yml +0 -0
  26. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/AGENTS.md +0 -0
  27. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/CLAUDE.md +0 -0
  28. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/CONTRIBUTING.md +0 -0
  29. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/LICENSE +0 -0
  30. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/SECURITY.md +0 -0
  31. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/adopter-reporting.md +0 -0
  32. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/assets/context-reduction.svg +0 -0
  33. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/context-efficiency.md +0 -0
  34. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/local-state-safety.md +0 -0
  35. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/paradigmarium-integration.md +0 -0
  36. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/releasing.md +0 -0
  37. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/setup-guide.md +0 -0
  38. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/docs/workstream-branching.md +0 -0
  39. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/generic-adopter/.docsystem.toml +0 -0
  40. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/generic-adopter/README.md +0 -0
  41. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/generic-adopter/plan/README.md +0 -0
  42. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/generic-adopter/plan/design.md +0 -0
  43. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/generic-adopter/plan/review.md +0 -0
  44. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/generic-adopter/plan/templates/document-template.md +0 -0
  45. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/paradigmarium-profile/.docsystem.toml +0 -0
  46. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/paradigmarium-profile/README.md +0 -0
  47. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/paradigmarium-profile/plan/README.md +0 -0
  48. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/paradigmarium-profile/plan/architecture/README.md +0 -0
  49. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/paradigmarium-profile/plan/decisions/README.md +0 -0
  50. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/examples/workstream-branch-template.md +0 -0
  51. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/pyproject.toml +0 -0
  52. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/scripts/installed_cli_smoke.sh +0 -0
  53. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/__main__.py +0 -0
  54. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/catalog.py +0 -0
  55. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/config.py +0 -0
  56. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/metadata.py +0 -0
  57. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/migration.py +0 -0
  58. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/projection.py +0 -0
  59. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/readiness.py +0 -0
  60. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/src/docsystem/sections.py +0 -0
  61. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_catalog.py +0 -0
  62. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_cli.py +0 -0
  63. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_config.py +0 -0
  64. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_context_cli.py +0 -0
  65. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_metadata.py +0 -0
  66. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_migration.py +0 -0
  67. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_readiness.py +0 -0
  68. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_sections.py +0 -0
  69. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/tests/test_vertical.py +0 -0
  70. {documentation_engine-0.1.2 → documentation_engine-0.2.0}/uv.lock +0 -0
@@ -148,6 +148,9 @@ jobs:
148
148
  uses: astral-sh/setup-uv@v7
149
149
  with:
150
150
  python-version: "3.12"
151
+ # This deliberately checkout-free consumer job has no uv.lock or
152
+ # pyproject.toml from which setup-uv could derive a cache key.
153
+ enable-cache: false
151
154
 
152
155
  - name: Create the consumer environment on Python 3.12
153
156
  run: |
@@ -8,6 +8,7 @@ __pycache__/
8
8
  /.docsystem.toml
9
9
  /.docsystem/
10
10
  .docsystem/
11
+ .docsystem.local.toml
11
12
  /.claude/
12
13
  /.paradigmarium/
13
14
  /.orchestrator/
@@ -2,6 +2,30 @@
2
2
 
3
3
  All notable changes to Documentation Engine are documented in this file.
4
4
 
5
+ ## [0.2.0] - 2026-07-13
6
+
7
+ ### Highlights
8
+
9
+ - Local workspace source selection lets one checkout address an independent
10
+ public or private Documentation Engine profile by a stable source name,
11
+ without committing machine-specific absolute paths.
12
+ - A strict `workspace.toml` registry and ignored `.docsystem.local.toml`
13
+ pointer provide deterministic discovery through explicit CLI options, an
14
+ environment variable or local project wiring.
15
+ - New read-only `workspace list` and `workspace doctor` commands report source
16
+ visibility and availability without reading document bodies or exposing
17
+ local paths.
18
+ - Existing project commands and MCP tools can select one registered source;
19
+ explicit selection fails closed and never falls back to the positional
20
+ project.
21
+ - Source roots must be contained, unique and non-overlapping. Writable
22
+ documentation and projection paths cannot escape through symlinks, and
23
+ malformed or looping paths produce bounded diagnostics instead of stack
24
+ traces.
25
+ - Existing single-project CLI and MCP behavior remains unchanged when no
26
+ source is selected. This release deliberately does not claim cross-source
27
+ graph federation, remote storage, synchronization or authorization.
28
+
5
29
  ## [0.1.2] - 2026-07-13
6
30
 
7
31
  ### Fixed
@@ -52,6 +76,7 @@ documentation-engine` starts working only after the first successful release.
52
76
  - Measured context-reduction methodology and a reproducible consumer-install
53
77
  smoke test.
54
78
 
55
- [0.1.2]: https://github.com/Jafa7/DocumentationEngine/compare/v0.1.1...main
79
+ [0.2.0]: https://github.com/Jafa7/DocumentationEngine/compare/v0.1.2...v0.2.0
80
+ [0.1.2]: https://github.com/Jafa7/DocumentationEngine/compare/v0.1.1...v0.1.2
56
81
  [0.1.1]: https://github.com/Jafa7/DocumentationEngine/compare/v0.1.0...v0.1.1
57
82
  [0.1.0]: https://github.com/Jafa7/DocumentationEngine/releases/tag/v0.1.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: documentation-engine
3
- Version: 0.1.2
3
+ Version: 0.2.0
4
4
  Summary: Provider-neutral structured Markdown documentation engine.
5
5
  Project-URL: Repository, https://github.com/Jafa7/DocumentationEngine
6
6
  Project-URL: Documentation, https://github.com/Jafa7/DocumentationEngine/tree/main/docs
@@ -94,6 +94,12 @@ Ask me where local disaster-recovery backups should be stored before touching
94
94
  ignored/private documentation or local configuration.
95
95
  ```
96
96
 
97
+ If public documentation stays in product repositories while private profiles
98
+ live in one local directory, use [workspace source selection](docs/workspace-sources.md)
99
+ to register those independent profiles and address one by name. This removes
100
+ machine-specific paths from routine commands without claiming a federated
101
+ cross-project graph.
102
+
97
103
  ## Principles
98
104
 
99
105
  - Markdown is the editable source of truth.
@@ -187,6 +193,9 @@ python -m docsystem changes .
187
193
  python -m docsystem changes . --json
188
194
  python -m docsystem agent-instructions .
189
195
  python -m docsystem agent-instructions . --json
196
+ python -m docsystem workspace list . --workspace /path/to/workspace
197
+ python -m docsystem workspace doctor . --workspace /path/to/workspace
198
+ python -m docsystem context DOC-001 . --source example-project
190
199
  ```
191
200
 
192
201
  `init` creates a project-local `.docsystem.toml` and the configured
@@ -77,6 +77,12 @@ Ask me where local disaster-recovery backups should be stored before touching
77
77
  ignored/private documentation or local configuration.
78
78
  ```
79
79
 
80
+ If public documentation stays in product repositories while private profiles
81
+ live in one local directory, use [workspace source selection](docs/workspace-sources.md)
82
+ to register those independent profiles and address one by name. This removes
83
+ machine-specific paths from routine commands without claiming a federated
84
+ cross-project graph.
85
+
80
86
  ## Principles
81
87
 
82
88
  - Markdown is the editable source of truth.
@@ -170,6 +176,9 @@ python -m docsystem changes .
170
176
  python -m docsystem changes . --json
171
177
  python -m docsystem agent-instructions .
172
178
  python -m docsystem agent-instructions . --json
179
+ python -m docsystem workspace list . --workspace /path/to/workspace
180
+ python -m docsystem workspace doctor . --workspace /path/to/workspace
181
+ python -m docsystem context DOC-001 . --source example-project
173
182
  ```
174
183
 
175
184
  `init` creates a project-local `.docsystem.toml` and the configured
@@ -146,6 +146,12 @@ delete or migration mistake. Define a local backup command before letting an
146
146
  agent perform broad or mutating work on ignored documentation. The reusable
147
147
  contract is described in [local state safety](local-state-safety.md).
148
148
 
149
+ When several independent public or private profiles live under one local
150
+ documentation directory, register them with
151
+ [workspace source selection](workspace-sources.md). The registry selects one
152
+ ordinary profile by name; it does not merge catalogs or authorize deleting an
153
+ original `plan/` after a copy-only migration.
154
+
149
155
  Project-specific registry synchronization, `finish` orchestration, private
150
156
  history/backup, and provider adapters remain outside this adoption profile.
151
157
 
@@ -77,6 +77,13 @@ unrelated directories, and an implicit-cwd invocation against the wrong
77
77
  directory produces a confusing `configuration not found` error at best and
78
78
  operates on an unintended project at worst.
79
79
 
80
+ For a profile registered in a local documentation workspace, an agent must
81
+ instead pass the positional discovery root and `--source NAME`. Workspace
82
+ resolution is fail-closed: an unknown or unavailable source must never be
83
+ replaced with the positional project. The local pointer and absolute workspace
84
+ path are private machine wiring and must not be committed. See
85
+ [workspace source selection](workspace-sources.md).
86
+
80
87
  ## Prefer `--json` over parsing text
81
88
 
82
89
  `readiness`, `migration-report`, `catalog --explain`, `changes` and
@@ -62,6 +62,12 @@ Project policy may configure:
62
62
  - legacy path-relation migration and historical snapshot document types;
63
63
  - provider adapters.
64
64
 
65
+ A local workspace registry is an outer selection layer, not another project
66
+ configuration table. It maps a stable source name to one contained project
67
+ root, after which the existing configuration, catalog, graph and projection
68
+ contracts apply unchanged. It deliberately does not aggregate multiple
69
+ sources; see [workspace source selection](workspace-sources.md).
70
+
65
71
  ## Scalable projection
66
72
 
67
73
  The target projection is sharded and generation-based:
@@ -265,3 +271,5 @@ fall back to the default, while a configured non-H2 match is invalid.
265
271
  6. Thin Codex integration and generated agent instructions.
266
272
  7. MCP adapter (an initial read-only stdio adapter ships as
267
273
  `docsystem.mcp_server`) and additional client integrations.
274
+ 8. Local workspace source selection for independently owned profiles, before
275
+ any atomic cross-source federation design.
@@ -71,10 +71,17 @@ The adapter is deliberately a wrapper, not a second implementation:
71
71
  | `impact` | text (Markdown table) | `docsystem impact ID PROJECT` |
72
72
  | `impact_packet` | object | `docsystem impact ID PROJECT` |
73
73
  | `agent_instructions` | object | `docsystem agent-instructions PROJECT --json` |
74
+ | `workspace_list` | object | `docsystem workspace list PROJECT --json` |
74
75
 
75
76
  Every tool takes the project root explicitly; none relies on the server
76
77
  process working directory.
77
78
 
79
+ Project-oriented tools also accept optional `source` and `workspace`
80
+ parameters for [workspace source selection](workspace-sources.md). They append
81
+ the corresponding CLI flags only when provided, so existing MCP calls remain
82
+ unchanged. `workspace_list` reports registry metadata without reading document
83
+ bodies. The adapter does not federate sources or expose workspace mutations.
84
+
78
85
  The packet tools use this envelope:
79
86
 
80
87
  ```json
@@ -0,0 +1,155 @@
1
+ # Workspace source selection
2
+
3
+ Documentation Engine normally operates on one project root passed directly to
4
+ each command. A local documentation workspace can register several independent
5
+ project profiles and let a caller select one by a stable source name instead
6
+ of repeating a machine-specific absolute path.
7
+
8
+ This feature is source selection, not federation. One command still sees one
9
+ ordinary catalog, dependency graph and projection. It does not merge IDs,
10
+ relations or context across sources.
11
+
12
+ ## Ownership model
13
+
14
+ Keep public product documentation in the repository that owns it. A private
15
+ workspace may hold ignored planning documents, internal reviews and other
16
+ local-only profiles outside public repositories. Each registered source is a
17
+ complete Documentation Engine project root with its own `.docsystem.toml`,
18
+ Markdown root and disposable `.docsystem/` projection.
19
+
20
+ The workspace registry does not copy, move, synchronize or delete documents.
21
+ Markdown ownership remains with the selected source. In particular, moving a
22
+ profile into a workspace is a separate, owner-controlled, copy-only migration:
23
+ the engine never authorizes removal of the original source tree.
24
+
25
+ ## Registry
26
+
27
+ Create `workspace.toml` at the root of the local workspace:
28
+
29
+ ```toml
30
+ version = 1
31
+
32
+ [[sources]]
33
+ name = "example-project"
34
+ root = "projects/example-project"
35
+ visibility = "private"
36
+
37
+ [[sources]]
38
+ name = "shared-guides"
39
+ root = "projects/shared-guides"
40
+ visibility = "public"
41
+ ```
42
+
43
+ Every source root is relative to the workspace, must remain inside it after
44
+ symlink resolution, and must name a complete project profile. Its configured
45
+ documentation root and projection cache must also resolve inside that source;
46
+ a writable symlink escape makes the source unavailable. Source names use
47
+ lowercase ASCII letters, digits and hyphens, starting with a letter. Names and
48
+ resolved roots must be unique and non-overlapping. `visibility` is required
49
+ and is either `private` or `public`.
50
+
51
+ Visibility is inspectable metadata in this milestone. It does not implement
52
+ authorization or redaction: selecting a private source explicitly means the
53
+ local caller is allowed to read it. Do not expose a workspace through an
54
+ untrusted service or publish generated output without applying the
55
+ organization's access policy.
56
+
57
+ Inspect the registry without reading document bodies:
58
+
59
+ ```bash
60
+ docsystem workspace list . --workspace /path/to/documentation-workspace
61
+ docsystem workspace list . --workspace /path/to/documentation-workspace --json
62
+ docsystem workspace doctor . --workspace /path/to/documentation-workspace
63
+ ```
64
+
65
+ The listing contains only source name, visibility, availability and a fixed
66
+ reason slug. Missing roots, missing or invalid configurations and unsafe local
67
+ paths remain visible; selecting any unavailable source fails closed.
68
+
69
+ ## Local project pointer
70
+
71
+ For routine use, place this ignored file in the consuming checkout:
72
+
73
+ ```toml
74
+ # .docsystem.local.toml
75
+ workspace = "/path/to/documentation-workspace"
76
+ ```
77
+
78
+ The pointer is local machine wiring, not public project policy. It accepts one
79
+ absolute path and is ignored by the Documentation Engine repository template.
80
+ Do not commit it or paste its value into public agent instructions.
81
+
82
+ Workspace discovery uses this precedence:
83
+
84
+ 1. `--workspace PATH`;
85
+ 2. `DOCSYSTEM_WORKSPACE`;
86
+ 3. `.docsystem.local.toml` in the positional project root.
87
+
88
+ An explicit source never falls back to the positional project when discovery,
89
+ manifest validation or source availability fails.
90
+
91
+ ## Selecting a source
92
+
93
+ Commands that operate on an existing project profile accept `--source NAME`
94
+ and `--workspace PATH`:
95
+
96
+ ```bash
97
+ docsystem readiness . --source example-project --json
98
+ docsystem catalog . --source example-project
99
+ docsystem context DOC-001 . --source example-project --depth 1
100
+ docsystem impact DOC-001 . --source example-project
101
+ docsystem index . --source example-project --write
102
+ ```
103
+
104
+ `--workspace` is normally omitted after installing the local pointer. On a
105
+ project command it is valid only together with `--source`. The `report draft`
106
+ command already uses `--source` for the reporting host, so its workspace
107
+ selector is spelled `--workspace-source`:
108
+
109
+ ```bash
110
+ docsystem report draft . \
111
+ --project-name "Example" \
112
+ --type adoption-finding \
113
+ --source codex \
114
+ --workspace-source example-project
115
+ ```
116
+
117
+ `init` remains a direct-path bootstrap command. Create a new profile with
118
+ `docsystem init PATH`, then register that valid project root in
119
+ `workspace.toml`; source selection never creates or repairs workspace entries.
120
+
121
+ When no source selector is present, workspace state is not loaded or validated
122
+ and the existing single-project behavior is unchanged. Selected-source
123
+ readiness and agent-instruction output identify the project by the caller's
124
+ positional discovery root plus `--source NAME`, never by the private source
125
+ root. Generated next commands therefore remain directly executable while the
126
+ same local pointer or environment wiring is active.
127
+
128
+ Mutating commands retain their existing authorization boundary. Source
129
+ selection does not make `init`, `migrate --apply` or `index --write` read-only;
130
+ it only changes the one project root they target. Agents must still obtain the
131
+ required approval and backup local-only authored state first.
132
+
133
+ ## MCP
134
+
135
+ The read-only MCP tools accept optional `source` and `workspace` parameters.
136
+ They forward the same CLI flags and preserve the old invocation exactly when
137
+ both are omitted. `workspace_list` exposes the body-free registry listing.
138
+ MCP does not expose workspace creation, synchronization, migration or source
139
+ mutation.
140
+
141
+ ## Deliberate non-goals
142
+
143
+ This milestone does not provide:
144
+
145
+ - qualified cross-project document IDs;
146
+ - cross-source dependency edges or aggregate context;
147
+ - a workspace-level projection;
148
+ - remote/network sources, authentication or authorization;
149
+ - concurrent-write locking;
150
+ - Git synchronization, import, copy or deletion;
151
+ - a documentation web server or UI.
152
+
153
+ Those capabilities require one atomic federation design. Until then, a caller
154
+ that needs another project selects that source in a separate command and must
155
+ not infer a complete cross-project graph.
@@ -9,7 +9,7 @@ from docsystem.catalog import (
9
9
  from docsystem.metadata import DocumentMetadata, MetadataReference
10
10
  from docsystem.sections import MarkdownSection
11
11
 
12
- __version__ = "0.1.2"
12
+ __version__ = "0.2.0"
13
13
 
14
14
  __all__ = [
15
15
  "CatalogMembership",