@nexus-framework/cli 0.1.1 → 0.1.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.
Files changed (60) hide show
  1. package/README.md +69 -417
  2. package/dist/cli.js +14 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.d.ts.map +1 -1
  5. package/dist/commands/init.js +5 -4
  6. package/dist/commands/init.js.map +1 -1
  7. package/dist/commands/repair.d.ts +20 -0
  8. package/dist/commands/repair.d.ts.map +1 -0
  9. package/dist/commands/repair.js +85 -0
  10. package/dist/commands/repair.js.map +1 -0
  11. package/dist/commands/upgrade.d.ts +21 -0
  12. package/dist/commands/upgrade.d.ts.map +1 -0
  13. package/dist/commands/upgrade.js +95 -0
  14. package/dist/commands/upgrade.js.map +1 -0
  15. package/dist/generators/ai-config.d.ts +15 -8
  16. package/dist/generators/ai-config.d.ts.map +1 -1
  17. package/dist/generators/ai-config.js +209 -131
  18. package/dist/generators/ai-config.js.map +1 -1
  19. package/dist/generators/config.d.ts.map +1 -1
  20. package/dist/generators/config.js +127 -19
  21. package/dist/generators/config.js.map +1 -1
  22. package/dist/generators/docs.d.ts.map +1 -1
  23. package/dist/generators/docs.js +379 -159
  24. package/dist/generators/docs.js.map +1 -1
  25. package/dist/generators/index.d.ts +44 -0
  26. package/dist/generators/index.d.ts.map +1 -1
  27. package/dist/generators/index.js +148 -3
  28. package/dist/generators/index.js.map +1 -1
  29. package/dist/generators/landing-page.d.ts.map +1 -1
  30. package/dist/generators/landing-page.js +310 -76
  31. package/dist/generators/landing-page.js.map +1 -1
  32. package/dist/generators/structure.d.ts.map +1 -1
  33. package/dist/generators/structure.js +161 -17
  34. package/dist/generators/structure.js.map +1 -1
  35. package/dist/generators/tests.js +1 -1
  36. package/dist/prompts/index.d.ts +3 -0
  37. package/dist/prompts/index.d.ts.map +1 -1
  38. package/dist/prompts/index.js +12 -8
  39. package/dist/prompts/index.js.map +1 -1
  40. package/dist/types/config.d.ts +3 -0
  41. package/dist/types/config.d.ts.map +1 -1
  42. package/dist/utils/file-system.d.ts +9 -1
  43. package/dist/utils/file-system.d.ts.map +1 -1
  44. package/dist/utils/file-system.js +24 -1
  45. package/dist/utils/file-system.js.map +1 -1
  46. package/dist/utils/index.d.ts +2 -2
  47. package/dist/utils/index.d.ts.map +1 -1
  48. package/dist/utils/index.js +2 -2
  49. package/dist/utils/index.js.map +1 -1
  50. package/dist/utils/logger.d.ts +2 -2
  51. package/dist/utils/logger.d.ts.map +1 -1
  52. package/dist/utils/logger.js +6 -3
  53. package/dist/utils/logger.js.map +1 -1
  54. package/dist/utils/validator.d.ts +20 -3
  55. package/dist/utils/validator.d.ts.map +1 -1
  56. package/dist/utils/validator.js +48 -15
  57. package/dist/utils/validator.js.map +1 -1
  58. package/dist/version.d.ts +1 -1
  59. package/dist/version.js +1 -1
  60. package/package.json +1 -1
@@ -15,7 +15,7 @@ import { generateProject } from '../generators/index.js';
15
15
  import { runPrompts } from '../prompts/index.js';
16
16
  import { logger } from '../utils/logger.js';
17
17
  import { isExistingProject } from '../utils/project-detector.js';
18
- import { validateProjectName } from '../utils/validator.js';
18
+ import { validateProjectName, toSlug } from '../utils/validator.js';
19
19
  import { version } from '../version.js';
20
20
  import { adoptCommand } from './adopt.js';
