nerftools 1.2.0__tar.gz → 1.3.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.
Files changed (445) hide show
  1. nerftools-1.3.0/.agents/plugins/marketplace.json +12 -0
  2. {nerftools-1.2.0 → nerftools-1.3.0}/.github/workflows/release-please.yml +6 -3
  3. nerftools-1.3.0/.release-please-manifest.json +3 -0
  4. {nerftools-1.2.0 → nerftools-1.3.0}/CHANGELOG.md +14 -0
  5. {nerftools-1.2.0 → nerftools-1.3.0}/PKG-INFO +1 -1
  6. {nerftools-1.2.0 → nerftools-1.3.0}/nerf.yaml +1 -1
  7. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/cli.py +16 -1
  8. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/config.py +19 -11
  9. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/formats.py +173 -11
  10. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/.claude-plugin/plugin.json +1 -1
  11. nerftools-1.3.0/out/codex-plugin/.codex-plugin/plugin.json +18 -0
  12. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-account/SKILL.md +57 -0
  13. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-account/scripts/nerf-az-account-list +39 -0
  14. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-account/scripts/nerf-az-account-set +69 -0
  15. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-account/scripts/nerf-az-account-show +39 -0
  16. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/SKILL.md +165 -0
  17. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-command-invoke +100 -0
  18. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials +94 -0
  19. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials-admin +94 -0
  20. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-versions +77 -0
  21. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-list +52 -0
  22. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-list +88 -0
  23. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-show +99 -0
  24. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-show +88 -0
  25. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/SKILL.md +182 -0
  26. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-area-list +47 -0
  27. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-comment +109 -0
  28. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-show +87 -0
  29. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-add-parent +119 -0
  30. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-comment +109 -0
  31. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-create +129 -0
  32. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-list +77 -0
  33. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-show +87 -0
  34. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-update +122 -0
  35. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-cosmosdb/SKILL.md +84 -0
  36. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-database-list +88 -0
  37. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-list +52 -0
  38. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-network-rule-list +88 -0
  39. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-show +88 -0
  40. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-devops/SKILL.md +27 -0
  41. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-devops/scripts/nerf-az-devops-set-default-project +69 -0
  42. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-keyvault/SKILL.md +101 -0
  43. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-list +52 -0
  44. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-network-rule-list +82 -0
  45. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-list +77 -0
  46. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-stats +118 -0
  47. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-show +82 -0
  48. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-monitor/SKILL.md +71 -0
  49. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-activity-log +113 -0
  50. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-diagnostic-settings-list +77 -0
  51. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-metrics-list +126 -0
  52. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/SKILL.md +339 -0
  53. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-nic-show +88 -0
  54. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-list +52 -0
  55. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-show +88 -0
  56. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-list +88 -0
  57. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-show +99 -0
  58. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-record-list +88 -0
  59. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-list +52 -0
  60. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-show +88 -0
  61. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-list +52 -0
  62. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-show +88 -0
  63. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-link-resource-list +77 -0
  64. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-list +52 -0
  65. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-show +88 -0
  66. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-route-table-show +88 -0
  67. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-subnet-show +99 -0
  68. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-list +52 -0
  69. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-list +88 -0
  70. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-show +99 -0
  71. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-show +88 -0
  72. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-pipelines/SKILL.md +76 -0
  73. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-check +87 -0
  74. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-list +47 -0
  75. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-show +87 -0
  76. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-runs +47 -0
  77. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-postgres/SKILL.md +66 -0
  78. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-firewall-rule-list +88 -0
  79. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-list +52 -0
  80. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-show +88 -0
  81. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-repos/SKILL.md +126 -0
  82. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-comments +110 -0
  83. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-create +108 -0
  84. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-list +86 -0
  85. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-set-status +118 -0
  86. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-show +87 -0
  87. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-vote +118 -0
  88. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-resource/SKILL.md +78 -0
  89. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-group-list +47 -0
  90. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-group-show +77 -0
  91. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-list +62 -0
  92. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-show +77 -0
  93. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-role/SKILL.md +72 -0
  94. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-by-id +77 -0
  95. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-list +73 -0
  96. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-role/scripts/nerf-az-role-definition-list +63 -0
  97. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-storage/SKILL.md +65 -0
  98. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-list +52 -0
  99. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-network-rule-list +88 -0
  100. nerftools-1.3.0/out/codex-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-show +88 -0
  101. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/SKILL.md +261 -0
  102. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-comment +91 -0
  103. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-create +87 -0
  104. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-list +81 -0
  105. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-issue-view +69 -0
  106. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-create +93 -0
  107. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-diff +69 -0
  108. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-inline-comments +79 -0
  109. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-list +87 -0
  110. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-review-comments +111 -0
  111. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-reviews +99 -0
  112. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comment +91 -0
  113. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comments +79 -0
  114. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-pr-view +69 -0
  115. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-run-list +81 -0
  116. nerftools-1.3.0/out/codex-plugin/skills/nerf-gh/scripts/nerf-gh-run-view +79 -0
  117. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/SKILL.md +372 -0
  118. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-add +148 -0
  119. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-checkout-remote +200 -0
  120. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-delete-merged +189 -0
  121. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-list-local +128 -0
  122. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-branch-list-remote +128 -0
  123. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-commit +171 -0
  124. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-commit-amend +188 -0
  125. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-create-branch +168 -0
  126. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-diff +128 -0
  127. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-diff-staged +128 -0
  128. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-fetch +168 -0
  129. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-log +128 -0
  130. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-pull +168 -0
  131. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-push-branch +188 -0
  132. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-push-main +168 -0
  133. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-rebase-unpushed +194 -0
  134. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-reset-hard-last +148 -0
  135. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-reset-unpushed +200 -0
  136. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-revert +158 -0
  137. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-status +128 -0
  138. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-switch +168 -0
  139. nerftools-1.3.0/out/codex-plugin/skills/nerf-git/scripts/nerf-git-tag +170 -0
  140. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/SKILL.md +290 -0
  141. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-resources +57 -0
  142. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-versions +39 -0
  143. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-cluster-info +39 -0
  144. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-current-context +39 -0
  145. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-get-contexts +39 -0
  146. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-use-context +79 -0
  147. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-describe +131 -0
  148. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-exec +124 -0
  149. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-explain +86 -0
  150. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get +145 -0
  151. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get-secrets +107 -0
  152. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-logs +133 -0
  153. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-port-forward +152 -0
  154. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-rollout-restart +97 -0
  155. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-nodes +47 -0
  156. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-pods +68 -0
  157. nerftools-1.3.0/out/codex-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-version +39 -0
  158. nerftools-1.3.0/out/codex-plugin/skills/nerf-nx/SKILL.md +84 -0
  159. nerftools-1.3.0/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-affected +41 -0
  160. nerftools-1.3.0/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-graph +41 -0
  161. nerftools-1.3.0/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-reset +41 -0
  162. nerftools-1.3.0/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-run +81 -0
  163. nerftools-1.3.0/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-show-project +81 -0
  164. nerftools-1.3.0/out/codex-plugin/skills/nerf-nx/scripts/nerf-nx-show-projects +41 -0
  165. nerftools-1.3.0/out/codex-plugin/skills/nerf-pkgrun/SKILL.md +54 -0
  166. nerftools-1.3.0/out/codex-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-cspell +72 -0
  167. nerftools-1.3.0/out/codex-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-markdownlint +72 -0
  168. nerftools-1.3.0/out/codex-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-prettier +72 -0
  169. nerftools-1.3.0/out/codex-plugin/skills/nerf-stdutils/SKILL.md +90 -0
  170. nerftools-1.3.0/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-find +53 -0
  171. nerftools-1.3.0/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-find-cwd +53 -0
  172. nerftools-1.3.0/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-grep +118 -0
  173. nerftools-1.3.0/out/codex-plugin/skills/nerf-stdutils/scripts/nerf-grep-recursive-cwd +102 -0
  174. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/SKILL.md +133 -0
  175. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-fmt +46 -0
  176. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-fmt-all +46 -0
  177. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-init +46 -0
  178. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-init-all +46 -0
  179. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-output +39 -0
  180. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-output-all +39 -0
  181. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-plan +39 -0
  182. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-plan-all +39 -0
  183. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-validate +39 -0
  184. nerftools-1.3.0/out/codex-plugin/skills/nerf-tg/scripts/nerf-tg-validate-all +39 -0
  185. nerftools-1.3.0/out/codex-plugin/skills/nerf-uv/SKILL.md +66 -0
  186. nerftools-1.3.0/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-mypy +53 -0
  187. nerftools-1.3.0/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-pytest +53 -0
  188. nerftools-1.3.0/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-check +53 -0
  189. nerftools-1.3.0/out/codex-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-fix +53 -0
  190. nerftools-1.3.0/out/codex-plugin/skills/nerftools/SKILL.md +40 -0
  191. {nerftools-1.2.0 → nerftools-1.3.0}/pyproject.toml +1 -1
  192. {nerftools-1.2.0 → nerftools-1.3.0}/tests/test_config.py +31 -0
  193. {nerftools-1.2.0 → nerftools-1.3.0}/tests/test_formats.py +125 -1
  194. {nerftools-1.2.0 → nerftools-1.3.0}/tests/test_nerfctl.py +4 -0
  195. {nerftools-1.2.0 → nerftools-1.3.0}/uv.lock +1 -1
  196. nerftools-1.2.0/.release-please-manifest.json +0 -3
  197. {nerftools-1.2.0 → nerftools-1.3.0}/.claude-plugin/marketplace.json +0 -0
  198. {nerftools-1.2.0 → nerftools-1.3.0}/.cspell.json +0 -0
  199. {nerftools-1.2.0 → nerftools-1.3.0}/.editorconfig +0 -0
  200. {nerftools-1.2.0 → nerftools-1.3.0}/.github/workflows/ci.yml +0 -0
  201. {nerftools-1.2.0 → nerftools-1.3.0}/.github/workflows/release.yml +0 -0
  202. {nerftools-1.2.0 → nerftools-1.3.0}/.gitignore +0 -0
  203. {nerftools-1.2.0 → nerftools-1.3.0}/.markdownlint-cli2.jsonc +0 -0
  204. {nerftools-1.2.0 → nerftools-1.3.0}/.prettierrc +0 -0
  205. {nerftools-1.2.0 → nerftools-1.3.0}/.python-version +0 -0
  206. {nerftools-1.2.0 → nerftools-1.3.0}/CONTRIBUTING.md +0 -0
  207. {nerftools-1.2.0 → nerftools-1.3.0}/LICENSE +0 -0
  208. {nerftools-1.2.0 → nerftools-1.3.0}/README.md +0 -0
  209. {nerftools-1.2.0 → nerftools-1.3.0}/docs/nerf-manifest.md +0 -0
  210. {nerftools-1.2.0 → nerftools-1.3.0}/docs/sdd/2026-04-04-nerf-refactor/frd.md +0 -0
  211. {nerftools-1.2.0 → nerftools-1.3.0}/docs/sdd/2026-04-04-nerf-refactor/hla.md +0 -0
  212. {nerftools-1.2.0 → nerftools-1.3.0}/docs/sdd/2026-04-04-nerf-refactor/locked.md +0 -0
  213. {nerftools-1.2.0 → nerftools-1.3.0}/docs/sdd/2026-04-04-nerf-refactor/manifest-spec.md +0 -0
  214. {nerftools-1.2.0 → nerftools-1.3.0}/docs/sdd/2026-04-04-nerf-refactor/plan.md +0 -0
  215. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/__init__.py +0 -0
  216. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/builder.py +0 -0
  217. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/README.md +0 -0
  218. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/__init__.py +0 -0
  219. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-account.yaml +0 -0
  220. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-aks.yaml +0 -0
  221. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-boards.yaml +0 -0
  222. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-cosmosdb.yaml +0 -0
  223. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-devops.yaml +0 -0
  224. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-keyvault.yaml +0 -0
  225. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-monitor.yaml +0 -0
  226. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-network.yaml +0 -0
  227. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-pipelines.yaml +0 -0
  228. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-postgres.yaml +0 -0
  229. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-repos.yaml +0 -0
  230. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-resource.yaml +0 -0
  231. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-role.yaml +0 -0
  232. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/az-storage.yaml +0 -0
  233. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/gh.yaml +0 -0
  234. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/git.yaml +0 -0
  235. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/kubectl.yaml +0 -0
  236. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/nx.yaml +0 -0
  237. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/pkgrun.yaml +0 -0
  238. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/stdutils.yaml +0 -0
  239. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/tg.yaml +0 -0
  240. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/default_manifests/uv.yaml +0 -0
  241. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/manifest.py +0 -0
  242. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/nerfctl/__init__.py +0 -0
  243. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/nerfctl/claude/grant-allow.sh +0 -0
  244. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/nerfctl/claude/grant-by-threat.sh +0 -0
  245. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/nerfctl/claude/grant-deny.sh +0 -0
  246. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/nerfctl/claude/grant-list.sh +0 -0
  247. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/nerfctl/claude/grant-reset.sh +0 -0
  248. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/rendering.py +0 -0
  249. {nerftools-1.2.0 → nerftools-1.3.0}/nerftools/skill.py +0 -0
  250. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/scripts/nerfctl-grant-allow +0 -0
  251. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/scripts/nerfctl-grant-by-threat +0 -0
  252. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/scripts/nerfctl-grant-deny +0 -0
  253. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/scripts/nerfctl-grant-list +0 -0
  254. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/scripts/nerfctl-grant-reset +0 -0
  255. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-account/SKILL.md +0 -0
  256. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-account/scripts/nerf-az-account-list +0 -0
  257. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-account/scripts/nerf-az-account-set +0 -0
  258. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-account/scripts/nerf-az-account-show +0 -0
  259. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/SKILL.md +0 -0
  260. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-command-invoke +0 -0
  261. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials +0 -0
  262. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-credentials-admin +0 -0
  263. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-get-versions +0 -0
  264. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-list +0 -0
  265. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-list +0 -0
  266. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-nodepool-show +0 -0
  267. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-aks/scripts/nerf-az-aks-show +0 -0
  268. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/SKILL.md +0 -0
  269. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-area-list +0 -0
  270. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-comment +0 -0
  271. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-mywi-show +0 -0
  272. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-add-parent +0 -0
  273. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-comment +0 -0
  274. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-create +0 -0
  275. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-list +0 -0
  276. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-show +0 -0
  277. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-boards/scripts/nerf-az-boards-wi-update +0 -0
  278. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-cosmosdb/SKILL.md +0 -0
  279. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-database-list +0 -0
  280. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-list +0 -0
  281. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-network-rule-list +0 -0
  282. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-cosmosdb/scripts/nerf-az-cosmosdb-show +0 -0
  283. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-devops/SKILL.md +0 -0
  284. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-devops/scripts/nerf-az-devops-set-default-project +0 -0
  285. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-keyvault/SKILL.md +0 -0
  286. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-list +0 -0
  287. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-network-rule-list +0 -0
  288. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-list +0 -0
  289. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-secret-stats +0 -0
  290. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-keyvault/scripts/nerf-az-keyvault-show +0 -0
  291. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-monitor/SKILL.md +0 -0
  292. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-activity-log +0 -0
  293. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-diagnostic-settings-list +0 -0
  294. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-monitor/scripts/nerf-az-monitor-metrics-list +0 -0
  295. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/SKILL.md +0 -0
  296. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-nic-show +0 -0
  297. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-list +0 -0
  298. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-nsg-show +0 -0
  299. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-list +0 -0
  300. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-link-show +0 -0
  301. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-record-list +0 -0
  302. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-list +0 -0
  303. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-dns-zone-show +0 -0
  304. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-list +0 -0
  305. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-endpoint-show +0 -0
  306. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-private-link-resource-list +0 -0
  307. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-list +0 -0
  308. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-public-ip-show +0 -0
  309. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-route-table-show +0 -0
  310. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-subnet-show +0 -0
  311. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-list +0 -0
  312. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-list +0 -0
  313. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-peering-show +0 -0
  314. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-network/scripts/nerf-az-network-vnet-show +0 -0
  315. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-pipelines/SKILL.md +0 -0
  316. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-check +0 -0
  317. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-list +0 -0
  318. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-run-show +0 -0
  319. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-pipelines/scripts/nerf-az-pipelines-runs +0 -0
  320. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-postgres/SKILL.md +0 -0
  321. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-firewall-rule-list +0 -0
  322. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-list +0 -0
  323. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-postgres/scripts/nerf-az-postgres-flexible-server-show +0 -0
  324. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-repos/SKILL.md +0 -0
  325. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-comments +0 -0
  326. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-create +0 -0
  327. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-list +0 -0
  328. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-set-status +0 -0
  329. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-show +0 -0
  330. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-repos/scripts/nerf-az-repos-pr-vote +0 -0
  331. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-resource/SKILL.md +0 -0
  332. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-group-list +0 -0
  333. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-group-show +0 -0
  334. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-list +0 -0
  335. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-resource/scripts/nerf-az-resource-show +0 -0
  336. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-role/SKILL.md +0 -0
  337. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-by-id +0 -0
  338. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-role/scripts/nerf-az-role-assignment-list +0 -0
  339. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-role/scripts/nerf-az-role-definition-list +0 -0
  340. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-storage/SKILL.md +0 -0
  341. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-list +0 -0
  342. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-network-rule-list +0 -0
  343. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-az-storage/scripts/nerf-az-storage-account-show +0 -0
  344. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/SKILL.md +0 -0
  345. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-comment +0 -0
  346. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-create +0 -0
  347. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-list +0 -0
  348. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-issue-view +0 -0
  349. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-create +0 -0
  350. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-diff +0 -0
  351. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-inline-comments +0 -0
  352. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-list +0 -0
  353. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-review-comments +0 -0
  354. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-reviews +0 -0
  355. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comment +0 -0
  356. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-thread-comments +0 -0
  357. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-pr-view +0 -0
  358. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-list +0 -0
  359. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-gh/scripts/nerf-gh-run-view +0 -0
  360. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/SKILL.md +0 -0
  361. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-add +0 -0
  362. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-checkout-remote +0 -0
  363. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-delete-merged +0 -0
  364. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-list-local +0 -0
  365. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-branch-list-remote +0 -0
  366. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit +0 -0
  367. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-commit-amend +0 -0
  368. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-create-branch +0 -0
  369. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-diff +0 -0
  370. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-diff-staged +0 -0
  371. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-fetch +0 -0
  372. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-log +0 -0
  373. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-pull +0 -0
  374. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-branch +0 -0
  375. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-push-main +0 -0
  376. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-rebase-unpushed +0 -0
  377. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-reset-hard-last +0 -0
  378. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-reset-unpushed +0 -0
  379. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-revert +0 -0
  380. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-status +0 -0
  381. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-switch +0 -0
  382. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-git/scripts/nerf-git-tag +0 -0
  383. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/SKILL.md +0 -0
  384. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-resources +0 -0
  385. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-api-versions +0 -0
  386. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-cluster-info +0 -0
  387. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-current-context +0 -0
  388. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-get-contexts +0 -0
  389. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-config-use-context +0 -0
  390. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-describe +0 -0
  391. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-exec +0 -0
  392. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-explain +0 -0
  393. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get +0 -0
  394. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-get-secrets +0 -0
  395. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-logs +0 -0
  396. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-port-forward +0 -0
  397. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-rollout-restart +0 -0
  398. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-nodes +0 -0
  399. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-top-pods +0 -0
  400. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-kubectl/scripts/nerf-kubectl-version +0 -0
  401. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-nx/SKILL.md +0 -0
  402. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-affected +0 -0
  403. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-graph +0 -0
  404. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-reset +0 -0
  405. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-run +0 -0
  406. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-project +0 -0
  407. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-nx/scripts/nerf-nx-show-projects +0 -0
  408. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-pkgrun/SKILL.md +0 -0
  409. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-cspell +0 -0
  410. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-markdownlint +0 -0
  411. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-pkgrun/scripts/nerf-pkgrun-prettier +0 -0
  412. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-stdutils/SKILL.md +0 -0
  413. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find +0 -0
  414. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-find-cwd +0 -0
  415. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep +0 -0
  416. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-stdutils/scripts/nerf-grep-recursive-cwd +0 -0
  417. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/SKILL.md +0 -0
  418. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt +0 -0
  419. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-fmt-all +0 -0
  420. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init +0 -0
  421. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-init-all +0 -0
  422. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output +0 -0
  423. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-output-all +0 -0
  424. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan +0 -0
  425. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-plan-all +0 -0
  426. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate +0 -0
  427. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-tg/scripts/nerf-tg-validate-all +0 -0
  428. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-uv/SKILL.md +0 -0
  429. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-mypy +0 -0
  430. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-pytest +0 -0
  431. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-check +0 -0
  432. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerf-uv/scripts/nerf-uv-ruff-fix +0 -0
  433. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerfctl-grant-allow/SKILL.md +0 -0
  434. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerfctl-grant-by-threat/SKILL.md +0 -0
  435. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerfctl-grant-deny/SKILL.md +0 -0
  436. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerfctl-grant-list/SKILL.md +0 -0
  437. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerfctl-grant-reset/SKILL.md +0 -0
  438. {nerftools-1.2.0 → nerftools-1.3.0}/out/claude-plugin/skills/nerftools/SKILL.md +0 -0
  439. {nerftools-1.2.0 → nerftools-1.3.0}/pypi-dist/.gitignore +0 -0
  440. {nerftools-1.2.0 → nerftools-1.3.0}/release-please-config.json +0 -0
  441. {nerftools-1.2.0 → nerftools-1.3.0}/tests/__init__.py +0 -0
  442. {nerftools-1.2.0 → nerftools-1.3.0}/tests/test_builder.py +0 -0
  443. {nerftools-1.2.0 → nerftools-1.3.0}/tests/test_manifest.py +0 -0
  444. {nerftools-1.2.0 → nerftools-1.3.0}/tests/test_rendering.py +0 -0
  445. {nerftools-1.2.0 → nerftools-1.3.0}/tests/test_skill.py +0 -0
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "nerftools",
3
+ "plugins": [
4
+ {
5
+ "name": "nerftools-default",
6
+ "source": {
7
+ "source": "local",
8
+ "path": "./out/codex-plugin"
9
+ }
10
+ }
11
+ ]
12
+ }
@@ -64,14 +64,17 @@ jobs:
64
64
  - name: Regenerate Claude Code plugin
