@axiomatic-labs/cli 1.0.0 → 1.0.2

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.
package/README.md ADDED
@@ -0,0 +1,47 @@
1
+ # Axiomatic
2
+
3
+ **Ship production apps with Claude Code — not prototypes.**
4
+
5
+ Axiomatic is a development toolkit that turns Claude Code into a senior engineering team. It installs skills, agents, hooks, and quality gates that enforce real-world standards on every task.
6
+
7
+ ## What you get
8
+
9
+ - **11 specialized skills** — Build pipeline, design system, brand strategy, competitive analysis, CRO, content strategy, and more. Each skill encodes expert-level methodology that Claude follows step by step.
10
+ - **11 AI agents** — Dedicated agents for design, architecture, code review, and implementation. They work in parallel, each with domain expertise.
11
+ - **21 automation hooks** — Quality gates, linting, build tracking, browser testing, and dev server management. They fire automatically — no manual checks needed.
12
+ - **One command to build anything** — Type `/build` and describe what you want. Axiomatic plans the architecture, selects the right skills, creates tasks, and executes them with built-in quality checks at every step.
13
+
14
+ ## Quick start
15
+
16
+ ```bash
17
+ npx @axiomatic-labs/cli init
18
+ claude
19
+ # then type: /build <what you want to create>
20
+ ```
21
+
22
+ ## Commands
23
+
24
+ ```bash
25
+ axiomatic init # Install Axiomatic in your project
26
+ axiomatic update # Update to the latest version
27
+ axiomatic version # Check installed and latest versions
28
+ ```
29
+
30
+ ## How it works
31
+
32
+ 1. `axiomatic init` downloads the latest template files into your project
33
+ 2. You run `claude` to start Claude Code — Axiomatic's skills and agents activate automatically
34
+ 3. Type `/build` with a description — Axiomatic analyzes your request, selects skills, creates an execution plan, and builds it with quality gates enforced at every step
35
+
36
+ Updates are non-destructive. `axiomatic update` replaces only template files — your generated skills, custom agents, and project-specific configurations stay untouched.
37
+
38
+ ## Requirements
39
+
40
+ - [Claude Code](https://claude.ai/claude-code) (Anthropic CLI)
41
+ - [GitHub CLI](https://cli.github.com/) (`gh`) or a `GITHUB_TOKEN` with repo access
42
+ - Node.js 18+
43
+
44
+ ## Links
45
+
46
+ - [Website](https://axiomatic.dev)
47
+ - [GitHub](https://github.com/axiomatic-labs/axiomatic-cli)
package/bin/cli.js CHANGED
@@ -18,20 +18,20 @@ switch (command) {
18
18
  break;
19
19
  case '--help':
20
20
  case '-h':
21
- case undefined:
22
- console.log(`
23
- axiomatic - Install and update Axiomatic project templates
24
-
25
- Usage:
26
- axiomatic init Download and install the latest template files
27
- axiomatic update Update template files to the latest version
28
- axiomatic version Show local and latest version info
29
-
30
- Options:
31
- --version, -v Show CLI version
32
- --help, -h Show this help message
33
- `);
21
+ case undefined: {
22
+ const ui = require('../lib/ui.js');
23
+ ui.banner();
24
+ console.log(` ${ui.BOLD}Usage:${ui.RESET}`);
25
+ console.log(` axiomatic ${ui.CYAN}init${ui.RESET} Install the latest template files`);
26
+ console.log(` axiomatic ${ui.CYAN}update${ui.RESET} Update templates to latest version`);
27
+ console.log(` axiomatic ${ui.CYAN}version${ui.RESET} Show version info`);
28
+ console.log('');
29
+ console.log(` ${ui.BOLD}Options:${ui.RESET}`);
30
+ console.log(` --version, -v Show CLI version`);
31
+ console.log(` --help, -h Show this help`);
32
+ console.log('');
34
33
  break;
34
+ }
35
35
  default:
36
36
  console.error(`Unknown command: ${command}`);
37
37
  console.error('Run "axiomatic --help" for usage.');
package/lib/init.js CHANGED
@@ -4,31 +4,38 @@ const { execSync } = require('child_process');
4
4
  const { requireAuth } = require('./auth.js');
5
5
  const { getLatestRelease, downloadReleaseAsset } = require('./download.js');
6
6
  const { writeLocalVersion } = require('./version.js');
7
+ const { TEMPLATE_SKILLS, TEMPLATE_AGENTS } = require('./manifest.js');
8
+ const ui = require('./ui.js');
7
9
 
8
10
  async function run() {
9
11
  // Check if already initialized
10
12
  const versionFile = path.join(process.cwd(), '.claude', '.axiomatic-version');
11
13
  if (fs.existsSync(versionFile)) {
12
14
  const current = fs.readFileSync(versionFile, 'utf-8').trim();
13
- console.error(`Already initialized at ${current}. Use "axiomatic update" instead.`);
15
+ ui.banner(current);
16
+ ui.warn(`Already initialized at ${current}.`);
17
+ ui.info('Run: axiomatic update');
18
+ console.log('');
14
19
  process.exit(1);
15
20
  }
16
21
 
17
- console.log('Authenticating with GitHub...');
22
+ ui.banner();
23
+
24
+ ui.step('Authenticating with GitHub...');
18
25
  const token = requireAuth();
19
26
 
20
- console.log('Fetching latest release...');
27
+ ui.step('Fetching latest release...');
21
28
  const release = await getLatestRelease(token);
22
29
  const version = release.tag_name;
23
30
 
24
31
  // Find the ZIP asset
25
32
  const asset = release.assets.find((a) => a.name.endsWith('.zip'));
26
33
  if (!asset) {
27
- console.error('No ZIP asset found in the latest release.');
34
+ ui.error('No ZIP asset found in the latest release.');
28
35
  process.exit(1);
29
36
  }
30
37
 
31
- console.log(`Downloading ${asset.name} (${version})...`);
38
+ ui.step(`Downloading ${version}...`);
32
39
  const zipBuffer = await downloadReleaseAsset(asset, token);
33
40
 
34
41
  // Write ZIP to temp file and extract
@@ -36,7 +43,7 @@ async function run() {
36
43
  fs.writeFileSync(tmpZip, zipBuffer);
37
44
 
38
45
  try {
39
- console.log('Extracting template files...');
46
+ ui.step('Extracting template files...');
40
47
  execSync(`unzip -o "${tmpZip}" -d "${process.cwd()}"`, { stdio: 'pipe' });
41
48
  } finally {
42
49
  fs.unlinkSync(tmpZip);
@@ -48,8 +55,22 @@ async function run() {
48
55
  // Write version file
49
56
  writeLocalVersion(version);
50
57
 
51
- console.log(`\nAxiomatic ${version} installed.`);
52
- console.log('Run: claude, then /build');
58
+ // Count installed hooks
59
+ const hooksDir = path.join(process.cwd(), '.claude', 'hooks');
60
+ let hookCount = 0;
61
+ try {
62
+ hookCount = fs.readdirSync(hooksDir).filter((f) => f.endsWith('.js')).length;
63
+ } catch {}
64
+
65
+ console.log('');
66
+ ui.success(`${TEMPLATE_SKILLS.length} skills installed`);
67
+ ui.success(`${TEMPLATE_AGENTS.length} agents installed`);
68
+ ui.success(`${hookCount} hooks installed`);
69
+
70
+ ui.done(`Axiomatic ${version} installed.`);
71
+ ui.info('Next: claude');
72
+ ui.info('Then: /build <what you want to create>');
73
+ console.log('');
53
74
  }
54
75
 
55
76
  module.exports = run;
package/lib/ui.js ADDED
@@ -0,0 +1,53 @@
1
+ // Branding and UI helpers for the Axiomatic CLI.
2
+
3
+ const RESET = '\x1b[0m';
4
+ const BOLD = '\x1b[1m';
5
+ const DIM = '\x1b[2m';
6
+ const CYAN = '\x1b[36m';
7
+ const GREEN = '\x1b[32m';
8
+ const YELLOW = '\x1b[33m';
9
+ const RED = '\x1b[31m';
10
+ const WHITE = '\x1b[97m';
11
+ const MAGENTA = '\x1b[35m';
12
+
13
+ function banner(version) {
14
+ console.log('');
15
+ console.log(`${DIM} ╔═══════════════════════════════════════╗${RESET}`);
16
+ console.log(`${DIM} ║ ║${RESET}`);
17
+ console.log(`${DIM} ║${RESET} ${MAGENTA}${BOLD}◆${RESET} ${WHITE}${BOLD}A X I O M A T I C${RESET} ${DIM}║${RESET}`);
18
+ console.log(`${DIM} ║${RESET} ${DIM}AI-Powered Development${RESET} ${DIM}║${RESET}`);
19
+ console.log(`${DIM} ║ ║${RESET}`);
20
+ console.log(`${DIM} ╚═══════════════════════════════════════╝${RESET}`);
21
+ if (version) {
22
+ console.log(`${DIM} ${version}${RESET}`);
23
+ }
24
+ console.log('');
25
+ }
26
+
27
+ function step(msg) {
28
+ console.log(` ${DIM}...${RESET} ${msg}`);
29
+ }
30
+
31
+ function success(msg) {
32
+ console.log(` ${GREEN}✓${RESET} ${msg}`);
33
+ }
34
+
35
+ function warn(msg) {
36
+ console.log(` ${YELLOW}!${RESET} ${msg}`);
37
+ }
38
+
39
+ function error(msg) {
40
+ console.error(` ${RED}✗${RESET} ${msg}`);
41
+ }
42
+
43
+ function info(msg) {
44
+ console.log(` ${CYAN}i${RESET} ${msg}`);
45
+ }
46
+
47
+ function done(msg) {
48
+ console.log('');
49
+ console.log(` ${GREEN}${BOLD}${msg}${RESET}`);
50
+ console.log('');
51
+ }
52
+
53
+ module.exports = { banner, step, success, warn, error, info, done, BOLD, DIM, RESET, GREEN, YELLOW, CYAN, RED, WHITE, MAGENTA };
package/lib/update.js CHANGED
@@ -5,36 +5,42 @@ const { requireAuth } = require('./auth.js');
5
5
  const { getLatestRelease, downloadReleaseAsset } = require('./download.js');
6
6
  const { readLocalVersion, writeLocalVersion } = require('./version.js');
7
7
  const { isTemplatePath } = require('./manifest.js');
8
+ const ui = require('./ui.js');
8
9
 
9
10
  async function run() {
10
11
  const current = readLocalVersion();
11
12
  if (!current) {
12
- console.error('Not initialized. Run "axiomatic init" first.');
13
+ ui.banner();
14
+ ui.error('Not initialized. Run: axiomatic init');
15
+ console.log('');
13
16
  process.exit(1);
14
17
  }
15
18
 
16
- console.log('Authenticating with GitHub...');
19
+ ui.banner(current);
20
+
21
+ ui.step('Authenticating with GitHub...');
17
22
  const token = requireAuth();
18
23
 
19
- console.log('Fetching latest release...');
24
+ ui.step('Checking for updates...');
20
25
  const release = await getLatestRelease(token);
21
26
  const latest = release.tag_name;
22
27
 
23
28
  if (current === latest) {
24
- console.log(`Already up to date (${current}).`);
29
+ ui.success(`Already up to date (${current}).`);
30
+ console.log('');
25
31
  return;
26
32
  }
27
33
 
28
- console.log(`Updating ${current} -> ${latest}`);
34
+ ui.info(`${current} ${ui.DIM}->${ui.RESET} ${ui.BOLD}${latest}${ui.RESET}`);
29
35
 
30
36
  // Find the ZIP asset
31
37
  const asset = release.assets.find((a) => a.name.endsWith('.zip'));
32
38
  if (!asset) {
33
- console.error('No ZIP asset found in the latest release.');
39
+ ui.error('No ZIP asset found in the latest release.');
34
40
  process.exit(1);
35
41
  }
36
42
 
37
- console.log(`Downloading ${asset.name}...`);
43
+ ui.step(`Downloading ${latest}...`);
38
44
  const zipBuffer = await downloadReleaseAsset(asset, token);
39
45
 
40
46
  // Write ZIP to temp file
@@ -47,6 +53,8 @@ async function run() {
47
53
  fs.mkdirSync(tmpDir, { recursive: true });
48
54
  execSync(`unzip -o "${tmpZip}" -d "${tmpDir}"`, { stdio: 'pipe' });
49
55
 
56
+ ui.step('Updating template files...');
57
+
50
58
  // Copy only template files
51
59
  const updated = [];
52
60
  copyTemplateFiles(tmpDir, process.cwd(), '', updated);
@@ -54,14 +62,20 @@ async function run() {
54
62
  // Write version file
55
63
  writeLocalVersion(latest);
56
64
 
57
- console.log(`\nUpdated ${current} -> ${latest}`);
58
- if (updated.length > 0) {
59
- console.log(`\nUpdated files:`);
60
- for (const f of updated) {
61
- console.log(` ${f}`);
62
- }
63
- }
64
- console.log('\nRestart CLI to apply agent changes.');
65
+ console.log('');
66
+ const skills = updated.filter((f) => f.includes('/skills/')).length;
67
+ const agents = updated.filter((f) => f.includes('/agents/')).length;
68
+ const hooks = updated.filter((f) => f.includes('/hooks/')).length;
69
+ const other = updated.length - skills - agents - hooks;
70
+
71
+ if (skills) ui.success(`${skills} skills updated`);
72
+ if (agents) ui.success(`${agents} agents updated`);
73
+ if (hooks) ui.success(`${hooks} hooks updated`);
74
+ if (other) ui.success(`${other} other files updated`);
75
+
76
+ ui.done(`Updated to ${latest}.`);
77
+ ui.warn('Restart CLI to apply agent changes.');
78
+ console.log('');
65
79
  } finally {
66
80
  fs.unlinkSync(tmpZip);
67
81
  fs.rmSync(tmpDir, { recursive: true, force: true });
package/lib/version.js CHANGED
@@ -2,6 +2,7 @@ const fs = require('fs');
2
2
  const path = require('path');
3
3
  const { getGitHubToken } = require('./auth.js');
4
4
  const { getLatestRelease } = require('./download.js');
5
+ const ui = require('./ui.js');
5
6
 
6
7
  const VERSION_FILE = path.join(process.cwd(), '.claude', '.axiomatic-version');
7
8
 
@@ -20,36 +21,41 @@ function writeLocalVersion(version) {
20
21
  }
21
22
 
22
23
  async function run() {
23
- const cliVersion = require('../package.json').version;
24
24
  const local = readLocalVersion();
25
25
 
26
- console.log(`CLI: v${cliVersion}`);
26
+ ui.banner(local);
27
+
28
+ const cliVersion = require('../package.json').version;
29
+ ui.info(`CLI version: v${cliVersion}`);
27
30
 
28
31
  if (local) {
29
- console.log(`Local: ${local}`);
32
+ ui.info(`Installed: ${local}`);
30
33
  } else {
31
- console.log('Local: not installed (run "axiomatic init" first)');
34
+ ui.warn('Not installed. Run: axiomatic init');
32
35
  }
33
36
 
34
37
  const token = getGitHubToken();
35
38
  if (!token) {
36
- console.log('Latest: (authenticate with GitHub to check)');
39
+ ui.warn('Authenticate with GitHub to check for updates.');
40
+ console.log('');
37
41
  return;
38
42
  }
39
43
 
40
44
  try {
41
45
  const release = await getLatestRelease(token);
42
46
  const latest = release.tag_name;
43
- console.log(`Latest: ${latest}`);
47
+ ui.info(`Latest: ${latest}`);
44
48
 
49
+ console.log('');
45
50
  if (local && local === latest) {
46
- console.log('\nUp to date.');
51
+ ui.success('Up to date.');
47
52
  } else if (local) {
48
- console.log('\nUpdate available. Run: axiomatic update');
53
+ ui.warn(`Update available. Run: axiomatic update`);
49
54
  }
50
55
  } catch (err) {
51
- console.error(`\nCould not fetch latest release: ${err.message}`);
56
+ ui.error(`Could not fetch latest release: ${err.message}`);
52
57
  }
58
+ console.log('');
53
59
  }
54
60
 
55
61
  module.exports = run;
package/package.json CHANGED
@@ -1,13 +1,31 @@
1
1
  {
2
2
  "name": "@axiomatic-labs/cli",
3
- "version": "1.0.0",
4
- "description": "CLI for installing and updating Axiomatic project templates",
3
+ "version": "1.0.2",
4
+ "description": "AI-powered development toolkit for Claude Code. Skills, agents, hooks, and quality gates that ship production apps — not prototypes.",
5
5
  "bin": {
6
6
  "axiomatic": "./bin/cli.js"
7
7
  },
8
8
  "files": [
9
9
  "bin/",
10
- "lib/"
10
+ "lib/",
11
+ "README.md"
12
+ ],
13
+ "keywords": [
14
+ "claude",
15
+ "claude-code",
16
+ "ai",
17
+ "ai-agents",
18
+ "ai-coding",
19
+ "developer-tools",
20
+ "cli",
21
+ "scaffolding",
22
+ "code-quality",
23
+ "automation",
24
+ "skills",
25
+ "agents",
26
+ "anthropic",
27
+ "llm",
28
+ "devtools"
11
29
  ],
12
30
  "engines": {
13
31
  "node": ">=18"
@@ -16,6 +34,7 @@
16
34
  "type": "git",
17
35
  "url": "https://github.com/axiomatic-labs/axiomatic-cli.git"
18
36
  },
37
+ "homepage": "https://axiomatic.dev",
19
38
  "license": "UNLICENSED",
20
39
  "private": false
21
40
  }