dynamic-skills 0.1.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.
- dynamic_skills-0.1.0/.github/workflows/ci.yml +51 -0
- dynamic_skills-0.1.0/.github/workflows/release.yml +92 -0
- dynamic_skills-0.1.0/.gitignore +12 -0
- dynamic_skills-0.1.0/CHANGELOG.md +35 -0
- dynamic_skills-0.1.0/LICENSE +21 -0
- dynamic_skills-0.1.0/PKG-INFO +545 -0
- dynamic_skills-0.1.0/README.md +523 -0
- dynamic_skills-0.1.0/RELEASING.md +78 -0
- dynamic_skills-0.1.0/assets/logo.svg +11 -0
- dynamic_skills-0.1.0/assets/memory-analogy.svg +57 -0
- dynamic_skills-0.1.0/assets/skill-lifecycle.svg +73 -0
- dynamic_skills-0.1.0/assets/wordmark.svg +16 -0
- dynamic_skills-0.1.0/pyproject.toml +39 -0
- dynamic_skills-0.1.0/scripts/check_dist.py +50 -0
- dynamic_skills-0.1.0/scripts/check_pypi.py +33 -0
- dynamic_skills-0.1.0/scripts/smoke_install.py +73 -0
- dynamic_skills-0.1.0/src/dynamic_skills/__init__.py +3 -0
- dynamic_skills-0.1.0/src/dynamic_skills/__main__.py +3 -0
- dynamic_skills-0.1.0/src/dynamic_skills/adapters.py +81 -0
- dynamic_skills-0.1.0/src/dynamic_skills/bundled/dynamic-skills/SKILL.md +35 -0
- dynamic_skills-0.1.0/src/dynamic_skills/cli.py +601 -0
- dynamic_skills-0.1.0/src/dynamic_skills/errors.py +6 -0
- dynamic_skills-0.1.0/src/dynamic_skills/files.py +178 -0
- dynamic_skills-0.1.0/src/dynamic_skills/migration.py +268 -0
- dynamic_skills-0.1.0/src/dynamic_skills/pool.py +397 -0
- dynamic_skills-0.1.0/src/dynamic_skills/project.py +484 -0
- dynamic_skills-0.1.0/src/dynamic_skills/sources.py +132 -0
- dynamic_skills-0.1.0/src/dynamic_skills/transaction.py +140 -0
- dynamic_skills-0.1.0/tests/__init__.py +0 -0
- dynamic_skills-0.1.0/tests/conftest.py +29 -0
- dynamic_skills-0.1.0/tests/test_cli.py +81 -0
- dynamic_skills-0.1.0/tests/test_migration.py +120 -0
- dynamic_skills-0.1.0/tests/test_packages.py +398 -0
- dynamic_skills-0.1.0/tests/test_pool.py +112 -0
- dynamic_skills-0.1.0/tests/test_project.py +390 -0
- dynamic_skills-0.1.0/tests/test_regressions.py +125 -0
- dynamic_skills-0.1.0/tests/test_sources.py +81 -0
- dynamic_skills-0.1.0/uv.lock +452 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main, 'feat/**']
|
|
6
|
+
pull_request:
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
workflow_call:
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: ci-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
test:
|
|
19
|
+
name: ${{ matrix.os }} / Python ${{ matrix.python }}
|
|
20
|
+
runs-on: ${{ matrix.os }}
|
|
21
|
+
strategy:
|
|
22
|
+
fail-fast: false
|
|
23
|
+
matrix:
|
|
24
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
25
|
+
python: ['3.11', '3.13']
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v7.0.1
|
|
28
|
+
- uses: astral-sh/setup-uv@v10.0.1
|
|
29
|
+
with:
|
|
30
|
+
python-version: ${{ matrix.python }}
|
|
31
|
+
enable-cache: true
|
|
32
|
+
- run: uv sync --locked --group dev
|
|
33
|
+
- run: uv run ruff check src tests scripts
|
|
34
|
+
- run: uv run ruff format --check src tests scripts
|
|
35
|
+
- run: uv run pytest --cov=dynamic_skills --cov-report=term-missing
|
|
36
|
+
- run: uv build
|
|
37
|
+
- run: uv run python scripts/check_dist.py
|
|
38
|
+
- run: uvx --from twine twine check --strict dist/*
|
|
39
|
+
- name: Smoke test installed wheel and sdist
|
|
40
|
+
shell: bash
|
|
41
|
+
run: |
|
|
42
|
+
for artifact in dist/*.whl dist/*.tar.gz; do
|
|
43
|
+
uv run --isolated --no-project --with "$artifact" python scripts/smoke_install.py
|
|
44
|
+
done
|
|
45
|
+
- name: Preserve verified release distributions
|
|
46
|
+
if: matrix.os == 'ubuntu-latest' && matrix.python == '3.11'
|
|
47
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
48
|
+
with:
|
|
49
|
+
name: distributions
|
|
50
|
+
path: dist/
|
|
51
|
+
if-no-files-found: error
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ['v*']
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: release-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: false
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
validate:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v7.0.1
|
|
20
|
+
with:
|
|
21
|
+
fetch-depth: 0
|
|
22
|
+
- name: Require a release tag on main
|
|
23
|
+
env:
|
|
24
|
+
RELEASE_REF: ${{ github.ref }}
|
|
25
|
+
run: |
|
|
26
|
+
[[ "$RELEASE_REF" =~ ^refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$ ]]
|
|
27
|
+
git merge-base --is-ancestor HEAD origin/main
|
|
28
|
+
|
|
29
|
+
checks:
|
|
30
|
+
needs: validate
|
|
31
|
+
uses: ./.github/workflows/ci.yml
|
|
32
|
+
|
|
33
|
+
publish:
|
|
34
|
+
needs: checks
|
|
35
|
+
runs-on: ubuntu-latest
|
|
36
|
+
environment:
|
|
37
|
+
name: pypi
|
|
38
|
+
url: https://pypi.org/project/dynamic-skills/
|
|
39
|
+
permissions:
|
|
40
|
+
contents: read
|
|
41
|
+
id-token: write
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/checkout@v7.0.1
|
|
44
|
+
- uses: astral-sh/setup-uv@v10.0.1
|
|
45
|
+
with:
|
|
46
|
+
python-version: '3.11'
|
|
47
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
48
|
+
with:
|
|
49
|
+
name: distributions
|
|
50
|
+
path: dist/
|
|
51
|
+
- name: Verify tag and distribution versions
|
|
52
|
+
env:
|
|
53
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
54
|
+
run: uv run --no-project python scripts/check_dist.py "$RELEASE_TAG"
|
|
55
|
+
- name: Reject conflicting files on retries
|
|
56
|
+
run: uv run --no-project python scripts/check_pypi.py
|
|
57
|
+
- name: Publish to PyPI using Trusted Publishing
|
|
58
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
59
|
+
with:
|
|
60
|
+
skip-existing: true
|
|
61
|
+
|
|
62
|
+
github-release:
|
|
63
|
+
needs: publish
|
|
64
|
+
runs-on: ubuntu-latest
|
|
65
|
+
permissions:
|
|
66
|
+
contents: write
|
|
67
|
+
steps:
|
|
68
|
+
- uses: actions/checkout@v7.0.1
|
|
69
|
+
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
70
|
+
with:
|
|
71
|
+
name: distributions
|
|
72
|
+
path: dist/
|
|
73
|
+
- name: Publish GitHub release and checksums
|
|
74
|
+
env:
|
|
75
|
+
GH_TOKEN: ${{ github.token }}
|
|
76
|
+
RELEASE_TAG: ${{ github.ref_name }}
|
|
77
|
+
run: |
|
|
78
|
+
sha256sum dist/* > SHA256SUMS
|
|
79
|
+
python - <<'PY'
|
|
80
|
+
import os
|
|
81
|
+
from pathlib import Path
|
|
82
|
+
version = os.environ['RELEASE_TAG'][1:]
|
|
83
|
+
text = Path('CHANGELOG.md').read_text()
|
|
84
|
+
notes = text.split(f'## [{version}]', 1)[1].split('\n## [', 1)[0]
|
|
85
|
+
Path('release-notes.md').write_text(notes.strip() + '\n')
|
|
86
|
+
PY
|
|
87
|
+
if ! gh release view "$RELEASE_TAG" >/dev/null 2>&1; then
|
|
88
|
+
gh release create "$RELEASE_TAG" --verify-tag --draft \
|
|
89
|
+
--title "$RELEASE_TAG (Alpha)" --notes-file release-notes.md
|
|
90
|
+
fi
|
|
91
|
+
gh release upload "$RELEASE_TAG" dist/* SHA256SUMS --clobber
|
|
92
|
+
gh release edit "$RELEASE_TAG" --draft=false --latest
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.1.0]
|
|
4
|
+
|
|
5
|
+
First public release of Dynamic Skills (`dskills`), an Alpha CLI for a versioned
|
|
6
|
+
local skill pool and explicit project skill selection.
|
|
7
|
+
|
|
8
|
+
### Included
|
|
9
|
+
|
|
10
|
+
- Import local and Git skills with complete resources, content hashes and provenance.
|
|
11
|
+
- Activate pinned skills for Codex, Claude Code, Kimi Code and Pi; preview changes,
|
|
12
|
+
synchronize project outputs, unplug skills and undo project changes.
|
|
13
|
+
- Preserve unmanaged files and local edits, with process locks, transactional
|
|
14
|
+
writes and explicit interrupted-operation recovery.
|
|
15
|
+
- Inventory and migrate global skills with reversible backups and restore support.
|
|
16
|
+
- Organize skills with tags/categories, additive reusable packages and pinned presets.
|
|
17
|
+
- Search and read skills through a versioned JSON CLI interface and an optional
|
|
18
|
+
bundled bridge skill; inspect local operation statistics and health diagnostics.
|
|
19
|
+
- Keep project metadata local by default, with opt-in Git tracking of configuration
|
|
20
|
+
and exact lockfile pins.
|
|
21
|
+
|
|
22
|
+
### Compatibility and limitations
|
|
23
|
+
|
|
24
|
+
- Python 3.11+; automated CI covers Linux, macOS and Windows on Python 3.11 and 3.13.
|
|
25
|
+
- Both `dskills` and `dynamic-skills` are supported CLI entry points.
|
|
26
|
+
- JSON responses use `schema_version: 1`. Alpha releases may change interfaces or
|
|
27
|
+
metadata formats; consult release notes before upgrading and retain backups.
|
|
28
|
+
- Native agent discovery depends on agent versions and configuration. Removing a
|
|
29
|
+
skill does not erase instructions already loaded into a conversation.
|
|
30
|
+
- Local source paths are not inherently portable. Cross-filesystem migration with
|
|
31
|
+
deactivation is unsupported; symlink mode depends on filesystem permissions.
|
|
32
|
+
- No skill scripts run on import, activation or reading. Imported skills retain
|
|
33
|
+
their own licenses; execution and trust remain the user's responsibility.
|
|
34
|
+
|
|
35
|
+
[0.1.0]: https://github.com/M1racleShih/dynamic-skills/releases/tag/v0.1.0
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 M1racleShih
|
|
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.
|