javi-forge 0.1.0 → 1.0.0

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 (159) hide show
  1. package/.releaserc +2 -1
  2. package/README.md +143 -31
  3. package/ai-config/commands/workflows/diagnose.md +70 -0
  4. package/ai-config/commands/workflows/discover.md +86 -0
  5. package/dist/commands/doctor.js +24 -1
  6. package/dist/commands/init.js +48 -1
  7. package/dist/commands/llmstxt.d.ts +9 -0
  8. package/dist/commands/llmstxt.js +93 -0
  9. package/dist/commands/llmstxt.test.d.ts +2 -0
  10. package/dist/commands/plugin.d.ts +24 -0
  11. package/dist/commands/plugin.js +78 -0
  12. package/dist/commands/plugin.test.d.ts +2 -0
  13. package/dist/constants.d.ts +8 -0
  14. package/dist/constants.js +8 -0
  15. package/dist/index.js +33 -4
  16. package/dist/lib/plugin.d.ts +39 -0
  17. package/dist/lib/plugin.js +228 -0
  18. package/dist/lib/plugin.test.d.ts +2 -0
  19. package/dist/types/index.d.ts +42 -0
  20. package/dist/ui/App.d.ts +2 -1
  21. package/dist/ui/App.js +2 -1
  22. package/dist/ui/LlmsTxt.d.ts +8 -0
  23. package/dist/ui/LlmsTxt.js +48 -0
  24. package/dist/ui/Plugin.d.ts +9 -0
  25. package/dist/ui/Plugin.js +96 -0
  26. package/modules/obsidian-brain/README.md +32 -0
  27. package/modules/obsidian-brain/core/templates/braindump.md +15 -0
  28. package/modules/obsidian-brain/core/templates/consolidation.md +42 -0
  29. package/modules/obsidian-brain/core/templates/daily-note.md +18 -0
  30. package/modules/obsidian-brain/core/templates/resource-capture.md +14 -0
  31. package/modules/obsidian-brain/developer/templates/adr.md +40 -0
  32. package/modules/obsidian-brain/developer/templates/coding-session.md +24 -0
  33. package/modules/obsidian-brain/developer/templates/debug-journal.md +22 -0
  34. package/modules/obsidian-brain/developer/templates/sdd-feedback.md +27 -0
  35. package/modules/obsidian-brain/developer/templates/tech-debt.md +20 -0
  36. package/modules/obsidian-brain/pm-lead/templates/daily-brief.md +25 -0
  37. package/modules/obsidian-brain/pm-lead/templates/meeting-notes.md +24 -0
  38. package/modules/obsidian-brain/pm-lead/templates/risk-registry.md +12 -0
  39. package/modules/obsidian-brain/pm-lead/templates/sprint-review.md +27 -0
  40. package/modules/obsidian-brain/pm-lead/templates/stakeholder-update.md +24 -0
  41. package/modules/obsidian-brain/pm-lead/templates/team-intelligence.md +19 -0
  42. package/modules/obsidian-brain/pm-lead/templates/weekly-brief.md +29 -0
  43. package/package.json +1 -1
  44. package/schemas/plugin.schema.json +62 -0
  45. package/ai-config/skills/docs/api-documentation/SKILL.md +0 -293
  46. package/ai-config/skills/docs/docs-spring/SKILL.md +0 -377
  47. package/ai-config/skills/docs/mustache-templates/SKILL.md +0 -190
  48. package/ai-config/skills/docs/technical-docs/SKILL.md +0 -447
  49. package/dist/commands/analyze.d.ts.map +0 -1
  50. package/dist/commands/analyze.js.map +0 -1
  51. package/dist/commands/analyze.test.d.ts.map +0 -1
  52. package/dist/commands/analyze.test.js +0 -145
  53. package/dist/commands/analyze.test.js.map +0 -1
  54. package/dist/commands/doctor.d.ts.map +0 -1
  55. package/dist/commands/doctor.js.map +0 -1
  56. package/dist/commands/doctor.test.d.ts.map +0 -1
  57. package/dist/commands/doctor.test.js +0 -200
  58. package/dist/commands/doctor.test.js.map +0 -1
  59. package/dist/commands/init.d.ts.map +0 -1
  60. package/dist/commands/init.js.map +0 -1
  61. package/dist/commands/init.test.d.ts.map +0 -1
  62. package/dist/commands/init.test.js +0 -271
  63. package/dist/commands/init.test.js.map +0 -1
  64. package/dist/commands/sync.d.ts.map +0 -1
  65. package/dist/commands/sync.js.map +0 -1
  66. package/dist/constants.d.ts.map +0 -1
  67. package/dist/constants.js.map +0 -1
  68. package/dist/e2e/aggressive.e2e.test.d.ts.map +0 -1
  69. package/dist/e2e/aggressive.e2e.test.js +0 -350
  70. package/dist/e2e/aggressive.e2e.test.js.map +0 -1
  71. package/dist/e2e/commands.e2e.test.d.ts.map +0 -1
  72. package/dist/e2e/commands.e2e.test.js +0 -213
  73. package/dist/e2e/commands.e2e.test.js.map +0 -1
  74. package/dist/index.d.ts.map +0 -1
  75. package/dist/index.js.map +0 -1
  76. package/dist/lib/common.d.ts.map +0 -1
  77. package/dist/lib/common.js.map +0 -1
  78. package/dist/lib/common.test.d.ts.map +0 -1
  79. package/dist/lib/common.test.js +0 -316
  80. package/dist/lib/common.test.js.map +0 -1
  81. package/dist/lib/frontmatter.d.ts.map +0 -1
  82. package/dist/lib/frontmatter.js.map +0 -1
  83. package/dist/lib/frontmatter.test.d.ts.map +0 -1
  84. package/dist/lib/frontmatter.test.js +0 -257
  85. package/dist/lib/frontmatter.test.js.map +0 -1
  86. package/dist/lib/template.d.ts.map +0 -1
  87. package/dist/lib/template.js.map +0 -1
  88. package/dist/lib/template.test.d.ts.map +0 -1
  89. package/dist/lib/template.test.js +0 -201
  90. package/dist/lib/template.test.js.map +0 -1
  91. package/dist/types/index.d.ts.map +0 -1
  92. package/dist/types/index.js.map +0 -1
  93. package/dist/ui/AnalyzeUI.d.ts.map +0 -1
  94. package/dist/ui/AnalyzeUI.js.map +0 -1
  95. package/dist/ui/App.d.ts.map +0 -1
  96. package/dist/ui/App.js.map +0 -1
  97. package/dist/ui/CIContext.d.ts.map +0 -1
  98. package/dist/ui/CIContext.js.map +0 -1
  99. package/dist/ui/CISelector.d.ts.map +0 -1
  100. package/dist/ui/CISelector.js.map +0 -1
  101. package/dist/ui/Doctor.d.ts.map +0 -1
  102. package/dist/ui/Doctor.js.map +0 -1
  103. package/dist/ui/Header.d.ts.map +0 -1
  104. package/dist/ui/Header.js.map +0 -1
  105. package/dist/ui/MemorySelector.d.ts.map +0 -1
  106. package/dist/ui/MemorySelector.js.map +0 -1
  107. package/dist/ui/NameInput.d.ts.map +0 -1
  108. package/dist/ui/NameInput.js.map +0 -1
  109. package/dist/ui/OptionSelector.d.ts.map +0 -1
  110. package/dist/ui/OptionSelector.js.map +0 -1
  111. package/dist/ui/Progress.d.ts.map +0 -1
  112. package/dist/ui/Progress.js.map +0 -1
  113. package/dist/ui/StackSelector.d.ts.map +0 -1
  114. package/dist/ui/StackSelector.js.map +0 -1
  115. package/dist/ui/Summary.d.ts.map +0 -1
  116. package/dist/ui/Summary.js.map +0 -1
  117. package/dist/ui/SyncUI.d.ts.map +0 -1
  118. package/dist/ui/SyncUI.js.map +0 -1
  119. package/dist/ui/Welcome.d.ts.map +0 -1
  120. package/dist/ui/Welcome.js.map +0 -1
  121. package/dist/ui/theme.d.ts.map +0 -1
  122. package/dist/ui/theme.js.map +0 -1
  123. package/modules/obsidian-brain/.obsidian/plugins/dataview/data.json +0 -25
  124. package/modules/obsidian-brain/.obsidian/plugins/obsidian-kanban/data.json +0 -29
  125. package/modules/obsidian-brain/.obsidian/plugins/templater-obsidian/data.json +0 -18
  126. package/src/commands/analyze.test.ts +0 -145
  127. package/src/commands/analyze.ts +0 -69
  128. package/src/commands/doctor.test.ts +0 -208
  129. package/src/commands/doctor.ts +0 -163
  130. package/src/commands/init.test.ts +0 -298
  131. package/src/commands/init.ts +0 -285
  132. package/src/constants.ts +0 -69
  133. package/src/e2e/aggressive.e2e.test.ts +0 -557
  134. package/src/e2e/commands.e2e.test.ts +0 -298
  135. package/src/index.tsx +0 -106
  136. package/src/lib/common.test.ts +0 -318
  137. package/src/lib/common.ts +0 -127
  138. package/src/lib/frontmatter.test.ts +0 -291
  139. package/src/lib/frontmatter.ts +0 -77
  140. package/src/lib/template.test.ts +0 -226
  141. package/src/lib/template.ts +0 -99
  142. package/src/types/index.ts +0 -53
  143. package/src/ui/AnalyzeUI.tsx +0 -133
  144. package/src/ui/App.tsx +0 -175
  145. package/src/ui/CIContext.tsx +0 -25
  146. package/src/ui/CISelector.tsx +0 -72
  147. package/src/ui/Doctor.tsx +0 -122
  148. package/src/ui/Header.tsx +0 -48
  149. package/src/ui/MemorySelector.tsx +0 -73
  150. package/src/ui/NameInput.tsx +0 -82
  151. package/src/ui/OptionSelector.tsx +0 -100
  152. package/src/ui/Progress.tsx +0 -88
  153. package/src/ui/StackSelector.tsx +0 -101
  154. package/src/ui/Summary.tsx +0 -134
  155. package/src/ui/Welcome.tsx +0 -54
  156. package/src/ui/theme.ts +0 -10
  157. package/stryker.config.json +0 -19
  158. package/tsconfig.json +0 -19
  159. package/vitest.config.ts +0 -16
