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.
- nerftools-0.3.1/.claude-plugin/marketplace.json +13 -0
- nerftools-0.3.1/.cspell.json +57 -0
- nerftools-0.3.1/.editorconfig +24 -0
- nerftools-0.3.1/.github/workflows/ci.yml +63 -0
- nerftools-0.3.1/.github/workflows/release-please.yml +78 -0
- nerftools-0.3.1/.github/workflows/release.yml +66 -0
- nerftools-0.3.1/.gitignore +42 -0
- nerftools-0.3.1/.markdownlint-cli2.jsonc +16 -0
- nerftools-0.3.1/.prettierrc +10 -0
- nerftools-0.3.1/.python-version +1 -0
- nerftools-0.3.1/.release-please-manifest.json +3 -0
- nerftools-0.3.1/CHANGELOG.md +58 -0
- nerftools-0.3.1/CONTRIBUTING.md +90 -0
- nerftools-0.3.1/LICENSE +21 -0
- nerftools-0.3.1/PKG-INFO +13 -0
- nerftools-0.3.1/README.md +192 -0
- nerftools-0.3.1/docs/nerf-manifest.md +608 -0
- nerftools-0.3.1/nerf-plugin.yaml +21 -0
- nerftools-0.3.1/nerftools/__init__.py +36 -0
- nerftools-0.3.1/nerftools/builder.py +746 -0
- nerftools-0.3.1/nerftools/cli.py +147 -0
- nerftools-0.3.1/nerftools/default_manifests/README.md +15 -0
- nerftools-0.3.1/nerftools/default_manifests/__init__.py +0 -0
- nerftools-0.3.1/nerftools/default_manifests/az-boards.yaml +229 -0
- nerftools-0.3.1/nerftools/default_manifests/az-pipelines.yaml +42 -0
- nerftools-0.3.1/nerftools/default_manifests/az-repos.yaml +137 -0
- nerftools-0.3.1/nerftools/default_manifests/gh.yaml +305 -0
- nerftools-0.3.1/nerftools/default_manifests/git.yaml +202 -0
- nerftools-0.3.1/nerftools/default_manifests/nx.yaml +88 -0
- nerftools-0.3.1/nerftools/default_manifests/pkgrun.yaml +58 -0
- nerftools-0.3.1/nerftools/default_manifests/stdutils.yaml +158 -0
- nerftools-0.3.1/nerftools/default_manifests/tg.yaml +107 -0
- nerftools-0.3.1/nerftools/default_manifests/uv.yaml +68 -0
- nerftools-0.3.1/nerftools/formats.py +380 -0
- nerftools-0.3.1/nerftools/manifest.py +696 -0
- nerftools-0.3.1/nerftools/nerfctl/__init__.py +0 -0
- nerftools-0.3.1/nerftools/nerfctl/claude/grant-allow.sh +170 -0
- nerftools-0.3.1/nerftools/nerfctl/claude/grant-by-threat.sh +307 -0
- nerftools-0.3.1/nerftools/nerfctl/claude/grant-deny.sh +164 -0
- nerftools-0.3.1/nerftools/nerfctl/claude/grant-list.sh +107 -0
- nerftools-0.3.1/nerftools/nerfctl/claude/grant-reset.sh +155 -0
- nerftools-0.3.1/nerftools/nerfctl/claude/install-plugin.sh +57 -0
- nerftools-0.3.1/nerftools/plugin_meta.py +200 -0
- nerftools-0.3.1/nerftools/rendering.py +98 -0
- nerftools-0.3.1/nerftools/skill.py +210 -0
- nerftools-0.3.1/out/claude-plugin/.claude-plugin/plugin.json +18 -0
- nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-allow +170 -0
- nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-by-threat +307 -0
- nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-deny +164 -0
- nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-list +107 -0
- nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-grant-reset +155 -0
- nerftools-0.3.1/out/claude-plugin/scripts/nerfctl-install-plugin +57 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/SKILL.md +141 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-comment +81 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-show +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-add-parent +91 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-comment +81 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-create +98 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-list +55 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-show +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-update +96 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/SKILL.md +50 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-check +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-list +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-runs +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/SKILL.md +73 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-comments +89 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-create +81 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-list +74 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-show +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/SKILL.md +200 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-comment +71 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-create +70 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-list +74 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-view +55 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-comment +71 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-create +76 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-diff +55 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-list +80 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-review-comments +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-view +55 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-list +74 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-view +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/SKILL.md +153 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-add +56 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit +68 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit-amend +85 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-fetch +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-log +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-pull +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-branch +84 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-main +65 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-reset-hard-last +56 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-revert +55 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-git/scripts/nerf-git-tag +67 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/SKILL.md +84 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-affected +38 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-graph +38 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-reset +38 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-run +67 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-project +67 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-projects +38 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/SKILL.md +54 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-cspell +61 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-markdownlint +61 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-prettier +61 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/SKILL.md +90 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find +53 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find-cwd +53 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep +109 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep-recursive-cwd +88 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/SKILL.md +133 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt +43 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt-all +43 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init +43 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init-all +43 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output-all +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan-all +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate-all +36 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/SKILL.md +66 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-mypy +42 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-pytest +42 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-check +42 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-fix +42 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-allow/SKILL.md +18 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-by-threat/SKILL.md +21 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-deny/SKILL.md +18 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-list/SKILL.md +17 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerfctl-grant-reset/SKILL.md +18 -0
- nerftools-0.3.1/out/claude-plugin/skills/nerftools/SKILL.md +28 -0
- nerftools-0.3.1/pypi-dist/.gitignore +1 -0
- nerftools-0.3.1/pyproject.toml +61 -0
- nerftools-0.3.1/release-please-config.json +17 -0
- nerftools-0.3.1/tests/__init__.py +0 -0
- nerftools-0.3.1/tests/test_builder.py +646 -0
- nerftools-0.3.1/tests/test_formats.py +225 -0
- nerftools-0.3.1/tests/test_manifest.py +596 -0
- nerftools-0.3.1/tests/test_nerfctl.py +437 -0
- nerftools-0.3.1/tests/test_plugin_meta.py +187 -0
- nerftools-0.3.1/tests/test_skill.py +396 -0
- 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 @@
|
|
|
1
|
+
3.12
|
|
@@ -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.
|
nerftools-0.3.1/LICENSE
ADDED
|
@@ -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.
|
nerftools-0.3.1/PKG-INFO
ADDED
|
@@ -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
|