21
21
  /**
@@ -40,9 +40,10 @@ export async function initCommand(projectName, options = {}) {
40
40
  process.exit(1);
41
41
  }
42
42
  // Check if the target directory is an existing project
43
- const targetDir = path.resolve(process.cwd(), projectName);
43
+ const slug = toSlug(projectName);
44
+ const targetDir = path.resolve(process.cwd(), slug);
44
45
  if (isExistingProject(targetDir)) {
45
- showAdoptSuggestion(projectName);
46
+ showAdoptSuggestion(slug);
46
47
  process.exit(1);
47
48
  }
48
49
  }
@@ -55,7 +56,7 @@ export async function initCommand(projectName, options = {}) {
55
56
  // Run interactive prompts
56
57
  const config = await runPrompts(projectName);
57
58
  logger.newline();
58
- logger.nexus(`Creating "${config.projectName}" with ${config.frontendFramework}...`);
59
+ logger.nexus(`Creating "${config.displayName}" with ${config.frontendFramework}...`);
59
60
  logger.newline();
60
61
  // Generate the project
61
62
  await generateProject(config);
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * NEXUS CLI - Repair Command
3
+ *
4
+ * The `nexus repair [path]` command restores missing or corrupted .nexus/
5
+ * files WITHOUT updating templates to a newer version.
6
+ *
7
+ * Use this when:
8
+ * - Files were accidentally deleted from .nexus/
9
+ * - A file's structure is corrupted (empty, broken frontmatter, invalid JSON)
10
+ * - You want to fix issues without changing template content
11
+ *
12
+ * For upgrading to the latest CLI templates, use `nexus upgrade` instead.
13
+ */
14
+ /**
15
+ * Handler for `nexus repair [path]`.
16
+ *
17
+ * @param targetPath - Optional path to the project to repair (defaults to cwd)
18
+ */
19
+ export declare function repairCommand(targetPath?: string): Promise<void>;
20
+ //# sourceMappingURL=repair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEtE"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * NEXUS CLI - Repair Command
3
+ *
4
+ * The `nexus repair [path]` command restores missing or corrupted .nexus/
5
+ * files WITHOUT updating templates to a newer version.
6
+ *
7
+ * Use this when:
8
+ * - Files were accidentally deleted from .nexus/
9
+ * - A file's structure is corrupted (empty, broken frontmatter, invalid JSON)
10
+ * - You want to fix issues without changing template content
11
+ *
12
+ * For upgrading to the latest CLI templates, use `nexus upgrade` instead.
13
+ */
14
+ import path from 'node:path';
15
+ import fs from 'fs-extra';
16
+ import { repairProject } from '../generators/index.js';
17
+ import { logger } from '../utils/logger.js';
18
+ import { version } from '../version.js';
19
+ /**
20
+ * Handler for `nexus repair [path]`.
21
+ *
22
+ * @param targetPath - Optional path to the project to repair (defaults to cwd)
23
+ */
24
+ export async function repairCommand(targetPath) {
25
+ logger.banner(version);
26
+ const targetDir = targetPath
27
+ ? path.resolve(process.cwd(), targetPath)
28
+ : process.cwd();
29
+ // ─── Check for .nexus/manifest.json ──────────────────────
30
+ const manifestPath = path.join(targetDir, '.nexus', 'manifest.json');
31
+ let manifest;
32
+ try {
33
+ const raw = await fs.readFile(manifestPath, 'utf-8');
34
+ manifest = JSON.parse(raw);
35
+ }
36
+ catch {
37
+ logger.error('No valid .nexus/manifest.json found in this project.');
38
+ logger.newline();
39
+ logger.info('The repair command requires an existing NEXUS project with a valid manifest.');
40
+ logger.info('If the manifest itself is corrupted, try `nexus upgrade` instead.');
41
+ logger.info('To add NEXUS to an existing project, run:');
42
+ logger.newline();
43
+ logger.nexus(' nexus adopt');
44
+ logger.newline();
45
+ process.exit(1);
46
+ return;
47
+ }
48
+ const config = manifest.config;
49
+ logger.nexus(`Repairing "${config.displayName}" NEXUS ecosystem...`);
50
+ logger.newline();
51
+ try {
52
+ const result = await repairProject(targetDir, config);
53
+ const fixCount = result.created.length + result.repaired.length;
54
+ if (fixCount === 0) {
55
+ logger.nexus('All NEXUS files are intact — nothing to repair.');
56
+ logger.newline();
57
+ return;
58
+ }
59
+ if (result.created.length > 0) {
60
+ logger.info(`✨ Restored (${result.created.length} missing files):`);
61
+ for (const f of result.created) {
62
+ logger.info(` + ${f}`);
63
+ }
64
+ }
65
+ if (result.repaired.length > 0) {
66
+ logger.info(`🔧 Repaired (${result.repaired.length} corrupted files):`);
67
+ for (const f of result.repaired) {
68
+ logger.info(` ⚕ ${f}`);
69
+ }
70
+ }
71
+ logger.info(`🔒 Untouched (${result.preserved.length} valid files preserved)`);
72
+ logger.newline();
73
+ logger.nexus(`Repair complete! Fixed ${fixCount} file${fixCount === 1 ? '' : 's'}.`);
74
+ logger.info('Your project knowledge was preserved.');
75
+ logger.newline();
76
+ }
77
+ catch (err) {
78
+ logger.error('Repair failed.');
79
+ if (err instanceof Error) {
80
+ logger.error(err.message);
81
+ }
82
+ process.exit(1);
83
+ }
84
+ }
85
+ //# sourceMappingURL=repair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair.js","sourceRoot":"","sources":["../../src/commands/repair.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * NEXUS CLI - Upgrade Command
3
+ *
4
+ * The `nexus upgrade [path]` command regenerates the .nexus/ ecosystem
5
+ * with the latest CLI templates while preserving project knowledge.
6
+ *
7
+ * Strategy:
8
+ * - REPLACE: AI instructions, tool files, manifest, .nexus/index.md
9
+ * - PRESERVE: knowledge.md, any doc with `status: populated`
10
+ * - SMART: Template docs get replaced; populated docs are kept
11
+ *
12
+ * The command reads `.nexus/manifest.json` to recover the original
13
+ * project config, regenerates everything, then applies the strategy.
14
+ */
15
+ /**
16
+ * Handler for `nexus upgrade [path]`.
17
+ *
18
+ * @param targetPath - Optional path to the project to upgrade (defaults to cwd)
19
+ */
20
+ export declare function upgradeCommand(targetPath?: string): Promise<void>;
21
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAWH;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkFvE"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * NEXUS CLI - Upgrade Command
3
+ *
4
+ * The `nexus upgrade [path]` command regenerates the .nexus/ ecosystem
5
+ * with the latest CLI templates while preserving project knowledge.
6
+ *
7
+ * Strategy:
8
+ * - REPLACE: AI instructions, tool files, manifest, .nexus/index.md
9
+ * - PRESERVE: knowledge.md, any doc with `status: populated`
10
+ * - SMART: Template docs get replaced; populated docs are kept
11
+ *
12
+ * The command reads `.nexus/manifest.json` to recover the original
13
+ * project config, regenerates everything, then applies the strategy.
14
+ */
15
+ import path from 'node:path';
16
+ import fs from 'fs-extra';
17
+ import { upgradeProject } from '../generators/index.js';
18
+ import { logger } from '../utils/logger.js';
19
+ import { version } from '../version.js';
20
+ /**
21
+ * Handler for `nexus upgrade [path]`.
22
+ *
23
+ * @param targetPath - Optional path to the project to upgrade (defaults to cwd)
24
+ */
25
+ export async function upgradeCommand(targetPath) {
26
+ logger.banner(version);
27
+ const targetDir = targetPath
28
+ ? path.resolve(process.cwd(), targetPath)
29
+ : process.cwd();
30
+ // ─── Check for .nexus/manifest.json ──────────────────────
31
+ const manifestPath = path.join(targetDir, '.nexus', 'manifest.json');
32
+ let manifest;
33
+ try {
34
+ const raw = await fs.readFile(manifestPath, 'utf-8');
35
+ manifest = JSON.parse(raw);
36
+ }
37
+ catch {
38
+ logger.error('No .nexus/manifest.json found in this project.');
39
+ logger.newline();
40
+ logger.info('The upgrade command requires an existing NEXUS project.');
41
+ logger.info('To add NEXUS to an existing project, run:');
42
+ logger.newline();
43
+ logger.nexus(' nexus adopt');
44
+ logger.newline();
45
+ process.exit(1);
46
+ return; // unreachable but satisfies TS
47
+ }
48
+ const config = manifest.config;
49
+ const oldVersion = manifest.cli?.version ?? 'unknown';
50
+ logger.nexus(`Upgrading "${config.displayName}" NEXUS ecosystem...`);
51
+ logger.newline();
52
+ logger.info(`Previous CLI version: ${oldVersion}`);
53
+ logger.info(`Current CLI version: ${version}`);
54
+ logger.newline();
55
+ try {
56
+ const result = await upgradeProject(targetDir, config);
57
+ // Log results
58
+ if (result.created.length > 0) {
59
+ logger.info(`✨ Created (${result.created.length} new files):`);
60
+ for (const f of result.created) {
61
+ logger.info(` + ${f}`);
62
+ }
63
+ }
64
+ if (result.repaired.length > 0) {
65
+ logger.info(`🔧 Repaired (${result.repaired.length} corrupted files restored):`);
66
+ for (const f of result.repaired) {
67
+ logger.info(` ⚕ ${f}`);
68
+ }
69
+ }
70
+ if (result.replaced.length > 0) {
71
+ logger.info(`🔄 Replaced (${result.replaced.length} files updated to latest):`);
72
+ for (const f of result.replaced) {
73
+ logger.info(` ↻ ${f}`);
74
+ }
75
+ }
76
+ if (result.preserved.length > 0) {
77
+ logger.info(`🔒 Preserved (${result.preserved.length} files with project knowledge):`);
78
+ for (const f of result.preserved) {
79
+ logger.info(` ✓ ${f}`);
80
+ }
81
+ }
82
+ logger.newline();
83
+ logger.nexus(`Upgrade complete! NEXUS ecosystem updated from v${oldVersion} → v${version}.`);
84
+ logger.info('Your project knowledge (populated docs, knowledge base, progress) was preserved.');
85
+ logger.newline();
86
+ }
87
+ catch (err) {
88
+ logger.error('Upgrade failed.');
89
+ if (err instanceof Error) {
90
+ logger.error(err.message);
91
+ }
92
+ process.exit(1);
93
+ }
94
+ }
95
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,UAAU,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAmB;IACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvB,MAAM,SAAS,GAAG,UAAU;QAC1B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC;QACzC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAElB,4DAA4D;IAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IACrE,IAAI,QAAuB,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAC/D,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACzD,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9B,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO,CAAC,+BAA+B;IACzC,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,IAAI,SAAS,CAAC;IAEtD,MAAM,CAAC,KAAK,CAAC,cAAc,MAAM,CAAC,WAAW,sBAAsB,CAAC,CAAC;IACrE,MAAM,CAAC,OAAO,EAAE,CAAC;IACjB,MAAM,CAAC,IAAI,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,CAAC;IAEjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEvD,cAAc;QACd,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;YAC/D,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,MAAM,6BAA6B,CAAC,CAAC;YACjF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,MAAM,4BAA4B,CAAC,CAAC;YAChF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,SAAS,CAAC,MAAM,iCAAiC,CAAC,CAAC;YACvF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QAED,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,CAAC,KAAK,CACV,mDAAmD,UAAU,OAAO,OAAO,GAAG,CAC/E,CAAC;QACF,MAAM,CAAC,IAAI,CACT,kFAAkF,CACnF,CAAC;QACF,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAChC,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -4,18 +4,25 @@
4
4
  * Generates AI agent instruction files for every major coding assistant.
