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.
- toolframe_core-0.6.2/.github/workflows/ci.yml +20 -0
- toolframe_core-0.6.2/.github/workflows/launcher.yml +96 -0
- toolframe_core-0.6.2/.github/workflows/publish.yml +128 -0
- toolframe_core-0.6.2/.github/workflows/validate.yml +102 -0
- toolframe_core-0.6.2/.gitignore +28 -0
- toolframe_core-0.6.2/CHANGELOG.md +48 -0
- toolframe_core-0.6.2/Cargo.lock +1689 -0
- toolframe_core-0.6.2/Cargo.toml +24 -0
- toolframe_core-0.6.2/LICENSE +202 -0
- toolframe_core-0.6.2/NOTICE +14 -0
- toolframe_core-0.6.2/PKG-INFO +465 -0
- toolframe_core-0.6.2/README.md +434 -0
- toolframe_core-0.6.2/companion-wheels.txt +2 -0
- toolframe_core-0.6.2/docs/adr/0001-explicit-dashboard-access-mode.md +17 -0
- toolframe_core-0.6.2/docs/adr/0002-scoped-passwords-and-public-business-entrances.md +25 -0
- toolframe_core-0.6.2/docs/adr/0003-public-fallback-on-auth-error-or-disablement.md +34 -0
- toolframe_core-0.6.2/docs/adr/0004-separate-auth-ownership-from-dashboard-presentation.md +13 -0
- toolframe_core-0.6.2/docs/adr/0005-password-only-login-and-secret-reuse.md +12 -0
- toolframe_core-0.6.2/docs/adr/0006-require-explicit-plugin-authorization-contracts.md +12 -0
- toolframe_core-0.6.2/docs/adr/0007-independent-mcp-bearer-authentication.md +21 -0
- toolframe_core-0.6.2/docs/adr/0008-shared-oidc-authentication.md +37 -0
- toolframe_core-0.6.2/docs/adr/0009-replaceable-core-journal.md +36 -0
- toolframe_core-0.6.2/docs/adr/0010-multiple-sql-providers.md +39 -0
- toolframe_core-0.6.2/docs/adr/0011-safe-new-application-access.md +27 -0
- toolframe_core-0.6.2/docs/adr/0012-optional-runtime-tracing.md +31 -0
- toolframe_core-0.6.2/docs/adr/0013-context-logging.md +34 -0
- toolframe_core-0.6.2/docs/architecture.md +220 -0
- toolframe_core-0.6.2/docs/authentication.md +183 -0
- toolframe_core-0.6.2/docs/ci.md +80 -0
- toolframe_core-0.6.2/docs/dependency-graph.md +73 -0
- toolframe_core-0.6.2/docs/glossary.md +190 -0
- toolframe_core-0.6.2/docs/mcp-authentication.md +96 -0
- toolframe_core-0.6.2/docs/object-storage.md +56 -0
- toolframe_core-0.6.2/docs/offline-maintenance.md +211 -0
- toolframe_core-0.6.2/docs/oidc-authentication.md +117 -0
- toolframe_core-0.6.2/docs/postgresql-state.md +151 -0
- toolframe_core-0.6.2/docs/releasing.md +108 -0
- toolframe_core-0.6.2/docs/runtime.md +114 -0
- toolframe_core-0.6.2/docs/sql-storage.md +109 -0
- toolframe_core-0.6.2/docs/testing.md +152 -0
- toolframe_core-0.6.2/docs/tracing.md +167 -0
- toolframe_core-0.6.2/packaging/launcher/NOTICE +5 -0
- toolframe_core-0.6.2/packaging/launcher/README.md +39 -0
- toolframe_core-0.6.2/packaging/launcher/pyproject.toml +23 -0
- toolframe_core-0.6.2/pyproject.toml +53 -0
- toolframe_core-0.6.2/scripts/build-launcher.py +165 -0
- toolframe_core-0.6.2/scripts/build-release.sh +7 -0
- toolframe_core-0.6.2/scripts/ci/check-launcher-wheel.py +88 -0
- toolframe_core-0.6.2/scripts/ci/check-postgres.py +36 -0
- toolframe_core-0.6.2/scripts/ci/check-release.py +26 -0
- toolframe_core-0.6.2/scripts/ci/dependencies.json +14 -0
- toolframe_core-0.6.2/scripts/ci/prepare-launcher.py +73 -0
- toolframe_core-0.6.2/scripts/ci/validate.py +447 -0
- toolframe_core-0.6.2/scripts/dev-wheelhouse.sh +8 -0
- toolframe_core-0.6.2/scripts/verify-auth-upgrade.py +199 -0
- toolframe_core-0.6.2/scripts/verify-auth.py +442 -0
- toolframe_core-0.6.2/scripts/verify-dependencies.py +198 -0
- toolframe_core-0.6.2/scripts/verify-network.py +237 -0
- toolframe_core-0.6.2/scripts/verify-operation-history.py +208 -0
- toolframe_core-0.6.2/scripts/verify-release.py +347 -0
- toolframe_core-0.6.2/scripts/verify-retained-plugins.py +228 -0
- toolframe_core-0.6.2/scripts/verify-scaffold.py +300 -0
- toolframe_core-0.6.2/scripts/verify-skill.py +198 -0
- toolframe_core-0.6.2/src/companions.rs +220 -0
- toolframe_core-0.6.2/src/main.rs +287 -0
- toolframe_core-0.6.2/src/toolframe_core/__init__.py +3 -0
- toolframe_core-0.6.2/src/toolframe_core/_state_postgres.py +420 -0
- toolframe_core-0.6.2/src/toolframe_core/_state_sqlite.py +339 -0
- toolframe_core-0.6.2/src/toolframe_core/access.py +513 -0
- toolframe_core-0.6.2/src/toolframe_core/api.py +700 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/LICENSE +21 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/SKILL.md +59 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/agents/openai.yaml +4 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/LICENSE +21 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/pyproject.toml +21 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/__init__.py +1 -0
- 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
- 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
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/page.py +25 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/plugin.py +119 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/assets/sample-plugin/src/toolframe_sample_notes/service.py +48 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/evals/cases.json +150 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/references/design.md +60 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/references/operations.md +133 -0
- toolframe_core-0.6.2/src/toolframe_core/bundled_skills/toolframe-plugin-design/references/plugin-api.md +186 -0
- toolframe_core-0.6.2/src/toolframe_core/cli.py +681 -0
- toolframe_core-0.6.2/src/toolframe_core/config.py +267 -0
- toolframe_core-0.6.2/src/toolframe_core/diagnostics.py +200 -0
- toolframe_core-0.6.2/src/toolframe_core/graph.py +207 -0
- toolframe_core-0.6.2/src/toolframe_core/host.py +2610 -0
- toolframe_core-0.6.2/src/toolframe_core/maintenance.py +868 -0
- toolframe_core-0.6.2/src/toolframe_core/mcp_access.py +259 -0
- toolframe_core-0.6.2/src/toolframe_core/network.py +97 -0
- toolframe_core-0.6.2/src/toolframe_core/oidc_access.py +187 -0
- toolframe_core-0.6.2/src/toolframe_core/packages.py +728 -0
- toolframe_core-0.6.2/src/toolframe_core/process.py +212 -0
- toolframe_core-0.6.2/src/toolframe_core/redaction.py +120 -0
- toolframe_core-0.6.2/src/toolframe_core/scaffold.py +142 -0
- toolframe_core-0.6.2/src/toolframe_core/skills.py +210 -0
- toolframe_core-0.6.2/src/toolframe_core/state.py +226 -0
- toolframe_core-0.6.2/src/toolframe_core/state_admin.py +270 -0
- toolframe_core-0.6.2/src/toolframe_core/stores.py +88 -0
- toolframe_core-0.6.2/src/toolframe_core/templates.json +6 -0
- toolframe_core-0.6.2/src/toolframe_core/templates.py +56 -0
- toolframe_core-0.6.2/src/uv.rs +1260 -0
- toolframe_core-0.6.2/tests/test_acceptance.py +626 -0
- toolframe_core-0.6.2/tests/test_access_policy.py +113 -0
- toolframe_core-0.6.2/tests/test_architecture.py +79 -0
- toolframe_core-0.6.2/tests/test_auth.py +497 -0
- toolframe_core-0.6.2/tests/test_bundles.py +69 -0
- toolframe_core-0.6.2/tests/test_cli.py +234 -0
- toolframe_core-0.6.2/tests/test_core_state.py +544 -0
- toolframe_core-0.6.2/tests/test_diagnostics.py +267 -0
- toolframe_core-0.6.2/tests/test_foundations.py +240 -0
- toolframe_core-0.6.2/tests/test_host.py +326 -0
- toolframe_core-0.6.2/tests/test_maintenance.py +1224 -0
- toolframe_core-0.6.2/tests/test_managed_tasks.py +300 -0
- toolframe_core-0.6.2/tests/test_mcp_auth.py +388 -0
- toolframe_core-0.6.2/tests/test_mixed_storage.py +254 -0
- toolframe_core-0.6.2/tests/test_network.py +292 -0
- toolframe_core-0.6.2/tests/test_object_store.py +76 -0
- toolframe_core-0.6.2/tests/test_oidc.py +249 -0
- toolframe_core-0.6.2/tests/test_operation_history.py +191 -0
- toolframe_core-0.6.2/tests/test_process.py +60 -0
- toolframe_core-0.6.2/tests/test_redaction.py +111 -0
- toolframe_core-0.6.2/tests/test_retained_plugins.py +186 -0
- toolframe_core-0.6.2/tests/test_scaffold.py +309 -0
- toolframe_core-0.6.2/tests/test_skills.py +419 -0
- toolframe_core-0.6.2/tests/test_storage_bindings.py +251 -0
- toolframe_core-0.6.2/tests/test_tracing.py +385 -0
- toolframe_core-0.6.2/uv-release-manifest.txt +9 -0
- 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.
|