toolframe-core 0.6.2__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 (132) hide show
  1. toolframe_core-0.6.2/.github/workflows/ci.yml +20 -0
  2. toolframe_core-0.6.2/.github/workflows/launcher.yml +96 -0
  3. toolframe_core-0.6.2/.github/workflows/publish.yml +128 -0
  4. toolframe_core-0.6.2/.github/workflows/validate.yml +102 -0
  5. toolframe_core-0.6.2/.gitignore +28 -0
  6. toolframe_core-0.6.2/CHANGELOG.md +48 -0
  7. toolframe_core-0.6.2/Cargo.lock +1689 -0
  8. toolframe_core-0.6.2/Cargo.toml +24 -0
  9. toolframe_core-0.6.2/LICENSE +202 -0
  10. toolframe_core-0.6.2/NOTICE +14 -0
  11. toolframe_core-0.6.2/PKG-INFO +465 -0
  12. toolframe_core-0.6.2/README.md +434 -0
  13. toolframe_core-0.6.2/companion-wheels.txt +2 -0
  14. toolframe_core-0.6.2/docs/adr/0001-explicit-dashboard-access-mode.md +17 -0
  15. toolframe_core-0.6.2/docs/adr/0002-scoped-passwords-and-public-business-entrances.md +25 -0
  16. toolframe_core-0.6.2/docs/adr/0003-public-fallback-on-auth-error-or-disablement.md +34 -0
  17. toolframe_core-0.6.2/docs/adr/0004-separate-auth-ownership-from-dashboard-presentation.md +13 -0
  18. toolframe_core-0.6.2/docs/adr/0005-password-only-login-and-secret-reuse.md +12 -0
  19. toolframe_core-0.6.2/docs/adr/0006-require-explicit-plugin-authorization-contracts.md +12 -0
  20. toolframe_core-0.6.2/docs/adr/0007-independent-mcp-bearer-authentication.md +21 -0
  21. toolframe_core-0.6.2/docs/adr/0008-shared-oidc-authentication.md +37 -0
  22. toolframe_core-0.6.2/docs/adr/0009-replaceable-core-journal.md +36 -0
  23. toolframe_core-0.6.2/docs/adr/0010-multiple-sql-providers.md +39 -0
  24. toolframe_core-0.6.2/docs/adr/0011-safe-new-application-access.md +27 -0
  25. toolframe_core-0.6.2/docs/adr/0012-optional-runtime-tracing.md +31 -0
  26. toolframe_core-0.6.2/docs/adr/0013-context-logging.md +34 -0
  27. toolframe_core-0.6.2/docs/architecture.md +220 -0
  28. toolframe_core-0.6.2/docs/authentication.md +183 -0
  29. toolframe_core-0.6.2/docs/ci.md +80 -0
  30. toolframe_core-0.6.2/docs/dependency-graph.md +73 -0
  31. toolframe_core-0.6.2/docs/glossary.md +190 -0
  32. toolframe_core-0.6.2/docs/mcp-authentication.md +96 -0
  33. toolframe_core-0.6.2/docs/object-storage.md +56 -0
  34. toolframe_core-0.6.2/docs/offline-maintenance.md +211 -0
  35. toolframe_core-0.6.2/docs/oidc-authentication.md +117 -0
  36. toolframe_core-0.6.2/docs/postgresql-state.md +151 -0
  37. toolframe_core-0.6.2/docs/releasing.md +108 -0
  38. toolframe_core-0.6.2/docs/runtime.md +114 -0
  39. toolframe_core-0.6.2/docs/sql-storage.md +109 -0
  40. toolframe_core-0.6.2/docs/testing.md +152 -0
  41. toolframe_core-0.6.2/docs/tracing.md +167 -0
  42. toolframe_core-0.6.2/packaging/launcher/NOTICE +5 -0
  43. toolframe_core-0.6.2/packaging/launcher/README.md +39 -0
  44. toolframe_core-0.6.2/packaging/launcher/pyproject.toml +23 -0
  45. toolframe_core-0.6.2/pyproject.toml +53 -0
  46. toolframe_core-0.6.2/scripts/build-launcher.py +165 -0
  47. toolframe_core-0.6.2/scripts/build-release.sh +7 -0
  48. toolframe_core-0.6.2/scripts/ci/check-launcher-wheel.py +88 -0
  49. toolframe_core-0.6.2/scripts/ci/check-postgres.py +36 -0
  50. toolframe_core-0.6.2/scripts/ci/check-release.py +26 -0
  51. toolframe_core-0.6.2/scripts/ci/dependencies.json +14 -0
  52. toolframe_core-0.6.2/scripts/ci/prepare-launcher.py +73 -0
  53. toolframe_core-0.6.2/scripts/ci/validate.py +447 -0
  54. toolframe_core-0.6.2/scripts/dev-wheelhouse.sh +8 -0
  55. toolframe_core-0.6.2/scripts/verify-auth-upgrade.py +199 -0
  56. toolframe_core-0.6.2/scripts/verify-auth.py +442 -0
  57. toolframe_core-0.6.2/scripts/verify-dependencies.py +198 -0
  58. toolframe_core-0.6.2/scripts/verify-network.py +237 -0
  59. toolframe_core-0.6.2/scripts/verify-operation-history.py +208 -0
  60. toolframe_core-0.6.2/scripts/verify-release.py +347 -0
  61. toolframe_core-0.6.2/scripts/verify-retained-plugins.py +228 -0
  62. toolframe_core-0.6.2/scripts/verify-scaffold.py +300 -0
  63. toolframe_core-0.6.2/scripts/verify-skill.py +198 -0
  64. toolframe_core-0.6.2/src/companions.rs +220 -0
  65. toolframe_core-0.6.2/src/main.rs +287 -0
  66. toolframe_core-0.6.2/src/toolframe_core/__init__.py +3 -0
  67. toolframe_core-0.6.2/src/toolframe_core/_state_postgres.py +420 -0
  68. toolframe_core-0.6.2/src/toolframe_core/_state_sqlite.py +339 -0
  69. toolframe_core-0.6.2/src/toolframe_core/access.py +513 -0
  70. toolframe_core-0.6.2/src/toolframe_core/api.py +700 -0
  71. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/LICENSE +21 -0
  72. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/SKILL.md +59 -0
  73. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/agents/openai.yaml +4 -0
  74. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/LICENSE +21 -0
  75. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/pyproject.toml +21 -0
  76. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/__init__.py +1 -0
  77. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/docs/usage.md +13 -0
  78. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/migrations/0001_init.sql +5 -0
  79. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/page.py +25 -0
  80. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/plugin.py +119 -0
  81. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/service.py +48 -0
  82. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/evals/cases.json +150 -0
  83. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/references/design.md +60 -0
  84. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/references/operations.md +133 -0
  85. toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/references/plugin-api.md +186 -0
  86. toolframe_core-0.6.2/src/toolframe_core/cli.py +681 -0
  87. toolframe_core-0.6.2/src/toolframe_core/config.py +267 -0
  88. toolframe_core-0.6.2/src/toolframe_core/diagnostics.py +200 -0
  89. toolframe_core-0.6.2/src/toolframe_core/graph.py +207 -0
  90. toolframe_core-0.6.2/src/toolframe_core/host.py +2610 -0
  91. toolframe_core-0.6.2/src/toolframe_core/maintenance.py +868 -0
  92. toolframe_core-0.6.2/src/toolframe_core/mcp_access.py +259 -0
  93. toolframe_core-0.6.2/src/toolframe_core/network.py +97 -0
  94. toolframe_core-0.6.2/src/toolframe_core/oidc_access.py +187 -0
  95. toolframe_core-0.6.2/src/toolframe_core/packages.py +728 -0
  96. toolframe_core-0.6.2/src/toolframe_core/process.py +212 -0
  97. toolframe_core-0.6.2/src/toolframe_core/redaction.py +120 -0
  98. toolframe_core-0.6.2/src/toolframe_core/scaffold.py +142 -0
  99. toolframe_core-0.6.2/src/toolframe_core/skills.py +210 -0
  100. toolframe_core-0.6.2/src/toolframe_core/state.py +226 -0
  101. toolframe_core-0.6.2/src/toolframe_core/state_admin.py +270 -0
  102. toolframe_core-0.6.2/src/toolframe_core/stores.py +88 -0
  103. toolframe_core-0.6.2/src/toolframe_core/templates.json +6 -0
  104. toolframe_core-0.6.2/src/toolframe_core/templates.py +56 -0
  105. toolframe_core-0.6.2/src/uv.rs +1260 -0
  106. toolframe_core-0.6.2/tests/test_acceptance.py +626 -0
  107. toolframe_core-0.6.2/tests/test_access_policy.py +113 -0
  108. toolframe_core-0.6.2/tests/test_architecture.py +79 -0
  109. toolframe_core-0.6.2/tests/test_auth.py +497 -0
  110. toolframe_core-0.6.2/tests/test_bundles.py +69 -0
  111. toolframe_core-0.6.2/tests/test_cli.py +234 -0
  112. toolframe_core-0.6.2/tests/test_core_state.py +544 -0
  113. toolframe_core-0.6.2/tests/test_diagnostics.py +267 -0
  114. toolframe_core-0.6.2/tests/test_foundations.py +240 -0
  115. toolframe_core-0.6.2/tests/test_host.py +326 -0
  116. toolframe_core-0.6.2/tests/test_maintenance.py +1224 -0
  117. toolframe_core-0.6.2/tests/test_managed_tasks.py +300 -0
  118. toolframe_core-0.6.2/tests/test_mcp_auth.py +388 -0
  119. toolframe_core-0.6.2/tests/test_mixed_storage.py +254 -0
  120. toolframe_core-0.6.2/tests/test_network.py +292 -0
  121. toolframe_core-0.6.2/tests/test_object_store.py +76 -0
  122. toolframe_core-0.6.2/tests/test_oidc.py +249 -0
  123. toolframe_core-0.6.2/tests/test_operation_history.py +191 -0
  124. toolframe_core-0.6.2/tests/test_process.py +60 -0
  125. toolframe_core-0.6.2/tests/test_redaction.py +111 -0
  126. toolframe_core-0.6.2/tests/test_retained_plugins.py +186 -0
  127. toolframe_core-0.6.2/tests/test_scaffold.py +309 -0
  128. toolframe_core-0.6.2/tests/test_skills.py +419 -0
  129. toolframe_core-0.6.2/tests/test_storage_bindings.py +251 -0
  130. toolframe_core-0.6.2/tests/test_tracing.py +385 -0
  131. toolframe_core-0.6.2/uv-release-manifest.txt +9 -0
  132. toolframe_core-0.6.2/uv.lock +1625 -0