@@ -1,350 +0,0 @@
1
- /**
2
- * Aggressive E2E tests for javi-forge init command.
3
- *
4
- * These tests do REAL filesystem operations in sandboxed temp directories.
5
- * They verify that `init` actually creates the expected project structure,
6
- * files, and content — not dry-run.
7
- *
8
- * Prerequisites: `pnpm build` must be run before these tests.
9
- */
10
- import { execFile } from 'child_process';
11
- import { promisify } from 'util';
12
- import path from 'path';
13
- import os from 'os';
14
- import fs from 'fs-extra';
15
- import crypto from 'crypto';
16
- import { describe, it, expect, afterEach } from 'vitest';
17
- const execFileAsync = promisify(execFile);
18
- const CLI_PATH = path.resolve(__dirname, '../../dist/index.js');
19
- // ── Helpers ──────────────────────────────────────────────────────────────────
20
- const sandboxes = [];
21
- async function createSandbox() {
22
- const dir = path.join(os.tmpdir(), `javi-forge-aggressive-${crypto.randomUUID()}`);
23
- await fs.ensureDir(dir);
24
- sandboxes.push(dir);
25
- return dir;
26
- }
27
- afterEach(async () => {
28
- for (const dir of sandboxes) {
29
- await fs.remove(dir).catch(() => { });
30
- }
31
- sandboxes.length = 0;
32
- });
33
- /**
34
- * Run the CLI for real (no --dry-run) in a sandbox.
35
- * Always sets CI=1 and --batch for non-interactive mode.
36
- * Defaults: --no-ai-sync by NOT including aiSync (OptionSelector auto-confirms
37
- * with defaults which includes aiSync, so we accept javi-ai errors gracefully).
38
- */
39
- async function runInit(args, cwd, timeout = 60_000) {
40
- try {
41
- const { stdout, stderr } = await execFileAsync('node', [CLI_PATH, 'init', '--batch', ...args], {
42
- timeout,
43
- cwd,
44
- env: { ...process.env, FORCE_COLOR: '0', CI: '1' },
45
- });
46
- return { stdout, stderr, exitCode: 0 };
47
- }
48
- catch (e) {
49
- return {
50
- stdout: e.stdout ?? '',
51
- stderr: e.stderr ?? '',
52
- exitCode: e.code ?? 1,
53
- };
54
- }
55
- }
56
- /** Get the project directory inside a sandbox */
57
- function projectDir(sandbox, name) {
58
- return path.join(sandbox, name);
59
- }
60
- /** Check if a file exists in the project */
61
- async function fileExists(sandbox, name, ...segments) {
62
- return fs.pathExists(path.join(sandbox, name, ...segments));
63
- }
64
- /** Read a file from the project */
65
- async function readProjectFile(sandbox, name, ...segments) {
66
- return fs.readFile(path.join(sandbox, name, ...segments), 'utf-8');
67
- }
68
- // ── Project creation tests ───────────────────────────────────────────────────
69
- describe('Project creation: init creates complete project', () => {
70
- it('init --stack node --ci github: creates complete project structure', async () => {
71
- const sandbox = await createSandbox();
72
- const { exitCode } = await runInit(['--project-name', 'test-app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
73
- expect(exitCode).toBe(0);
74
- // .git/ directory (git initialized)
75
- expect(await fileExists(sandbox, 'test-app', '.git')).toBe(true);
76
- // .github/workflows/ci.yml (CI template)
77
- expect(await fileExists(sandbox, 'test-app', '.github', 'workflows', 'ci.yml')).toBe(true);
78
- // .github/dependabot.yml (dependabot config)
79
- expect(await fileExists(sandbox, 'test-app', '.github', 'dependabot.yml')).toBe(true);
80
- // .gitignore (non-empty)
81
- expect(await fileExists(sandbox, 'test-app', '.gitignore')).toBe(true);
82
- const gitignore = await readProjectFile(sandbox, 'test-app', '.gitignore');
83
- expect(gitignore.length).toBeGreaterThan(0);
84
- // .javi-forge/manifest.json (valid JSON)
85
- expect(await fileExists(sandbox, 'test-app', '.javi-forge', 'manifest.json')).toBe(true);
86
- const manifest = await fs.readJson(path.join(sandbox, 'test-app', '.javi-forge', 'manifest.json'));
87
- expect(manifest).toBeDefined();
88
- expect(manifest.stack).toBe('node');
89
- });
90
- });
91
- // ── CI content per stack ─────────────────────────────────────────────────────
92
- describe('CI content per stack', () => {
93
- it('init --stack python --ci github: CI contains Python content', async () => {
94
- const sandbox = await createSandbox();
95
- await runInit(['--project-name', 'py-app', '--stack', 'python', '--ci', 'github', '--memory', 'none'], sandbox);
96
- const ciContent = await readProjectFile(sandbox, 'py-app', '.github', 'workflows', 'ci.yml');
97
- const lower = ciContent.toLowerCase();
98
- expect(lower.includes('pytest') || lower.includes('pip') || lower.includes('python')).toBe(true);
99
- });
100
- it('init --stack go --ci github: CI contains Go content', async () => {
101
- const sandbox = await createSandbox();
102
- await runInit(['--project-name', 'go-app', '--stack', 'go', '--ci', 'github', '--memory', 'none'], sandbox);
103
- const ciContent = await readProjectFile(sandbox, 'go-app', '.github', 'workflows', 'ci.yml');
104
- const lower = ciContent.toLowerCase();
105
- expect(lower.includes('go test') || lower.includes('golangci') || lower.includes('go-version')).toBe(true);
106
- });
107
- it('init --stack java-gradle --ci github: CI contains Gradle content', async () => {
108
- const sandbox = await createSandbox();
109
- await runInit(['--project-name', 'java-app', '--stack', 'java-gradle', '--ci', 'github', '--memory', 'none'], sandbox);
110
- const ciContent = await readProjectFile(sandbox, 'java-app', '.github', 'workflows', 'ci.yml');
111
- const lower = ciContent.toLowerCase();
112
- expect(lower.includes('gradle') || lower.includes('java') || lower.includes('jdk')).toBe(true);
113
- });
114
- it('init --stack rust --ci github: CI contains Rust/Cargo content', async () => {
115
- const sandbox = await createSandbox();
116
- await runInit(['--project-name', 'rust-app', '--stack', 'rust', '--ci', 'github', '--memory', 'none'], sandbox);
117
- const ciContent = await readProjectFile(sandbox, 'rust-app', '.github', 'workflows', 'ci.yml');
118
- const lower = ciContent.toLowerCase();
119
- expect(lower.includes('cargo') || lower.includes('clippy') || lower.includes('rust')).toBe(true);
120
- });
121
- });
122
- // ── CI providers ─────────────────────────────────────────────────────────────
123
- describe('CI providers', () => {
124
- it('init --ci gitlab: creates .gitlab-ci.yml', async () => {
125
- const sandbox = await createSandbox();
126
- await runInit(['--project-name', 'gl-app', '--stack', 'node', '--ci', 'gitlab', '--memory', 'none'], sandbox);
127
- expect(await fileExists(sandbox, 'gl-app', '.gitlab-ci.yml')).toBe(true);
128
- // Should NOT have GitHub workflows
129
- expect(await fileExists(sandbox, 'gl-app', '.github', 'workflows')).toBe(false);
130
- });
131
- it('init --ci woodpecker: creates .woodpecker.yml', async () => {
132
- const sandbox = await createSandbox();
133
- await runInit(['--project-name', 'wp-app', '--stack', 'node', '--ci', 'woodpecker', '--memory', 'none'], sandbox);
134
- const hasYml = await fileExists(sandbox, 'wp-app', '.woodpecker.yml');
135
- const hasDir = await fileExists(sandbox, 'wp-app', '.woodpecker');
136
- expect(hasYml || hasDir).toBe(true);
137
- });
138
- });
139
- // ── Memory module tests ──────────────────────────────────────────────────────
140
- describe('Memory modules', () => {
141
- it('init --memory engram: installs engram module', async () => {
142
- const sandbox = await createSandbox();
143
- await runInit(['--project-name', 'eng-app', '--stack', 'node', '--ci', 'github', '--memory', 'engram'], sandbox);
144
- // Engram module files copied to .javi-forge/modules/engram/
145
- expect(await fileExists(sandbox, 'eng-app', '.javi-forge', 'modules', 'engram')).toBe(true);
146
- // .mcp-config-snippet.json copied to project root
147
- expect(await fileExists(sandbox, 'eng-app', '.mcp-config-snippet.json')).toBe(true);
148
- });
149
- it('init --memory obsidian-brain: installs obsidian brain module', async () => {
150
- const sandbox = await createSandbox();
151
- await runInit(['--project-name', 'obs-app', '--stack', 'node', '--ci', 'github', '--memory', 'obsidian-brain'], sandbox);
152
- // Module copied to .javi-forge/modules/obsidian-brain/
153
- expect(await fileExists(sandbox, 'obs-app', '.javi-forge', 'modules', 'obsidian-brain')).toBe(true);
154
- // .project/Memory structure inside the module copy
155
- expect(await fileExists(sandbox, 'obs-app', '.javi-forge', 'modules', 'obsidian-brain', '.project', 'Memory', 'CONTEXT.md')).toBe(true);
156
- expect(await fileExists(sandbox, 'obs-app', '.javi-forge', 'modules', 'obsidian-brain', '.project', 'Memory', 'KANBAN.md')).toBe(true);
157
- });
158
- it('init --memory memory-simple: installs simple memory module', async () => {
159
- const sandbox = await createSandbox();
160
- await runInit(['--project-name', 'sim-app', '--stack', 'node', '--ci', 'github', '--memory', 'memory-simple'], sandbox);
161
- // Module copied to .javi-forge/modules/memory-simple/
162
- expect(await fileExists(sandbox, 'sim-app', '.javi-forge', 'modules', 'memory-simple')).toBe(true);
163
- // .project/NOTES.md inside the module copy
164
- expect(await fileExists(sandbox, 'sim-app', '.javi-forge', 'modules', 'memory-simple', '.project', 'NOTES.md')).toBe(true);
165
- });
166
- it('init --memory none: no memory module installed', async () => {
167
- const sandbox = await createSandbox();
168
- await runInit(['--project-name', 'no-mem', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
169
- // No modules directory for memory
170
- const modulesDir = path.join(sandbox, 'no-mem', '.javi-forge', 'modules');
171
- const hasModulesDir = await fs.pathExists(modulesDir);
172
- if (hasModulesDir) {
173
- const entries = await fs.readdir(modulesDir);
174
- // Should not contain engram, obsidian-brain, or memory-simple
175
- const memoryModules = entries.filter(e => ['engram', 'obsidian-brain', 'memory-simple'].includes(e));
176
- expect(memoryModules).toHaveLength(0);
177
- }
178
- });
179
- });
180
- // ── Dependabot ecosystem tests ───────────────────────────────────────────────
181
- describe('Dependabot ecosystems', () => {
182
- it('node project: dependabot has npm ecosystem', async () => {
183
- const sandbox = await createSandbox();
184
- await runInit(['--project-name', 'dep-node', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
185
- const content = await readProjectFile(sandbox, 'dep-node', '.github', 'dependabot.yml');
186
- expect(content).toContain('npm');
187
- });
188
- it('python project: dependabot has pip ecosystem', async () => {
189
- const sandbox = await createSandbox();
190
- await runInit(['--project-name', 'dep-py', '--stack', 'python', '--ci', 'github', '--memory', 'none'], sandbox);
191
- const content = await readProjectFile(sandbox, 'dep-py', '.github', 'dependabot.yml');
192
- expect(content).toContain('pip');
193
- });
194
- it('go project: dependabot has gomod ecosystem', async () => {
195
- const sandbox = await createSandbox();
196
- await runInit(['--project-name', 'dep-go', '--stack', 'go', '--ci', 'github', '--memory', 'none'], sandbox);
197
- const content = await readProjectFile(sandbox, 'dep-go', '.github', 'dependabot.yml');
198
- expect(content).toContain('gomod');
199
- });
200
- });
201
- // ── SDD tests ────────────────────────────────────────────────────────────────
202
- describe('SDD (Spec-Driven Development)', () => {
203
- it('init with SDD default (CI auto-confirms with sdd=true): creates openspec/', async () => {
204
- const sandbox = await createSandbox();
205
- // In CI/batch mode, OptionSelector defaults to sdd=true
206
- await runInit(['--project-name', 'sdd-app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
207
- expect(await fileExists(sandbox, 'sdd-app', 'openspec')).toBe(true);
208
- expect(await fileExists(sandbox, 'sdd-app', 'openspec', 'README.md')).toBe(true);
209
- });
210
- });
211
- // ── GHAGGA tests ─────────────────────────────────────────────────────────────
212
- describe('GHAGGA review system', () => {
213
- it('init --ghagga --ci github: creates ghagga workflow', async () => {
214
- const sandbox = await createSandbox();
215
- await runInit(['--project-name', 'ghagga-app', '--stack', 'node', '--ci', 'github', '--memory', 'none', '--ghagga'], sandbox);
216
- // GHAGGA module installed
217
- expect(await fileExists(sandbox, 'ghagga-app', '.javi-forge', 'modules', 'ghagga')).toBe(true);
218
- // Ghagga workflow file
219
- const workflowDir = path.join(sandbox, 'ghagga-app', '.github', 'workflows');
220
- if (await fs.pathExists(workflowDir)) {
221
- const files = await fs.readdir(workflowDir);
222
- const hasGhaggaWorkflow = files.some(f => f.toLowerCase().includes('ghagga'));
223
- expect(hasGhaggaWorkflow).toBe(true);
224
- }
225
- });
226
- it('init without --ghagga: no ghagga module or workflow', async () => {
227
- const sandbox = await createSandbox();
228
- await runInit(['--project-name', 'no-ghagga', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
229
- // No ghagga module
230
- expect(await fileExists(sandbox, 'no-ghagga', '.javi-forge', 'modules', 'ghagga')).toBe(false);
231
- // No ghagga workflow
232
- const workflowDir = path.join(sandbox, 'no-ghagga', '.github', 'workflows');
233
- if (await fs.pathExists(workflowDir)) {
234
- const files = await fs.readdir(workflowDir);
235
- const hasGhaggaWorkflow = files.some(f => f.toLowerCase().includes('ghagga'));
236
- expect(hasGhaggaWorkflow).toBe(false);
237
- }
238
- });
239
- });
240
- // ── Manifest tests ───────────────────────────────────────────────────────────
241
- describe('Manifest metadata', () => {
242
- it('manifest contains correct metadata fields', async () => {
243
- const sandbox = await createSandbox();
244
- await runInit(['--project-name', 'meta-app', '--stack', 'python', '--ci', 'github', '--memory', 'engram'], sandbox);
245
- const manifest = await fs.readJson(path.join(sandbox, 'meta-app', '.javi-forge', 'manifest.json'));
246
- expect(manifest).toHaveProperty('stack');
247
- expect(manifest).toHaveProperty('ciProvider');
248
- expect(manifest).toHaveProperty('memory');
249
- expect(manifest).toHaveProperty('createdAt');
250
- expect(manifest.stack).toBe('python');
251
- expect(manifest.ciProvider).toBe('github');
252
- expect(manifest.memory).toBe('engram');
253
- expect(manifest.projectName).toBe('meta-app');
254
- });
255
- it('different stacks produce different manifests', async () => {
256
- const sandbox = await createSandbox();
257
- await runInit(['--project-name', 'proj-node', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
258
- await runInit(['--project-name', 'proj-go', '--stack', 'go', '--ci', 'github', '--memory', 'none'], sandbox);
259
- const manifestNode = await fs.readJson(path.join(sandbox, 'proj-node', '.javi-forge', 'manifest.json'));
260
- const manifestGo = await fs.readJson(path.join(sandbox, 'proj-go', '.javi-forge', 'manifest.json'));
261
- expect(manifestNode.stack).toBe('node');
262
- expect(manifestGo.stack).toBe('go');
263
- expect(manifestNode.stack).not.toBe(manifestGo.stack);
264
- });
265
- });
266
- // ── Gitignore tests ──────────────────────────────────────────────────────────
267
- describe('Gitignore generation', () => {
268
- it('generated .gitignore is non-empty with at least 5 lines', async () => {
269
- const sandbox = await createSandbox();
270
- await runInit(['--project-name', 'gi-app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
271
- const content = await readProjectFile(sandbox, 'gi-app', '.gitignore');
272
- const lines = content.split('\n').filter(l => l.trim().length > 0);
273
- expect(lines.length).toBeGreaterThanOrEqual(5);
274
- });
275
- it('generated .gitignore contains common patterns', async () => {
276
- const sandbox = await createSandbox();
277
- await runInit(['--project-name', 'gi-app2', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
278
- const content = await readProjectFile(sandbox, 'gi-app2', '.gitignore');
279
- // The template has common patterns like .env, .idea, .DS_Store
280
- expect(content.includes('.env') ||
281
- content.includes('node_modules') ||
282
- content.includes('.DS_Store') ||
283
- content.includes('.idea')).toBe(true);
284
- });
285
- });
286
- // ── Idempotency tests ────────────────────────────────────────────────────────
287
- describe('Idempotency', () => {
288
- it('init in already-initialized project does not crash on second run', async () => {
289
- const sandbox = await createSandbox();
290
- // First run
291
- const first = await runInit(['--project-name', 'idem-app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
292
- expect(first.exitCode).toBe(0);
293
- // Second run — same project name in same sandbox
294
- const second = await runInit(['--project-name', 'idem-app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
295
- // Should not crash — exits 0
296
- expect(second.exitCode).toBe(0);
297
- // Project should still be valid
298
- expect(await fileExists(sandbox, 'idem-app', '.javi-forge', 'manifest.json')).toBe(true);
299
- });
300
- });
301
- // ── CI Local tests ───────────────────────────────────────────────────────────
302
- describe('CI Local setup', () => {
303
- it('init creates ci-local if source dir exists', async () => {
304
- const sandbox = await createSandbox();
305
- await runInit(['--project-name', 'ci-app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
306
- // ci-local dir should exist (copied from forge root)
307
- const ciLocalDir = path.join(sandbox, 'ci-app', 'ci-local');
308
- const hasCILocal = await fs.pathExists(ciLocalDir);
309
- if (hasCILocal) {
310
- // Should have ci-local.sh or hooks
311
- const hasCIScript = await fs.pathExists(path.join(ciLocalDir, 'ci-local.sh'));
312
- const hasHooks = await fs.pathExists(path.join(ciLocalDir, 'hooks'));
313
- expect(hasCIScript || hasHooks).toBe(true);
314
- }
315
- // If ci-local source doesn't exist at forge root, this step is skipped — that's OK
316
- expect(true).toBe(true);
317
- });
318
- });
319
- // ── Cross-stack CI generation ────────────────────────────────────────────────
320
- describe('Cross-stack CI generation', () => {
321
- const stacks = ['node', 'python', 'go', 'rust', 'java-gradle'];
322
- for (const stack of stacks) {
323
- it(`init --stack ${stack} --ci github: generates CI workflow file`, async () => {
324
- const sandbox = await createSandbox();
325
- const name = `ci-${stack}`;
326
- await runInit(['--project-name', name, '--stack', stack, '--ci', 'github', '--memory', 'none'], sandbox);
327
- expect(await fileExists(sandbox, name, '.github', 'workflows', 'ci.yml')).toBe(true);
328
- const content = await readProjectFile(sandbox, name, '.github', 'workflows', 'ci.yml');
329
- expect(content.length).toBeGreaterThan(10);
330
- });
331
- }
332
- });
333
- // ── Dependabot with github-actions fragment ──────────────────────────────────
334
- describe('Dependabot includes github-actions', () => {
335
- it('dependabot.yml contains github-actions update section', async () => {
336
- const sandbox = await createSandbox();
337
- await runInit(['--project-name', 'dbot-app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
338
- const content = await readProjectFile(sandbox, 'dbot-app', '.github', 'dependabot.yml');
339
- expect(content).toContain('github-actions');
340
- });
341
- });
342
- // ── GitLab does not create dependabot ────────────────────────────────────────
343
- describe('Non-GitHub CI skips dependabot', () => {
344
- it('gitlab CI does not create .github/dependabot.yml', async () => {
345
- const sandbox = await createSandbox();
346
- await runInit(['--project-name', 'gl-nodep', '--stack', 'node', '--ci', 'gitlab', '--memory', 'none'], sandbox);
347
- expect(await fileExists(sandbox, 'gl-nodep', '.github', 'dependabot.yml')).toBe(false);
348
- });
349
- });
350
- //# sourceMappingURL=aggressive.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aggressive.e2e.test.js","sourceRoot":"","sources":["../../src/e2e/aggressive.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands.e2e.test.d.ts","sourceRoot":"","sources":["../../src/e2e/commands.e2e.test.ts"],"names":[],"mappings":""}
@@ -1,213 +0,0 @@
1
- /**
2
- * E2E tests for javi-forge CLI commands.
3
- *
4
- * These tests execute the REAL compiled CLI as a subprocess but ONLY test
5
- * dry-run behavior — no real filesystem modifications are made.
6
- *
7
- * Prerequisites: `pnpm build` must be run before these tests.
8
- */
9
- import { execFile } from 'child_process';
10
- import { promisify } from 'util';
11
- import path from 'path';
12
- import os from 'os';
13
- import fs from 'fs-extra';
14
- import crypto from 'crypto';
15
- import { describe, it, expect, afterEach } from 'vitest';
16
- const execFileAsync = promisify(execFile);
17
- const CLI_PATH = path.resolve(__dirname, '../../dist/index.js');
18
- // ── Helpers ──────────────────────────────────────────────────────────────────
19
- const sandboxes = [];
20
- async function createSandbox() {
21
- const dir = path.join(os.tmpdir(), `javi-forge-e2e-${crypto.randomUUID()}`);
22
- await fs.ensureDir(dir);
23
- sandboxes.push(dir);
24
- return dir;
25
- }
26
- afterEach(async () => {
27
- for (const dir of sandboxes) {
28
- await fs.remove(dir).catch(() => { });
29
- }
30
- sandboxes.length = 0;
31
- });
32
- async function runCLI(args, cwd, timeout = 30_000) {
33
- try {
34
- const { stdout, stderr } = await execFileAsync('node', [CLI_PATH, ...args], {
35
- timeout,
36
- cwd: cwd ?? process.cwd(),
37
- env: { ...process.env, FORCE_COLOR: '0', CI: '1' },
38
- });
39
- return { stdout, stderr, exitCode: 0 };
40
- }
41
- catch (e) {
42
- return {
43
- stdout: e.stdout ?? '',
44
- stderr: e.stderr ?? '',
45
- exitCode: e.code ?? 1,
46
- };
47
- }
48
- }
49
- // ── --help ──────────────────────────────────────────────────────────────────
50
- describe('javi-forge --help', () => {
51
- it('shows usage with all commands listed', async () => {
52
- const { stdout, exitCode } = await runCLI(['--help']);
53
- expect(exitCode).toBe(0);
54
- expect(stdout).toContain('javi-forge');
55
- expect(stdout).toContain('init');
56
- expect(stdout).toContain('analyze');
57
- expect(stdout).toContain('doctor');
58
- });
59
- it('shows all option flags', async () => {
60
- const { stdout } = await runCLI(['--help']);
61
- expect(stdout).toContain('--dry-run');
62
- expect(stdout).toContain('--stack');
63
- expect(stdout).toContain('--ci');
64
- expect(stdout).toContain('--memory');
65
- expect(stdout).toContain('--project-name');
66
- expect(stdout).toContain('--ghagga');
67
- expect(stdout).toContain('--batch');
68
- });
69
- });
70
- // ── init --dry-run ──────────────────────────────────────────────────────────
71
- describe('javi-forge init --dry-run', () => {
72
- it('shows plan with all required flags (node + github)', async () => {
73
- const sandbox = await createSandbox();
74
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'test-app', '--stack', 'node', '--ci', 'github', '--memory', 'engram'], sandbox);
75
- expect(exitCode).toBe(0);
76
- expect(stdout).toContain('DRY RUN');
77
- expect(stdout).toContain('Dry run complete');
78
- expect(stdout).toContain('test-app');
79
- expect(stdout).toContain('No changes were made');
80
- expect(stdout).toContain('steps completed');
81
- });
82
- it('does not create files in cwd during dry-run', async () => {
83
- const sandbox = await createSandbox();
84
- await runCLI(['init', '--dry-run', '--project-name', 'test-app', '--stack', 'node', '--ci', 'github', '--memory', 'engram'], sandbox);
85
- // Sandbox should still be empty — dry-run writes nothing
86
- const entries = await fs.readdir(sandbox);
87
- expect(entries).toHaveLength(0);
88
- });
89
- it('shows Python stack in output', async () => {
90
- const sandbox = await createSandbox();
91
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'pyapp', '--stack', 'python', '--ci', 'github', '--memory', 'engram'], sandbox);
92
- expect(exitCode).toBe(0);
93
- expect(stdout).toContain('python');
94
- });
95
- it('selects GitLab CI templates', async () => {
96
- const sandbox = await createSandbox();
97
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'app', '--stack', 'node', '--ci', 'gitlab', '--memory', 'engram'], sandbox);
98
- expect(exitCode).toBe(0);
99
- expect(stdout).toContain('gitlab');
100
- });
101
- it('selects Woodpecker CI templates', async () => {
102
- const sandbox = await createSandbox();
103
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'app', '--stack', 'node', '--ci', 'woodpecker', '--memory', 'engram'], sandbox);
104
- expect(exitCode).toBe(0);
105
- expect(stdout).toContain('woodpecker');
106
- });
107
- it('references obsidian-brain when selected as memory module', async () => {
108
- const sandbox = await createSandbox();
109
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'app', '--stack', 'node', '--ci', 'github', '--memory', 'obsidian-brain'], sandbox);
110
- expect(exitCode).toBe(0);
111
- expect(stdout).toContain('obsidian-brain');
112
- });
113
- it('skips memory step when --memory none is used', async () => {
114
- const sandbox = await createSandbox();
115
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'app', '--stack', 'node', '--ci', 'github', '--memory', 'none'], sandbox);
116
- expect(exitCode).toBe(0);
117
- // With memory=none, one more step is skipped (memory module install)
118
- expect(stdout).toContain('skipped');
119
- });
120
- it('shows ghagga step as done when --ghagga flag is used', async () => {
121
- const sandbox = await createSandbox();
122
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'app', '--stack', 'node', '--ci', 'github', '--memory', 'engram', '--ghagga'], sandbox);
123
- expect(exitCode).toBe(0);
124
- // GHAGGA step should be completed (not skipped)
125
- expect(stdout).toContain('Install GHAGGA review system');
126
- expect(stdout).not.toContain('GHAGGA review system not selected');
127
- });
128
- it('shows ghagga step as skipped without --ghagga flag', async () => {
129
- const sandbox = await createSandbox();
130
- const { stdout, exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'app', '--stack', 'node', '--ci', 'github', '--memory', 'engram'], sandbox);
131
- expect(exitCode).toBe(0);
132
- // GHAGGA step should be skipped
133
- expect(stdout).toContain('GHAGGA review system');
134
- expect(stdout).toContain('not selected');
135
- });
136
- it('exits with code 0 even with all options', async () => {
137
- const sandbox = await createSandbox();
138
- const { exitCode } = await runCLI(['init', '--dry-run', '--project-name', 'full-app', '--stack', 'go', '--ci', 'github', '--memory', 'engram', '--ghagga'], sandbox);
139
- expect(exitCode).toBe(0);
140
- });
141
- });
142
- // ── analyze ─────────────────────────────────────────────────────────────────
143
- describe('javi-forge analyze', () => {
144
- it('analyze --dry-run completes', async () => {
145
- const { stdout, exitCode } = await runCLI(['analyze', '--dry-run']);
146
- expect(exitCode).toBe(0);
147
- // Should mention either analysis results or that repoforge is not found
148
- expect(stdout.length).toBeGreaterThan(0);
149
- });
150
- it('analyze --dry-run in empty dir shows appropriate message', async () => {
151
- const sandbox = await createSandbox();
152
- const { stdout, exitCode } = await runCLI(['analyze', '--dry-run'], sandbox);
153
- expect(exitCode).toBe(0);
154
- // Output should contain something about analysis — either results or repoforge status
155
- const combined = stdout.toLowerCase();
156
- expect(combined.includes('analysis') ||
157
- combined.includes('analyze') ||
158
- combined.includes('repoforge') ||
159
- combined.includes('complete') ||
160
- combined.includes('dry run')).toBe(true);
161
- });
162
- });
163
- // ── doctor ──────────────────────────────────────────────────────────────────
164
- describe('javi-forge doctor', () => {
165
- it('runs without crashing and shows check results', async () => {
166
- const { stdout, exitCode } = await runCLI(['doctor']);
167
- expect(exitCode).toBe(0);
168
- // Doctor output contains status icons (✓ ok, ✗ fail, – skip)
169
- const hasStatusIndicators = stdout.includes('\u2713') || // ✓
170
- stdout.includes('\u2717') || // ✗
171
- stdout.includes('\u2013') || // –
172
- stdout.includes('ok') ||
173
- stdout.includes('fail') ||
174
- stdout.includes('skip');
175
- expect(hasStatusIndicators).toBe(true);
176
- });
177
- it('shows health score', async () => {
178
- const { stdout, exitCode } = await runCLI(['doctor']);
179
- expect(exitCode).toBe(0);
180
- expect(stdout).toContain('Health:');
181
- expect(stdout).toMatch(/\d+\/\d+ checks passed/);
182
- });
183
- it('checks system tools (git, node)', async () => {
184
- const { stdout, exitCode } = await runCLI(['doctor']);
185
- expect(exitCode).toBe(0);
186
- expect(stdout).toContain('System Tools');
187
- expect(stdout).toContain('Git');
188
- expect(stdout).toContain('Node.js');
189
- });
190
- it('shows framework structure section', async () => {
191
- const { stdout, exitCode } = await runCLI(['doctor']);
192
- expect(exitCode).toBe(0);
193
- expect(stdout).toContain('Framework Structure');
194
- expect(stdout).toContain('templates/');
195
- expect(stdout).toContain('modules/');
196
- });
197
- it('in empty dir shows no stack detected', async () => {
198
- const sandbox = await createSandbox();
199
- const { stdout, exitCode } = await runCLI(['doctor'], sandbox);
200
- expect(exitCode).toBe(0);
201
- expect(stdout).toContain('Stack Detection');
202
- // In empty dir, no stack is recognizable
203
- expect(stdout).toContain('no recognizable project files');
204
- });
205
- it('shows installed modules section', async () => {
206
- const { stdout, exitCode } = await runCLI(['doctor']);
207
- expect(exitCode).toBe(0);
208
- expect(stdout).toContain('Installed Modules');
209
- expect(stdout).toContain('engram');
210
- expect(stdout).toContain('ghagga');
211
- });
212
- });
213
- //# sourceMappingURL=commands.e2e.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands.e2e.test.js","sourceRoot":"","sources":["../../src/e2e/commands.e2e.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":""}