5
5
  *
6
6
  * Strategy:
7
- * All real content lives in `.nexus/ai/` — a single folder that beginners
8
- * can understand ("this is for AI tools") without cluttering the repo root.
7
+ * The master file lives in `.nexus/ai/instructions.md` — a single folder
8
+ * that beginners can understand ("this is for AI tools").
9
9
  *
10
- * Thin pointer files are placed at the paths each tool expects:
11
- * .cursorrules → reads .nexus/ai/instructions.md
12
- * .windsurfrules → reads .nexus/ai/instructions.md
13
- * .clinerules → reads .nexus/ai/instructions.md
14
- * AGENTS.md → reads .nexus/ai/instructions.md
15
- * .github/copilot-instructions.md full content (Copilot requires this path)
10
+ * EVERY tool-specific config file gets the FULL project-aware instructions
11
+ * embedded directly. We do NOT rely on "go read another file" directives
12
+ * because AI tools ignore cross-file pointers too often.
13
+ *
14
+ * Files generated:
15
+ * .nexus/ai/instructions.md master file (full content)
16
+ * .cursorrules — Cursor (full content)
17
+ * .windsurfrules — Windsurf (full content)
18
+ * .clinerules — Cline (full content)
19
+ * AGENTS.md — Claude Code / OpenAI Codex (full content)
20
+ * .github/copilot-instructions.md — GitHub Copilot (full content)
16
21
  *
17
22
  * Every file is project-aware — it references the actual framework, data
18
23
  * strategy, test framework, and patterns chosen during `nexus init`.
24
+ * Every file includes the onboarding protocol that tells the AI to
25
+ * populate template docs BEFORE doing anything the user asks.
19
26
  */
20
27
  import type { NexusConfig } from '../types/config.js';
21
28
  import type { GeneratedFile } from '../types/templates.js';
@@ -1 +1 @@
1
- {"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../src/generators/ai-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAO3D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,EAAE,CAcrE"}
1
+ {"version":3,"file":"ai-config.d.ts","sourceRoot":"","sources":["../../src/generators/ai-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAO3D;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,EAAE,CAcrE"}