diff --git a/CHANGELOG.md b/CHANGELOG.md index f45d7e0..3bf10c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,20 @@ Versions follow [Semantic Versioning](https://semver.org/). --- +## v3.3.0 — 2026-05-16 + +**npm package + CLI quickstart.** + +- Published to npm as `code-warden` — install with `npx code-warden init` +- Added `bin/code-warden.js` — CLI wrapper dispatching to existing tools: `init`, `report`, `doctor`, `list`, `hooks`, `uninstall-hooks` +- Added `"bin"` field to `package.json` for global/npx invocation +- Added `"files"` field to control tarball contents (41 files, 39 kB, zero runtime deps) +- Added `"engines": { "node": ">=18" }` +- Added `"keywords"`, `"repository"`, `"homepage"`, `"bugs"` metadata +- Updated README with `npx code-warden init` as primary install path and CLI command table + +--- + ## v3.2.0 — 2026-05-16 **Governance Evidence Artifact.** diff --git a/README.md b/README.md index 68c48bb..f90aa0c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Code-Warden Quality Gate - Version 3.2.0 + Version 3.3.0 MIT License Claude Code PreToolUse Hooks AI Governance Enforced @@ -121,38 +121,31 @@ Start where you have the most immediate pain. ## Install ```bash -git clone https://github.com/Kodaxadev/Code-Warden.git -cd Code-Warden/code-warden -node install.js +npx code-warden init ``` -The auto-installer scans for installed AI apps and deploys to all of them in one step. -Supports Claude Code, Cursor, Warp, OpenAI Codex, Windsurf, and generic agent runtimes. - -### Common commands +Or install globally: ```bash -node install.js --all # install without prompt -node install.js --dry-run # preview, write nothing -node install.js --list # show detected apps -node install.js --doctor # verify source + install health -node install.js --verify-target=claude # strict per-target check, exits nonzero on failure -node install.js --hooks=claude # install Claude Code PreToolUse hooks -node install.js --uninstall-hooks=claude # remove Claude Code hooks -node install.js --hooks=codex # install Codex PreToolUse hooks (partial) -node install.js --uninstall-hooks=codex # remove Codex hooks +npm install -g code-warden +code-warden init ``` -### npm scripts +The installer scans for AI runtimes and deploys to all of them in one step. +Supports Claude Code, Cursor, Warp, OpenAI Codex, Windsurf, and generic agent runtimes. + +### CLI commands ```bash -npm run lint # scan full project tree for oversized files -npm run check-secrets # scan full project tree for hardcoded credentials -npm run report # governance report — writes .code-warden-report.json -npm run report:md # governance report as Markdown (pipe to PR summary) -npm run ci # lint + secrets + test + doctor -npm run install-auto # node install.js -npm run install-doctor # node install.js --doctor +code-warden init # install to detected AI runtimes +code-warden report # generate governance report +code-warden report --format=md # Markdown output (pipe to PR summary) +code-warden doctor # verify source + install health +code-warden list # show detected runtimes +code-warden hooks claude # install Claude Code PreToolUse hooks +code-warden hooks codex # install Codex PreToolUse hooks (partial) +code-warden uninstall-hooks claude +code-warden uninstall-hooks codex ``` ## Invoke @@ -256,7 +249,7 @@ Full template: [`code-warden/templates/ci/github-actions.yml`](code-warden/templ ## Version -v3.2.0 — See [`CHANGELOG.md`](CHANGELOG.md) for full changelog. +v3.3.0 — See [`CHANGELOG.md`](CHANGELOG.md) for full changelog. ## Author diff --git a/code-warden/README.md b/code-warden/README.md index 2adb83e..19f74e2 100644 --- a/code-warden/README.md +++ b/code-warden/README.md @@ -60,12 +60,31 @@ See [`templates/ci/github-actions.yml`](templates/ci/github-actions.yml) for the ## Install ```bash -git clone https://github.com/Kodaxadev/Code-Warden.git -cd Code-Warden/code-warden -node install.js +npx code-warden init ``` -### Installer commands +Or install globally: + +```bash +npm install -g code-warden +code-warden init +``` + +### CLI commands + +| Command | Purpose | +|---------|---------| +| `code-warden init` | Install to all detected AI runtimes | +| `code-warden report` | Generate governance report | +| `code-warden report --format=md` | Markdown output for PR summaries | +| `code-warden doctor` | Verify source integrity + install health | +| `code-warden list` | Show detected runtimes | +| `code-warden hooks claude` | Install Claude Code PreToolUse hooks | +| `code-warden hooks codex` | Install Codex PreToolUse hooks (partial) | +| `code-warden uninstall-hooks claude` | Remove Claude Code hooks | +| `code-warden uninstall-hooks codex` | Remove Codex hooks | + +### Direct installer commands | Command | Purpose | |---------|---------| diff --git a/code-warden/bin/code-warden.js b/code-warden/bin/code-warden.js new file mode 100644 index 0000000..2453aab --- /dev/null +++ b/code-warden/bin/code-warden.js @@ -0,0 +1,82 @@ +#!/usr/bin/env node +'use strict'; + +const { spawnSync } = require('child_process'); +const path = require('path'); + +const ROOT = path.join(__dirname, '..'); + +const COMMANDS = { + init: { desc: 'Install Code-Warden to detected AI runtimes', run: ['install.js', '--all'] }, + doctor: { desc: 'Verify source integrity and install health', run: ['install.js', '--doctor'] }, + report: { desc: 'Generate governance report (.code-warden-report.json)', run: ['tools/governance-report.js', '.'] }, + list: { desc: 'Show detected AI runtimes', run: ['install.js', '--list'] }, +}; + +const HOOK_TARGETS = ['claude', 'codex']; + +function usage() { + console.log('Usage: code-warden [options]\n'); + console.log('Commands:'); + for (const [name, { desc }] of Object.entries(COMMANDS)) { + console.log(` ${name.padEnd(22)} ${desc}`); + } + console.log(` ${'hooks '.padEnd(22)} Install PreToolUse hooks (${HOOK_TARGETS.join(', ')})`); + console.log(` ${'uninstall-hooks '.padEnd(22)} Remove PreToolUse hooks`); + console.log(`\nExamples:`); + console.log(` npx code-warden init`); + console.log(` npx code-warden report`); + console.log(` npx code-warden report --format=md`); + console.log(` npx code-warden hooks claude`); +} + +function run(scriptPath, args) { + const result = spawnSync(process.execPath, [path.join(ROOT, scriptPath), ...args], { + stdio: 'inherit', + cwd: process.cwd(), + }); + process.exit(result.status ?? 1); +} + +const args = process.argv.slice(2); +const command = args[0]; +const rest = args.slice(1); + +if (!command || command === '--help' || command === '-h') { + usage(); + process.exit(0); +} + +if (command === '--version' || command === '-v') { + const pkg = require(path.join(ROOT, 'package.json')); + console.log(pkg.version); + process.exit(0); +} + +if (COMMANDS[command]) { + const entry = COMMANDS[command]; + const scriptArgs = [...entry.run.slice(1), ...rest]; + run(entry.run[0], scriptArgs); +} + +if (command === 'hooks') { + const target = rest[0]; + if (!target || !HOOK_TARGETS.includes(target)) { + console.error(`Usage: code-warden hooks <${HOOK_TARGETS.join('|')}>`); + process.exit(1); + } + run('install.js', [`--hooks=${target}`]); +} + +if (command === 'uninstall-hooks') { + const target = rest[0]; + if (!target || !HOOK_TARGETS.includes(target)) { + console.error(`Usage: code-warden uninstall-hooks <${HOOK_TARGETS.join('|')}>`); + process.exit(1); + } + run('install.js', [`--uninstall-hooks=${target}`]); +} + +console.error(`Unknown command: ${command}\n`); +usage(); +process.exit(1); diff --git a/code-warden/package.json b/code-warden/package.json index 88cb449..5042d64 100644 --- a/code-warden/package.json +++ b/code-warden/package.json @@ -1,8 +1,26 @@ { "name": "code-warden", - "version": "3.2.0", + "version": "3.3.0", "description": "Verifiable governance for AI-assisted development — checks, hooks, and evidence.", "main": "SKILL.md", + "bin": { + "code-warden": "bin/code-warden.js" + }, + "files": [ + "bin/", + "tools/", + "references/", + "templates/", + "examples/", + "SKILL.md", + "CONFIGURE.md", + "DECISIONS.md", + "README.md", + "codewarden.json", + "install.js", + "install.ps1", + "install.sh" + ], "scripts": { "lint": "node tools/warden-lint.js .", "check-secrets": "node tools/verify-secrets.js .", @@ -17,6 +35,28 @@ "test": "node tools/tests/run-tests.js", "ci": "npm run lint && npm run check-secrets && npm run test && node install.js --doctor" }, + "engines": { + "node": ">=18" + }, + "keywords": [ + "ai", + "governance", + "claude", + "codex", + "cursor", + "windsurf", + "code-review", + "linter", + "secrets", + "ci", + "hooks" + ], + "repository": { + "type": "git", + "url": "https://github.com/Kodaxadev/Code-Warden.git" + }, + "homepage": "https://github.com/Kodaxadev/Code-Warden", + "bugs": "https://github.com/Kodaxadev/Code-Warden/issues", "author": "Justin Davis", "license": "MIT" }