delimit-cli 3.14.1 → 3.14.3

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 CHANGED
@@ -1,9 +1,9 @@
1
1
  # `</>` Delimit
2
2
 
3
- Unify Claude Code, Codex, Cursor, and Gemini CLI with persistent context, governance, and multi-model debate.
3
+ API governance that enforces itself. One workspace for Claude Code, Codex, Cursor, and Gemini CLI.
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/delimit-cli)](https://www.npmjs.com/package/delimit-cli)
6
- [![GitHub Action](https://img.shields.io/badge/GitHub%20Action-v1.6.0-blue)](https://github.com/marketplace/actions/delimit-api-governance)
6
+ [![GitHub Action](https://img.shields.io/badge/GitHub%20Action-v1.8.0-blue)](https://github.com/marketplace/actions/delimit-api-governance)
7
7
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
8
8
  [![Glama](https://glama.ai/mcp/servers/delimit-ai/delimit-mcp-server/badges/score.svg)](https://glama.ai/mcp/servers/delimit-ai/delimit-mcp-server)
9
9
  [![API Governance](https://delimit-ai.github.io/badge/pass.svg)](https://github.com/marketplace/actions/delimit-api-governance)
@@ -12,13 +12,35 @@ Unify Claude Code, Codex, Cursor, and Gemini CLI with persistent context, govern
12
12
  <img src="docs/demo.gif" alt="Delimit detecting breaking API changes" width="700">
13
13
  </p>
14
14
 
15
- Persistent ledger, API governance, security orchestration, and multi-model deliberation — all shared across Claude Code, Codex, Cursor, and Gemini CLI.
15
+ ---
16
+
17
+ ## Try it in 2 minutes
18
+
19
+ ```bash
20
+ npx delimit-cli demo # See governance in action — no setup needed
21
+ npx delimit-cli init # Set up governance for your project
22
+ npx delimit-cli setup # Configure your AI assistants
23
+ ```
24
+
25
+ No API keys. No account. No config files.
26
+
27
+ ---
28
+
29
+ ## What's New in v3.14
30
+
31
+ - **Evidence timeline + gate status dashboard** -- see every governance decision and when it happened
32
+ - **Multi-agent orchestration** -- track which AI assistant works on what, across models
33
+ - **Continuous drift monitoring** -- detect spec drift between deployments automatically
34
+ - **PR governance copilot** -- gate status posted directly in PR comments
35
+ - **Compliance templates** -- SOC2, PCI-DSS, and HIPAA presets out of the box
36
+ - **Beta capture in CLI** -- opt into early features from the command line
37
+ - **112+ MCP tools** -- governance, context, shipping, observability, and orchestration
16
38
 
17
39
  ---
18
40
 
19
41
  ## GitHub Action
20
42
 
21
- Zero-config auto-detects your OpenAPI spec:
43
+ Zero-config -- auto-detects your OpenAPI spec:
22
44
 
23
45
  ```yaml
24
46
  - uses: delimit-ai/delimit-action@v1
@@ -44,14 +66,9 @@ jobs:
44
66
  spec: api/openapi.yaml
45
67
  ```
46
68
 
47
- That's it. Delimit auto-fetches the base branch spec, diffs it, and posts a PR comment with:
48
-
49
- - Breaking changes with severity badges
50
- - Semver classification (major/minor/patch)
51
- - Step-by-step migration guide
52
- - Policy violations
69
+ That's it. Delimit auto-fetches the base branch spec, diffs it, and posts a PR comment with breaking changes, semver classification, migration guides, and governance gate results.
53
70
 
54
- [View on GitHub Marketplace](https://github.com/marketplace/actions/delimit-api-governance) · [See a live demo (23 breaking changes)](https://github.com/delimit-ai/delimit-action-demo/pull/2)
71
+ [View on GitHub Marketplace](https://github.com/marketplace/actions/delimit-api-governance) | [See a live demo (23 breaking changes)](https://github.com/delimit-ai/delimit-action-demo/pull/2)
55
72
 
56
73
  ### Example PR comment
57
74
 
@@ -60,34 +77,34 @@ That's it. Delimit auto-fetches the base branch spec, diffs it, and posts a PR c
60
77
  > | Change | Path | Severity |
61
78
  > |--------|------|----------|
62
79
  > | endpoint_removed | `DELETE /pets/{petId}` | error |
63
- > | type_changed | `/pets:GET:200[].id` (string integer) | warning |
80
+ > | type_changed | `/pets:GET:200[].id` (string -> integer) | warning |
64
81
  > | enum_value_removed | `/pets:GET:200[].status` | warning |
65
82
  >
66
- > **Semver**: MAJOR (1.0.0 2.0.0)
83
+ > **Semver**: MAJOR (1.0.0 -> 2.0.0)
67
84
  >
68
85
  > **Migration Guide**: 3 steps to update your integration
86
+ >
87
+ > ### Governance Gates
88
+ > | Gate | Status | Chain |
89
+ > |------|--------|-------|
90
+ > | API Lint | Pass/Fail | lint -> semver -> gov_evaluate |
91
+ > | Policy Compliance | Pass/Fail | policy -> evidence_collect |
92
+ > | Security Audit | Pass | security_audit -> evidence_collect |
93
+ > | Deploy Readiness | Ready/Blocked | deploy_plan -> security_audit |
69
94
 
70
95
  ---
71
96
 
72
- ## CLI + MCP Toolkit
73
-
74
- Governance tools for AI coding assistants (Claude Code, Codex, Cursor, Gemini CLI):
75
-
76
- ```bash
77
- npx delimit-cli setup
78
- ```
79
-
80
- No API keys. No account. Installs in 10 seconds.
81
-
82
- ### CLI commands (all free)
97
+ ## CLI commands
83
98
 
84
99
  ```bash
100
+ npx delimit-cli demo # Self-contained governance demo
101
+ npx delimit-cli init # Guided wizard with compliance templates
102
+ npx delimit-cli init --preset strict # Initialize with strict policy
85
103
  npx delimit-cli setup # Install into all AI assistants
86
104
  npx delimit-cli setup --dry-run # Preview changes first
87
105
  npx delimit-cli lint api/openapi.yaml # Check for breaking changes
88
106
  npx delimit-cli diff old.yaml new.yaml # Compare two specs
89
107
  npx delimit-cli explain old.yaml new.yaml # Generate migration guide
90
- npx delimit-cli init --preset strict # Initialize policies
91
108
  npx delimit-cli doctor # Check setup health
92
109
  npx delimit-cli uninstall --dry-run # Preview removal
93
110
  ```
@@ -194,6 +211,7 @@ rules:
194
211
  ## Links
195
212
 
196
213
  - [delimit.ai](https://delimit.ai) -- homepage
214
+ - [Dashboard](https://app.delimit.ai) -- governance console
197
215
  - [Docs](https://delimit.ai/docs) -- full documentation
198
216
  - [GitHub Action](https://github.com/marketplace/actions/delimit-api-governance) -- Marketplace listing
199
217
  - [Quickstart](https://github.com/delimit-ai/delimit-mcp-server) -- try it in 2 minutes
@@ -1332,7 +1332,29 @@ jobs:
1332
1332
  }
1333
1333
  console.log(` ${chalk.bold('delimit doctor')} — verify setup`);
1334
1334
  console.log(` ${chalk.bold('delimit explain')} — human-readable report`);
1335
- console.log('');
1335
+
1336
+ // Beta capture after init (LED-263)
1337
+ if (!options.yes) {
1338
+ try {
1339
+ const betaAns = await inquirer.prompt([{
1340
+ type: 'input',
1341
+ name: 'email',
1342
+ message: chalk.blue(' Join the beta? Enter your email (or press Enter to skip):'),
1343
+ }]);
1344
+ if (betaAns.email && betaAns.email.includes('@')) {
1345
+ try {
1346
+ await axios.post('https://delimit.ai/api/subscribe', { email: betaAns.email, source: 'cli-init' });
1347
+ console.log(chalk.green(' Thanks! You\'re on the list.\n'));
1348
+ } catch {
1349
+ console.log(chalk.green(' Thanks! Visit https://delimit.ai to stay updated.\n'));
1350
+ }
1351
+ } else {
1352
+ console.log('');
1353
+ }
1354
+ } catch {}
1355
+ } else {
1356
+ console.log('');
1357
+ }
1336
1358
  });
1337
1359
 
1338
1360
  // Demo command — prove governance value in 5 minutes (LED-262)
@@ -1495,10 +1517,184 @@ program
1495
1517
  console.log(` ${chalk.green('npx delimit-cli lint')} — lint your API spec`);
1496
1518
  console.log(` ${chalk.green('npx delimit-cli setup')} — configure AI assistants\n`);
1497
1519
 
1520
+ // Beta capture (LED-263)
1521
+ try {
1522
+ const betaAns = await inquirer.prompt([{
1523
+ type: 'input',
1524
+ name: 'email',
1525
+ message: chalk.blue('Join the beta? Enter your email (or press Enter to skip):'),
1526
+ }]);
1527
+ if (betaAns.email && betaAns.email.includes('@')) {
1528
+ try {
1529
+ await axios.post('https://delimit.ai/api/subscribe', { email: betaAns.email, source: 'cli-demo' });
1530
+ console.log(chalk.green('\n Thanks! You\'re on the list. We\'ll keep you in the loop.\n'));
1531
+ } catch {
1532
+ console.log(chalk.green('\n Thanks! Visit https://delimit.ai to stay updated.\n'));
1533
+ }
1534
+ }
1535
+ } catch {}
1536
+
1498
1537
  // Cleanup
1499
1538
  try { fs.rmSync(tmpDir, { recursive: true }); } catch {}
1500
1539
  });
1501
1540
 
1541
+ // Try command — zero-risk demo with Markdown report artifact (LED-264)
1542
+ program
1543
+ .command('try')
1544
+ .description('Run a zero-risk governance demo and save a Markdown report')
1545
+ .action(async () => {
1546
+ const tmpDir = path.join(os.tmpdir(), `delimit-try-${Date.now()}`);
1547
+ fs.mkdirSync(tmpDir, { recursive: true });
1548
+
1549
+ console.log(chalk.bold('\n Delimit — Try It\n'));
1550
+ console.log(chalk.gray(' Safe mode: runs in a temp directory, nothing touches your project.\n'));
1551
+
1552
+ // Create sample specs (same as demo)
1553
+ const baseSpec = {
1554
+ openapi: '3.0.3',
1555
+ info: { title: 'Pet Store API', version: '1.0.0' },
1556
+ paths: {
1557
+ '/pets': {
1558
+ get: { summary: 'List all pets', parameters: [{ name: 'limit', in: 'query', required: false, schema: { type: 'integer' } }], responses: { '200': { description: 'A list of pets' } } },
1559
+ post: { summary: 'Create a pet', responses: { '201': { description: 'Pet created' } } },
1560
+ },
1561
+ '/pets/{petId}': {
1562
+ get: { summary: 'Get a pet by ID', parameters: [{ name: 'petId', in: 'path', required: true, schema: { type: 'string' } }], responses: { '200': { description: 'A pet' } } },
1563
+ },
1564
+ },
1565
+ components: { schemas: { Pet: { type: 'object', required: ['id', 'name'], properties: { id: { type: 'integer' }, name: { type: 'string' }, tag: { type: 'string' } } } } },
1566
+ };
1567
+
1568
+ const changedSpec = JSON.parse(JSON.stringify(baseSpec));
1569
+ changedSpec.info.version = '2.0.0';
1570
+ delete changedSpec.paths['/pets/{petId}'];
1571
+ changedSpec.paths['/pets'].get.parameters.push({ name: 'owner_id', in: 'query', required: true, schema: { type: 'string' } });
1572
+ delete changedSpec.components.schemas.Pet.properties.tag;
1573
+ changedSpec.paths['/pets/search'] = { get: { summary: 'Search pets', responses: { '200': { description: 'Search results' } } } };
1574
+
1575
+ const basePath = path.join(tmpDir, 'openapi-v1.yaml');
1576
+ const changedPath = path.join(tmpDir, 'openapi-v2.yaml');
1577
+ fs.writeFileSync(basePath, yaml.dump(baseSpec));
1578
+ fs.writeFileSync(changedPath, yaml.dump(changedSpec));
1579
+
1580
+ console.log(chalk.gray(' Running governance pipeline...\n'));
1581
+
1582
+ // Run lint
1583
+ let report = [];
1584
+ let violations = [];
1585
+ let semverBump = 'MAJOR';
1586
+ try {
1587
+ const result = apiEngine.lint(basePath, changedPath, { policy: 'strict' });
1588
+ if (result) {
1589
+ violations = result.violations || [];
1590
+ const s = result.summary || {};
1591
+ const breaking = s.breaking || s.breaking_changes || 0;
1592
+ const total = s.total || s.total_changes || 0;
1593
+ semverBump = result.semver?.bump?.toUpperCase() || 'MAJOR';
1594
+
1595
+ report.push('# Delimit Governance Report');
1596
+ report.push('');
1597
+ report.push(`**Generated**: ${new Date().toISOString().slice(0, 19).replace('T', ' ')} UTC`);
1598
+ report.push(`**API**: Pet Store API`);
1599
+ report.push(`**Changes**: ${total} total (${breaking} breaking)`);
1600
+ report.push(`**Semver**: ${semverBump}`);
1601
+ report.push('');
1602
+ report.push('## Governance Gates');
1603
+ report.push('');
1604
+ report.push('| Gate | Status | Enforcement Chain |');
1605
+ report.push('|------|--------|-------------------|');
1606
+ report.push(`| API Lint | ${breaking > 0 ? 'FAIL' : 'PASS'} | lint → semver → gov_evaluate |`);
1607
+ report.push(`| Policy Compliance | ${violations.length > 0 ? 'FAIL (' + violations.length + ')' : 'PASS'} | policy → evidence_collect |`);
1608
+ report.push('| Security Audit | PASS | security_audit → evidence_collect |');
1609
+ report.push(`| Deploy Readiness | ${breaking > 0 ? 'BLOCKED' : 'READY'} | deploy_plan → security_audit |`);
1610
+ report.push('');
1611
+
1612
+ if (violations.length > 0) {
1613
+ report.push('## Violations');
1614
+ report.push('');
1615
+ report.push('| Severity | Change | Location |');
1616
+ report.push('|----------|--------|----------|');
1617
+ violations.forEach(v => {
1618
+ report.push(`| ${v.severity === 'error' ? 'BLOCK' : 'WARN'} | ${v.message} | \`${v.path || ''}\` |`);
1619
+ });
1620
+ report.push('');
1621
+ }
1622
+
1623
+ report.push('## What Delimit Does');
1624
+ report.push('');
1625
+ report.push('1. Detects breaking changes automatically (27 types)');
1626
+ report.push('2. Evaluates against your policy (strict/default/relaxed)');
1627
+ report.push('3. Blocks deploys via governance gates');
1628
+ report.push('4. Records evidence for audit trail');
1629
+ report.push('5. Posts remediation guide on PRs');
1630
+ report.push('6. Tracks in ledger for cross-model continuity');
1631
+ report.push('');
1632
+ report.push('## Get Started');
1633
+ report.push('');
1634
+ report.push('```bash');
1635
+ report.push('npx delimit-cli init # Set up governance');
1636
+ report.push('npx delimit-cli setup # Configure AI assistants');
1637
+ report.push('```');
1638
+ report.push('');
1639
+ report.push('---');
1640
+ report.push('[delimit.ai](https://delimit.ai) | [Dashboard](https://app.delimit.ai) | [GitHub](https://github.com/delimit-ai/delimit-mcp-server)');
1641
+ }
1642
+ } catch (err) {
1643
+ report.push('# Delimit Governance Report');
1644
+ report.push('');
1645
+ report.push(`Error: ${err.message}`);
1646
+ }
1647
+
1648
+ // Save report to user's current directory
1649
+ const reportPath = path.join(process.cwd(), 'delimit-report.md');
1650
+ const reportContent = report.join('\n');
1651
+ fs.writeFileSync(reportPath, reportContent);
1652
+
1653
+ // Show summary in terminal
1654
+ const breakingCount = violations.filter(v => v.severity === 'error').length;
1655
+ if (breakingCount > 0) {
1656
+ console.log(chalk.red.bold(` BLOCKED — ${breakingCount} breaking change(s) detected`));
1657
+ }
1658
+ violations.forEach(v => {
1659
+ const icon = v.severity === 'error' ? chalk.red(' BLOCK') : chalk.yellow(' WARN ');
1660
+ console.log(` ${icon} ${v.message}`);
1661
+ });
1662
+ console.log('');
1663
+ console.log(chalk.bold(' Governance Gates:'));
1664
+ console.log(` ${breakingCount > 0 ? chalk.red('X') : chalk.green('+')} API Lint ${chalk.gray('→ semver → gov_evaluate')}`);
1665
+ console.log(` ${violations.length > 0 ? chalk.red('X') : chalk.green('+')} Policy Compliance ${chalk.gray('→ evidence_collect')}`);
1666
+ console.log(` ${chalk.green('+')} Security Audit ${chalk.gray('→ evidence_collect → notify')}`);
1667
+ console.log(` ${breakingCount > 0 ? chalk.red('X') : chalk.green('+')} Deploy Readiness ${chalk.gray('→ deploy_plan → security_audit')}`);
1668
+ console.log('');
1669
+ console.log(chalk.green.bold(` Report saved to: ${reportPath}`));
1670
+ console.log(chalk.gray(' Open it to see the full governance analysis.\n'));
1671
+
1672
+ console.log(chalk.bold(' Next:'));
1673
+ console.log(` ${chalk.green('npx delimit-cli init')} — set up governance in your project`);
1674
+ console.log(` ${chalk.green('npx delimit-cli setup')} — configure AI assistants`);
1675
+ console.log(chalk.gray(` rm delimit-report.md — clean up this report\n`));
1676
+
1677
+ // Beta capture
1678
+ try {
1679
+ const betaAns = await inquirer.prompt([{
1680
+ type: 'input',
1681
+ name: 'email',
1682
+ message: chalk.blue('Join the beta? Enter your email (or press Enter to skip):'),
1683
+ }]);
1684
+ if (betaAns.email && betaAns.email.includes('@')) {
1685
+ try {
1686
+ await axios.post('https://delimit.ai/api/subscribe', { email: betaAns.email, source: 'cli-try' });
1687
+ console.log(chalk.green('\n Thanks! You\'re on the list.\n'));
1688
+ } catch {
1689
+ console.log(chalk.green('\n Thanks! Visit https://delimit.ai\n'));
1690
+ }
1691
+ }
1692
+ } catch {}
1693
+
1694
+ // Cleanup temp
1695
+ try { fs.rmSync(tmpDir, { recursive: true }); } catch {}
1696
+ });
1697
+
1502
1698
  // Doctor command — verify setup is correct
1503
1699
  program
1504
1700
  .command('doctor')
@@ -1592,11 +1788,46 @@ program
1592
1788
  warn++;
1593
1789
  }
1594
1790
 
1791
+ // Preview what init would create (LED-265)
1792
+ const delimitDir = path.join(process.cwd(), '.delimit');
1793
+ const hasDelimitDir = fs.existsSync(delimitDir);
1794
+ console.log(chalk.bold('\n Init Preview:'));
1795
+ if (hasDelimitDir) {
1796
+ const files = [];
1797
+ try {
1798
+ const walk = (dir, prefix) => {
1799
+ for (const f of fs.readdirSync(dir)) {
1800
+ const full = path.join(dir, f);
1801
+ const rel = prefix ? `${prefix}/${f}` : f;
1802
+ if (fs.statSync(full).isDirectory()) walk(full, rel);
1803
+ else files.push(rel);
1804
+ }
1805
+ };
1806
+ walk(delimitDir, '.delimit');
1807
+ } catch {}
1808
+ console.log(chalk.green(` Already initialized — ${files.length} file(s) in .delimit/`));
1809
+ files.slice(0, 8).forEach(f => console.log(chalk.gray(` ${f}`)));
1810
+ if (files.length > 8) console.log(chalk.gray(` ... and ${files.length - 8} more`));
1811
+ } else {
1812
+ console.log(chalk.gray(' Running delimit init would create:'));
1813
+ console.log(chalk.gray(' .delimit/policies.yml — governance policy rules'));
1814
+ console.log(chalk.gray(' .delimit/evidence/ — audit trail events'));
1815
+ console.log(chalk.gray(' .delimit/compliance.json — if compliance template selected'));
1816
+ if (fs.existsSync(path.join(process.cwd(), '.github'))) {
1817
+ console.log(chalk.gray(' .github/workflows/api-governance.yml'));
1818
+ console.log(chalk.gray(' .github/workflows/api-drift-monitor.yml'));
1819
+ }
1820
+ }
1821
+
1822
+ // Undo instruction (LED-265)
1823
+ console.log(chalk.bold('\n Undo:'));
1824
+ console.log(chalk.gray(' rm -rf .delimit — remove all Delimit files'));
1825
+ console.log(chalk.gray(' delimit uninstall --dry-run — preview MCP removal\n'));
1826
+
1595
1827
  // Summary
1596
1828
  console.log('');
1597
1829
  if (fail === 0 && warn === 0) {
1598
1830
  console.log(chalk.green.bold(' All checks passed! Ready to lint.\n'));
1599
- console.log('Keep Building.\n');
1600
1831
  } else if (fail === 0) {
1601
1832
  console.log(chalk.yellow.bold(` ${ok} passed, ${warn} warning(s). Setup looks good.\n`));
1602
1833
  } else {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "delimit-cli",
3
3
  "mcpName": "io.github.delimit-ai/delimit-mcp-server",
4
- "version": "3.14.1",
4
+ "version": "3.14.3",
5
5
  "description": "Unify Claude Code, Codex, Cursor, and Gemini CLI with persistent context, governance, and multi-model debate.",
6
6
  "main": "index.js",
7
7
  "files": [
@@ -21,7 +21,7 @@
21
21
  },
22
22
  "scripts": {
23
23
  "postinstall": "node scripts/postinstall.js",
24
- "test": "node --test tests/setup-onboarding.test.js tests/setup-matrix.test.js tests/config-export-import.test.js tests/cross-model-hooks.test.js"
24
+ "test": "node --test tests/setup-onboarding.test.js tests/setup-matrix.test.js tests/config-export-import.test.js tests/cross-model-hooks.test.js tests/golden-path.test.js"
25
25
  },
26
26
  "keywords": [
27
27
  "openapi",