devstuff 1.14.0__tar.gz → 1.14.1__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 (54) hide show
  1. {devstuff-1.14.0 → devstuff-1.14.1}/CHANGELOG.md +6 -0
  2. {devstuff-1.14.0 → devstuff-1.14.1}/PKG-INFO +1 -1
  3. {devstuff-1.14.0 → devstuff-1.14.1}/pyproject.toml +1 -1
  4. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/skills_cmd.py +28 -1
  5. {devstuff-1.14.0 → devstuff-1.14.1}/uv.lock +1 -1
  6. {devstuff-1.14.0 → devstuff-1.14.1}/.claude/skills/run-stuff/SKILL.md +0 -0
  7. {devstuff-1.14.0 → devstuff-1.14.1}/.claude/skills/run-stuff/smoke.sh +0 -0
  8. {devstuff-1.14.0 → devstuff-1.14.1}/.github/workflows/bump.yml +0 -0
  9. {devstuff-1.14.0 → devstuff-1.14.1}/.github/workflows/ci.yml +0 -0
  10. {devstuff-1.14.0 → devstuff-1.14.1}/.github/workflows/publish.yml +0 -0
  11. {devstuff-1.14.0 → devstuff-1.14.1}/.github/workflows/test-installs.yml +0 -0
  12. {devstuff-1.14.0 → devstuff-1.14.1}/.gitignore +0 -0
  13. {devstuff-1.14.0 → devstuff-1.14.1}/CLAUDE.md +0 -0
  14. {devstuff-1.14.0 → devstuff-1.14.1}/README.md +0 -0
  15. {devstuff-1.14.0 → devstuff-1.14.1}/dev/Dockerfile +0 -0
  16. {devstuff-1.14.0 → devstuff-1.14.1}/dev/Dockerfile.ci +0 -0
  17. {devstuff-1.14.0 → devstuff-1.14.1}/dev/Makefile +0 -0
  18. {devstuff-1.14.0 → devstuff-1.14.1}/dev/docker-compose.yml +0 -0
  19. {devstuff-1.14.0 → devstuff-1.14.1}/dev-setup +0 -0
  20. {devstuff-1.14.0 → devstuff-1.14.1}/install.sh +0 -0
  21. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/__init__.py +0 -0
  22. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/__main__.py +0 -0
  23. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/base.py +0 -0
  24. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/catalog.py +0 -0
  25. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/cli.py +0 -0
  26. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/__init__.py +0 -0
  27. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/add_cmd.py +0 -0
  28. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/catalog_cmd.py +0 -0
  29. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/delete_cmd.py +0 -0
  30. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/docs_cmd.py +0 -0
  31. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/functions_cmd.py +0 -0
  32. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/help_cmd.py +0 -0
  33. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/install_cmd.py +0 -0
  34. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/list_cmd.py +0 -0
  35. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/remove_cmd.py +0 -0
  36. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/run_cmd.py +0 -0
  37. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/commands/update_cmd.py +0 -0
  38. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/function_runner.py +0 -0
  39. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/functions.schema.json +0 -0
  40. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/functions.yaml +0 -0
  41. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/functions_catalog.py +0 -0
  42. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/functions_registry.py +0 -0
  43. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/generic.py +0 -0
  44. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/registry.py +0 -0
  45. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/tools.yaml +0 -0
  46. {devstuff-1.14.0 → devstuff-1.14.1}/src/dev_setup/ui.py +0 -0
  47. {devstuff-1.14.0 → devstuff-1.14.1}/tests/__init__.py +0 -0
  48. {devstuff-1.14.0 → devstuff-1.14.1}/tests/integration/__init__.py +0 -0
  49. {devstuff-1.14.0 → devstuff-1.14.1}/tests/integration/conftest.py +0 -0
  50. {devstuff-1.14.0 → devstuff-1.14.1}/tests/integration/test_tools.py +0 -0
  51. {devstuff-1.14.0 → devstuff-1.14.1}/tests/test_catalog.py +0 -0
  52. {devstuff-1.14.0 → devstuff-1.14.1}/tests/test_functions.py +0 -0
  53. {devstuff-1.14.0 → devstuff-1.14.1}/tests/test_generic.py +0 -0
  54. {devstuff-1.14.0 → devstuff-1.14.1}/tests/test_registry.py +0 -0
@@ -1,3 +1,9 @@
1
+ ## v1.14.1 (2026-07-12)
2
+
3
+ ### Fix
4
+
5
+ - discover skills by SKILL.md marker, not just a skills/ folder
6
+
1
7
  ## v1.14.0 (2026-07-12)
2
8
 
3
9
  ### Feat
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devstuff
3
- Version: 1.14.0
3
+ Version: 1.14.1
4
4
  Summary: Development environment setup CLI for Linux
5
5
  Project-URL: Repository, https://github.com/thesawdawg/dev-setup-py
6
6
  Author-email: Sawyer <sawyerksu@gmail.com>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devstuff"
3
- version = "1.14.0"
3
+ version = "1.14.1"
4
4
  description = "Development environment setup CLI for Linux"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -168,8 +168,34 @@ def _to_ssh_url(repo: str) -> str:
168
168
  return f"git@github.com:{_owner_repo(repo)}.git"
169
169
 
170
170
 
171
+ def _find_skill_dirs(root: Path) -> list[Path]:
172
+ """Recursively find directories marked as skills by a SKILL.md file.
173
+
174
+ Does not descend into a directory once it's identified as a skill, since
175
+ a skill's own subdirectories (scripts/, references/) aren't skills.
176
+ """
177
+ found: list[Path] = []
178
+
179
+ def _walk(d: Path) -> None:
180
+ if d.name == ".git":
181
+ return
182
+ if (d / "SKILL.md").is_file():
183
+ found.append(d)
184
+ return
185
+ for child in d.iterdir():
186
+ if child.is_dir():
187
+ _walk(child)
188
+
189
+ _walk(root)
190
+ return sorted(found)
191
+
192
+
171
193
  def _discover_skills(repo_dir: Path, repo: str) -> list[Path]:
172
194
  """Return the list of skill directories found in a cloned repo."""
195
+ by_marker = _find_skill_dirs(repo_dir)
196
+ if by_marker:
197
+ return by_marker
198
+
173
199
  skills_root = repo_dir / "skills"
174
200
  if skills_root.is_dir():
175
201
  return sorted(
@@ -177,7 +203,8 @@ def _discover_skills(repo_dir: Path, repo: str) -> list[Path]:
177
203
  if p.is_dir() and not p.name.startswith(".")
178
204
  )
179
205
 
180
- # No skills/ subdir — if the repo root looks like a single skill, use it.
206
+ # No SKILL.md markers or skills/ subdir — if the repo root looks like a
207
+ # single skill, use it.
181
208
  has_content = any(
182
209
  p.name not in (".git",) for p in repo_dir.iterdir()
183
210
  )
@@ -167,7 +167,7 @@ wheels = [
167
167
 
168
168
  [[package]]
169
169
  name = "devstuff"
170
- version = "1.14.0"
170
+ version = "1.14.1"
171
171
  source = { editable = "." }
172
172
  dependencies = [
173
173
  { name = "click" },
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes