From 41a25b0419208d9a971b6b92c7a09fb17a0bc4b8 Mon Sep 17 00:00:00 2001
From: Kabi <48044253+Kabi10@users.noreply.github.com>
Date: Sat, 27 Jun 2026 07:06:59 +0000
Subject: [PATCH 1/3] feat: add portable AGENTS.md output (--agents, --all) +
non-interactive --yes
- compose.js: buildAgentsBlock/writeRulesAgentsMd emit AGENTS.md as plain
markdown (Cursor, Copilot, Codex, Claude Code) with a single H1; module
headings demoted to ##. Managed-block markers preserve hand-edited content
on regeneration; foreign files are appended to, not clobbered.
- cli.js: --agents, --all, --yes/-y, -h/--help, mutual-exclusion check, and an
always-on token size warning (>~2000 tokens).
- tests/agents.test.js: create / regen-preserves-user-content / foreign-file /
plain-markdown (no globs/alwaysApply) coverage.
- package.json: fix test glob to tests/*.test.js (CI needs no bash globstar),
bump to 1.2.0, broaden description + keywords (agents-md, claude, copilot...).
- CI: GitHub Actions test matrix (Node 18/20/22) + non-interactive smoke test.
---
.github/workflows/ci.yml | 47 ++++++++++++
README.md | 129 ++++++++++++++++++++++++-------
package.json | 16 +++-
src/cli.js | 160 ++++++++++++++++++++++++++++++++++-----
src/compose.js | 86 +++++++++++++++++++++
tests/agents.test.js | 109 ++++++++++++++++++++++++++
6 files changed, 497 insertions(+), 50 deletions(-)
create mode 100644 .github/workflows/ci.yml
create mode 100644 tests/agents.test.js
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..b321777
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,47 @@
+name: CI
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+
+jobs:
+ test:
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ node-version: [18, 20, 22]
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ matrix.node-version }}
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Run tests
+ run: npm test
+
+ smoke:
+ # Proves the headline claim — the CLI runs non-interactively and writes files.
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ - run: npm install
+ - name: Smoke test the CLI in a sample project
+ run: |
+ mkdir -p /tmp/sample && cd /tmp/sample
+ echo '{"dependencies":{"next":"14.0.0","typescript":"5.0.0"}}' > package.json
+ node "$GITHUB_WORKSPACE/src/cli.js" --all --yes
+ test -f .cursor/rules/030-nextjs.mdc && echo "✅ .mdc generated" || (echo "❌ no .mdc" && exit 1)
+ test -f AGENTS.md && echo "✅ AGENTS.md generated" || (echo "❌ no AGENTS.md" && exit 1)
+ grep -q "cursor-compose:start" AGENTS.md && echo "✅ managed markers present" || (echo "❌ no markers" && exit 1)
+ ! grep -q "alwaysApply:" AGENTS.md && echo "✅ AGENTS.md is plain markdown" || (echo "❌ frontmatter leaked into AGENTS.md" && exit 1)
diff --git a/README.md b/README.md
index c9174ae..c147e21 100644
--- a/README.md
+++ b/README.md
@@ -1,54 +1,127 @@
+
+
# cursor-compose
-Auto-detect your project's stack and generate Cursor project rules in one command. No cloning required.
+**Stop hand-writing AI coding rules. Detect your stack, generate them — for every tool.**
+
+One command scans your project, detects your frameworks, and writes a tailored rules file. Output a portable **`AGENTS.md`** (read by Cursor, Copilot, Codex & Claude Code) or Cursor's native `.cursor/rules/*.mdc` — from one source.
+
+[](https://www.npmjs.com/package/cursor-compose)
+[](https://github.com/Kabi10/cursor-rules/actions/workflows/ci.yml)
+[](https://nodejs.org)
+[](LICENSE)
+
+
+
+```bash
+npx cursor-compose --agents # → AGENTS.md, works across every major AI editor
+```
+
+
+
+
+---
+
+## Why
+
+Everyone is pasting the same recycled rules files between projects. They go stale, they don't match your actual stack, and every editor wants its own format.
+
+`cursor-compose` reads your **real dependencies** (`package.json`, `requirements.txt`, `pubspec.yaml`) and composes a rules file from modular, stack-specific building blocks — and writes it as the portable **`AGENTS.md`** standard so the same source works in Cursor, Copilot, Codex and Claude Code. Zero config to start.
+
+## Usage
```bash
-npx cursor-compose
+# In your project root:
+npx cursor-compose # default → per-module .cursor/rules/*.mdc
+npx cursor-compose --agents # → AGENTS.md (portable, cross-tool)
+npx cursor-compose --all # → both .mdc and AGENTS.md, one pass
```
-Writes `.cursor/rules/project.mdc` — the current Cursor format. Legacy `.cursorrules` also supported.
+It will:
+1. **Scan** your project for dependency files.
+2. **Show** the modules it detected and let you toggle optional ones.
+3. **Write** your chosen output(s).
-## What it does
+No install, no config file required.
-1. Scans your project for `package.json`, `requirements.txt`, `pubspec.yaml`, etc.
-2. Shows which modules were detected, lets you toggle extras
-3. Writes a composed `.cursor/rules/project.mdc` to your project root
+### Flags
-## Detected stacks
+| Flag | Output |
+|---|---|
+| _(default)_ | per-module `.cursor/rules/*.mdc` (current Cursor format) |
+| `--agents` | `AGENTS.md` at repo root — portable across Cursor, Copilot, Codex, Claude Code |
+| `--all` | both `.mdc` and `AGENTS.md` in one pass |
+| `--legacy` | a single `.cursorrules` file |
+| `--yes`, `-y` | non-interactive: use detected modules, no prompts (great for CI/scripts) |
+| `-h`, `--help` | show help |
-| File found | Modules added |
-|-----------|--------------|
-| `next` in package.json | `nextjs` + `typescript` |
-| `typescript` in package.json | `typescript` |
-| `@supabase/supabase-js` | `supabase` |
-| `drizzle-orm` | `drizzle` |
-| `shadcn` / `@radix-ui` | `shadcn` |
-| `fastapi` in requirements.txt | `fastapi` |
-| `flutter:` in pubspec.yaml | `flutter` |
+### AGENTS.md is safe to hand-edit
-`core` is always included.
+The generated content lives between managed markers:
+
+```markdown
+
+# AGENTS.md
+...generated from your stack...
+
+
+## Your own notes (preserved on regenerate)
+```
+
+Re-running `--agents` only replaces the managed block — anything you add outside it is kept.
+
+## What it detects
+
+| Auto-detected | From |
+|---|---|
+| Next.js + TypeScript | `package.json` |
+| Supabase | `package.json` |
+| Drizzle ORM | `package.json` |
+| shadcn / Radix UI | `package.json` |
+| FastAPI | `requirements.txt` |
+| Flutter | `pubspec.yaml` |
+
+Core conventions always load by default.
## Optional modules
-Select these manually during init:
+Toggle these on during the interactive prompt:
-- `saas` — multi-tenancy, billing, feature flags
-- `ecommerce` — cart, checkout, inventory, payments
-- `claude-code` — CLAUDE.md conventions, memory system
-- `agentic` — agent loop patterns, tool use safety
+- **`saas`** — multi-tenancy, billing, auth patterns
+- **`ecommerce`** — cart, checkout, payment flows
+- **`claude-code`** — `CLAUDE.md` / documentation conventions
+- **`agentic`** — agent & tool-calling patterns
## Requirements
-Node.js 18+
+- Node.js 18+
+
+## Roadmap
+
+- [ ] **`cursor-compose check`** — CI command that fails the build when your committed rules drift from your actual dependencies.
+- [ ] More stacks (Django, Rails, SvelteKit, Expo).
-## Modular builder (advanced)
+Want a stack supported? [Open an issue](https://github.com/Kabi10/cursor-rules/issues) or send a PR — adding a module is just a markdown file (see [CONTRIBUTING.md](CONTRIBUTING.md)).
-If you prefer to compose rules with a script instead of `npx`, the original
-`build-rules.ps1` (Windows) and `build-rules.sh` (Unix) are still available after cloning.
+## How it works
+
+```
+src/
+ cli.js # interactive prompt + orchestration + flags
+ detect.js # reads dependency files → detected modules
+ compose.js # assembles selected modules; writes .mdc / .cursorrules / AGENTS.md
+ frontmatter.js # Cursor .mdc YAML frontmatter (not used for AGENTS.md)
+modules/ # one .md per framework — the rule building blocks
+patterns/ # reusable code-organization patterns
+```
## Contributing
-See [CONTRIBUTING.md](CONTRIBUTING.md). Adding a new module is just adding a `.md` file to `modules/`.
+New modules are welcome and easy — drop a markdown file in `modules/`. See [CONTRIBUTING.md](CONTRIBUTING.md).
## License
diff --git a/package.json b/package.json
index b690c93..f8cd640 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "cursor-compose",
- "version": "1.1.0",
- "description": "Auto-detect your stack and generate Cursor project rules (.cursor/rules/project.mdc). npx cursor-compose",
+ "version": "1.2.0",
+ "description": "Auto-detect your stack and generate AI editor rules — AGENTS.md (Cursor, Copilot, Codex, Claude Code) or Cursor .mdc. npx cursor-compose",
"type": "module",
"bin": {
"cursor-compose": "src/cli.js"
@@ -11,7 +11,7 @@
"modules/"
],
"scripts": {
- "test": "node --test tests/**/*.test.js"
+ "test": "node --test tests/*.test.js"
},
"dependencies": {
"kleur": "^4.1.5",
@@ -24,8 +24,16 @@
"cursor",
"cursorrules",
"cursor-ai",
+ "agents-md",
+ "agents.md",
+ "ai",
+ "llm",
+ "claude",
+ "copilot",
+ "codex",
"developer-tools",
- "cli"
+ "cli",
+ "npx"
],
"license": "MIT",
"homepage": "https://github.com/Kabi10/cursor-rules",
diff --git a/src/cli.js b/src/cli.js
index 1de034b..378cde0 100644
--- a/src/cli.js
+++ b/src/cli.js
@@ -1,10 +1,17 @@
#!/usr/bin/env node
import prompts from 'prompts';
import kleur from 'kleur';
-import { existsSync, readdirSync } from 'fs';
+import { existsSync, readdirSync, readFileSync } from 'fs';
import { join } from 'path';
import { detectModules } from './detect.js';
-import { writeRulesMdc, writeRulesLegacy, estimateTokens, composeModules } from './compose.js';
+import {
+ writeRulesMdc,
+ writeRulesLegacy,
+ writeRulesAgentsMd,
+ estimateTokens,
+ composeModules,
+ AGENTS_START,
+} from './compose.js';
const ALL_MODULES = [
'core',
@@ -21,6 +28,26 @@ const ALL_MODULES = [
'agentic',
];
+// Warn when an always-on AGENTS.md gets large enough to eat real context.
+const TOKEN_WARN_THRESHOLD = 2000;
+
+const HELP = `
+${kleur.bold('cursor-compose')} — detect your stack and generate AI editor rules
+
+${kleur.bold('Usage:')} cursor-compose [options]
+
+${kleur.bold('Options:')}
+ ${kleur.cyan('(default)')} write per-module .mdc files to .cursor/rules/
+ ${kleur.cyan('--agents')} write AGENTS.md (portable: Cursor, Copilot, Codex, Claude Code)
+ ${kleur.cyan('--all')} write both .cursor/rules/*.mdc and AGENTS.md
+ ${kleur.cyan('--legacy')} write a single .cursorrules file
+ ${kleur.cyan('--yes, -y')} non-interactive: use detected modules, update/overwrite without prompts
+ ${kleur.cyan('-h, --help')} show this help
+
+AGENTS.md is written between managed markers; anything you add outside them is
+preserved when you regenerate.
+`;
+
// Exit cleanly on Ctrl+C
process.on('SIGINT', () => {
console.log(kleur.yellow('\nCancelled.'));
@@ -28,6 +55,13 @@ process.on('SIGINT', () => {
});
async function main() {
+ const argv = process.argv.slice(2);
+
+ if (argv.includes('-h') || argv.includes('--help')) {
+ console.log(HELP);
+ process.exit(0);
+ }
+
// Node version check
const [major] = process.versions.node.split('.').map(Number);
if (major < 18) {
@@ -37,8 +71,16 @@ async function main() {
process.exit(1);
}
- // --legacy flag
- const isLegacy = process.argv.includes('--legacy');
+ // Output mode flags ({--agents, --legacy, --all} are mutually exclusive).
+ const isAgents = argv.includes('--agents');
+ const isLegacy = argv.includes('--legacy');
+ const isAll = argv.includes('--all');
+ const isYes = argv.includes('--yes') || argv.includes('-y');
+
+ if ([isAgents, isLegacy, isAll].filter(Boolean).length > 1) {
+ console.error(kleur.red('Choose only one of --agents / --legacy / --all.'));
+ process.exit(1);
+ }
console.log(kleur.bold('\ncursor-compose\n'));
@@ -50,26 +92,44 @@ async function main() {
console.log(kleur.dim('No stack detected — select modules manually.\n'));
}
- // Module selection
- const { selected } = await prompts({
- type: 'multiselect',
- name: 'selected',
- message: 'Select modules (space to toggle, enter to confirm):',
- choices: ALL_MODULES.map((m) => ({
- title: m,
- value: m,
- selected: detected.includes(m),
- })),
- min: 1,
- });
+ // Module selection (skipped in non-interactive mode).
+ let selected;
+ if (isYes) {
+ selected = detected.length > 0 ? detected : ['core'];
+ console.log(kleur.dim('Non-interactive: using ') + selected.join(', ') + '\n');
+ } else {
+ ({ selected } = await prompts({
+ type: 'multiselect',
+ name: 'selected',
+ message: 'Select modules (space to toggle, enter to confirm):',
+ choices: ALL_MODULES.map((m) => ({
+ title: m,
+ value: m,
+ selected: detected.includes(m),
+ })),
+ min: 1,
+ }));
+ }
if (!selected || selected.length === 0) {
console.log(kleur.yellow('No modules selected. Exiting.'));
process.exit(0);
}
+ // Reports estimated tokens for an always-on file and warns when it's large.
+ const reportTokens = () => {
+ const tokens = estimateTokens(composeModules(selected));
+ if (tokens > TOKEN_WARN_THRESHOLD) {
+ console.log(
+ kleur.yellow(`\n⚠ AGENTS.md is ~${tokens} tokens (${selected.length} modules).`) +
+ kleur.dim(' Consider fewer modules to save context.')
+ );
+ }
+ return tokens;
+ };
+
+ // --legacy: single .cursorrules file
if (isLegacy) {
- // Legacy: single .cursorrules file
const outFile = '.cursorrules';
if (existsSync(outFile)) {
const { action } = await prompts({
@@ -94,7 +154,35 @@ async function main() {
return;
}
- // Modern: one .mdc per module in .cursor/rules/
+ // --agents: portable AGENTS.md (managed block)
+ if (isAgents) {
+ const tokens = reportTokens();
+ const onForeignFile = await resolveForeignDecision(isYes);
+ const result = writeRulesAgentsMd(selected, process.cwd(), { onForeignFile });
+ if (result.action === 'cancelled') {
+ console.log(kleur.yellow('Cancelled.'));
+ process.exit(0);
+ }
+ console.log('\n' + kleur.green('Done! ') + `${actionVerb(result.action)} ${kleur.bold('AGENTS.md')} (~${tokens} tokens)`);
+ console.log(kleur.dim('Works with Cursor, Copilot, Codex & Claude Code.\n'));
+ return;
+ }
+
+ // --all: per-module .mdc AND AGENTS.md in one pass
+ if (isAll) {
+ const written = writeRulesMdc(selected);
+ const tokens = reportTokens();
+ const onForeignFile = await resolveForeignDecision(isYes);
+ const result = writeRulesAgentsMd(selected, process.cwd(), { onForeignFile });
+ console.log('\n' + kleur.green('Done! ') + `Wrote ${written.length} rule file(s) to ${kleur.bold('.cursor/rules/')}`);
+ if (result.action !== 'cancelled') {
+ console.log(kleur.green(' ') + `${actionVerb(result.action)} ${kleur.bold('AGENTS.md')} (~${tokens} tokens)`);
+ }
+ console.log(kleur.dim('Restart Cursor to apply.\n'));
+ return;
+ }
+
+ // Default: one .mdc per module in .cursor/rules/
const rulesDir = join(process.cwd(), '.cursor', 'rules');
const existingMdc = existsSync(rulesDir)
? readdirSync(rulesDir).filter(f => f.endsWith('.mdc'))
@@ -124,6 +212,42 @@ async function main() {
console.log(kleur.dim('\nRestart Cursor to apply.\n'));
}
+/**
+ * Resolves how to handle an existing AGENTS.md, returning a sync callback for
+ * writeRulesAgentsMd. Only a foreign file (exists, no managed markers) prompts;
+ * a missing file or one with markers is handled non-destructively by the writer.
+ */
+async function resolveForeignDecision(isYes) {
+ const p = join(process.cwd(), 'AGENTS.md');
+ if (!existsSync(p)) return () => 'append';
+ if (readFileSync(p, 'utf8').includes(AGENTS_START)) return () => 'append';
+ if (isYes) return () => 'append';
+
+ const { action } = await prompts({
+ type: 'select',
+ name: 'action',
+ message: `${kleur.yellow('AGENTS.md')} exists without cursor-compose markers:`,
+ choices: [
+ { title: 'Append a managed block (keep existing content)', value: 'append' },
+ { title: 'Overwrite the whole file', value: 'overwrite' },
+ { title: 'Cancel', value: 'cancel' },
+ ],
+ initial: 0,
+ });
+ const decision = action || 'cancel';
+ return () => decision;
+}
+
+function actionVerb(action) {
+ switch (action) {
+ case 'created': return 'Created';
+ case 'updated': return 'Updated';
+ case 'appended': return 'Appended managed block to';
+ case 'overwritten': return 'Overwrote';
+ default: return 'Wrote';
+ }
+}
+
main().catch((err) => {
console.error(kleur.red('Error: ') + err.message);
process.exit(1);
diff --git a/src/compose.js b/src/compose.js
index 7e0f0cb..8a240ea 100644
--- a/src/compose.js
+++ b/src/compose.js
@@ -6,6 +6,11 @@ import { FRONTMATTER, buildFrontmatter } from './frontmatter.js';
const __dirname = dirname(fileURLToPath(import.meta.url));
const MODULES_DIR = join(__dirname, '..', 'modules');
+// Markers delimiting cursor-compose's managed region inside AGENTS.md.
+// Content outside these markers is preserved across regenerations.
+export const AGENTS_START = '';
+export const AGENTS_END = '';
+
/**
* Loads selected module .md files and concatenates them (legacy single-file mode).
*
@@ -84,6 +89,87 @@ export function writeRulesLegacy(moduleIds, cwd = process.cwd()) {
return outPath;
}
+/**
+ * Builds the managed AGENTS.md block for the selected modules.
+ *
+ * AGENTS.md is the portable, cross-tool standard (Cursor, Copilot, Codex,
+ * Claude Code), so this is plain markdown — NOT the Cursor-specific .mdc
+ * frontmatter. Each module's top-level `# Heading` is demoted to `## Heading`
+ * so the composed file keeps a single H1.
+ *
+ * @param {string[]} moduleIds
+ * @returns {string} the managed block, wrapped in start/end markers
+ */
+export function buildAgentsBlock(moduleIds) {
+ const sections = moduleIds.map((id) => {
+ const modPath = join(MODULES_DIR, `${id}.md`);
+ if (!existsSync(modPath)) {
+ console.warn(`Warning: module "${id}" not found, skipping`);
+ return null;
+ }
+ const content = readFileSync(modPath, 'utf8').trim();
+ // Demote module headings so AGENTS.md has a single top-level H1.
+ return content.replace(/^# /gm, '## ');
+ }).filter(Boolean);
+
+ const header =
+ '# AGENTS.md\n\n' +
+ '';
+
+ const body = [header, ...sections].join('\n\n');
+ return `${AGENTS_START}\n${body}\n${AGENTS_END}`;
+}
+
+/**
+ * Writes/updates AGENTS.md at the project root using a managed block, so the
+ * tool can be re-run without clobbering content a user added by hand.
+ *
+ * - No file → create it.
+ * - Has markers → replace only the managed block, preserve everything else.
+ * - Foreign file → decision via opts.onForeignFile() returning
+ * 'append' | 'overwrite' | 'cancel' (defaults to 'append').
+ *
+ * @param {string[]} moduleIds
+ * @param {string} cwd - target directory (defaults to process.cwd())
+ * @param {{ onForeignFile?: () => ('append'|'overwrite'|'cancel') }} [opts]
+ * @returns {{ outPath: string, action: ('created'|'updated'|'appended'|'overwritten'|'cancelled') }}
+ */
+export function writeRulesAgentsMd(moduleIds, cwd = process.cwd(), opts = {}) {
+ const outPath = join(cwd, 'AGENTS.md');
+ const block = buildAgentsBlock(moduleIds);
+
+ if (!existsSync(outPath)) {
+ writeFileSync(outPath, block + '\n', 'utf8');
+ return { outPath, action: 'created' };
+ }
+
+ const existing = readFileSync(outPath, 'utf8');
+ const startIdx = existing.indexOf(AGENTS_START);
+ const endIdx = existing.indexOf(AGENTS_END);
+
+ if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
+ const before = existing.slice(0, startIdx);
+ const after = existing.slice(endIdx + AGENTS_END.length);
+ writeFileSync(outPath, `${before}${block}${after}`, 'utf8');
+ return { outPath, action: 'updated' };
+ }
+
+ // Foreign file with no managed markers — don't silently destroy it.
+ const decision = opts.onForeignFile ? opts.onForeignFile() : 'append';
+ if (decision === 'cancel') {
+ return { outPath, action: 'cancelled' };
+ }
+ if (decision === 'overwrite') {
+ writeFileSync(outPath, block + '\n', 'utf8');
+ return { outPath, action: 'overwritten' };
+ }
+ const sep = existing.endsWith('\n') ? '\n' : '\n\n';
+ writeFileSync(outPath, `${existing}${sep}${block}\n`, 'utf8');
+ return { outPath, action: 'appended' };
+}
+
/**
* @deprecated Use writeRulesMdc or writeRulesLegacy directly.
* Kept for backwards compat with existing tests.
diff --git a/tests/agents.test.js b/tests/agents.test.js
new file mode 100644
index 0000000..dfcaede
--- /dev/null
+++ b/tests/agents.test.js
@@ -0,0 +1,109 @@
+import { test } from 'node:test';
+import assert from 'node:assert/strict';
+import { mkdtempSync, readFileSync, writeFileSync, rmSync } from 'node:fs';
+import { tmpdir } from 'node:os';
+import { join } from 'node:path';
+import {
+ writeRulesAgentsMd,
+ buildAgentsBlock,
+ AGENTS_START,
+ AGENTS_END,
+} from '../src/compose.js';
+
+function tmp() {
+ return mkdtempSync(join(tmpdir(), 'cc-agents-'));
+}
+
+test('creates AGENTS.md with managed markers and a single H1', () => {
+ const dir = tmp();
+ try {
+ const { outPath, action } = writeRulesAgentsMd(['core'], dir);
+ assert.equal(action, 'created');
+ const content = readFileSync(outPath, 'utf8');
+
+ assert.ok(content.includes(AGENTS_START), 'has start marker');
+ assert.ok(content.includes(AGENTS_END), 'has end marker');
+
+ // Exactly one top-level H1 (the AGENTS.md title); module titles demoted to ##.
+ const h1s = content.split('\n').filter((l) => /^# /.test(l));
+ assert.equal(h1s.length, 1, 'exactly one H1');
+ assert.equal(h1s[0], '# AGENTS.md');
+ assert.ok(/^## /m.test(content), 'module headings demoted to H2');
+ } finally {
+ rmSync(dir, { recursive: true, force: true });
+ }
+});
+
+test('AGENTS.md is plain markdown — no Cursor frontmatter', () => {
+ const dir = tmp();
+ try {
+ const { outPath } = writeRulesAgentsMd(['core', 'typescript'], dir);
+ const content = readFileSync(outPath, 'utf8');
+ assert.ok(!content.includes('alwaysApply:'), 'no alwaysApply');
+ assert.ok(!content.includes('globs:'), 'no globs');
+ } finally {
+ rmSync(dir, { recursive: true, force: true });
+ }
+});
+
+test('regeneration replaces the managed block but preserves user content', () => {
+ const dir = tmp();
+ try {
+ const { outPath } = writeRulesAgentsMd(['core'], dir);
+ // User appends custom content after the managed block.
+ const custom = '\n\n## Team notes\nDo not deploy on Fridays.\n';
+ writeFileSync(outPath, readFileSync(outPath, 'utf8') + custom, 'utf8');
+
+ const { action } = writeRulesAgentsMd(['core', 'typescript'], dir);
+ assert.equal(action, 'updated');
+
+ const after = readFileSync(outPath, 'utf8');
+ assert.ok(after.includes('Do not deploy on Fridays.'), 'user content preserved');
+ // New module set reflected inside the block.
+ const block = buildAgentsBlock(['core', 'typescript']);
+ assert.ok(after.includes(block), 'managed block updated to new module set');
+ // Still exactly one managed region.
+ assert.equal(after.split(AGENTS_START).length - 1, 1, 'single start marker');
+ } finally {
+ rmSync(dir, { recursive: true, force: true });
+ }
+});
+
+test('foreign AGENTS.md (no markers) is appended to, not clobbered', () => {
+ const dir = tmp();
+ try {
+ const outPath = join(dir, 'AGENTS.md');
+ writeFileSync(outPath, '# My hand-written rules\nKeep me.\n', 'utf8');
+
+ const { action } = writeRulesAgentsMd(['core'], dir, {
+ onForeignFile: () => 'append',
+ });
+ assert.equal(action, 'appended');
+
+ const content = readFileSync(outPath, 'utf8');
+ assert.ok(content.includes('Keep me.'), 'original content preserved');
+ assert.ok(content.includes(AGENTS_START), 'managed block appended');
+ } finally {
+ rmSync(dir, { recursive: true, force: true });
+ }
+});
+
+test('foreign AGENTS.md can be overwritten or cancelled on request', () => {
+ const dir = tmp();
+ try {
+ const outPath = join(dir, 'AGENTS.md');
+ writeFileSync(outPath, 'old\n', 'utf8');
+
+ const cancelled = writeRulesAgentsMd(['core'], dir, { onForeignFile: () => 'cancel' });
+ assert.equal(cancelled.action, 'cancelled');
+ assert.equal(readFileSync(outPath, 'utf8'), 'old\n', 'unchanged on cancel');
+
+ const overwritten = writeRulesAgentsMd(['core'], dir, { onForeignFile: () => 'overwrite' });
+ assert.equal(overwritten.action, 'overwritten');
+ const content = readFileSync(outPath, 'utf8');
+ assert.ok(!content.includes('old'), 'old content gone');
+ assert.ok(content.includes(AGENTS_START), 'managed block written');
+ } finally {
+ rmSync(dir, { recursive: true, force: true });
+ }
+});
From 4721354274520f6f9adf58005877055149891532 Mon Sep 17 00:00:00 2001
From: Kabi <48044253+Kabi10@users.noreply.github.com>
Date: Sat, 27 Jun 2026 07:46:22 +0000
Subject: [PATCH 2/3] docs: add demo GIF (VHS) for README hero
---
docs/demo.gif | Bin 0 -> 211467 bytes
docs/demo.tape | 29 +++++++++++++++++++++++++++++
2 files changed, 29 insertions(+)
create mode 100644 docs/demo.gif
create mode 100644 docs/demo.tape
diff --git a/docs/demo.gif b/docs/demo.gif
new file mode 100644
index 0000000000000000000000000000000000000000..dbdbca7cb509f4073b104d4f4c508701b9d4a3cb
GIT binary patch
literal 211467
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 |