@@ -0,0 +1,20 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ # publish.yml validates release tags in the publication run itself.
7
+ branches: ['**']
8
+ workflow_dispatch:
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ concurrency:
14
+ group: ci-${{ github.workflow }}-${{ github.ref }}
15
+ cancel-in-progress: true
16
+
17
+ jobs:
18
+ validate:
19
+ uses: ./.github/workflows/validate.yml
20
+ secrets: inherit
@@ -0,0 +1,96 @@
1
+ name: Native launcher wheels
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ permissions:
7
+ contents: read
8
+
9
+ jobs:
10
+ launcher:
11
+ name: Launcher (${{ matrix.target }})
12
+ runs-on: ${{ matrix.runner }}
13
+ timeout-minutes: 60
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ include:
18
+ - runner: macos-15
19
+ target: aarch64-apple-darwin
20
+ manylinux: 'off'
21
+ - runner: macos-15-intel
22
+ target: x86_64-apple-darwin
23
+ manylinux: 'off'
24
+ - runner: ubuntu-24.04-arm
25
+ target: aarch64-unknown-linux-gnu
26
+ manylinux: '2_28'
27
+ - runner: ubuntu-24.04
28
+ target: x86_64-unknown-linux-gnu
29
+ manylinux: '2_28'
30
+ env:
31
+ TOOLFRAME_REPOSITORY_OWNER: ${{ vars.TOOLFRAME_REPOSITORY_OWNER || github.repository_owner }}
32
+ TOOLFRAME_REPOSITORY_TOKEN: ${{ secrets.TOOLFRAME_READ_TOKEN }}
33
+ MACOSX_DEPLOYMENT_TARGET: '12.0'
34
+ CARGO_BUILD_JOBS: '2'
35
+ TOOLFRAME_TARGET: ${{ matrix.target }}
36
+ steps:
37
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
38
+ with:
39
+ persist-credentials: false
40
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
41
+ with:
42
+ python-version: '3.14.7'
43
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
44
+ with:
45
+ version: '0.12.8'
46
+ enable-cache: false
47
+ - name: Install the Rust toolchain
48
+ run: rustup toolchain install 1.94.1 --profile minimal --component rustfmt
49
+ - name: Verify the launcher source
50
+ run: |
51
+ cargo +1.94.1 fmt --check
52
+ cargo +1.94.1 test --locked
53
+ - name: Prepare native sources and acceptance dependencies
54
+ run: >-
55
+ python scripts/ci/prepare-launcher.py --target "$TOOLFRAME_TARGET"
56
+ --repository-owner "$TOOLFRAME_REPOSITORY_OWNER"
57
+ - name: Build the native wheel
58
+ uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1
59
+ with:
60
+ working-directory: build/launcher
61
+ target: ${{ matrix.target }}
62
+ manylinux: ${{ matrix.manylinux }}
63
+ maturin-version: 'v1.14.1'
64
+ rust-toolchain: '1.94.1'
65
+ args: --release --locked --out ../launcher-dist/wheels
66
+ - name: Export the identical GitHub Release executable
67
+ run: >-
68
+ python scripts/build-launcher.py finish --target "$TOOLFRAME_TARGET"
69
+ --output build/launcher-dist
70
+ - name: Check metadata and exercise the installed wheel
71
+ run: |
72
+ uv tool run --from twine==7.0.0 twine check --strict build/launcher-dist/wheels/*
73
+ python scripts/ci/check-launcher-wheel.py --output build/launcher-dist --wheelhouse build/launcher-inputs/validation-wheels
74
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
75
+ with:
76
+ name: launcher-wheel-${{ matrix.target }}
77
+ path: build/launcher-dist/wheels/*.whl
78
+ if-no-files-found: error
79
+ retention-days: 14
80
+ - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
81
+ with:
82
+ name: launcher-release-${{ matrix.target }}
83
+ path: |
84
+ build/launcher-dist/release/*.tar.gz
85
+ build/launcher-dist/release/*.whl
86
+ build/launcher-dist/release/*.json
87
+ build/launcher-dist/release/SHA256SUMS-*.txt
88
+ if-no-files-found: error
89
+ retention-days: 14
90
+ - name: Retain acceptance evidence
91
+ if: always()
92
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
93
+ with:
94
+ name: launcher-evidence-${{ matrix.target }}
95
+ path: build/launcher-dist/*.json
96
+ if-no-files-found: warn
@@ -0,0 +1,128 @@
1
+ name: Publish Python distribution
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ index:
7
+ description: Package index (select the matching vVERSION tag as the run ref)
8
+ type: choice
9
+ options:
10
+ - testpypi
11
+ - pypi
12
+ default: testpypi
13
+ required: true
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ concurrency:
19
+ group: publish-${{ github.ref }}-${{ inputs.index }}
20
+ cancel-in-progress: false
21
+
22
+ jobs:
23
+ release-tag:
24
+ runs-on: ubuntu-24.04
25
+ timeout-minutes: 5
26
+ steps:
27
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
28
+ with:
29
+ persist-credentials: false
30
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
31
+ with:
32
+ python-version: '3.14.7'
33
+ - name: Require the exact project version tag
34
+ run: python scripts/ci/check-release.py --ref "$GITHUB_REF"
35
+
36
+ validate:
37
+ needs: release-tag
38
+ uses: ./.github/workflows/validate.yml
39
+ secrets: inherit
40
+
41
+ publish-core:
42
+ needs: [release-tag, validate]
43
+ runs-on: ubuntu-24.04
44
+ timeout-minutes: 10
45
+ environment:
46
+ name: ${{ inputs.index }}
47
+ permissions:
48
+ id-token: write
49
+ steps:
50
+ - name: Download the distributions validated in this run
51
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
52
+ with:
53
+ name: python-dist
54
+ path: dist/
55
+ - name: Require the complete Core release set
56
+ run: |
57
+ python - <<'PY'
58
+ from pathlib import Path
59
+ files = list(Path('dist').iterdir())
60
+ assert len(list(Path('dist').glob('toolframe_core-*.whl'))) == 1
61
+ assert len(list(Path('dist').glob('toolframe_core-*.tar.gz'))) == 1
62
+ assert len(files) == 2
63
+ PY
64
+ - name: Publish Core using its Trusted Publisher
65
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
66
+ with:
67
+ packages-dir: dist/
68
+ repository-url: ${{ inputs.index == 'testpypi' && 'https://test.pypi.org/legacy/' || 'https://upload.pypi.org/legacy/' }}
69
+
70
+ publish-launcher:
71
+ needs: [release-tag, validate]
72
+ runs-on: ubuntu-24.04
73
+ timeout-minutes: 10
74
+ environment:
75
+ name: ${{ inputs.index }}-launcher
76
+ permissions:
77
+ id-token: write
78
+ steps:
79
+ - name: Download all four validated native wheels
80
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
81
+ with:
82
+ pattern: launcher-wheel-*
83
+ merge-multiple: true
84
+ path: dist/
85
+ - name: Require the complete launcher release set
86
+ run: |
87
+ python - <<'PY'
88
+ from pathlib import Path
89
+ files = list(Path('dist').iterdir())
90
+ assert len(list(Path('dist').glob('toolframe-*.whl'))) == 4
91
+ assert len(files) == 4
92
+ PY
93
+ - name: Publish the launcher using its Trusted Publisher
94
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
95
+ with:
96
+ packages-dir: dist/
97
+ repository-url: ${{ inputs.index == 'testpypi' && 'https://test.pypi.org/legacy/' || 'https://upload.pypi.org/legacy/' }}
98
+
99
+ release-binaries:
100
+ needs: [validate, publish-core, publish-launcher]
101
+ if: inputs.index == 'pypi'
102
+ runs-on: ubuntu-24.04
103
+ timeout-minutes: 10
104
+ permissions:
105
+ contents: write
106
+ steps:
107
+ - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
108
+ with:
109
+ pattern: launcher-release-*
110
+ merge-multiple: true
111
+ path: releases/
112
+ - name: Publish verified executables and checksums
113
+ env:
114
+ GH_TOKEN: ${{ github.token }}
115
+ GH_REPO: ${{ github.repository }}
116
+ RELEASE_TAG: ${{ github.ref_name }}
117
+ run: |
118
+ cat releases/SHA256SUMS-*.txt > releases/SHA256SUMS
119
+ (cd releases && sha256sum --check SHA256SUMS)
120
+ cat > release-notes.txt <<'EOF'
121
+ Install the native CLI with `uv tool install toolframe`, or download the matching archive below and place `toolframe` on PATH. The wheel and archive contain the same executable.
122
+
123
+ Supported platforms: macOS 12+ (Apple Silicon and Intel), and Linux glibc 2.28+ (ARM64 and x86-64). First use prepares Python and public dependencies with uv. Windows and musl Linux are not included.
124
+
125
+ Start an application with `toolframe --home ./my-app init --template entry-register`, then `toolframe --home ./my-app serve`. Run `toolframe --home ./my-app open` in another terminal for the local sign-in link.
126
+ EOF
127
+ gh release create "$RELEASE_TAG" --verify-tag --title "Toolframe $RELEASE_TAG" \
128
+ --notes-file release-notes.txt releases/*.tar.gz releases/SHA256SUMS releases/manifest-*.json releases/*.whl
@@ -0,0 +1,102 @@
1
+ name: Validate distributions and launchers
2
+
3
+ on:
4
+ workflow_call:
5
+
6
+ permissions:
7
+ contents: read
8
+
9
+ # Concurrency belongs to the caller: a reusable workflow must not cancel it.
10
+ jobs:
11
+ postgres:
12
+ name: PostgreSQL journal and mixed SQL storage
13
+ runs-on: ubuntu-latest
14
+ timeout-minutes: 20
15
+ services:
16
+ postgres:
17
+ image: postgres:16.14-alpine
18
+ env:
19
+ POSTGRES_USER: postgres
20
+ POSTGRES_PASSWORD: postgres
21
+ ports:
22
+ - 5432:5432
23
+ options: >-
24
+ --health-cmd "pg_isready -U postgres"
25
+ --health-interval 5s --health-timeout 5s --health-retries 10
26
+ env:
27
+ TOOLFRAME_CORE_TEST_ADMIN_DSN: postgresql://postgres:postgres@127.0.0.1:5432/postgres
28
+ TOOLFRAME_POSTGRES_PG_DUMP: /usr/lib/postgresql/16/bin/pg_dump
29
+ TOOLFRAME_POSTGRES_PG_RESTORE: /usr/lib/postgresql/16/bin/pg_restore
30
+ TOOLFRAME_REPOSITORY_TOKEN: ${{ secrets.TOOLFRAME_READ_TOKEN }}
31
+ TOOLFRAME_REPOSITORY_OWNER: ${{ vars.TOOLFRAME_REPOSITORY_OWNER || github.repository_owner }}
32
+ steps:
33
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
34
+ with:
35
+ persist-credentials: false
36
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
37
+ with:
38
+ python-version: '3.14.7'
39
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
40
+ with:
41
+ version: '0.12.8'
42
+ enable-cache: false
43
+ - name: Install matching PostgreSQL backup tools
44
+ run: sudo apt-get update && sudo apt-get install -y postgresql-client-16
45
+ - name: Verify journals, mixed storage and failure recovery
46
+ run: >-
47
+ python scripts/ci/validate.py --checks postgres --output build/ci-postgres
48
+ --repository-owner "$TOOLFRAME_REPOSITORY_OWNER"
49
+ - name: Save PostgreSQL validation evidence
50
+ if: always()
51
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
52
+ with:
53
+ name: postgres-validation
54
+ path: |
55
+ build/ci-postgres/*.json
56
+ build/ci-postgres/workspace.txt
57
+ if-no-files-found: warn
58
+ python:
59
+ name: Python integration and distribution
60
+ runs-on: macos-15
61
+ timeout-minutes: 40
62
+ env:
63
+ # github.repository_owner is the base repository owner, including fork PRs.
64
+ TOOLFRAME_REPOSITORY_TOKEN: ${{ secrets.TOOLFRAME_READ_TOKEN }}
65
+ TOOLFRAME_REPOSITORY_OWNER: ${{ vars.TOOLFRAME_REPOSITORY_OWNER || github.repository_owner }}
66
+ steps:
67
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
68
+ with:
69
+ persist-credentials: false
70
+ - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
71
+ with:
72
+ python-version: '3.14.7'
73
+ - uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
74
+ with:
75
+ version: '0.12.8'
76
+ enable-cache: false
77
+ - name: Validate in a fresh pinned workspace
78
+ run: >-
79
+ python scripts/ci/validate.py --checks python --output build/ci-python
80
+ --repository-owner "$TOOLFRAME_REPOSITORY_OWNER"
81
+ - name: Save validated Python distributions
82
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
83
+ with:
84
+ name: python-dist
85
+ path: build/ci-python/python-dist/
86
+ if-no-files-found: error
87
+ retention-days: 14
88
+ - name: Save Python validation evidence
89
+ if: always()
90
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
91
+ with:
92
+ name: python-validation
93
+ path: |
94
+ build/ci-python/*.json
95
+ build/ci-python/*.xml
96
+ build/ci-python/workspace.txt
97
+ if-no-files-found: warn
98
+ retention-days: 14
99
+
100
+ launcher:
101
+ uses: ./.github/workflows/launcher.yml
102
+ secrets: inherit
@@ -0,0 +1,28 @@
1
+ /target/
2
+ /target-*/
3
+ /.venv/
4
+ /.pytest_cache/
5
+ /.ruff_cache/
6
+ /wheelhouse/
7
+ /build/
8
+ /dist/
9
+ /.toolframe/
10
+ /data/
11
+ # Legacy pre-0.1 runtime locations remain ignored during upgrades.
12
+ /runtime/
13
+ /logs/
14
+ /data.db
15
+ /data.db-shm
16
+ /data.db-wal
17
+ __pycache__/
18
+ *.py[cod]
19
+ *.log
20
+ .DS_Store
21
+
22
+ /.coverage
23
+ /htmlcov/
24
+
25
+ # Local working documents, issue state, and development worktrees.
26
+ /.local/
27
+ /.issues/
28
+ /.worktrees/
@@ -0,0 +1,48 @@
1
+ # Changelog
2
+
3
+ These versions describe local development releases. A version entry does not
4
+ imply that its distributions have been published or every target is qualified.
5
+
6
+ ## Unreleased
7
+
8
+ - Run multiple SQL storage providers using service defaults and per-plugin bindings.
9
+ - Retain store provider ownership across removal and restart; reject silent rebinding.
10
+ - Bind migration plans and forward repair to their provider, and preserve admitted
11
+ bindings and cleanup across storage cohorts.
12
+
13
+ ## 0.5.2
14
+
15
+ - Exclude development evaluation fixtures from installed plugin skills and bundles.
16
+ - Preserve customized skills while upgrading unchanged installed copies.
17
+
18
+ ## 0.5.1
19
+
20
+ - Align the Dashboard operation-history refresh and pagination controls.
21
+
22
+ ## 0.5.0
23
+
24
+ - Add permanent operation sequence numbers and paginated, filtered history.
25
+ - Upgrade existing journal rows while retaining their operation UUIDs.
26
+
27
+ ## 0.4.1
28
+
29
+ - Reuse compatible retained plugin artifacts after executable upgrades.
30
+ - Guide disabled plugins through enable operations and show Dashboard loading state.
31
+
32
+ ## 0.4.0
33
+
34
+ - Add dependency, binding and presentation diagnostics with operation impact views.
35
+
36
+ ## 0.3.1
37
+
38
+ - Simplify password creation, relative expiry and local timestamp presentation.
39
+
40
+ ## 0.3.0
41
+
42
+ - Add independent Auth and Dashboard Auth plugins and explicit SDK authorization.
43
+ - Separate configured Dashboard access policy from effective fallback behavior.
44
+
45
+ ## 0.2.0
46
+
47
+ - Add configurable localhost/LAN listeners and standard executable bundles.
48
+ - Report launcher versions without runtime preparation.