spolvero 0.5.0__tar.gz → 0.6.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.
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/workflows/ci.yml +22 -5
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/workflows/release.yml +24 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/HANDOFF.md +17 -12
- spolvero-0.6.0/LICENSE +21 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/PKG-INFO +72 -15
- {spolvero-0.5.0 → spolvero-0.6.0}/README.md +69 -13
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/claude/.claude/skills/spolvero-roundtrip/SKILL.md +16 -6
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/agents/recipes.md +13 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/artifact-governance.md +7 -2
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/consumer-ci-recipe.md +7 -3
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/current-state.md +14 -9
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/declaratus-migration.md +5 -7
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/demos/round-trip/README.md +28 -25
- spolvero-0.5.0/docs/demos/round-trip/accepted/d1.layout.yml → spolvero-0.6.0/docs/demos/round-trip/accepted/diagram-001.layout.yml +18 -3
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/demos/round-trip/accepted/drift.json +1 -1
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/demos/round-trip/accepted/drift.md +1 -1
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/demos/round-trip/rejected/drift.json +1 -1
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/demos/round-trip/rejected/drift.md +1 -1
- spolvero-0.6.0/docs/plans/04-container-stamping-and-multi-diagram-patches.md +205 -0
- spolvero-0.6.0/docs/plans/05-manual-annotations.md +131 -0
- spolvero-0.6.0/docs/releases/0.6.0.md +48 -0
- spolvero-0.6.0/docs/round-trip-workflow.md +161 -0
- spolvero-0.6.0/docs/specs/04-container-stamping-and-multi-diagram-patches.md +269 -0
- spolvero-0.6.0/docs/specs/05-manual-annotations.md +210 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/vsdx-template-contract.md +10 -6
- {spolvero-0.5.0 → spolvero-0.6.0}/pyproject.toml +2 -1
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero-roundtrip/SKILL.md +13 -6
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero-roundtrip/references/coverage-and-drift.md +43 -13
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero-roundtrip/references/pr-preparation.md +4 -1
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero-roundtrip/references/workflow.md +26 -12
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero-roundtrip/scripts/roundtrip_review.py +128 -28
- spolvero-0.6.0/src/spolvero/annotations.py +163 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/builder.py +158 -21
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/cli.py +75 -11
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/constants.py +1 -1
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/drift_detection.py +113 -34
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/engines/__init__.py +2 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/engines/vsdx_template.py +186 -1
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/hygiene.py +1 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/layout_extraction.py +39 -13
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/layout_patch.py +24 -5
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/render.py +56 -14
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/schema.py +12 -0
- spolvero-0.6.0/src/spolvero/schemas/annotations.schema.json +29 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/schemas/layout-patch.schema.json +25 -3
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/schemas/manifest.schema.json +4 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/stamping.py +45 -32
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/_review_toolkit.py +43 -7
- spolvero-0.6.0/tests/desktop/__init__.py +0 -0
- spolvero-0.6.0/tests/desktop/test_visio_desktop.py +224 -0
- spolvero-0.6.0/tests/fixtures/connector-attachment.mmd +3 -0
- spolvero-0.6.0/tests/fixtures/connector-direction.mmd +6 -0
- spolvero-0.6.0/tests/fixtures/reviewed-topology.vsdx +0 -0
- spolvero-0.6.0/tests/test_annotations.py +183 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_cli_detect_drift.py +5 -1
- spolvero-0.6.0/tests/test_cli_extract_layout.py +134 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_drift_detection.py +226 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_layout_extraction.py +31 -9
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_layout_patch.py +89 -2
- spolvero-0.6.0/tests/test_package_build.py +319 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_render_with_overrides.py +141 -0
- spolvero-0.6.0/tests/test_roundtrip_annotations.py +178 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_roundtrip_review.py +145 -1
- spolvero-0.6.0/tests/test_roundtrip_review_guard.py +167 -0
- spolvero-0.6.0/tests/test_roundtrip_topology.py +168 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_stamping.py +108 -2
- spolvero-0.6.0/tests/test_vsdx_connectors.py +271 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_vsdx_template.py +33 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/uv.lock +1 -1
- spolvero-0.5.0/docs/round-trip-workflow.md +0 -104
- spolvero-0.5.0/tests/test_cli_extract_layout.py +0 -66
- spolvero-0.5.0/tests/test_package_build.py +0 -127
- {spolvero-0.5.0 → spolvero-0.6.0}/.gitattributes +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/CODEOWNERS +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/ISSUE_TEMPLATE/feature_engine_work.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/ISSUE_TEMPLATE/qa_hygiene_work.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/ISSUE_TEMPLATE/release_work.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/ISSUE_TEMPLATE/vsdx_template_work.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/copilot-instructions.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/dependabot.yml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/instructions/spolvero.instructions.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/pull_request_template.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/workflows/codeql.yml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.github/workflows/dependency-review.yml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/.gitignore +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/AGENTS.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/CLAUDE.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/SECURITY.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/claude/.claude/skills/spolvero/SKILL.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/claude/CLAUDE.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/claude/INSTALL.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/copilot/.github/copilot-instructions.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/copilot/.github/instructions/spolvero.instructions.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/copilot/INSTALL.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/adapters/generic/AGENTS.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/agent-usage.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/agents/architecture.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/agents/extending.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/agents/glossary.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/feature-expansion/template-testing-lessons.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/plans/01-round-trip-drift-engine.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/plans/03-connector-endpoint-drift.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/qa-corpus-and-sanitization.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/qa-findings-plan.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/research/artifact-governance.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/security-posture-audit.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/specs/01-round-trip-drift-engine.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/specs/02-visio-diagram-handoff-assistant-skill.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/specs/03-connector-endpoint-drift.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/support-matrix.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/topology-ir.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/docs/using-the-package.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero/SKILL.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero/agents/openai.yaml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero/references/support-matrix.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero/scripts/spolvero_packager.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/skills/codex/spolvero-roundtrip/agents/openai.yaml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/__init__.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/__main__.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/engines/data_visualizer.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/engines/package_only.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/engines/visio_com.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/inspection.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/ir.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/models.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/reports.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/schemas/__init__.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/schemas/ir.schema.json +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/schemas/topology.schema.json +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/source.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/templates/LICENSE.txt +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/templates/minimal_flowchart.vsdx +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/topology/__init__.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/topology/model.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/utils.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/src/spolvero/workbook.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/__init__.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/_paths.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/reviewed-connectors.vsdx +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/reviewed-simple.vsdx +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample-network.topology.yaml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample-sequence.mmd +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample-trd.topology.json +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample.dot +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample.md +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample.png +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample.puml +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/sample.svg +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/simple.mmd +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/fixtures/synthetic-rich.mmd +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_cli.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_engine_registry.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_extraction.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_hygiene.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_mermaid_ir.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_optional_tools.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_review_toolkit.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_topology_ir.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_visio_com.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_vsdx_inspection.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/test_workbook.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/validation/test_roundtrip_script_hardening.py +0 -0
- {spolvero-0.5.0 → spolvero-0.6.0}/tests/validation/test_skill_adapters.py +0 -0
|
@@ -34,16 +34,33 @@ jobs:
|
|
|
34
34
|
- name: Assert generated artifacts
|
|
35
35
|
run: uv run python -c "import json, pathlib, zipfile; root=pathlib.Path('.tmp/ci-smoke'); manifest=json.loads((root/'manifest.json').read_text()); assert manifest['schema_version']=='1.0.0'; assert len(manifest['diagrams'])==3; assert (root/'preview/diagram-001.png').read_bytes().startswith(b'\x89PNG\r\n\x1a\n'); assert zipfile.is_zipfile(root/'visio/diagram-001-data-visualizer.xlsx')"
|
|
36
36
|
|
|
37
|
+
test-vsdx:
|
|
38
|
+
# Real-VSDX round-trip tests are skipped in the matrix above (no [vsdx] extra).
|
|
39
|
+
name: Real-VSDX tests (Python 3.13 on ubuntu-latest)
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
env:
|
|
42
|
+
SPOLVERO_TEST_VSDX: "1"
|
|
43
|
+
steps:
|
|
44
|
+
- uses: actions/checkout@v7
|
|
45
|
+
- uses: astral-sh/setup-uv@v7
|
|
46
|
+
with:
|
|
47
|
+
enable-cache: true
|
|
48
|
+
- uses: actions/setup-python@v6
|
|
49
|
+
with:
|
|
50
|
+
python-version: "3.13"
|
|
51
|
+
- name: Test with [vsdx] extra
|
|
52
|
+
run: uv run --extra vsdx pytest -rs
|
|
53
|
+
|
|
37
54
|
ci-summary:
|
|
38
55
|
name: ci-summary
|
|
39
56
|
runs-on: ubuntu-latest
|
|
40
|
-
needs: [test]
|
|
57
|
+
needs: [test, test-vsdx]
|
|
41
58
|
if: always()
|
|
42
59
|
steps:
|
|
43
|
-
- name: Check test
|
|
60
|
+
- name: Check test results
|
|
44
61
|
run: |
|
|
45
|
-
|
|
46
|
-
|
|
62
|
+
echo "test result: ${{ needs.test.result }}"
|
|
63
|
+
echo "test-vsdx result: ${{ needs.test-vsdx.result }}"
|
|
64
|
+
if [ "${{ needs.test.result }}" != "success" ] || [ "${{ needs.test-vsdx.result }}" != "success" ]; then
|
|
47
65
|
exit 1
|
|
48
66
|
fi
|
|
49
|
-
echo "test result: ${{ needs.test.result }}"
|
|
@@ -18,6 +18,15 @@ jobs:
|
|
|
18
18
|
with:
|
|
19
19
|
python-version: "3.13"
|
|
20
20
|
|
|
21
|
+
- name: Check tag matches package version
|
|
22
|
+
run: |
|
|
23
|
+
version="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')"
|
|
24
|
+
if [ "${GITHUB_REF_NAME}" != "v${version}" ]; then
|
|
25
|
+
echo "::error::Tag ${GITHUB_REF_NAME} does not match pyproject.toml version ${version} (expected v${version})."
|
|
26
|
+
exit 1
|
|
27
|
+
fi
|
|
28
|
+
echo "Tag ${GITHUB_REF_NAME} matches version ${version}."
|
|
29
|
+
|
|
21
30
|
- name: Install build tooling
|
|
22
31
|
run: python -m pip install --upgrade build twine
|
|
23
32
|
|
|
@@ -57,6 +66,20 @@ jobs:
|
|
|
57
66
|
permissions:
|
|
58
67
|
contents: write
|
|
59
68
|
steps:
|
|
69
|
+
- uses: actions/checkout@v7
|
|
70
|
+
with:
|
|
71
|
+
sparse-checkout: docs/releases
|
|
72
|
+
|
|
73
|
+
- name: Select curated release notes
|
|
74
|
+
id: notes
|
|
75
|
+
run: |
|
|
76
|
+
notes="docs/releases/${GITHUB_REF_NAME#v}.md"
|
|
77
|
+
if [ -f "$notes" ]; then
|
|
78
|
+
echo "body_path=$notes" >> "$GITHUB_OUTPUT"
|
|
79
|
+
else
|
|
80
|
+
echo "::warning::No $notes; the release body will be auto-generated only."
|
|
81
|
+
fi
|
|
82
|
+
|
|
60
83
|
- uses: actions/download-artifact@v8
|
|
61
84
|
with:
|
|
62
85
|
name: dist
|
|
@@ -65,5 +88,6 @@ jobs:
|
|
|
65
88
|
- uses: softprops/action-gh-release@v3
|
|
66
89
|
with:
|
|
67
90
|
files: dist/*
|
|
91
|
+
body_path: ${{ steps.notes.outputs.body_path }}
|
|
68
92
|
generate_release_notes: true
|
|
69
93
|
draft: false
|
|
@@ -8,7 +8,7 @@ Latest durable queue for `spolvero`.
|
|
|
8
8
|
- The repository now lives at `Declaratus/spolvero`; `main` should remain ready for post-release governance and operations work.
|
|
9
9
|
- CI exposes a single `ci-summary` aggregate check for org ruleset readiness.
|
|
10
10
|
- Latest default-branch checks are green, including `ci-summary`, CodeQL, and Dependency Review.
|
|
11
|
-
- v0.
|
|
11
|
+
- v0.5.0 is the previous tagged release. The package version is 0.6.0 (container stamping, multi-diagram patch matching, and manual annotation preservation; PRs #63–#66). Tagging and publication require separate approval; check for a `v0.6.0` tag before assuming it has shipped. See [docs/releases/0.6.0.md](docs/releases/0.6.0.md).
|
|
12
12
|
- Spolvero is promoted to `tier=internal`; repo-local branch protection is disabled, and default-branch policy is enforced through Declaratus org rulesets.
|
|
13
13
|
- Spolvero is recorded in `Declaratus/governance` property assignments; issue #18 is closed.
|
|
14
14
|
- CODEOWNERS covers release and governance-sensitive paths with the current owner handle until a Declaratus maintainer team exists.
|
|
@@ -62,19 +62,24 @@ New capabilities:
|
|
|
62
62
|
1. Source-metadata stamping (per-shape Visio Shape Data plus doc-level
|
|
63
63
|
`docProps/custom.xml`) on every `vsdx-template` build; see
|
|
64
64
|
`docs/vsdx-template-contract.md` for the stamp keys.
|
|
65
|
-
2. `spolvero extract-layout` lifts reviewer node positions
|
|
66
|
-
endpoints into a YAML layout patch
|
|
67
|
-
`spolvero.source_id
|
|
68
|
-
|
|
69
|
-
|
|
65
|
+
2. `spolvero extract-layout` lifts reviewer node positions, connector
|
|
66
|
+
endpoints, and topology container bounds into a YAML layout patch
|
|
67
|
+
(`patch_schema_version: 3`) keyed by `spolvero.source_id`; `--diagram`
|
|
68
|
+
defaults to the stamped `spolvero.diagram_id`.
|
|
69
|
+
3. `spolvero detect-drift` runs the D1–D6 detectors against the source IR
|
|
70
|
+
(D5 connector-endpoint drift landed with spec 03 / DEC-169; D1 containers
|
|
71
|
+
and the D6 pairing guard with spec 04 / DEC-170).
|
|
70
72
|
4. `spolvero build --layout-patch` regenerates while honouring reviewer
|
|
71
|
-
layout, including connector endpoint routes
|
|
73
|
+
layout, including connector endpoint routes and container bounds;
|
|
74
|
+
`--layout-patch` is repeatable and matched to diagrams by id.
|
|
75
|
+
5. `spolvero extract-layout --annotations-out` / `build --annotations`
|
|
76
|
+
capture and re-materialize reviewer-added shapes as `ownership: manual`
|
|
77
|
+
annotations via a committed sidecar (spec 05 / DEC-172).
|
|
72
78
|
|
|
73
79
|
Follow-ups:
|
|
74
80
|
|
|
75
|
-
1. The
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
stamping
|
|
79
|
-
and a consumer CI recipe (see the MVP limitations in
|
|
81
|
+
1. The residual engine scope is tracked in Linear on the Visio Renderer
|
|
82
|
+
initiative: waypoint/polyline route geometry, annotation styling fidelity,
|
|
83
|
+
and reviewer-drawn (1-D) annotations. Container membership drift and
|
|
84
|
+
flowchart-subgraph stamping are out of scope (see the MVP limitations in
|
|
80
85
|
`docs/round-trip-workflow.md`).
|
spolvero-0.6.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Declaratus
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: spolvero
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.0
|
|
4
4
|
Summary: Package docs-as-code diagrams into Visio-friendly handoff artifacts.
|
|
5
5
|
Author: Spolvero maintainers
|
|
6
6
|
License: MIT
|
|
7
|
+
License-File: LICENSE
|
|
7
8
|
Keywords: data-visualizer,diagram,handoff,mermaid,visio
|
|
8
9
|
Requires-Python: >=3.11
|
|
9
10
|
Provides-Extra: com
|
|
@@ -24,12 +25,47 @@ The package treats source diagrams as canonical unless a project deliberately mo
|
|
|
24
25
|
|
|
25
26
|
See [docs/using-the-package.md](docs/using-the-package.md) for what to do with the handoff folder once it has been generated.
|
|
26
27
|
|
|
28
|
+
**Status:** pre-1.0. The manifest and IR schemas are versioned, but the CLI and Python API may still change between minor releases. The `visio-com` engine does not create native COM shapes yet; it delegates to the engines below it.
|
|
29
|
+
|
|
30
|
+
## Install
|
|
31
|
+
|
|
32
|
+
Requires Python 3.11 or later.
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pip install spolvero
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The core install is stdlib-only. Each extra unlocks one optional engine or input format and is feature-detected at runtime so it never blocks the default path.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pip install 'spolvero[vsdx]' # vsdx-template engine (cross-platform)
|
|
42
|
+
pip install 'spolvero[topology]' # YAML topology inputs (PyYAML)
|
|
43
|
+
pip install 'spolvero[com]' # visio-com engine (Windows + Visio Plan 2)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
A Mermaid CLI (`mmdc`) on `PATH` is auto-detected for higher-fidelity Mermaid previews. Set `SPOLVERO_DISABLE_MMDC=1` to force the built-in renderer.
|
|
47
|
+
|
|
27
48
|
## Quick Start
|
|
28
49
|
|
|
29
50
|
```bash
|
|
30
51
|
spolvero build input.md --out ./handoff --target data-visualizer
|
|
31
52
|
```
|
|
32
53
|
|
|
54
|
+
For an input with one supported Mermaid flowchart, the output folder looks like this (`<id>` is the diagram id, such as `diagram-001`):
|
|
55
|
+
|
|
56
|
+
```text
|
|
57
|
+
handoff/
|
|
58
|
+
├── manifest.json # everything that was built, plus warnings
|
|
59
|
+
├── README.md # auto-generated package overview
|
|
60
|
+
├── source/ # original input + per-diagram extracted source
|
|
61
|
+
├── normalized/<id>.ir.json # validated intermediate representation
|
|
62
|
+
├── preview/<id>.svg, <id>.png # always generated
|
|
63
|
+
├── visio/<id>-data-visualizer.xlsx
|
|
64
|
+
└── qa/<id>-qa.md, <id>-conversion-log.json
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The workbook appears only for supported flowcharts and topology inputs; other diagrams are packaged as previews with reference editability. Open `manifest.json` for the summary and `qa/<id>-qa.md` for per-diagram warnings. The [handoff guide](docs/using-the-package.md) walks through each file.
|
|
68
|
+
|
|
33
69
|
From a checkout without installation:
|
|
34
70
|
|
|
35
71
|
```bash
|
|
@@ -51,6 +87,7 @@ build_package(Path("input.md"), Path("handoff"), "data-visualizer", title="Revie
|
|
|
51
87
|
- `src/spolvero/`: neutral Python library and CLI.
|
|
52
88
|
- `src/spolvero/schemas/`: versioned manifest and IR schemas.
|
|
53
89
|
- `skills/codex/spolvero/`: Codex-installable skill bundle generated from canonical docs and wrappers.
|
|
90
|
+
- `skills/codex/spolvero-roundtrip/`: Codex skill bundle for processing a reviewed `.vsdx` (coverage, layout patch, drift report).
|
|
54
91
|
- `adapters/`: Claude Code, GitHub Copilot, and generic agent install notes/instruction files.
|
|
55
92
|
- `tests/`: pytest coverage for extraction, Mermaid parsing, schemas, artifacts, adapters, and CLI smoke builds.
|
|
56
93
|
|
|
@@ -74,19 +111,6 @@ uv run spolvero sanitize-vsdx src/spolvero/templates/minimal_flowchart.vsdx --ou
|
|
|
74
111
|
|
|
75
112
|
See [docs/declaratus-migration.md](docs/declaratus-migration.md) for post-import operating guidance.
|
|
76
113
|
|
|
77
|
-
## Optional Extras
|
|
78
|
-
|
|
79
|
-
The core install is stdlib-only. Each extra unlocks one optional engine or input format and is feature-detected at runtime so it never blocks the default path.
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
pip install spolvero # stdlib-only default
|
|
83
|
-
pip install 'spolvero[vsdx]' # vsdx-template engine (cross-platform)
|
|
84
|
-
pip install 'spolvero[topology]' # YAML topology inputs (PyYAML)
|
|
85
|
-
pip install 'spolvero[com]' # visio-com engine (Windows + Visio Plan 2)
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
A Mermaid CLI (`mmdc`) on `PATH` is auto-detected for higher-fidelity Mermaid previews. Set `SPOLVERO_DISABLE_MMDC=1` to force the built-in renderer.
|
|
89
|
-
|
|
90
114
|
## Targets and Editability
|
|
91
115
|
|
|
92
116
|
| Target | Engine | Flowchart editability | Notes |
|
|
@@ -100,6 +124,33 @@ The manifest always records both `requested_engine` and `actual_engine` so engin
|
|
|
100
124
|
|
|
101
125
|
The VSDX template stamp contract is documented in [docs/vsdx-template-contract.md](docs/vsdx-template-contract.md). The bundled template is intentionally minimal; richer templates can provide preferred flowchart, topology, and container stamp names while remaining synthetic and organization-agnostic.
|
|
102
126
|
|
|
127
|
+
## Round-trip Review
|
|
128
|
+
|
|
129
|
+
When a `vsdx-template` file comes back from review in Visio, Spolvero keeps the reviewer's layout without editing your source. Every generated shape is stamped with its source id, so the reviewed file can be read back. Requires the `[vsdx]` extra.
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Capture reviewer positions, connector routes, and container bounds as a layout patch.
|
|
133
|
+
# --annotations-out also keeps shapes the reviewer added (callouts, notes) as a sidecar.
|
|
134
|
+
spolvero extract-layout reviewed.vsdx --out diagram-001.layout.yml \
|
|
135
|
+
--annotations-out diagram-001.annotations.yml
|
|
136
|
+
|
|
137
|
+
# Check what changed against the source: deleted or relabelled shapes,
|
|
138
|
+
# re-pointed connectors, stale source, or a file paired with the wrong diagram.
|
|
139
|
+
spolvero detect-drift handoff/normalized/diagram-001.ir.json reviewed.vsdx \
|
|
140
|
+
--source input.md --report drift.md
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
`detect-drift` exits 1 on high-severity drift. Stop there and review `drift.md` before rebuilding; only continue once the drift is understood or accepted.
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
# Rebuild with the reviewer's layout and annotations. Both flags are repeatable
|
|
147
|
+
# and matched to diagrams by id in multi-diagram packages.
|
|
148
|
+
spolvero build input.md --out handoff --target vsdx-template \
|
|
149
|
+
--layout-patch diagram-001.layout.yml --annotations diagram-001.annotations.yml
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Routes keep endpoints, not waypoints, and annotations keep geometry and text only. See [docs/round-trip-workflow.md](docs/round-trip-workflow.md) for the full workflow and limits, and the `spolvero-roundtrip` agent skill for a scripted review run.
|
|
153
|
+
|
|
103
154
|
## Inputs
|
|
104
155
|
|
|
105
156
|
- Mermaid flowchart (`.mmd`, fenced ` ```mermaid ` in Markdown) — primary input; full IR + workbook.
|
|
@@ -109,3 +160,9 @@ The VSDX template stamp contract is documented in [docs/vsdx-template-contract.m
|
|
|
109
160
|
## The name
|
|
110
161
|
|
|
111
162
|
Spolvero (Italian, *spol-VEH-roh*) is the Renaissance pouncing technique: an artist pricks holes along the lines of a finished drawing, then dusts pigment through them to transfer the design onto a wall or panel. The pricked cartoon is a deliberate intermediate — made for transfer, distinct from the original. This tool works the same way: it produces a transfer-ready rendering of a source diagram for the Visio surface, while the source stays canonical.
|
|
163
|
+
|
|
164
|
+
## Security and License
|
|
165
|
+
|
|
166
|
+
Report vulnerabilities as described in [SECURITY.md](SECURITY.md).
|
|
167
|
+
|
|
168
|
+
Spolvero is released under the [MIT License](LICENSE). The bundled `minimal_flowchart.vsdx` template is redistributed under the BSD 3-Clause License; see [src/spolvero/templates/LICENSE.txt](src/spolvero/templates/LICENSE.txt).
|
|
@@ -6,12 +6,47 @@ The package treats source diagrams as canonical unless a project deliberately mo
|
|
|
6
6
|
|
|
7
7
|
See [docs/using-the-package.md](docs/using-the-package.md) for what to do with the handoff folder once it has been generated.
|
|
8
8
|
|
|
9
|
+
**Status:** pre-1.0. The manifest and IR schemas are versioned, but the CLI and Python API may still change between minor releases. The `visio-com` engine does not create native COM shapes yet; it delegates to the engines below it.
|
|
10
|
+
|
|
11
|
+
## Install
|
|
12
|
+
|
|
13
|
+
Requires Python 3.11 or later.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install spolvero
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The core install is stdlib-only. Each extra unlocks one optional engine or input format and is feature-detected at runtime so it never blocks the default path.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install 'spolvero[vsdx]' # vsdx-template engine (cross-platform)
|
|
23
|
+
pip install 'spolvero[topology]' # YAML topology inputs (PyYAML)
|
|
24
|
+
pip install 'spolvero[com]' # visio-com engine (Windows + Visio Plan 2)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
A Mermaid CLI (`mmdc`) on `PATH` is auto-detected for higher-fidelity Mermaid previews. Set `SPOLVERO_DISABLE_MMDC=1` to force the built-in renderer.
|
|
28
|
+
|
|
9
29
|
## Quick Start
|
|
10
30
|
|
|
11
31
|
```bash
|
|
12
32
|
spolvero build input.md --out ./handoff --target data-visualizer
|
|
13
33
|
```
|
|
14
34
|
|
|
35
|
+
For an input with one supported Mermaid flowchart, the output folder looks like this (`<id>` is the diagram id, such as `diagram-001`):
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
handoff/
|
|
39
|
+
├── manifest.json # everything that was built, plus warnings
|
|
40
|
+
├── README.md # auto-generated package overview
|
|
41
|
+
├── source/ # original input + per-diagram extracted source
|
|
42
|
+
├── normalized/<id>.ir.json # validated intermediate representation
|
|
43
|
+
├── preview/<id>.svg, <id>.png # always generated
|
|
44
|
+
├── visio/<id>-data-visualizer.xlsx
|
|
45
|
+
└── qa/<id>-qa.md, <id>-conversion-log.json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The workbook appears only for supported flowcharts and topology inputs; other diagrams are packaged as previews with reference editability. Open `manifest.json` for the summary and `qa/<id>-qa.md` for per-diagram warnings. The [handoff guide](docs/using-the-package.md) walks through each file.
|
|
49
|
+
|
|
15
50
|
From a checkout without installation:
|
|
16
51
|
|
|
17
52
|
```bash
|
|
@@ -33,6 +68,7 @@ build_package(Path("input.md"), Path("handoff"), "data-visualizer", title="Revie
|
|
|
33
68
|
- `src/spolvero/`: neutral Python library and CLI.
|
|
34
69
|
- `src/spolvero/schemas/`: versioned manifest and IR schemas.
|
|
35
70
|
- `skills/codex/spolvero/`: Codex-installable skill bundle generated from canonical docs and wrappers.
|
|
71
|
+
- `skills/codex/spolvero-roundtrip/`: Codex skill bundle for processing a reviewed `.vsdx` (coverage, layout patch, drift report).
|
|
36
72
|
- `adapters/`: Claude Code, GitHub Copilot, and generic agent install notes/instruction files.
|
|
37
73
|
- `tests/`: pytest coverage for extraction, Mermaid parsing, schemas, artifacts, adapters, and CLI smoke builds.
|
|
38
74
|
|
|
@@ -56,19 +92,6 @@ uv run spolvero sanitize-vsdx src/spolvero/templates/minimal_flowchart.vsdx --ou
|
|
|
56
92
|
|
|
57
93
|
See [docs/declaratus-migration.md](docs/declaratus-migration.md) for post-import operating guidance.
|
|
58
94
|
|
|
59
|
-
## Optional Extras
|
|
60
|
-
|
|
61
|
-
The core install is stdlib-only. Each extra unlocks one optional engine or input format and is feature-detected at runtime so it never blocks the default path.
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
pip install spolvero # stdlib-only default
|
|
65
|
-
pip install 'spolvero[vsdx]' # vsdx-template engine (cross-platform)
|
|
66
|
-
pip install 'spolvero[topology]' # YAML topology inputs (PyYAML)
|
|
67
|
-
pip install 'spolvero[com]' # visio-com engine (Windows + Visio Plan 2)
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
A Mermaid CLI (`mmdc`) on `PATH` is auto-detected for higher-fidelity Mermaid previews. Set `SPOLVERO_DISABLE_MMDC=1` to force the built-in renderer.
|
|
71
|
-
|
|
72
95
|
## Targets and Editability
|
|
73
96
|
|
|
74
97
|
| Target | Engine | Flowchart editability | Notes |
|
|
@@ -82,6 +105,33 @@ The manifest always records both `requested_engine` and `actual_engine` so engin
|
|
|
82
105
|
|
|
83
106
|
The VSDX template stamp contract is documented in [docs/vsdx-template-contract.md](docs/vsdx-template-contract.md). The bundled template is intentionally minimal; richer templates can provide preferred flowchart, topology, and container stamp names while remaining synthetic and organization-agnostic.
|
|
84
107
|
|
|
108
|
+
## Round-trip Review
|
|
109
|
+
|
|
110
|
+
When a `vsdx-template` file comes back from review in Visio, Spolvero keeps the reviewer's layout without editing your source. Every generated shape is stamped with its source id, so the reviewed file can be read back. Requires the `[vsdx]` extra.
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
# Capture reviewer positions, connector routes, and container bounds as a layout patch.
|
|
114
|
+
# --annotations-out also keeps shapes the reviewer added (callouts, notes) as a sidecar.
|
|
115
|
+
spolvero extract-layout reviewed.vsdx --out diagram-001.layout.yml \
|
|
116
|
+
--annotations-out diagram-001.annotations.yml
|
|
117
|
+
|
|
118
|
+
# Check what changed against the source: deleted or relabelled shapes,
|
|
119
|
+
# re-pointed connectors, stale source, or a file paired with the wrong diagram.
|
|
120
|
+
spolvero detect-drift handoff/normalized/diagram-001.ir.json reviewed.vsdx \
|
|
121
|
+
--source input.md --report drift.md
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
`detect-drift` exits 1 on high-severity drift. Stop there and review `drift.md` before rebuilding; only continue once the drift is understood or accepted.
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# Rebuild with the reviewer's layout and annotations. Both flags are repeatable
|
|
128
|
+
# and matched to diagrams by id in multi-diagram packages.
|
|
129
|
+
spolvero build input.md --out handoff --target vsdx-template \
|
|
130
|
+
--layout-patch diagram-001.layout.yml --annotations diagram-001.annotations.yml
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Routes keep endpoints, not waypoints, and annotations keep geometry and text only. See [docs/round-trip-workflow.md](docs/round-trip-workflow.md) for the full workflow and limits, and the `spolvero-roundtrip` agent skill for a scripted review run.
|
|
134
|
+
|
|
85
135
|
## Inputs
|
|
86
136
|
|
|
87
137
|
- Mermaid flowchart (`.mmd`, fenced ` ```mermaid ` in Markdown) — primary input; full IR + workbook.
|
|
@@ -91,3 +141,9 @@ The VSDX template stamp contract is documented in [docs/vsdx-template-contract.m
|
|
|
91
141
|
## The name
|
|
92
142
|
|
|
93
143
|
Spolvero (Italian, *spol-VEH-roh*) is the Renaissance pouncing technique: an artist pricks holes along the lines of a finished drawing, then dusts pigment through them to transfer the design onto a wall or panel. The pricked cartoon is a deliberate intermediate — made for transfer, distinct from the original. This tool works the same way: it produces a transfer-ready rendering of a source diagram for the Visio surface, while the source stays canonical.
|
|
144
|
+
|
|
145
|
+
## Security and License
|
|
146
|
+
|
|
147
|
+
Report vulnerabilities as described in [SECURITY.md](SECURITY.md).
|
|
148
|
+
|
|
149
|
+
Spolvero is released under the [MIT License](LICENSE). The bundled `minimal_flowchart.vsdx` template is redistributed under the BSD 3-Clause License; see [src/spolvero/templates/LICENSE.txt](src/spolvero/templates/LICENSE.txt).
|
{spolvero-0.5.0 → spolvero-0.6.0}/adapters/claude/.claude/skills/spolvero-roundtrip/SKILL.md
RENAMED
|
@@ -32,15 +32,25 @@ Core rules:
|
|
|
32
32
|
subcommands only. Never run ad-hoc Python against a `.vsdx`.
|
|
33
33
|
- Exit 0: clean or medium findings — proceed to PR preparation per the
|
|
34
34
|
bundle's `references/pr-preparation.md`.
|
|
35
|
-
- Exit 1: high-severity drift (D1 deleted shape
|
|
36
|
-
|
|
37
|
-
decide.
|
|
38
|
-
-
|
|
39
|
-
|
|
40
|
-
`
|
|
35
|
+
- Exit 1: high-severity drift (D1 deleted shape, connector, or container /
|
|
36
|
+
D4 revision mismatch / D5 re-pointed endpoint / D6 wrong diagram) — HALT
|
|
37
|
+
before PR preparation; show `validation-report.md` and let a human decide.
|
|
38
|
+
- Shapes the reviewer added in Visio are medium (D2) findings and are dropped
|
|
39
|
+
on rebuild. Keep them only if the user asks: run
|
|
40
|
+
`spolvero extract-layout reviewed.vsdx --out <diagram>.layout.yml --annotations-out <diagram>.annotations.yml`
|
|
41
|
+
and commit the sidecar next to the patch (see the bundle's
|
|
42
|
+
`references/coverage-and-drift.md`).
|
|
43
|
+
- Exit 2: input/environment error or failed/incomplete rebuild. HALT before
|
|
44
|
+
PR preparation. Rebuild failures retain a HALT validation report; the "not
|
|
45
|
+
a round-trip candidate" stop retains `coverage.json` and `drift.*` as evidence.
|
|
41
46
|
- If the `.vsdx` came from outside the repo, run `spolvero inspect-vsdx`
|
|
42
47
|
(read-only) first and surface sensitive-pattern findings.
|
|
43
48
|
- Never merge, never push to a protected branch, never commit a reviewed
|
|
44
49
|
`.vsdx` binary. No COM automation.
|
|
45
50
|
|
|
51
|
+
The wrapper requires a non-empty IR id; explicit `--diagram` must match it.
|
|
52
|
+
Rebuild patch warnings (`patch_unmatched`, `patch_diagram_mismatch`,
|
|
53
|
+
`patch_stale`) halt PR preparation with exit 2 and a HALT validation report.
|
|
54
|
+
Failed rebuilds also halt; retained previews are not validated.
|
|
55
|
+
|
|
46
56
|
Requires the `[vsdx]` extra: `pip install 'spolvero[vsdx]'`.
|
|
@@ -19,6 +19,19 @@ set SPOLVERO_TEST_COM=1
|
|
|
19
19
|
uv run pytest -q
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
+
## Live Visio acceptance checks
|
|
23
|
+
|
|
24
|
+
`tests/desktop` opens generated files in an invisible Visio instance, moves
|
|
25
|
+
connected nodes, saves, reopens and rebuilds. Hosted CI cannot run it (no
|
|
26
|
+
licensed Visio), so a maintainer runs it on a licensed Windows machine:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
SPOLVERO_TEST_VSDX=1 SPOLVERO_TEST_VISIO_DESKTOP=1 uv run --extra vsdx --extra com pytest -m visio_desktop -rsx
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Report which tests passed, failed, xfailed or were skipped. Never run these on
|
|
33
|
+
a self-hosted runner that executes public pull-request code.
|
|
34
|
+
|
|
22
35
|
## Smoke build a sample package
|
|
23
36
|
|
|
24
37
|
```bash
|
|
@@ -53,6 +53,10 @@ tracked in git as long as the diagram exists.
|
|
|
53
53
|
patch to work around a stale `source_revision` — re-extract instead.
|
|
54
54
|
- Lives alongside the diagram it patches, not in a separate patches
|
|
55
55
|
directory or branch.
|
|
56
|
+
- Annotation sidecars (`layouts/<diagram>.annotations.yml`, spec 05) follow
|
|
57
|
+
the same rules: committed text, keyed by `manual-NNN`, tracked alongside the
|
|
58
|
+
diagram. They are reviewer-owned rather than source-owned, so unlike a patch
|
|
59
|
+
they are not pinned to a `source_revision` and survive source changes.
|
|
56
60
|
|
|
57
61
|
## Drift reports
|
|
58
62
|
|
|
@@ -131,8 +135,9 @@ exception to "no committed binaries," and it stays singular by default.
|
|
|
131
135
|
## Test fixtures
|
|
132
136
|
|
|
133
137
|
Checked-in adversarial `.vsdx` fixtures under `tests/fixtures/` are
|
|
134
|
-
sanctioned — `reviewed-simple.vsdx` has been tracked since spec 01,
|
|
135
|
-
|
|
138
|
+
sanctioned — `reviewed-simple.vsdx` has been tracked since spec 01, spec 03
|
|
139
|
+
adds `reviewed-connectors.vsdx`, and spec 04 adds `reviewed-topology.vsdx`.
|
|
140
|
+
They are not reviewer output and
|
|
136
141
|
the "reviewed `.vsdx` binaries are never committed" rule does not apply to
|
|
137
142
|
them: they are generated headlessly from tracked sources by
|
|
138
143
|
`tests/_review_toolkit.py` (spec 01 §11's stand-in for a Visio session) and
|
|
@@ -11,13 +11,17 @@ D1–D4 semantics, and `docs/specs/03-connector-endpoint-drift.md` §7 for D5.
|
|
|
11
11
|
`spolvero detect-drift` exits non-zero when any **high-severity** finding is
|
|
12
12
|
present:
|
|
13
13
|
|
|
14
|
-
- **D1** — source-owned shape or
|
|
14
|
+
- **D1** — source-owned shape, connector, or container deleted from the
|
|
15
|
+
reviewed VSDX.
|
|
15
16
|
- **D4** — doc-level source-hash no longer matches the `--source` file.
|
|
16
17
|
- **D5** (`endpoint_repointed`) — a connector endpoint re-pointed at a
|
|
17
18
|
different source-owned node.
|
|
19
|
+
- **D6** (`diagram_mismatch`) — the reviewed VSDX was generated as a
|
|
20
|
+
different diagram than the paired IR (short-circuits all other detectors).
|
|
18
21
|
|
|
19
|
-
Medium findings (**D2** invalid/missing metadata, **D3** label changed
|
|
20
|
-
**D5** `endpoint_dangling`) are reported but
|
|
22
|
+
Medium findings (**D2** invalid/missing metadata, **D3** label changed on a
|
|
23
|
+
node, connector, or container, **D5** `endpoint_dangling`) are reported but
|
|
24
|
+
exit 0 — they're
|
|
21
25
|
recommendations for a human reviewer, not blockers. That non-zero-on-high exit is the CI gate: wire it into a required
|
|
22
26
|
check and a round-trip review PR cannot merge with undetected shape deletions
|
|
23
27
|
or a stale source revision. Exit codes are enumerated in §4; note that runtime
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
# Current State
|
|
2
2
|
|
|
3
|
-
Snapshot
|
|
3
|
+
Snapshot for 0.6.0: container stamping, multi-diagram patches, and manual annotation preservation. See [releases/0.6.0.md](releases/0.6.0.md).
|
|
4
4
|
|
|
5
5
|
## Version
|
|
6
6
|
|
|
7
|
-
- Package: `spolvero` 0.
|
|
7
|
+
- Package: `spolvero` 0.6.0 (publication is recorded by the `v0.6.0` tag and the PyPI release)
|
|
8
8
|
- Schema version: `1.0.0` (manifest, IR, topology IR)
|
|
9
|
-
-
|
|
9
|
+
- Hosted CI runs Linux/Windows on Python 3.11 and 3.13. Release validation must also install `[vsdx]` and enable `SPOLVERO_TEST_VSDX=1`; skip counts vary by optional tools.
|
|
10
10
|
|
|
11
11
|
## Governance / Operations
|
|
12
12
|
|
|
13
13
|
- Repository: `Declaratus/spolvero`
|
|
14
|
-
-
|
|
14
|
+
- Previous release: `v0.5.0`. 0.6.0 ships by following the [release process](releases/0.6.0.md#release-process), which requires explicit publication approval.
|
|
15
15
|
- Current governance track: post-import operations and follow-up security hardening.
|
|
16
16
|
- Custom properties: `tier=internal`, `data-classification=internal`, `lifecycle-stage=active`; owner assignment is managed in the governance source of truth.
|
|
17
17
|
- CI runs the Linux/Windows Python 3.11/3.13 matrix and exposes `ci-summary` as the aggregate check for Declaratus org ruleset readiness.
|
|
@@ -108,9 +108,10 @@ Slashes from parallelogram `[/.../]` are stripped from the label.
|
|
|
108
108
|
### Round-trip layout and drift tooling
|
|
109
109
|
|
|
110
110
|
- Every `vsdx-template` build stamps source metadata: per-shape `spolvero.*` Visio Shape Data keys plus doc-level `docProps/custom.xml` entries including the source hash, per [vsdx-template-contract.md](vsdx-template-contract.md).
|
|
111
|
-
- `spolvero extract-layout` lifts reviewer node positions
|
|
112
|
-
- `spolvero detect-drift` runs the D1–
|
|
113
|
-
- `spolvero build --layout-patch` regenerates a package while honouring reviewer positions; patched node x/y
|
|
111
|
+
- `spolvero extract-layout` lifts reviewer node positions, connector begin/end endpoints, and topology container bounds from a reviewed `.vsdx` into a YAML layout patch (`patch_schema_version: 3`) keyed by `spolvero.source_id`. `--diagram` is optional and defaults to the stamped `spolvero.diagram_id`. Requires the `[vsdx]` extra.
|
|
112
|
+
- `spolvero detect-drift` runs the D1–D6 detectors against the source IR and compares the doc-level source hash against `--source`; it exits non-zero on high-severity findings (D1 deleted shape, connector, or container; D4 source-hash mismatch; D5 re-pointed connector endpoint; D6 wrong IR/vsdx pairing). Requires the `[vsdx]` extra.
|
|
113
|
+
- `spolvero build --layout-patch` regenerates a package while honouring reviewer positions; patched node x/y, connector endpoints, and container bounds apply to the VSDX and the built-in preview. `--layout-patch` is repeatable and matched to diagrams by id. v1/v2 patches still load and apply.
|
|
114
|
+
- `spolvero extract-layout --annotations-out` adopts reviewer-added unstamped 2-D shapes into a YAML annotations sidecar (`annotations_schema_version: 1`, keyed by `manual-NNN`); `spolvero build --annotations` re-materializes them as `ownership: manual` / `role: annotation` shapes on the vsdx-template surface (spec 05). Geometry and text are preserved; styling is not.
|
|
114
115
|
- See [round-trip-workflow.md](round-trip-workflow.md) for the end-to-end flow and MVP limitations.
|
|
115
116
|
|
|
116
117
|
### Governance and repository hygiene tooling
|
|
@@ -127,7 +128,7 @@ Slashes from parallelogram `[/.../]` are stripped from the label.
|
|
|
127
128
|
| Engines | TODO: higher-fidelity synthetic templates | The engine now documents preferred flowchart/topology/container stamp names and warns on degradation, but the bundled template remains intentionally minimal. |
|
|
128
129
|
| Engines | TODO: `visio-com` native body | The Windows-only path currently delegates to downstream engines and preserves delegated editability. A fully COM-driven shape/connector pass is a future iteration and should be the only path that emits `native`. |
|
|
129
130
|
| QA / safety | TODO: external corpus automation | Read-only inspection and opt-in XML sanitization are implemented. External corpus manifests, license approvals, and media/OCR automation remain outside tracked source until explicitly approved. |
|
|
130
|
-
| Round-trip | Residual engine scope | Waypoint/polyline route geometry,
|
|
131
|
+
| Round-trip | Residual engine scope | Waypoint/polyline route geometry, annotation styling fidelity, and reviewer-drawn connectors are deferred; container membership drift and flowchart-subgraph stamping are out of scope (see the MVP limitations in [round-trip-workflow.md](round-trip-workflow.md)); tracked in Linear on the Visio Renderer initiative. |
|
|
131
132
|
| Workbook metadata | Mermaid metadata columns | Mermaid carries no `Phase`, `System`, `Owner`, or `Criticality` metadata; topology nodes can populate them via `metadata`. |
|
|
132
133
|
|
|
133
134
|
## Roadmap
|
|
@@ -147,12 +148,16 @@ Major engineering items now landed:
|
|
|
147
148
|
|
|
148
149
|
9. ✅ Connector-endpoint drift and edge-route geometry (spec 03, DEC-169): D5 detector with glue read-through, layout patch v2 with edge routes, and edge overrides on both rebuild surfaces.
|
|
149
150
|
|
|
151
|
+
10. ✅ Container stamping and multi-diagram patch matching (spec 04, DEC-170): topology containers stamped with `spolvero.role`, patch v3 with a containers section, D1 `container_deleted` + D3 container relabels, the `spolvero.diagram_id` doc stamp with the D6 pairing guard, and repeatable diagram-matched `--layout-patch`. Also removed the false D2-per-container finding on topology round-trips.
|
|
152
|
+
|
|
153
|
+
11. ✅ Manual-annotation ownership and preservation (spec 05, DEC-172): `ownership: manual` activated via a committed annotations sidecar — `extract-layout --annotations-out` adopts reviewer-added 2-D shapes, `build --annotations` re-materializes them, and extraction routes them out of the source-owned drift maps. D2's unstamped-shape recommendation now names the adoption flag.
|
|
154
|
+
|
|
150
155
|
Next-up TODO areas:
|
|
151
156
|
|
|
152
157
|
- Hand-rolled `.vsdx` body in the visio-com engine (true native shapes/connectors when Visio is reachable).
|
|
153
158
|
- Higher-fidelity synthetic templates for flowchart/topology stamps beyond the bundled minimal fixture.
|
|
154
159
|
- External corpus harnesses and media/OCR review workflows as post-release security/QA work.
|
|
155
|
-
- Residual round-trip scope (waypoint/polyline routes
|
|
160
|
+
- Residual round-trip scope (waypoint/polyline routes; annotation styling fidelity and reviewer-drawn connectors), tracked in Linear on the Visio Renderer initiative.
|
|
156
161
|
|
|
157
162
|
## References
|
|
158
163
|
|
|
@@ -10,7 +10,7 @@ git, and keep Visio/Office artifacts reviewable.
|
|
|
10
10
|
## Operating Baseline
|
|
11
11
|
|
|
12
12
|
- Repository: `Declaratus/spolvero`
|
|
13
|
-
-
|
|
13
|
+
- Import baseline: `0.3.0` (historical); see [current-state.md](current-state.md) for the current release candidate.
|
|
14
14
|
- Schema version: `1.0.0`
|
|
15
15
|
- Custom properties: `tier=internal`, `data-classification=internal`, `lifecycle-stage=active`
|
|
16
16
|
- Default-branch policy: inherited from Declaratus org rulesets, especially `tier-internal`
|
|
@@ -95,10 +95,8 @@ Future changes to organization-wide policy, repository classification, rulesets,
|
|
|
95
95
|
controls belong in `Declaratus/governance`. Spolvero-local docs should describe how inherited policy affects
|
|
96
96
|
this package without duplicating it as repo-local policy.
|
|
97
97
|
|
|
98
|
-
##
|
|
98
|
+
## Completed Governance Follow-Ups
|
|
99
99
|
|
|
100
|
-
- #30: Add PyPI environment protection for releases.
|
|
101
|
-
- #31: Evaluate Python dependency audit workflow.
|
|
102
|
-
- #32: Enable Code Security and add scanning gates.
|
|
103
|
-
|
|
104
|
-
Keep the v0.4 VSDX template expansion and future COM-native work separate from this governance cleanup.
|
|
100
|
+
- #30 (closed): Add PyPI environment protection for releases.
|
|
101
|
+
- #31 (closed): Evaluate Python dependency audit workflow.
|
|
102
|
+
- #32 (closed): Enable Code Security and add scanning gates.
|