nerftools 2.1.0__tar.gz → 2.2.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.
- nerftools-2.2.0/.release-please-manifest.json +3 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/CHANGELOG.md +16 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/PKG-INFO +1 -1
- {nerftools-2.1.0 → nerftools-2.2.0}/README.md +26 -22
- {nerftools-2.1.0 → nerftools-2.2.0}/docs/nerf-manifest.md +7 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerf.yaml +1 -1
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/formats.py +28 -0
- {nerftools-2.1.0/out/codex-plugin/.codex-plugin → nerftools-2.2.0/out/claude-plugin/.claude-plugin}/plugin.json +1 -1
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/hooks/nerf-bash-hint +12 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-report/scripts/nerf-report +1 -1
- {nerftools-2.1.0/out/claude-plugin/.claude-plugin → nerftools-2.2.0/out/codex-plugin/.codex-plugin}/plugin.json +1 -1
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-report/scripts/nerf-report +1 -1
- {nerftools-2.1.0 → nerftools-2.2.0}/pyproject.toml +1 -1
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_formats.py +89 -1
- {nerftools-2.1.0 → nerftools-2.2.0}/uv.lock +1 -1
- nerftools-2.1.0/.release-please-manifest.json +0 -3
- {nerftools-2.1.0 → nerftools-2.2.0}/.agents/plugins/marketplace.json +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.claude/agents/nerftool-manifest-reviewer.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.claude-plugin/marketplace.json +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.cspell-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.cspell.json +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.editorconfig +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.github/agents/nerftool-manifest-reviewer.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.github/dependabot.yml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.github/workflows/ci.yml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.github/workflows/release-please.yml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.github/workflows/release.yml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.gitignore +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.markdownlint-cli2-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.markdownlint-cli2.jsonc +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.node-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.prettier-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.prettierignore +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.prettierrc +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.python-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.rulesync/subagents/nerftool-manifest-reviewer.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/.rulesync-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/CONTRIBUTING.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/LICENSE +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/docs/sdd/2026-04-04-nerf-refactor/frd.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/docs/sdd/2026-04-04-nerf-refactor/hla.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/docs/sdd/2026-04-04-nerf-refactor/locked.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/docs/sdd/2026-04-04-nerf-refactor/manifest-spec.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/docs/sdd/2026-04-04-nerf-refactor/plan.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/__init__.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/builder.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/cli.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/config.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/README.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/__init__.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-account.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-aks.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-boards.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-cosmosdb.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-devops.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-keyvault.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-monitor.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-network.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-pipelines.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-postgres.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-repos.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-resource.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-role.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/az-storage.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/gh.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/git.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/kubectl.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/nx.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/pkgrun.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/stdutils.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/tf.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/tg.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/default_manifests/uv.yaml +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/manifest.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerf_report/__init__.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerf_report/script.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerfctl/__init__.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerfctl/claude/grant-allow.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerfctl/claude/grant-by-threat.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerfctl/claude/grant-deny.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerfctl/claude/grant-list.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/nerfctl/claude/grant-reset.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/outdir.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/rendering.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/nerftools/skill.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/.nerf-build-manifest +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/hooks/hooks.json +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/hooks/nerf-session-start +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/scripts/nerfctl-grant-allow +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/scripts/nerfctl-grant-by-threat +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/scripts/nerfctl-grant-deny +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/scripts/nerfctl-grant-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/scripts/nerfctl-grant-reset +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-account/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-account/scripts/nerf-az-account-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-account/scripts/nerf-az-account-set +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-account/scripts/nerf-az-account-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-command-invoke +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials-admin +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-versions +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-area-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-update +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-add-parent +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-update +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-cosmosdb/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-database-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-network-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-devops/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-devops/scripts/nerf-az-devops-set-default-project +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-keyvault/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-network-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-stats +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-monitor/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-activity-log +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-diagnostic-settings-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-metrics-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-nic-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-record-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-link-resource-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-route-table-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-subnet-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-pipelines/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-check +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-log +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-timeline +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-runs +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-postgres/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-firewall-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-edit +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-set-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-vote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-resource/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-group-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-group-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-role/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-by-id +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-role/scripts/nerf-az-role-definition-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-storage/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-network-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-view +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-copilot-review-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-diff +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-inline-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-ready +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-request-copilot-review +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-review-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-reviews +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-view +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-view +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-add +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-blame +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-checkout-remote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-current +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-delete-merged +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-list-local +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-list-remote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-cherry-pick +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit-amend +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-create-branch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-diff +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-fetch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-log +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-ls-remote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-merge-no-ff +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-mv +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-pull +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-branch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-main +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-rebase-abort +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-rebase-continue +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-rebase-unpushed +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-reflog +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-remote-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-reset-hard-last +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-reset-unpushed +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-restore-staged +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-restore-worktree +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-revert +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-rm +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-stash-drop +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-stash-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-stash-pop +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-stash-push +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-submodule-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-switch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-tag +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-tag-push +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-resources +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-versions +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-cluster-info +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-current-context +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-get-contexts +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-use-context +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-describe +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-exec +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-explain +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get-secrets +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-logs +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-port-forward +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-rollout-restart +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-nodes +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-pods +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-nx/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-affected +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-graph +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-reset +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-run +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-project +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-projects +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-pkgrun/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-cspell +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-markdownlint +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-prettier +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-report/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-stdutils/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find-cwd +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep-recursive-cwd +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tf/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tf/scripts/nerf-tf-fmt +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tf/scripts/nerf-tf-validate +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-hcl-validate +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-uv/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-mypy +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-pytest +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-check +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-fix +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerfctl-grant-allow/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerfctl-grant-by-threat/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerfctl-grant-deny/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerfctl-grant-list/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerfctl-grant-reset/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerftools/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/.nerf-build-manifest +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-account/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-account/scripts/nerf-az-account-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-account/scripts/nerf-az-account-set +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-account/scripts/nerf-az-account-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-command-invoke +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials-admin +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-versions +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-area-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-update +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-add-parent +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-update +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-cosmosdb/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-database-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-network-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-devops/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-devops/scripts/nerf-az-devops-set-default-project +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-keyvault/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-network-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-stats +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-monitor/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-activity-log +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-diagnostic-settings-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-metrics-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-nic-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-record-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-link-resource-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-route-table-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-subnet-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-pipelines/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-check +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-log +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-timeline +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-runs +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-postgres/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-firewall-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-edit +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-set-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-vote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-resource/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-group-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-group-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-role/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-by-id +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-role/scripts/nerf-az-role-definition-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-storage/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-network-rule-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-view +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-copilot-review-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-create +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-diff +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-inline-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-ready +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-request-copilot-review +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-review-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-reviews +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comment +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comments +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-view +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-run-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-run-view +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-add +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-blame +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-checkout-remote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-current +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-delete-merged +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-list-local +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-list-remote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-cherry-pick +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-commit +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-commit-amend +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-create-branch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-diff +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-fetch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-log +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-ls-remote +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-merge-no-ff +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-mv +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-pull +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-push-branch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-push-main +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-rebase-abort +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-rebase-continue +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-rebase-unpushed +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-reflog +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-remote-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-reset-hard-last +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-reset-unpushed +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-restore-staged +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-restore-worktree +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-revert +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-rm +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-show +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-stash-drop +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-stash-list +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-stash-pop +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-stash-push +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-submodule-status +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-switch +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-tag +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-git/scripts/nerf-git-tag-push +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-resources +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-versions +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-cluster-info +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-current-context +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-get-contexts +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-use-context +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-describe +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-exec +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-explain +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get-secrets +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-logs +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-port-forward +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-rollout-restart +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-nodes +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-pods +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-version +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-nx/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-affected +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-graph +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-reset +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-run +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-show-project +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-show-projects +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-pkgrun/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-cspell +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-markdownlint +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-prettier +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-report/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-stdutils/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-find +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-find-cwd +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-grep +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-grep-recursive-cwd +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tf/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tf/scripts/nerf-tf-fmt +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tf/scripts/nerf-tf-validate +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-fmt +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-fmt-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-hcl-validate +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-init +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-init-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-output +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-output-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-plan +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-plan-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-validate +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-validate-all +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-uv/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-mypy +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-pytest +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-check +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-fix +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/out/codex-plugin/skills/nerftools/SKILL.md +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/pypi-dist/.gitignore +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/release-please-config.json +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/rulesync.jsonc +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/rulesync.local.jsonc.example +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/scripts/_common.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/scripts/generate-plugins.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/scripts/lint-files.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/scripts/rulesync-upgen.sh +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/__init__.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_builder.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_config.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_manifest.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_nerf_report.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_nerfctl.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_rendering.py +0 -0
- {nerftools-2.1.0 → nerftools-2.2.0}/tests/test_skill.py +0 -0
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.2.0](https://github.com/WayfarerLabs/nerftools/compare/v2.1.0...v2.2.0) (2026-06-05)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* bash-hint hook opt-in via brand-namespaced env var ([aa2288e](https://github.com/WayfarerLabs/nerftools/commit/aa2288e5f15c37f3c439698f9457f923786301f5))
|
|
9
|
+
* gate bash-hint hook behind brand-namespaced opt-in env var ([ee2801d](https://github.com/WayfarerLabs/nerftools/commit/ee2801d6bb5b641becdb623785729d029aad4f77))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Documentation
|
|
13
|
+
|
|
14
|
+
* clarify claude code output ([d2094a9](https://github.com/WayfarerLabs/nerftools/commit/d2094a9b047dcfac56d90bf5cb77725abdf1fd32))
|
|
15
|
+
* further readme updates ([e147e84](https://github.com/WayfarerLabs/nerftools/commit/e147e842d6281e25ed05bd8c8b28ccb830db47dc))
|
|
16
|
+
* refresh README -- add Codex plugin, soften default-manifests section, update structure ([76cc678](https://github.com/WayfarerLabs/nerftools/commit/76cc6781269539463237c9aedacfbd3549aa2b54))
|
|
17
|
+
* refresh README for Codex plugin and softened default-manifests section ([63d2f5b](https://github.com/WayfarerLabs/nerftools/commit/63d2f5ba93806bbbb2fed4e521c17199e1dbced4))
|
|
18
|
+
|
|
3
19
|
## [2.1.0](https://github.com/WayfarerLabs/nerftools/compare/v2.0.0...v2.1.0) (2026-06-03)
|
|
4
20
|
|
|
5
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nerftools
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Define and generate nerf tools: limited-scope wrappers for common CLI utilities that allow for fine-grained control over agent execution
|
|
5
5
|
Project-URL: Homepage, https://github.com/WayfarerLabs/nerftools
|
|
6
6
|
Project-URL: Repository, https://github.com/WayfarerLabs/nerftools
|
|
@@ -42,9 +42,11 @@ For more detail on the manifest format and tool types/capabilities, see the
|
|
|
42
42
|
[manifest reference](docs/nerf-manifest.md).
|
|
43
43
|
|
|
44
44
|
This repo includes a set of [default manifests](nerftools/default_manifests/) that define a baseline
|
|
45
|
-
set of nerf tools for common CLI utilities.
|
|
45
|
+
set of nerf tools for common CLI utilities. Note that these are biased towards the author's stack
|
|
46
|
+
(Azure, AZDO, Github, Kubectl, etc.). Users are free to build upon these with their own custom
|
|
46
47
|
manifests or exclude them entirely by passing the `--no-default` flag to the CLI when generating
|
|
47
|
-
tools.
|
|
48
|
+
tools. Default manifest contributions that meet our exacting standards are very much encouraged,
|
|
49
|
+
too.
|
|
48
50
|
|
|
49
51
|
### Targets
|
|
50
52
|
|
|
@@ -62,9 +64,9 @@ within that package along with the package-level information.
|
|
|
62
64
|
|
|
63
65
|
This repo offers several ways to use the nerf tools. Choose the best one for your specific needs:
|
|
64
66
|
|
|
65
|
-
- The repo exposes
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
- The repo exposes fully-generated plugins for Claude Code and Codex with the default tools, both
|
|
68
|
+
installable directly from this repository. This is super easy but does not allow for customization
|
|
69
|
+
of the tools or other changes to the plugins.
|
|
68
70
|
- Alternatively, users can install the Python package and generate their own targets locally using
|
|
69
71
|
the CLI.
|
|
70
72
|
- Additionally, platforms like [Agentworks](https://github.com/WayfarerLabs/agentworks) integrate
|
|
@@ -103,6 +105,9 @@ uv run nerf generate --target skills --outdir ./skills
|
|
|
103
105
|
# Generate a Claude Code plugin (uses built-in defaults if no config)
|
|
104
106
|
uv run nerf generate --target claude-plugin --outdir ./claude-plugin
|
|
105
107
|
|
|
108
|
+
# Generate a Codex plugin
|
|
109
|
+
uv run nerf generate --target codex-plugin --outdir ./codex-plugin
|
|
110
|
+
|
|
106
111
|
# Generate a Claude Code plugin with custom identity
|
|
107
112
|
uv run nerf generate --target claude-plugin -c nerf.yaml --outdir ./claude-plugin
|
|
108
113
|
```
|
|
@@ -118,20 +123,16 @@ claude plugin marketplace add <plugin-dir>
|
|
|
118
123
|
claude plugin install <plugin-name>@<marketplace-name>
|
|
119
124
|
```
|
|
120
125
|
|
|
121
|
-
## Default Manifests
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
| pkgrun | 3 | npm package runners (cspell, markdownlint, prettier) |
|
|
132
|
-
| stdutils | 4 | Unix utilities (find, grep) with safety guardrails |
|
|
133
|
-
| gh | 10 | GitHub CLI (PRs, issues, workflow runs) |
|
|
134
|
-
| uv | 4 | Python dev tools via uv run (pytest, ruff, mypy) |
|
|
126
|
+
## Default Manifests
|
|
127
|
+
|
|
128
|
+
The repo ships a [default set of manifests](nerftools/default_manifests/) covering common CLI
|
|
129
|
+
utilities -- git, gh, much of the `az` surface (Repos, Pipelines, Boards, AKS, network, storage,
|
|
130
|
+
role assignments, and others), kubectl, terraform/terragrunt, nx, uv, and assorted utilities. Browse
|
|
131
|
+
the directory for the current set; each YAML's package description and tool definitions explain
|
|
132
|
+
what's covered and the threat profile of each tool.
|
|
133
|
+
|
|
134
|
+
Use the defaults as-is, layer your own manifests on top, or skip them entirely with `--no-default`
|
|
135
|
+
when generating.
|
|
135
136
|
|
|
136
137
|
## Nerf Control Tools
|
|
137
138
|
|
|
@@ -191,12 +192,15 @@ nerftools/ Python package
|
|
|
191
192
|
builder.py Bash script generation (3 execution modes)
|
|
192
193
|
rendering.py Shared display helpers (maps-to, usage tokens)
|
|
193
194
|
skill.py Rulesync skill generation
|
|
194
|
-
formats.py Claude Code plugin
|
|
195
|
+
formats.py Claude Code and Codex plugin builders
|
|
196
|
+
outdir.py Output directory safety guard (refuses to wipe unmanaged dirs)
|
|
195
197
|
config.py Config loader, plugin metadata, defaults resolution
|
|
196
198
|
cli.py CLI (validate + generate)
|
|
197
|
-
nerfctl/claude/ Grant management shell scripts
|
|
199
|
+
nerfctl/claude/ Grant management shell scripts (Claude Code)
|
|
200
|
+
nerf_report/ Bundled agent-feedback tool template
|
|
198
201
|
default_manifests/ Default tool package manifests (YAML)
|
|
199
202
|
tests/ Test suite
|
|
200
203
|
out/claude-plugin/ Pre-built Claude Code plugin (auto-generated)
|
|
201
|
-
|
|
204
|
+
out/codex-plugin/ Pre-built Codex plugin (auto-generated)
|
|
205
|
+
docs/ Manifest spec and design docs
|
|
202
206
|
```
|
|
@@ -147,6 +147,13 @@ constructs (lookaheads, named groups, etc.) will pass load-time validation but w
|
|
|
147
147
|
runtime. Stick to ERE. As a convenience, `\b` boundaries are translated to portable POSIX ERE at
|
|
148
148
|
generation time so manifests can keep using them.
|
|
149
149
|
|
|
150
|
+
The hook is **opt-in at runtime**: even when generated and installed, it is a silent no-op unless
|
|
151
|
+
the brand-namespaced env var `<BRAND>_ENABLE_BASH_HINT_HOOK` (e.g. `NERF_ENABLE_BASH_HINT_HOOK` for
|
|
152
|
+
the default `nerf-` prefix, `MY_TOOL_ENABLE_BASH_HINT_HOOK` for `my-tool-`) is set to a truthy value
|
|
153
|
+
(`1`, `true`, `yes`, or `on` — case-insensitive). The redirect is aggressive enough that we make
|
|
154
|
+
this explicit rather than discover-by-surprise. Brand-namespacing the env var means two plugins with
|
|
155
|
+
different brands installed side-by-side have independent kill switches.
|
|
156
|
+
|
|
150
157
|
The hook automatically skips when it detects an actual wrapper invocation: it splits the command on
|
|
151
158
|
shell separators (`&&`, `||`, `;`, `|`, `&`), finds the first non-env-var token of each segment, and
|
|
152
159
|
checks whether that token's basename starts with the wrapper prefix. Compound forms like
|
|
@@ -723,6 +723,12 @@ _HINT_HOOK_TEMPLATE = '''\
|
|
|
723
723
|
# command allows the call through without matching. Empty reason still denies,
|
|
724
724
|
# with an explanation.
|
|
725
725
|
#
|
|
726
|
+
# Opt-in: this hook is a no-op unless __BRAND_ENV__ is set to a truthy
|
|
727
|
+
# value (1, true, yes, on -- case-insensitive). The redirect is aggressive
|
|
728
|
+
# enough that we make agents/users explicitly opt in rather than discover
|
|
729
|
+
# it by surprise. The env var is brand-namespaced so two plugins with
|
|
730
|
+
# different brands installed side-by-side don't share a kill switch.
|
|
731
|
+
#
|
|
726
732
|
# Fail-open behavior: if bash < 4 or jq is missing, the hook exits 0 silently.
|
|
727
733
|
# A SessionStart hook surfaces a warning so the user knows the redirect is
|
|
728
734
|
# disabled.
|
|
@@ -732,6 +738,12 @@ if [[ "${BASH_VERSINFO[0]:-0}" -lt 4 ]]; then
|
|
|
732
738
|
exit 0
|
|
733
739
|
fi
|
|
734
740
|
|
|
741
|
+
# Opt-in gate: silent no-op unless explicitly enabled.
|
|
742
|
+
case "${__BRAND_ENV__:-}" in
|
|
743
|
+
1 | [tT][rR][uU][eE] | [yY][eE][sS] | [oO][nN]) ;;
|
|
744
|
+
*) exit 0 ;;
|
|
745
|
+
esac
|
|
746
|
+
|
|
735
747
|
set -uo pipefail
|
|
736
748
|
|
|
737
749
|
_WRAPPER_PREFIX="__PREFIX__"
|
|
@@ -855,6 +867,21 @@ def _derive_brand(prefix: str) -> str:
|
|
|
855
867
|
return prefix.rstrip("-_") or "nerf"
|
|
856
868
|
|
|
857
869
|
|
|
870
|
+
def _derive_brand_env_var(brand: str) -> str:
|
|
871
|
+
"""Derive the brand-namespaced env var that opts the hook in.
|
|
872
|
+
|
|
873
|
+
Two plugins with different brands installed side-by-side need
|
|
874
|
+
independent kill switches; namespacing the env var by brand makes
|
|
875
|
+
them non-interfering. ``"nerf"`` -> ``"NERF_ENABLE_BASH_HINT_HOOK"``,
|
|
876
|
+
``"my-tool"`` -> ``"MY_TOOL_ENABLE_BASH_HINT_HOOK"``.
|
|
877
|
+
"""
|
|
878
|
+
sanitized = re_module.sub(r"[^A-Z0-9]", "_", brand.upper())
|
|
879
|
+
# Env var names can't start with a digit.
|
|
880
|
+
if sanitized and sanitized[0].isdigit():
|
|
881
|
+
sanitized = "_" + sanitized
|
|
882
|
+
return f"{sanitized}_ENABLE_BASH_HINT_HOOK"
|
|
883
|
+
|
|
884
|
+
|
|
858
885
|
def _build_bash_hint_hook_script(manifests: list[NerfManifest], *, prefix: str) -> str:
|
|
859
886
|
"""Render the PreToolUse hint dispatcher with patterns baked in."""
|
|
860
887
|
brand = _derive_brand(prefix)
|
|
@@ -871,6 +898,7 @@ def _build_bash_hint_hook_script(manifests: list[NerfManifest], *, prefix: str)
|
|
|
871
898
|
.replace("__PREFIX__", _bash_double_quote_escape(prefix))
|
|
872
899
|
.replace("__BRAND__", _bash_double_quote_escape(brand))
|
|
873
900
|
.replace("__BRAND_RE__", _bash_double_quote_escape(_ere_escape(brand)))
|
|
901
|
+
.replace("__BRAND_ENV__", _derive_brand_env_var(brand))
|
|
874
902
|
)
|
|
875
903
|
|
|
876
904
|
|
|
@@ -10,6 +10,12 @@
|
|
|
10
10
|
# command allows the call through without matching. Empty reason still denies,
|
|
11
11
|
# with an explanation.
|
|
12
12
|
#
|
|
13
|
+
# Opt-in: this hook is a no-op unless NERF_ENABLE_BASH_HINT_HOOK is set to a truthy
|
|
14
|
+
# value (1, true, yes, on -- case-insensitive). The redirect is aggressive
|
|
15
|
+
# enough that we make agents/users explicitly opt in rather than discover
|
|
16
|
+
# it by surprise. The env var is brand-namespaced so two plugins with
|
|
17
|
+
# different brands installed side-by-side don't share a kill switch.
|
|
18
|
+
#
|
|
13
19
|
# Fail-open behavior: if bash < 4 or jq is missing, the hook exits 0 silently.
|
|
14
20
|
# A SessionStart hook surfaces a warning so the user knows the redirect is
|
|
15
21
|
# disabled.
|
|
@@ -19,6 +25,12 @@ if [[ "${BASH_VERSINFO[0]:-0}" -lt 4 ]]; then
|
|
|
19
25
|
exit 0
|
|
20
26
|
fi
|
|
21
27
|
|
|
28
|
+
# Opt-in gate: silent no-op unless explicitly enabled.
|
|
29
|
+
case "${NERF_ENABLE_BASH_HINT_HOOK:-}" in
|
|
30
|
+
1 | [tT][rR][uU][eE] | [yY][eE][sS] | [oO][nN]) ;;
|
|
31
|
+
*) exit 0 ;;
|
|
32
|
+
esac
|
|
33
|
+
|
|
22
34
|
set -uo pipefail
|
|
23
35
|
|
|
24
36
|
_WRAPPER_PREFIX="nerf-"
|
{nerftools-2.1.0 → nerftools-2.2.0}/out/claude-plugin/skills/nerf-report/scripts/nerf-report
RENAMED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
7
|
# Stamped at plugin build time.
|
|
8
|
-
NERFTOOLS_VERSION="2.
|
|
8
|
+
NERFTOOLS_VERSION="2.2.0"
|
|
9
9
|
|
|
10
10
|
# Reports live under $HOME; fail fast with an actionable message if it's
|
|
11
11
|
# unset rather than relying on `set -u` to crash later with "unbound variable".
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
set -euo pipefail
|
|
6
6
|
|
|
7
7
|
# Stamped at plugin build time.
|
|
8
|
-
NERFTOOLS_VERSION="2.
|
|
8
|
+
NERFTOOLS_VERSION="2.2.0"
|
|
9
9
|
|
|
10
10
|
# Reports live under $HOME; fail fast with an actionable message if it's
|
|
11
11
|
# unset rather than relying on `set -u` to crash later with "unbound variable".
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "nerftools"
|
|
3
|
-
version = "2.
|
|
3
|
+
version = "2.2.0"
|
|
4
4
|
description = "Define and generate nerf tools: limited-scope wrappers for common CLI utilities that allow for fine-grained control over agent execution"
|
|
5
5
|
requires-python = ">=3.12"
|
|
6
6
|
license = "MIT"
|
|
@@ -278,14 +278,34 @@ def _manifest_with_hints(
|
|
|
278
278
|
)
|
|
279
279
|
|
|
280
280
|
|
|
281
|
-
def _run_hook(
|
|
281
|
+
def _run_hook(
|
|
282
|
+
script: Path,
|
|
283
|
+
payload: dict,
|
|
284
|
+
*,
|
|
285
|
+
env: dict[str, str] | None = None,
|
|
286
|
+
brand: str = "nerf",
|
|
287
|
+
) -> tuple[str, int]:
|
|
288
|
+
import os
|
|
282
289
|
import subprocess
|
|
283
290
|
|
|
291
|
+
from nerftools.formats import _derive_brand_env_var
|
|
292
|
+
|
|
293
|
+
# The hook is opt-in via <BRAND>_ENABLE_BASH_HINT_HOOK -- default the
|
|
294
|
+
# brand to "nerf" (matches all existing tests' prefix="nerf-") and
|
|
295
|
+
# default the gate to truthy so the tests exercise the hook's logic.
|
|
296
|
+
# Tests of the gate itself pass an explicit env that overrides.
|
|
297
|
+
# Use the production helper directly so test/hook env-var derivation
|
|
298
|
+
# can't drift (e.g., on digit-leading brands).
|
|
299
|
+
enable_var = _derive_brand_env_var(brand)
|
|
300
|
+
merged_env = {**os.environ, enable_var: "true"}
|
|
301
|
+
if env is not None:
|
|
302
|
+
merged_env.update(env)
|
|
284
303
|
result = subprocess.run(
|
|
285
304
|
[str(script)],
|
|
286
305
|
input=json.dumps(payload),
|
|
287
306
|
capture_output=True,
|
|
288
307
|
text=True,
|
|
308
|
+
env=merged_env,
|
|
289
309
|
check=False,
|
|
290
310
|
)
|
|
291
311
|
return result.stdout, result.returncode
|
|
@@ -448,6 +468,70 @@ def test_claude_plugin_hook_script_executable(tmp_path: Path) -> None:
|
|
|
448
468
|
assert script.stat().st_mode & 0o111 # executable
|
|
449
469
|
|
|
450
470
|
|
|
471
|
+
@pytest.mark.parametrize("enable_value", ["true", "TRUE", "True", "1", "yes", "YES", "on", "ON"])
|
|
472
|
+
def test_hook_runs_when_enable_env_is_truthy(tmp_path: Path, enable_value: str) -> None:
|
|
473
|
+
_build([_manifest_with_hints()], tmp_path, prefix="nerf-")
|
|
474
|
+
script = tmp_path / "hooks" / "nerf-bash-hint"
|
|
475
|
+
stdout, rc = _run_hook(
|
|
476
|
+
script,
|
|
477
|
+
{"tool_name": "Bash", "tool_input": {"command": "git status"}},
|
|
478
|
+
env={"NERF_ENABLE_BASH_HINT_HOOK": enable_value},
|
|
479
|
+
)
|
|
480
|
+
assert rc == 0
|
|
481
|
+
assert json.loads(stdout)["hookSpecificOutput"]["permissionDecision"] == "deny"
|
|
482
|
+
|
|
483
|
+
|
|
484
|
+
@pytest.mark.parametrize(
|
|
485
|
+
"enable_value", ["", "false", "0", "no", "off", "FaLsE", "anything-else"]
|
|
486
|
+
)
|
|
487
|
+
def test_hook_silent_noop_when_enable_env_is_not_truthy(tmp_path: Path, enable_value: str) -> None:
|
|
488
|
+
_build([_manifest_with_hints()], tmp_path, prefix="nerf-")
|
|
489
|
+
script = tmp_path / "hooks" / "nerf-bash-hint"
|
|
490
|
+
stdout, rc = _run_hook(
|
|
491
|
+
script,
|
|
492
|
+
{"tool_name": "Bash", "tool_input": {"command": "git status"}},
|
|
493
|
+
env={"NERF_ENABLE_BASH_HINT_HOOK": enable_value},
|
|
494
|
+
)
|
|
495
|
+
assert rc == 0
|
|
496
|
+
assert stdout == "" # nothing printed -> Claude Code lets the command through
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
def test_hook_silent_noop_when_enable_env_is_unset(tmp_path: Path) -> None:
|
|
500
|
+
"""Explicit guard against accidentally clobbering os.environ: pass an env
|
|
501
|
+
dict that omits NERF_ENABLE_BASH_HINT_HOOK to confirm the unset case."""
|
|
502
|
+
import os
|
|
503
|
+
import subprocess
|
|
504
|
+
|
|
505
|
+
_build([_manifest_with_hints()], tmp_path, prefix="nerf-")
|
|
506
|
+
script = tmp_path / "hooks" / "nerf-bash-hint"
|
|
507
|
+
env = {k: v for k, v in os.environ.items() if k != "NERF_ENABLE_BASH_HINT_HOOK"}
|
|
508
|
+
result = subprocess.run(
|
|
509
|
+
[str(script)],
|
|
510
|
+
input=json.dumps({"tool_name": "Bash", "tool_input": {"command": "git status"}}),
|
|
511
|
+
capture_output=True,
|
|
512
|
+
text=True,
|
|
513
|
+
env=env,
|
|
514
|
+
check=False,
|
|
515
|
+
)
|
|
516
|
+
assert result.returncode == 0
|
|
517
|
+
assert result.stdout == ""
|
|
518
|
+
|
|
519
|
+
|
|
520
|
+
def test_hook_env_var_is_brand_namespaced(tmp_path: Path) -> None:
|
|
521
|
+
"""A non-default brand gets its own env var so multiple plugins coexist."""
|
|
522
|
+
_build([_manifest_with_hints()], tmp_path, prefix="acme-")
|
|
523
|
+
script = tmp_path / "hooks" / "nerf-bash-hint"
|
|
524
|
+
script_text = script.read_text()
|
|
525
|
+
assert "ACME_ENABLE_BASH_HINT_HOOK" in script_text
|
|
526
|
+
assert "NERF_ENABLE_BASH_HINT_HOOK" not in script_text
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
def test_hook_with_hyphenated_brand_uppercases_and_underscores(tmp_path: Path) -> None:
|
|
530
|
+
_build([_manifest_with_hints()], tmp_path, prefix="my-tool-")
|
|
531
|
+
script = tmp_path / "hooks" / "nerf-bash-hint"
|
|
532
|
+
assert "MY_TOOL_ENABLE_BASH_HINT_HOOK" in script.read_text()
|
|
533
|
+
|
|
534
|
+
|
|
451
535
|
def test_hook_denies_matching_command(tmp_path: Path) -> None:
|
|
452
536
|
_build([_manifest_with_hints()], tmp_path, prefix="nerf-")
|
|
453
537
|
script = tmp_path / "hooks" / "nerf-bash-hint"
|
|
@@ -587,6 +671,7 @@ def test_hook_brand_regex_meta_safe(tmp_path: Path) -> None:
|
|
|
587
671
|
stdout, _ = _run_hook(
|
|
588
672
|
script,
|
|
589
673
|
{"tool_name": "Bash", "tool_input": {"command": "git status # myXtool:bypass reason"}},
|
|
674
|
+
brand="my.tool",
|
|
590
675
|
)
|
|
591
676
|
reason = json.loads(stdout)["hookSpecificOutput"]["permissionDecisionReason"]
|
|
592
677
|
assert "`my.tool-git`" in reason
|
|
@@ -594,6 +679,7 @@ def test_hook_brand_regex_meta_safe(tmp_path: Path) -> None:
|
|
|
594
679
|
stdout, _ = _run_hook(
|
|
595
680
|
script,
|
|
596
681
|
{"tool_name": "Bash", "tool_input": {"command": "git status # my.tool:bypass reason"}},
|
|
682
|
+
brand="my.tool",
|
|
597
683
|
)
|
|
598
684
|
assert stdout == ""
|
|
599
685
|
|
|
@@ -660,12 +746,14 @@ def test_hook_brand_follows_prefix(tmp_path: Path) -> None:
|
|
|
660
746
|
stdout, _ = _run_hook(
|
|
661
747
|
script,
|
|
662
748
|
{"tool_name": "Bash", "tool_input": {"command": "git status # mytool:bypass yes"}},
|
|
749
|
+
brand="mytool",
|
|
663
750
|
)
|
|
664
751
|
assert stdout == ""
|
|
665
752
|
# Bypass with the old "nerf:" brand does NOT match -> still denies
|
|
666
753
|
stdout, _ = _run_hook(
|
|
667
754
|
script,
|
|
668
755
|
{"tool_name": "Bash", "tool_input": {"command": "git status # nerf:bypass yes"}},
|
|
756
|
+
brand="mytool",
|
|
669
757
|
)
|
|
670
758
|
reason = json.loads(stdout)["hookSpecificOutput"]["permissionDecisionReason"]
|
|
671
759
|
assert "`mytool-git`" in reason
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|