Add OpenSpec skills for change management and exploration

- Implement openspec-apply-change skill for applying tasks from OpenSpec changes.
- Create openspec-archive-change skill for archiving completed changes.
- Introduce openspec-explore skill for exploring ideas and clarifying requirements.
- Add openspec-propose skill for proposing new changes with generated artifacts.
- Migrate source command skills: source-command-opsx-apply, source-command-opsx-archive, source-command-opsx-explore, and source-command-opsx-propose for improved command handling.
This commit is contained in:
2026-07-06 14:53:30 +08:00
parent 387921965f
commit 720233b14c
23 changed files with 71 additions and 47 deletions

View File

@@ -1,10 +1,14 @@
---
name: "OPSX: Apply"
description: Implement tasks from an OpenSpec change (Experimental)
category: Workflow
tags: [workflow, artifacts, experimental]
name: "source-command-opsx-apply"
description: "Implement tasks from an OpenSpec change (Experimental)"
---
# source-command-opsx-apply
Use this skill when the user asks to run the migrated source command `opsx-apply`.
## Command Template
Implement tasks from an OpenSpec change.
**Input**: Optionally specify a change name (e.g., `/opsx:apply add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.

View File

@@ -1,10 +1,14 @@
---
name: "OPSX: Archive"
description: Archive a completed change in the experimental workflow
category: Workflow
tags: [workflow, archive, experimental]
name: "source-command-opsx-archive"
description: "Archive a completed change in the experimental workflow"
---
# source-command-opsx-archive
Use this skill when the user asks to run the migrated source command `opsx-archive`.
## Command Template
Archive a completed change in the experimental workflow.
**Input**: Optionally specify a change name after `/opsx:archive` (e.g., `/opsx:archive add-auth`). If omitted, check if it can be inferred from conversation context. If vague or ambiguous you MUST prompt for available changes.

View File

@@ -1,10 +1,14 @@
---
name: "OPSX: Explore"
name: "source-command-opsx-explore"
description: "Enter explore mode - think through ideas, investigate problems, clarify requirements"
category: Workflow
tags: [workflow, explore, experimental, thinking]
---
# source-command-opsx-explore
Use this skill when the user asks to run the migrated source command `opsx-explore`.
## Command Template
Enter explore mode. Think deeply. Visualize freely. Follow the conversation wherever it goes.
**IMPORTANT: Explore mode is for thinking, not implementing.** You may read files, search code, and investigate the codebase, but you must NEVER write code or implement features. If the user asks you to implement something, remind them to exit explore mode first and create a change proposal. You MAY create OpenSpec artifacts (proposals, designs, specs) if the user asks—that's capturing thinking, not implementing.

View File

@@ -1,10 +1,14 @@
---
name: "OPSX: Propose"
description: Propose a new change - create it and generate all artifacts in one step
category: Workflow
tags: [workflow, artifacts, experimental]
name: "source-command-opsx-propose"
description: "Propose a new change - create it and generate all artifacts in one step"
---
# source-command-opsx-propose
Use this skill when the user asks to run the migrated source command `opsx-propose`.
## Command Template
Propose a new change - create the change and generate all artifacts in one step.
I'll create a change with artifacts:

12
.gitignore vendored
View File

@@ -1,7 +1,7 @@
# Tempary files
temp
sandbox.*
notes/
/notes/
# Environments
.env
@@ -22,11 +22,11 @@ secrets/
SECRETS/
secrets.bak/
# Claude
# Claude Code
.claude/settings.local.json
.claudian
# Obsidian
.obsidian/*
!.obsidian/snippets
!.obsidian/app.json
@@ -389,8 +389,4 @@ dist
# Vite files
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
.vite/
# Scipy
!scipy_ndimage/*/**
.vite/

View File

@@ -1 +0,0 @@
@AGENTS.md

View File

@@ -19,7 +19,8 @@ required_packages = ["SimpleITK==2.5.5",
"transforms3d==0.4.2",
"tifffile==2024.7.24",
"matplotlib==3.10.7",
"pillow==11.2.1"]
"pillow==11.2.1",
"scipy==1.17.1"]
platforms = {"windows-x64": Platform(pypi_suffix="win_amd64",
@@ -33,7 +34,8 @@ platforms = {"windows-x64": Platform(pypi_suffix="win_amd64",
packages_to_remove = {
"imagecodecs",
"numpy"
"numpy",
"packaging"
}
@@ -45,7 +47,6 @@ def run_python(args: str):
def build_extension(platform: Platform, python_version: str) -> None:
wheel_dirpath = Path("./src/bioxelnodes/wheels")
toml_filepath = Path("./src/bioxelnodes/blender_manifest.toml")
scipy_ndimage_dirpath = Path("./scipy_ndimage", platform.blender_tag)
# download required_packages
run_python(
@@ -62,10 +63,6 @@ def build_extension(platform: Platform, python_version: str) -> None:
and "universal2" in f.name
):
f.rename(Path(f.parent, f.name.replace("universal2", "arm64")))
for ndimage_filepath in scipy_ndimage_dirpath.iterdir():
to_filepath = Path("./src/bioxelnodes/bioxel/scipy", ndimage_filepath.name)
shutil.copy(ndimage_filepath, to_filepath)
# Load the TOML file
with toml_filepath.open("r") as file:

View File

@@ -1,8 +1,8 @@
[project]
name = "bioxelnodes"
version = "1.0.9"
version = "2.0.0"
description = ""
authors = [{ name = "Ma Nan", email = "icrdr2010@outlook.com" }]
authors = [{ name = "MaNan", email = "icrdr2010@outlook.com" }]
requires-python = ">=3.11.0,<3.12.dev0"
readme = "README.md"
license = "MIT"
@@ -13,6 +13,7 @@ dependencies = [
"h5py==3.11.0",
"transforms3d==0.4.2",
"matplotlib==3.10.7",
"scipy==1.17.1",
]
[dependency-groups]

View File

@@ -6,7 +6,7 @@ name = "Bioxel Nodes"
tagline = "For scientific volumetric data visualization in Blender"
maintainer = "Nan <icrdr2010@outlook.com>"
type = "add-on"
website = "https://omoolab.github.io/BioxelNodes/latest"
website = "https://docs.omoolab.xyz/bioxelnodes/"
tags = ["Geometry Nodes", "Render", "Import-Export"]
blender_version_min = "5.0.0"
@@ -29,12 +29,13 @@ wheels = [
"./wheels/matplotlib-3.10.7-cp311-cp311-win_amd64.whl",
"./wheels/matplotlib-3.10.7-cp313-cp313-win_amd64.whl",
"./wheels/mrcfile-1.5.1-py2.py3-none-any.whl",
"./wheels/packaging-26.2-py3-none-any.whl",
"./wheels/pillow-11.2.1-cp311-cp311-win_amd64.whl",
"./wheels/pillow-11.2.1-cp313-cp313-win_amd64.whl",
"./wheels/pyometiff-1.0.0-py3-none-any.whl",
"./wheels/pyparsing-3.3.2-py3-none-any.whl",
"./wheels/python_dateutil-2.9.0.post0-py2.py3-none-any.whl",
"./wheels/scipy-1.17.1-cp311-cp311-win_amd64.whl",
"./wheels/scipy-1.17.1-cp313-cp313-win_amd64.whl",
"./wheels/simpleitk-2.5.5-cp311-abi3-win_amd64.whl",
"./wheels/six-1.17.0-py2.py3-none-any.whl",
"./wheels/tifffile-2024.7.24-py3-none-any.whl",

25
uv.lock generated
View File

@@ -25,13 +25,14 @@ wheels = [
[[package]]
name = "bioxelnodes"
version = "1.0.9"
version = "2.0.0"
source = { editable = "." }
dependencies = [
{ name = "h5py" },
{ name = "matplotlib" },
{ name = "mrcfile" },
{ name = "pyometiff" },
{ name = "scipy" },
{ name = "simpleitk" },
{ name = "transforms3d" },
]
@@ -59,6 +60,7 @@ requires-dist = [
{ name = "matplotlib", specifier = "==3.10.7" },
{ name = "mrcfile", specifier = "==1.5.1" },
{ name = "pyometiff", specifier = "==1.0.0" },
{ name = "scipy", specifier = "==1.17.1" },
{ name = "simpleitk", specifier = "==2.3.1" },
{ name = "transforms3d", specifier = "==0.4.2" },
]
@@ -945,6 +947,27 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928, upload-time = "2024-05-29T15:37:47.027Z" },
]
[[package]]
name = "scipy"
version = "1.17.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "numpy" },
]
sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" },
{ url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" },
{ url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" },
{ url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" },
{ url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" },
{ url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" },
{ url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" },
{ url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" },
{ url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" },
{ url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" },
]
[[package]]
name = "setuptools"
version = "72.1.0"