nerftools 0.3.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 (144) hide show
  1. nerftools-0.3.1/.claude-plugin/marketplace.json +13 -0
  2. nerftools-0.3.1/.cspell.json +57 -0
  3. nerftools-0.3.1/.editorconfig +24 -0
  4. nerftools-0.3.1/.github/workflows/ci.yml +63 -0
  5. nerftools-0.3.1/.github/workflows/release-please.yml +78 -0
  6. nerftools-0.3.1/.github/workflows/release.yml +66 -0
  7. nerftools-0.3.1/.gitignore +42 -0
  8. nerftools-0.3.1/.markdownlint-cli2.jsonc +16 -0
  9. nerftools-0.3.1/.prettierrc +10 -0
  10. nerftools-0.3.1/.python-version +1 -0
  11. nerftools-0.3.1/.release-please-manifest.json +3 -0
  12. nerftools-0.3.1/CHANGELOG.md +58 -0
  13. nerftools-0.3.1/CONTRIBUTING.md +90 -0
  14. nerftools-0.3.1/LICENSE +21 -0
  15. nerftools-0.3.1/PKG-INFO +13 -0
  16. nerftools-0.3.1/README.md +192 -0
  17. nerftools-0.3.1/docs/nerf-manifest.md +608 -0
  18. nerftools-0.3.1/nerf-plugin.yaml +21 -0
  19. nerftools-0.3.1/nerftools/__init__.py +36 -0
  20. nerftools-0.3.1/nerftools/builder.py +746 -0
  21. nerftools-0.3.1/nerftools/cli.py +147 -0
  22. nerftools-0.3.1/nerftools/default_manifests/README.md +15 -0
  23. nerftools-0.3.1/nerftools/default_manifests/__init__.py +0 -0
  24. nerftools-0.3.1/nerftools/default_manifests/az-boards.yaml +229 -0
  25. nerftools-0.3.1/nerftools/default_manifests/az-pipelines.yaml +42 -0
  26. nerftools-0.3.1/nerftools/default_manifests/az-repos.yaml +137 -0
  27. nerftools-0.3.1/nerftools/default_manifests/gh.yaml +305 -0
  28. nerftools-0.3.1/nerftools/default_manifests/git.yaml +202 -0
  29. nerftools-0.3.1/nerftools/default_manifests/nx.yaml +88 -0
  30. nerftools-0.3.1/nerftools/default_manifests/pkgrun.yaml +58 -0
  31. nerftools-0.3.1/nerftools/default_manifests/stdutils.yaml +158 -0
  32. nerftools-0.3.1/nerftools/default_manifests/tg.yaml +107 -0
  33. nerftools-0.3.1/nerftools/default_manifests/uv.yaml +68 -0
  34. nerftools-0.3.1/nerftools/formats.py +380 -0
  35. nerftools-0.3.1/nerftools/manifest.py +696 -0
  36. nerftools-0.3.1/nerftools/nerfctl/__init__.py +0 -0
  37. nerftools-0.3.1/nerftools/nerfctl/claude/grant-allow.sh +170 -0
  38. nerftools-0.3.1/nerftools/nerfctl/claude/grant-by-threat.sh +307 -0
  39. nerftools-0.3.1/nerftools/nerfctl/claude/grant-deny.sh +164 -0
  40. nerftools-0.3.1/nerftools/nerfctl/claude/grant-list.sh +107 -0
  41. nerftools-0.3.1/nerftools/nerfctl/claude/grant-reset.sh +155 -0
  42. nerftools-0.3.1/nerftools/nerfctl/claude/install-plugin.sh +57 -0
  43. nerftools-0.3.1/nerftools/plugin_meta.py +200 -0
  44. nerftools-0.3.1/nerftools/rendering.py +98 -0
  45. nerftools-0.3.1/nerftools/skill.py +210 -0
  46. nerftools-0.3.1/out/claude-plugin/.claude-plugin/plugin.json +18 -0
  47. nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-allow +170 -0
  48. nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-by-threat +307 -0
  49. nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-deny +164 -0
  50. nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-list +107 -0
  51. nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-reset +155 -0
  52. nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-install-plugin +57 -0
  53. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/SKILL.md +141 -0
  54. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-comment +81 -0
  55. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-show +65 -0
  56. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-add-parent +91 -0
  57. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-comment +81 -0
  58. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-create +98 -0
  59. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-list +55 -0
  60. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-show +65 -0
  61. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-update +96 -0
  62. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/SKILL.md +50 -0
  63. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-check +65 -0
  64. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-list +36 -0
  65. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-runs +36 -0
  66. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/SKILL.md +73 -0
  67. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-comments +89 -0
  68. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-create +81 -0
  69. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-list +74 -0
  70. nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-show +65 -0
  71. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/SKILL.md +200 -0
  72. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-comment +71 -0
  73. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-create +70 -0
  74. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-list +74 -0
  75. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-view +55 -0
  76. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-comment +71 -0
  77. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-create +76 -0
  78. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-diff +55 -0
  79. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-list +80 -0
  80. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-review-comments +65 -0
  81. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-view +55 -0
  82. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-list +74 -0
  83. nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-view +65 -0
  84. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/SKILL.md +153 -0
  85. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-add +56 -0
  86. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit +68 -0
  87. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit-amend +85 -0
  88. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-fetch +65 -0
  89. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-log +36 -0
  90. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-pull +65 -0
  91. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-branch +84 -0
  92. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-main +65 -0
  93. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-reset-hard-last +56 -0
  94. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-revert +55 -0
  95. nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-tag +67 -0
  96. nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/SKILL.md +84 -0
  97. nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-affected +38 -0
  98. nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-graph +38 -0
  99. nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-reset +38 -0
  100. nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-run +67 -0
  101. nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-project +67 -0
  102. nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-projects +38 -0
  103. nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/SKILL.md +54 -0
  104. nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-cspell +61 -0
  105. nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-markdownlint +61 -0
  106. nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-prettier +61 -0
  107. nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/SKILL.md +90 -0
  108. nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find +53 -0
  109. nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find-cwd +53 -0
  110. nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep +109 -0
  111. nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep-recursive-cwd +88 -0
  112. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/SKILL.md +133 -0
  113. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt +43 -0
  114. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt-all +43 -0
  115. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init +43 -0
  116. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init-all +43 -0
  117. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output +36 -0
  118. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output-all +36 -0
  119. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan +36 -0
  120. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan-all +36 -0
  121. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate +36 -0
  122. nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate-all +36 -0
  123. nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/SKILL.md +66 -0
  124. nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-mypy +42 -0
  125. nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-pytest +42 -0
  126. nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-check +42 -0
  127. nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-fix +42 -0
  128. nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-allow/SKILL.md +18 -0
  129. nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-by-threat/SKILL.md +21 -0
  130. nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-deny/SKILL.md +18 -0
  131. nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-list/SKILL.md +17 -0
  132. nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-reset/SKILL.md +18 -0
  133. nerftools-0.3.1/out/claude-plugin/skills/nerftools/SKILL.md +28 -0
  134. nerftools-0.3.1/pypi-dist/.gitignore +1 -0
  135. nerftools-0.3.1/pyproject.toml +61 -0
  136. nerftools-0.3.1/release-please-config.json +17 -0
  137. nerftools-0.3.1/tests/__init__.py +0 -0
  138. nerftools-0.3.1/tests/test_builder.py +646 -0
  139. nerftools-0.3.1/tests/test_formats.py +225 -0
  140. nerftools-0.3.1/tests/test_manifest.py +596 -0
  141. nerftools-0.3.1/tests/test_nerfctl.py +437 -0
  142. nerftools-0.3.1/tests/test_plugin_meta.py +187 -0
  143. nerftools-0.3.1/tests/test_skill.py +396 -0
  144. nerftools-0.3.1/uv.lock +384 -0
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "nerftools-marketplace",
3
+ "owner": {
4
+ "name": "Wayfarer Labs"
5
+ },
6
+ "plugins": [
7
+ {
8
+ "name": "nerftools",
9
+ "description": "Limited scope wrappers for common CLI utilities, allows for fine-grained control over agent execution",
10
+ "source": "./out/claude-plugin"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "version": "0.2",
3
+ "language": "en",
4
+ "words": [
5
+ "agentic",
6
+ "Agentworks",
7
+ "bunx",
8
+ "dataclass",
9
+ "dataclasses",
10
+ "defanged",
11
+ "elif",
12
+ "esac",
13
+ "execdir",
14
+ "exitcode",
15
+ "frontmatter",
16
+ "gwat",
17
+ "invokable",
18
+ "metacharacter",
19
+ "metacharacters",
20
+ "myapp",
21
+ "mypy",
22
+ "mywi",
23
+ "nerfctl",
24
+ "nerfed",
25
+ "nerftools",
26
+ "noprofile",
27
+ "norc",
28
+ "okdir",
29
+ "oneline",
30
+ "permissioning",
31
+ "pipefail",
32
+ "pkgrun",
33
+ "pnpx",
34
+ "pyproject",
35
+ "pytest",
36
+ "pytestmark",
37
+ "rulesync",
38
+ "Rulesync",
39
+ "stdutils",
40
+ "subshell",
41
+ "tmpl",
42
+ "upgen",
43
+ "uppercased",
44
+ "usecases",
45
+ "variadics",
46
+ "wiql",
47
+ "WIQL"
48
+ ],
49
+ "ignoreRegExpList": [
50
+ "`[^`\\r\\n]+`"
51
+ ],
52
+ "ignorePaths": [
53
+ "node_modules",
54
+ "out/",
55
+ "CHANGELOG.md"
56
+ ]
57
+ }
@@ -0,0 +1,24 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+ indent_size = 4
10
+ max_line_length = 120
11
+
12
+ [*.yml]
13
+ indent_size = 2
14
+
15
+ [*.toml]
16
+ indent_size = 4
17
+
18
+ [*.md]
19
+ indent_size = 2
20
+ max_line_length = 100
21
+ trim_trailing_whitespace = false
22
+
23
+ [*.json]
24
+ indent_size = 2
@@ -0,0 +1,63 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches: [main]
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ lint:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v6
16
+
17
+ - uses: astral-sh/setup-uv@v7
18
+ with:
19
+ enable-cache: true
20
+
21
+ - name: Install dependencies
22
+ run: uv sync --frozen
23
+
24
+ - name: Ruff check
25
+ run: uv run ruff check nerftools/ tests/
26
+
27
+ - name: Mypy
28
+ run: uv run mypy nerftools/
29
+
30
+ test:
31
+ runs-on: ubuntu-latest
32
+ steps:
33
+ - uses: actions/checkout@v6
34
+
35
+ - uses: astral-sh/setup-uv@v7
36
+ with:
37
+ enable-cache: true
38
+
39
+ - name: Install dependencies
40
+ run: uv sync --frozen
41
+
42
+ - name: Pytest
43
+ run: uv run pytest tests/ -v
44
+
45
+ markdown:
46
+ runs-on: ubuntu-latest
47
+ steps:
48
+ - uses: actions/checkout@v6
49
+
50
+ - name: markdownlint
51
+ uses: DavidAnson/markdownlint-cli2-action@v23
52
+ with:
53
+ globs: "**/*.md"
54
+
55
+ spelling:
56
+ runs-on: ubuntu-latest
57
+ steps:
58
+ - uses: actions/checkout@v6
59
+
60
+ - name: cspell
61
+ uses: streetsidesoftware/cspell-action@v8
62
+ with:
63
+ files: "**/*.{md,py,yaml}"
@@ -0,0 +1,78 @@
1
+ name: Release Please
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ jobs:
8
+ release-please:
9
+ runs-on: ubuntu-latest
10
+ env:
11
+ # release-please-action@v4 still declares node20; force node24 on the runner.
12
+ # Remove once the action publishes a node24 release (see googleapis/release-please-action#1192).
13
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
14
+ outputs:
15
+ pr_branch: ${{ steps.extract.outputs.pr_branch }}
16
+ app_token: ${{ steps.app-token.outputs.token }}
17
+ steps:
18
+ # Use a GitHub App token so the release PR (and any subsequent pushes
19
+ # to its branch) trigger CI workflows. The default GITHUB_TOKEN creates
20
+ # events as github-actions[bot], which GitHub won't run workflows for.
21
+ - uses: actions/create-github-app-token@v2
22
+ id: app-token
23
+ with:
24
+ app-id: ${{ vars.RELEASE_APP_ID }}
25
+ private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
26
+
27
+ - uses: googleapis/release-please-action@v4
28
+ id: release
29
+ with:
30
+ token: ${{ steps.app-token.outputs.token }}
31
+ config-file: release-please-config.json
32
+ manifest-file: .release-please-manifest.json
33
+
34
+ - name: Extract release PR branch
35
+ id: extract
36
+ if: steps.release.outputs.pr
37
+ run: |
38
+ branch=$(echo '${{ steps.release.outputs.pr }}' | jq -r .headBranchName)
39
+ echo "pr_branch=$branch" >> "$GITHUB_OUTPUT"
40
+
41
+ regenerate-dist:
42
+ needs: release-please
43
+ if: needs.release-please.outputs.pr_branch
44
+ runs-on: ubuntu-latest
45
+ steps:
46
+ - uses: actions/create-github-app-token@v2
47
+ id: app-token
48
+ with:
49
+ app-id: ${{ vars.RELEASE_APP_ID }}
50
+ private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
51
+
52
+ - uses: actions/checkout@v6
53
+ with:
54
+ ref: ${{ needs.release-please.outputs.pr_branch }}
55
+ token: ${{ steps.app-token.outputs.token }}
56
+ fetch-depth: 0
57
+
58
+ - uses: astral-sh/setup-uv@v7
59
+ with:
60
+ enable-cache: true
61
+
62
+ - name: Install dependencies
63
+ run: uv sync --frozen
64
+
65
+ - name: Regenerate Claude Code plugin
66
+ run: uv run nerf generate --target claude-plugin --plugin-config nerf-plugin.yaml --outdir ./out/claude-plugin
67
+
68
+ - name: Commit updated plugin
69
+ run: |
70
+ git config user.name "nerftools-release[bot]"
71
+ git config user.email "nerftools-release[bot]@users.noreply.github.com"
72
+ git add out/claude-plugin/
73
+ if git diff --cached --quiet; then
74
+ echo "No changes to plugin output"
75
+ else
76
+ git commit -m "build: regenerate Claude Code plugin for release"
77
+ git push
78
+ fi
@@ -0,0 +1,66 @@
1
+ name: Release to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags: ["v*"]
6
+
7
+ permissions:
8
+ contents: read
9
+ id-token: write # Required for trusted publishing via OIDC
10
+
11
+ jobs:
12
+ verify-tag-on-main:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v6
16
+ with:
17
+ fetch-depth: 0
18
+
19
+ - name: Verify tag is reachable from main
20
+ run: |
21
+ git fetch origin main
22
+ if ! git merge-base --is-ancestor "${{ github.sha }}" origin/main; then
23
+ echo "Error: tag ${{ github.ref_name }} is not an ancestor of main"
24
+ exit 1
25
+ fi
26
+
27
+ test:
28
+ needs: verify-tag-on-main
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - uses: actions/checkout@v6
32
+
33
+ - uses: astral-sh/setup-uv@v7
34
+ with:
35
+ enable-cache: true
36
+
37
+ - name: Install dependencies
38
+ run: uv sync --frozen
39
+
40
+ - name: Ruff check
41
+ run: uv run ruff check nerftools/ tests/
42
+
43
+ - name: Mypy
44
+ run: uv run mypy nerftools/
45
+
46
+ - name: Pytest
47
+ run: uv run pytest tests/ -v
48
+
49
+ publish:
50
+ needs: test
51
+ runs-on: ubuntu-latest
52
+ environment: release
53
+ steps:
54
+ - uses: actions/checkout@v6
55
+
56
+ - uses: astral-sh/setup-uv@v7
57
+ with:
58
+ enable-cache: true
59
+
60
+ - name: Build package
61
+ run: uv build --out-dir pypi-dist/
62
+
63
+ - name: Publish to PyPI
64
+ uses: pypa/gh-action-pypi-publish@release/v1
65
+ with:
66
+ packages-dir: pypi-dist/
@@ -0,0 +1,42 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ *.egg
7
+ build/
8
+ dist/
9
+ .eggs/
10
+
11
+ # out/ contains pre-built targets (auto-generated, committed for distribution)
12
+
13
+ # Virtual environments
14
+ .venv/
15
+ venv/
16
+
17
+ # uv.lock is committed for reproducible CI builds
18
+
19
+ # IDE
20
+ .idea/
21
+ .vscode/
22
+ *.swp
23
+ *.swo
24
+ *~
25
+
26
+ # Secrets / env files
27
+ *.env*
28
+
29
+ # OS
30
+ .DS_Store
31
+ Thumbs.db
32
+
33
+ # mypy
34
+ .mypy_cache/
35
+
36
+ # ruff
37
+ .ruff_cache/
38
+
39
+ # pytest
40
+ .pytest_cache/
41
+ htmlcov/
42
+ .coverage
@@ -0,0 +1,16 @@
1
+ {
2
+ "config": {
3
+ "default": true,
4
+ "MD013": {
5
+ "line_length": 100,
6
+ "code_blocks": false,
7
+ "tables": false
8
+ },
9
+ "MD024": {
10
+ "siblings_only": true
11
+ },
12
+ "MD033": false,
13
+ "MD060": false
14
+ },
15
+ "ignores": ["out/**", "CHANGELOG.md"]
16
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "overrides": [
3
+ {
4
+ "files": "*.md",
5
+ "options": {
6
+ "proseWrap": "always"
7
+ }
8
+ }
9
+ ]
10
+ }
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.1"
3
+ }
@@ -0,0 +1,58 @@
1
+ # Changelog
2
+
3
+ ## [0.3.1](https://github.com/WayfarerLabs/nerftools/compare/v0.3.0...v0.3.1) (2026-04-14)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * use app token for regenerate-dist pushes so CI triggers on release PRs ([e78ae87](https://github.com/WayfarerLabs/nerftools/commit/e78ae875208a100d77cde6cb0881186e61b83e60))
9
+
10
+ ## [0.3.0](https://github.com/WayfarerLabs/nerftools/compare/v0.2.0...v0.3.0) (2026-04-14)
11
+
12
+
13
+ ### Features
14
+
15
+ * add --embed-marketplace option for standalone plugin deployment ([d00ae28](https://github.com/WayfarerLabs/nerftools/commit/d00ae28170857702a29141f24bec15c62e034c8b))
16
+ * initial nerftools repo with Python package and pre-built Claude Code plugin ([55eee79](https://github.com/WayfarerLabs/nerftools/commit/55eee79eb462dfb996568d42e05b86fe3a11ce3a))
17
+ * templatize plugin metadata via nerf-plugin.yaml config ([05086d6](https://github.com/WayfarerLabs/nerftools/commit/05086d63214351f2f9cef21fd4b6dc0679a52bd4))
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * doc update as fix to trigger release pipeline ([79ede3c](https://github.com/WayfarerLabs/nerftools/commit/79ede3c0f7fad1446e960bef3f943c5ca83e1a08))
23
+ * drop component prefix from release-please tags to match release … ([ac70693](https://github.com/WayfarerLabs/nerftools/commit/ac70693efa1e418348e5b7f10b964ebed82258db))
24
+ * drop component prefix from release-please tags to match release workflow ([6f92386](https://github.com/WayfarerLabs/nerftools/commit/6f92386f6fdc3dab9b63cc12ad9fcfead327382b))
25
+
26
+
27
+ ### Documentation
28
+
29
+ * additional readme tweaks ([4f7267f](https://github.com/WayfarerLabs/nerftools/commit/4f7267f8112c215ffc0fd50d0cdd2a9d6430ea87))
30
+ * document the release process in CONTRIBUTING.md ([cfd29c8](https://github.com/WayfarerLabs/nerftools/commit/cfd29c8b144d17d58232c6b8677451c427627d8a))
31
+ * fix manifest spec link and split threat model content between README and spec ([60493c8](https://github.com/WayfarerLabs/nerftools/commit/60493c846bb9fbffde8875a576a4698e4ae2e461))
32
+ * move manifest guide and ref from readme ([6392c0b](https://github.com/WayfarerLabs/nerftools/commit/6392c0b716892080137b133487f3a536650590b3))
33
+ * polish README intro and update quick start with --plugin-config ([6cd3dde](https://github.com/WayfarerLabs/nerftools/commit/6cd3dde8c3b98dc8be7c57b1d0a3de84429bd9d0))
34
+ * update readme with additional context ([a93632d](https://github.com/WayfarerLabs/nerftools/commit/a93632dd217d5dad44ee4df3c86a31c282640636))
35
+
36
+ ## [0.2.0](https://github.com/WayfarerLabs/nerftools/compare/nerftools-v0.1.0...nerftools-v0.2.0) (2026-04-14)
37
+
38
+
39
+ ### Features
40
+
41
+ * add --embed-marketplace option for standalone plugin deployment ([d00ae28](https://github.com/WayfarerLabs/nerftools/commit/d00ae28170857702a29141f24bec15c62e034c8b))
42
+ * initial nerftools repo with Python package and pre-built Claude Code plugin ([55eee79](https://github.com/WayfarerLabs/nerftools/commit/55eee79eb462dfb996568d42e05b86fe3a11ce3a))
43
+ * templatize plugin metadata via nerf-plugin.yaml config ([05086d6](https://github.com/WayfarerLabs/nerftools/commit/05086d63214351f2f9cef21fd4b6dc0679a52bd4))
44
+
45
+
46
+ ### Bug Fixes
47
+
48
+ * doc update as fix to trigger release pipeline ([79ede3c](https://github.com/WayfarerLabs/nerftools/commit/79ede3c0f7fad1446e960bef3f943c5ca83e1a08))
49
+
50
+
51
+ ### Documentation
52
+
53
+ * additional readme tweaks ([4f7267f](https://github.com/WayfarerLabs/nerftools/commit/4f7267f8112c215ffc0fd50d0cdd2a9d6430ea87))
54
+ * document the release process in CONTRIBUTING.md ([cfd29c8](https://github.com/WayfarerLabs/nerftools/commit/cfd29c8b144d17d58232c6b8677451c427627d8a))
55
+ * fix manifest spec link and split threat model content between README and spec ([60493c8](https://github.com/WayfarerLabs/nerftools/commit/60493c846bb9fbffde8875a576a4698e4ae2e461))
56
+ * move manifest guide and ref from readme ([6392c0b](https://github.com/WayfarerLabs/nerftools/commit/6392c0b716892080137b133487f3a536650590b3))
57
+ * polish README intro and update quick start with --plugin-config ([6cd3dde](https://github.com/WayfarerLabs/nerftools/commit/6cd3dde8c3b98dc8be7c57b1d0a3de84429bd9d0))
58
+ * update readme with additional context ([a93632d](https://github.com/WayfarerLabs/nerftools/commit/a93632dd217d5dad44ee4df3c86a31c282640636))
@@ -0,0 +1,90 @@
1
+ # Contributing
2
+
3
+ This is designed to be an opinionated project with high standards for code quality, documentation,
4
+ and design. Contributions must meet these standards and follow the guidelines outlined in this
5
+ document. I highly recommend creating discussions or issues to propose and discuss changes before
6
+ putting in the work to implement them, especially for larger changes.
7
+
8
+ All that said, I'd love to see high-quality contributions of all sizes, from fixing typos to adding
9
+ major features.
10
+
11
+ ## Conventional Commits
12
+
13
+ All commit messages follow the [Conventional Commits](https://www.conventionalcommits.org/)
14
+ specification. This is not just a style preference -- commit types drive automated versioning
15
+ (see [Releases](#releases) below).
16
+
17
+ Commit types that trigger version bumps:
18
+
19
+ - `feat:` -> minor version bump
20
+ - `fix:` / `perf:` -> patch version bump
21
+ - `feat!:` / `fix!:` / any commit with `BREAKING CHANGE:` in the body -> major version bump
22
+
23
+ Other types (`docs:`, `chore:`, `refactor:`, `test:`, `ci:`, `build:`, `style:`, `revert:`) do not
24
+ trigger a release on their own but still appear in the changelog.
25
+
26
+ When squash-merging a PR, set the PR title to the desired conventional commit message -- GitHub
27
+ uses that as the squash commit message, which is what `release-please` reads.
28
+
29
+ ## Code Quality
30
+
31
+ - **Python**: ruff (linting + formatting), mypy (type checking), pytest
32
+ - **Markdown**: markdownlint, prettier, cspell
33
+ - Custom dictionaries are maintained in `.cspell.json`
34
+
35
+ ## Rebuilding the Claude Code Plugin Locally
36
+
37
+ After changing manifests or plugin generation code, you can rebuild the pre-built plugin locally
38
+ to preview the output:
39
+
40
+ ```bash
41
+ uv run nerf generate --target claude-plugin --plugin-config nerf-plugin.yaml --outdir ./out/claude-plugin
42
+ ```
43
+
44
+ You don't need to commit the regenerated `out/` -- CI regenerates it as part of the release PR.
45
+ But committing it can be useful so reviewers can see the exact generated output in your PR diff.
46
+
47
+ ## Releases
48
+
49
+ Releases are fully automated via [`release-please`](https://github.com/googleapis/release-please)
50
+ and conventional commits. No one manually bumps versions or creates tags.
51
+
52
+ ### How a release happens
53
+
54
+ 1. Feature PRs land on `main` with conventional commit messages.
55
+ 2. The `release-please` workflow keeps an open PR titled `chore(main): release X.Y.Z` that
56
+ accumulates changes. On each push to `main` it:
57
+ - Computes the next version from the conventional commits since the last release.
58
+ - Updates the version in `pyproject.toml`, `nerf-plugin.yaml`, and `.release-please-manifest.json`.
59
+ - Updates `CHANGELOG.md`.
60
+ - Regenerates `out/claude-plugin/` with the new version baked into `plugin.json`.
61
+ 3. When you're ready to release, merge the release PR.
62
+ 4. On merge, `release-please` creates the git tag (`vX.Y.Z`) and a GitHub Release.
63
+ 5. The tag push triggers the `release` workflow, which verifies the tag is on `main`, runs the
64
+ test suite, and publishes to PyPI via trusted publishing.
65
+
66
+ ### What you do as a maintainer
67
+
68
+ - Review and merge feature PRs normally.
69
+ - When you want to cut a release, review the release PR (check the version bump and the changelog)
70
+ and merge it. That's it.
71
+
72
+ ### What you *don't* do
73
+
74
+ - Don't edit version numbers by hand in any file. `release-please` owns them.
75
+ - Don't create tags by hand. `release-please` creates tags on merge of the release PR.
76
+ - Don't edit `CHANGELOG.md` by hand. It's regenerated from commit messages.
77
+ - Don't edit `out/claude-plugin/` by hand. Edit the source (`nerftools/`, manifests, or
78
+ `nerf-plugin.yaml`) and the release PR will regenerate it.
79
+
80
+ ### Breaking changes
81
+
82
+ To signal a breaking change, use `!` in the commit type or add a `BREAKING CHANGE:` footer:
83
+
84
+ ```text
85
+ feat!: rename --embed-marketplace to --standalone
86
+
87
+ BREAKING CHANGE: the --embed-marketplace flag has been replaced with --standalone.
88
+ ```
89
+
90
+ Either form bumps the major version.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Robert Scot Hastings
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.
@@ -0,0 +1,13 @@
1
+ Metadata-Version: 2.4
2
+ Name: nerftools
3
+ Version: 0.3.1
4
+ Summary: Build and manage nerf tools -- defanged, scoped wrappers for agent use
5
+ Project-URL: Homepage, https://github.com/WayfarerLabs/nerftools
6
+ Project-URL: Repository, https://github.com/WayfarerLabs/nerftools
7
+ Project-URL: Issues, https://github.com/WayfarerLabs/nerftools/issues
8
+ Author: Robert Scot Hastings
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Requires-Python: >=3.12
12
+ Requires-Dist: pyyaml>=6.0
13
+ Requires-Dist: typer>=0.24.1