65
65
  run: uv run nerf generate --target claude-plugin -c nerf.yaml --outdir ./out/claude-plugin
66
66
 
67
- - name: Commit updated plugin and lockfile
67
+ - name: Regenerate Codex plugin
68
+ run: uv run nerf generate --target codex-plugin -c nerf.yaml --outdir ./out/codex-plugin
69
+
70
+ - name: Commit updated plugins and lockfile
68
71
  run: |
69
72
  git config user.name "nerftools-release[bot]"
70
73
  git config user.email "nerftools-release[bot]@users.noreply.github.com"
71
- git add out/claude-plugin/ uv.lock
74
+ git add out/claude-plugin/ out/codex-plugin/ uv.lock
72
75
  if git diff --cached --quiet; then
73
76
  echo "No changes to plugin output or lockfile"
74
77
  else
75
- git commit -m "build: regenerate Claude Code plugin for release"
78
+ git commit -m "build: regenerate plugins for release"
76
79
  git push
77
80
  fi
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "1.3.0"
3
+ }
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [1.3.0](https://github.com/WayfarerLabs/nerftools/compare/v1.2.0...v1.3.0) (2026-05-09)
4
+
5
+
6
+ ### Features
7
+
8
+ * add codex marketplace registration ([dedd5f4](https://github.com/WayfarerLabs/nerftools/commit/dedd5f49b9d7ef303e92baaf6a3a1e87cc6c28be))
9
+ * add codex-plugin target for OpenAI Codex agent support ([8b7e655](https://github.com/WayfarerLabs/nerftools/commit/8b7e6555b73a635cc890e4ab753de874983a8db4))
10
+ * add codex-plugin target for OpenAI Codex support ([85cf792](https://github.com/WayfarerLabs/nerftools/commit/85cf792477234354537e7ec25c393c0b5c771086))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * guard codex cleanup against symlinked directories ([ebdf2fd](https://github.com/WayfarerLabs/nerftools/commit/ebdf2fd41c1ac251d776ab41180284ba391a675a))
16
+
3
17
  ## [1.2.0](https://github.com/WayfarerLabs/nerftools/compare/v1.1.0...v1.2.0) (2026-05-06)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nerftools
3
- Version: 1.2.0
3
+ Version: 1.3.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
@@ -3,7 +3,7 @@
3
3
 
4
4
  package:
5
5
  name: nerftools
6
- version: 1.2.0 # x-release-please-version
6
+ version: 1.3.0 # x-release-please-version
7
7
  description: Scoped, safety-constrained CLI wrappers for AI agents
8
8
  author:
9
9
  name: WayfarerLabs
@@ -18,7 +18,7 @@ app = typer.Typer(
18
18
  no_args_is_help=True,
19
19
  )
20
20
 
21
- _VALID_TARGETS = ("bin", "skills", "claude-plugin")
21
+ _VALID_TARGETS = ("bin", "skills", "claude-plugin", "codex-plugin")
22
22
 
23
23
 
24
24
  def _resolve_config_manifests(config_manifests: list[str], config_path: Path | None) -> list[Path]:
@@ -176,3 +176,18 @@ def generate(
176
176
  )
177
177
  for path in written:
178
178
  typer.echo(f" {path}")
179
+
180
+ elif t == "codex-plugin":
181
+ from nerftools.config import resolve_plugin_meta
182
+ from nerftools.formats import build_codex_plugin
183
+
184
+ plugin_meta = resolve_plugin_meta(config)
185
+
186
+ written = build_codex_plugin(
187
+ loaded,
188
+ output,
189
+ plugin_meta,
190
+ prefix=prefix,
191
+ )
192
+ for path in written:
193
+ typer.echo(f" {path}")
@@ -346,20 +346,13 @@ def _parse_marketplace_config(raw: Any) -> MarketplaceConfig:
346
346
  # -- Defaults resolution -------------------------------------------------------
347
347
 
348
348
 
349
- def resolve_claude_plugin_meta(
350
- config: NerfConfig,
351
- ) -> tuple[PluginMetadata, MarketplaceMetadata | None]:
352
- """Build ``PluginMetadata`` and optional ``MarketplaceMetadata`` from config.
349
+ def resolve_plugin_meta(config: NerfConfig) -> PluginMetadata:
350
+ """Build ``PluginMetadata`` from package config.
353
351
 
354
- Applies defaults cascade:
355
- - marketplace.name ← package.name
356
- - marketplace.description ← package.description
357
- - marketplace.owner.name ← package.author.name if present, else package.name
352
+ Shared by all plugin targets (claude-plugin, codex-plugin).
358
353
  """
359
354
  pkg = config.package
360
- mkt = config.targets.claude_plugin.marketplace
361
-
362
- plugin = PluginMetadata(
355
+ return PluginMetadata(
363
356
  name=pkg.name,
364
357
  version=pkg.version,
365
358
  description=pkg.description,
@@ -370,10 +363,25 @@ def resolve_claude_plugin_meta(
370
363
  keywords=list(pkg.keywords),
371
364
  )
372
365
 
366
+
367
+ def resolve_claude_plugin_meta(
368
+ config: NerfConfig,
369
+ ) -> tuple[PluginMetadata, MarketplaceMetadata | None]:
370
+ """Build ``PluginMetadata`` and optional ``MarketplaceMetadata`` from config.
371
+
372
+ Applies defaults cascade:
373
+ - marketplace.name ← package.name
374
+ - marketplace.description ← package.description
375
+ - marketplace.owner.name ← package.author.name if present, else package.name
376
+ """
377
+ plugin = resolve_plugin_meta(config)
378
+
379
+ mkt = config.targets.claude_plugin.marketplace
373
380
  if not mkt.embed:
374
381
  return plugin, None
375
382
 
376
383
  # Cascade marketplace fields from package.
384
+ pkg = config.package
377
385
  mp_name = mkt.name or pkg.name
378
386
  mp_description = mkt.description or pkg.description
379
387
  mp_owner = mkt.owner
@@ -1,7 +1,7 @@
1
- """Claude Code plugin builder for nerf tools (v1).
1
+ """Plugin builders for nerf tools (v1).
2
2
 
3
- Generates a self-contained Claude Code plugin from nerf manifests, including
4
- skills, scripts, plugin manifest, and marketplace metadata.
3
+ Generates self-contained plugins from nerf manifests for Claude Code and
4
+ Codex, including skills, scripts, plugin manifests, and marketplace metadata.
5
5
  """
6
6
 
7
7
  from __future__ import annotations
@@ -280,15 +280,18 @@ def _build_claude_plugin_skill_text(manifest: NerfManifest, prefix: str = "") ->
280
280
  return "\n".join(parts).rstrip() + "\n"
281
281
 
282
282
 
283
- def _claude_plugin_tool_section(tool_name: str, skill_group: str, tool_spec: ToolSpec) -> str:
284
- """Generate a tool section for the claude-plugin format."""
283
+ def _tool_section(tool_name: str, tool_spec: ToolSpec, *, script_path: str) -> str:
284
+ """Generate a tool section for a plugin skill.
285
+
286
+ Shared by all plugin targets — the caller passes the resolved *script_path*
287
+ (absolute for Claude, relative for Codex).
288
+ """
285
289
  parts: list[str] = []
286
290
  parts.append(f"## {tool_name}")
287
291
  parts.append("")
288
292
  parts.append(tool_spec.description)
289
293
  parts.append("")
290
294
 
291
- script_path = f"${{CLAUDE_PLUGIN_ROOT}}/skills/{skill_group}/scripts/{tool_name}"
292
295
  usage = " ".join([script_path, *usage_tokens(tool_spec)])
293
296
  parts.append(f"**Usage:** `{usage}`")
294
297
 
@@ -334,12 +337,20 @@ def _claude_plugin_tool_section(tool_name: str, skill_group: str, tool_spec: Too
334
337
  return "\n".join(parts)
335
338
 
336
339
 
337
- def _build_claude_plugin_overview_text(
340
+ def _claude_plugin_tool_section(tool_name: str, skill_group: str, tool_spec: ToolSpec) -> str:
341
+ """Generate a tool section using ``${CLAUDE_PLUGIN_ROOT}`` paths."""
342
+ script_path = f"${{CLAUDE_PLUGIN_ROOT}}/skills/{skill_group}/scripts/{tool_name}"
343
+ return _tool_section(tool_name, tool_spec, script_path=script_path)
344
+
345
+
346
+ def _overview_text(
338
347
  manifests: list[NerfManifest],
339
348
  plugin_meta: PluginMetadata,
340
349
  prefix: str = "",
350
+ *,
351
+ path_instruction: str,
341
352
  ) -> str:
342
- """Generate the overview SKILL.md for the claude-plugin format."""
353
+ """Generate the overview SKILL.md shared by all plugin targets."""
343
354
  parts: list[str] = []
344
355
 
345
356
  parts.append("---")
@@ -363,9 +374,7 @@ def _build_claude_plugin_overview_text(
363
374
  "rather than using raw `git` commands."
364
375
  )
365
376
  parts.append("")
366
- parts.append(
367
- "Each tool's usage line shows the full absolute path to call it. Use that path directly in Bash commands."
368
- )
377
+ parts.append(path_instruction)
369
378
  parts.append("")
370
379
  parts.append("## Available tool packages")
371
380
  parts.append("")
@@ -378,3 +387,156 @@ def _build_claude_plugin_overview_text(
378
387
  parts.append("Use the corresponding `nerf-*` skill for full usage details on each package.")
379
388
 
380
389
  return "\n".join(parts).rstrip() + "\n"
390
+
391
+
392
+ def _build_claude_plugin_overview_text(
393
+ manifests: list[NerfManifest],
394
+ plugin_meta: PluginMetadata,
395
+ prefix: str = "",
396
+ ) -> str:
397
+ """Generate the overview SKILL.md for the claude-plugin format."""
398
+ return _overview_text(
399
+ manifests,
400
+ plugin_meta,
401
+ prefix,
402
+ path_instruction=(
403
+ "Each tool's usage line shows the full absolute path to call it. "
404
+ "Use that path directly in Bash commands."
405
+ ),
406
+ )
407
+
408
+
409
+ # -- Codex plugin format -------------------------------------------------------
410
+
411
+
412
+ def build_codex_plugin(
413
+ manifests: list[NerfManifest],
414
+ output_dir: Path,
415
+ plugin_meta: PluginMetadata,
416
+ *,
417
+ prefix: str = "nerf-",
418
+ ) -> list[Path]:
419
+ """Build a self-contained Codex plugin.
420
+
421
+ Layout::
422
+
423
+ output_dir/
424
+ ├── .codex-plugin/
425
+ │ └── plugin.json
426
+ └── skills/
427
+ ├── <plugin-name>/SKILL.md (overview)
428
+ ├── <prefix><group>/
429
+ │ ├── SKILL.md
430
+ │ └── scripts/<prefix><tool> (executable scripts)
431
+ └── ...
432
+
433
+ Script paths in SKILL.md are relative to the skill directory — Codex
434
+ resolves them from the absolute path it injects into the system prompt.
435
+ """
436
+ import json
437
+ import shutil
438
+
439
+ from nerftools.builder import build_script_text
440
+
441
+ written: list[Path] = []
442
+
443
+ # Always start clean
444
+ output_dir.mkdir(parents=True, exist_ok=True)
445
+ for item in output_dir.iterdir():
446
+ if item.is_symlink():
447
+ raise ValueError(
448
+ f"refusing to clean symlink in output directory: {item}. "
449
+ "Please remove the symlink manually before proceeding."
450
+ )
451
+ if item.is_dir():
452
+ shutil.rmtree(item)
453
+ elif item.is_file():
454
+ item.unlink()
455
+
456
+ # Plugin manifest
457
+ plugin_dir = output_dir / ".codex-plugin"
458
+ plugin_dir.mkdir(exist_ok=True)
459
+
460
+ p = plugin_dir / "plugin.json"
461
+ p.write_text(json.dumps(plugin_meta.to_json(), indent=2) + "\n")
462
+ written.append(p)
463
+
464
+ skills_dir = output_dir / "skills"
465
+ skills_dir.mkdir(exist_ok=True)
466
+
467
+ # Per-package: skill + scripts
468
+ for manifest in manifests:
469
+ group = prefix + manifest.package.skill_group
470
+ skill_dir = skills_dir / group
471
+ skill_dir.mkdir(exist_ok=True)
472
+ scripts_dir = skill_dir / "scripts"
473
+ scripts_dir.mkdir(exist_ok=True)
474
+
475
+ # Generate scripts into the skill's scripts/ dir
476
+ for tool_name, tool_spec in manifest.tools.items():
477
+ full_name = prefix + tool_name
478
+ script_text = build_script_text(full_name, manifest.package.name, tool_spec)
479
+ out = scripts_dir / full_name
480
+ out.write_bytes(script_text.encode("utf-8"))
481
+ out.chmod(0o755)
482
+ written.append(out)
483
+
484
+ # Generate skill with relative path references
485
+ skill_text = _build_codex_plugin_skill_text(manifest, prefix=prefix)
486
+ out = skill_dir / "SKILL.md"
487
+ out.write_text(skill_text)
488
+ written.append(out)
489
+
490
+ # Overview skill
491
+ if manifests:
492
+ overview_text = _overview_text(
493
+ manifests,
494
+ plugin_meta,
495
+ prefix,
496
+ path_instruction=(
497
+ "Each tool's usage line shows the path to call it relative to "
498
+ "this skill's directory."
499
+ ),
500
+ )
501
+ overview_dir = skills_dir / plugin_meta.name
502
+ overview_dir.mkdir(exist_ok=True)
503
+ out = overview_dir / "SKILL.md"
504
+ out.write_text(overview_text)
505
+ written.append(out)
506
+
507
+ return written
508
+
509
+
510
+ def _build_codex_plugin_skill_text(manifest: NerfManifest, prefix: str = "") -> str:
511
+ """Generate a SKILL.md for the codex-plugin format.
512
+
513
+ Uses relative script paths — Codex resolves them from the skill's
514
+ listed file path in the system prompt.
515
+ """
516
+ parts: list[str] = []
517
+ skill_group = prefix + manifest.package.skill_group
518
+
519
+ parts.append("---")
520
+ parts.append(f"name: {skill_group}")
521
+ parts.append(f'description: "{manifest.package.description}"')
522
+ parts.append('targets: ["*"]')
523
+ parts.append("---")
524
+ parts.append("")
525
+ parts.append(f"# {skill_group}")
526
+ parts.append("")
527
+ parts.append(
528
+ "These tools are available as scripts within this skill. "
529
+ "Call them using the paths shown in each usage line."
530
+ )
531
+ parts.append("")
532
+
533
+ if manifest.package.skill_intro:
534
+ parts.append(manifest.package.skill_intro.strip())
535
+ parts.append("")
536
+
537
+ for tool_name, tool_spec in manifest.tools.items():
538
+ full_name = prefix + tool_name
539
+ script_path = f"scripts/{full_name}"
540
+ parts.append(_tool_section(full_name, tool_spec, script_path=script_path))
541
+
542
+ return "\n".join(parts).rstrip() + "\n"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nerftools",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Scoped, safety-constrained CLI wrappers for AI agents",
5
5
  "skills": "./skills/",
6
6
  "author": {
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "nerftools",
3
+ "version": "1.3.0",
4
+ "description": "Scoped, safety-constrained CLI wrappers for AI agents",
5
+ "skills": "./skills/",
6
+ "author": {
7
+ "name": "WayfarerLabs"
8
+ },
9
+ "homepage": "https://github.com/WayfarerLabs/nerftools",
10
+ "repository": "https://github.com/WayfarerLabs/nerftools",
11
+ "license": "MIT",
12
+ "keywords": [
13
+ "claude-code",
14
+ "agent-tools",
15
+ "safety",
16
+ "cli-wrappers"
17
+ ]
18
+ }
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: nerf-az-account
3
+ description: "Azure subscription and identity context tools"
4
+ targets: ["*"]
5
+ ---
6
+
7
+ # nerf-az-account
8
+
9
+ These tools are available as scripts within this skill. Call them using the paths shown in each usage line.
10
+
11
+ Tools for inspecting and switching the active Azure subscription.
12
+ az-account-show reports the active subscription and signed-in identity.
13
+ az-account-list enumerates all subscriptions the principal can see.
14
+ az-account-set switches the active subscription for the session.
15
+
16
+ Scope note: every az-* tool accepts --subscription. The wrappers do
17
+ not enforce a subscription allow-list; the principal's Azure RBAC is
18
+ the actual boundary. If the signed-in identity has access to
19
+ multiple subscriptions or guest access in other tenants, those are
20
+ all reachable via --subscription. Restrict the principal at the
21
+ Entra/RBAC layer if you need a tighter scope than "everything the
22
+ identity can see."
23
+
24
+ ## nerf-az-account-show
25
+
26
+ Show the currently active subscription and signed-in identity.
27
+
28
+ **Usage:** `scripts/nerf-az-account-show`
29
+ **Maps to:** `az account show --output json`
30
+
31
+ No arguments.
32
+
33
+ ---
34
+
35
+ ## nerf-az-account-list
36
+
37
+ List all Azure subscriptions accessible to the signed-in principal.
38
+
39
+ **Usage:** `scripts/nerf-az-account-list`
40
+ **Maps to:** `az account list --output json`
41
+
42
+ No arguments.
43
+
44
+ ---
45
+
46
+ ## nerf-az-account-set
47
+
48
+ Switch the active Azure subscription for this session.
49
+
50
+ **Usage:** `scripts/nerf-az-account-set <subscription>`
51
+ **Maps to:** `az account set --subscription <subscription>`
52
+
53
+ **Arguments:**
54
+
55
+ - `<subscription>` (required): Subscription name or ID
56
+
57
+ ---
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env bash
2
+ # nerf-az-account-list -- List all Azure subscriptions accessible to the signed-in principal.
3
+ # Generated from az-account manifest. Do not edit directly.
4
+ # nerf:threat:read=remote
5
+ # nerf:threat:write=none
6
+
7
+ set -euo pipefail
8
+
9
+ _NERF_DRY_RUN=""
10
+
11
+ usage() {
12
+ cat >&2 <<'EOF'
13
+ Usage: nerf-az-account-list
14
+
15
+ Maps to: az account list --output json
16
+
17
+ List all Azure subscriptions accessible to the signed-in principal.
18
+ EOF
19
+ exit 1
20
+ }
21
+
22
+ while [[ $# -gt 0 ]]; do
23
+ case "$1" in
24
+ --nerf-dry-run) _NERF_DRY_RUN="true"; shift 1 ;;
25
+ -h|--help) usage ;;
26
+ --) shift; break ;;
27
+ *) echo "error: unknown argument: $1" >&2; usage ;;
28
+ esac
29
+ done
30
+
31
+ if [[ "$_NERF_DRY_RUN" == "true" ]]; then
32
+ _NERF_DRY_CMD=(az account list --output json)
33
+ printf 'dry-run:'
34
+ for _a in "${_NERF_DRY_CMD[@]}"; do printf " %q" "$_a"; done
35
+ echo
36
+ exit 0
37
+ fi
38
+
39
+ exec az account list --output json
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env bash
2
+ # nerf-az-account-set -- Switch the active Azure subscription for this session.
3
+ # Generated from az-account manifest. Do not edit directly.
4
+ # nerf:threat:read=remote
5
+ # nerf:threat:write=machine
6
+
7
+ set -euo pipefail
8
+
9
+ _NERF_DRY_RUN=""
10
+
11
+ usage() {
12
+ cat >&2 <<'EOF'
13
+ Usage: nerf-az-account-set <subscription>
14
+
15
+ Arguments:
16
+ <subscription> (required)
17
+ Subscription name or ID
18
+
19
+ Maps to: az account set --subscription <subscription>
20
+
21
+ Switch the active Azure subscription for this session.
22
+ EOF
23
+ exit 1
24
+ }
25
+
26
+ while [[ $# -gt 0 ]]; do
27
+ case "$1" in
28
+ --nerf-dry-run) _NERF_DRY_RUN="true"; shift 1 ;;
29
+ -h|--help) usage ;;
30
+ --) shift; break ;;
31
+ *) break ;;
32
+ esac
33
+ done
34
+
35
+ _SUBSCRIPTION_SET=""
36
+ if [[ $# -gt 0 ]]; then
37
+ SUBSCRIPTION="$1"
38
+ _SUBSCRIPTION_SET=true
39
+ shift
40
+ else
41
+ SUBSCRIPTION=""
42
+ fi
43
+ if [[ $# -gt 0 ]]; then
44
+ echo "error: nerf-az-account-set: unexpected extra arguments: $*" >&2
45
+ echo " hint: switches and options must come before positional arguments" >&2
46
+ exit 1
47
+ fi
48
+
49
+ if [[ -n "${_SUBSCRIPTION_SET}" ]] && [[ "${SUBSCRIPTION}" == -* ]]; then
50
+ echo "error: nerf-az-account-set: <subscription> cannot start with '-'" >&2
51
+ echo " hint: use -- before positional arguments if needed" >&2
52
+ exit 1
53
+ fi
54
+
55
+ if [[ -z "${SUBSCRIPTION}" ]]; then
56
+ echo "error: nerf-az-account-set: missing required argument <subscription>" >&2
57
+ echo " hint: provide a value for <subscription>" >&2
58
+ usage
59
+ fi
60
+
61
+ if [[ "$_NERF_DRY_RUN" == "true" ]]; then
62
+ _NERF_DRY_CMD=(az account set --subscription "${SUBSCRIPTION}")
63
+ printf 'dry-run:'
64
+ for _a in "${_NERF_DRY_CMD[@]}"; do printf " %q" "$_a"; done
65
+ echo
66
+ exit 0
67
+ fi
68
+
69
+ exec az account set --subscription "${SUBSCRIPTION}"
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env bash
2
+ # nerf-az-account-show -- Show the currently active subscription and signed-in identity.
3
+ # Generated from az-account manifest. Do not edit directly.
4
+ # nerf:threat:read=remote
5
+ # nerf:threat:write=none
6
+
7
+ set -euo pipefail
8
+
9
+ _NERF_DRY_RUN=""
10
+
11
+ usage() {
12
+ cat >&2 <<'EOF'
13
+ Usage: nerf-az-account-show
14
+
15
+ Maps to: az account show --output json
16
+
17
+ Show the currently active subscription and signed-in identity.
18
+ EOF
19
+ exit 1
20
+ }
21
+
22
+ while [[ $# -gt 0 ]]; do
23
+ case "$1" in
24
+ --nerf-dry-run) _NERF_DRY_RUN="true"; shift 1 ;;
25
+ -h|--help) usage ;;
26
+ --) shift; break ;;
27
+ *) echo "error: unknown argument: $1" >&2; usage ;;
28
+ esac
29
+ done
30
+
31
+ if [[ "$_NERF_DRY_RUN" == "true" ]]; then
32
+ _NERF_DRY_CMD=(az account show --output json)
33
+ printf 'dry-run:'
34
+ for _a in "${_NERF_DRY_CMD[@]}"; do printf " %q" "$_a"; done
35
+ echo
36
+ exit 0
37
+ fi
38
+
39
+ exec az account show --output json