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
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.tsx"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/lib/common.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAE9D;;;GAGG;AACH,wBAAsB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAiDpF;AAkCD,oEAAoE;AACpE,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAMvE;AAED,yDAAyD;AACzD,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpE;AAED,+CAA+C;AAC/C,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7D;AAED,iEAAiE;AACjE,wBAAgB,YAAY,IAAI,MAAM,CAIrC;AAED,0BAA0B;AAC1B,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAQ9C,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/lib/common.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.test.d.ts","sourceRoot":"","sources":["../../src/lib/common.test.ts"],"names":[],"mappings":""}
@@ -1,316 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import path from 'path';
3
- // ── Mock fs-extra ────────────────────────────────────────────────────────────
4
- vi.mock('fs-extra', () => {
5
- const mockFs = {
6
- pathExists: vi.fn(),
7
- readJson: vi.fn(),
8
- readFile: vi.fn(),
9
- copy: vi.fn(),
10
- ensureDir: vi.fn(),
11
- };
12
- return { default: mockFs, ...mockFs };
13
- });
14
- import fs from 'fs-extra';
15
- import { detectStack, backupIfExists, isGitRepo } from './common.js';
16
- const mockedFs = vi.mocked(fs);
17
- beforeEach(() => {
18
- vi.resetAllMocks();
19
- });
20
- // ═══════════════════════════════════════════════════════════════════════════════
21
- // detectStack
22
- // ═══════════════════════════════════════════════════════════════════════════════
23
- describe('detectStack', () => {
24
- function mockFileExists(existingFiles) {
25
- mockedFs.pathExists.mockImplementation(async (filePath) => {
26
- const p = String(filePath);
27
- return existingFiles.some(f => p.endsWith(f));
28
- });
29
- }
30
- it('detects build.gradle → java-gradle', async () => {
31
- mockFileExists(['build.gradle']);
32
- mockedFs.readFile.mockResolvedValue('sourceCompatibility = 21');
33
- const result = await detectStack('/project');
34
- expect(result).not.toBeNull();
35
- expect(result.stackType).toBe('java-gradle');
36
- expect(result.buildTool).toBe('gradle');
37
- expect(result.javaVersion).toBe('21');
38
- });
39
- it('detects build.gradle.kts → java-gradle', async () => {
40
- mockedFs.pathExists.mockImplementation(async (filePath) => {
41
- const p = String(filePath);
42
- if (p.endsWith('build.gradle'))
43
- return false;
44
- if (p.endsWith('build.gradle.kts'))
45
- return true;
46
- return false;
47
- });
48
- mockedFs.readFile.mockResolvedValue('jvmTarget = "17"');
49
- const result = await detectStack('/project');
50
- expect(result).not.toBeNull();
51
- expect(result.stackType).toBe('java-gradle');
52
- expect(result.javaVersion).toBe('17');
53
- });
54
- it('detects pom.xml → java-maven', async () => {
55
- mockedFs.pathExists.mockImplementation(async (filePath) => {
56
- const p = String(filePath);
57
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts'))
58
- return false;
59
- if (p.endsWith('pom.xml'))
60
- return true;
61
- return false;
62
- });
63
- mockedFs.readFile.mockResolvedValue('<java.version>21</java.version>');
64
- const result = await detectStack('/project');
65
- expect(result).not.toBeNull();
66
- expect(result.stackType).toBe('java-maven');
67
- expect(result.buildTool).toBe('maven');
68
- });
69
- it('detects package.json + pnpm-lock.yaml → node/pnpm', async () => {
70
- mockedFs.pathExists.mockImplementation(async (filePath) => {
71
- const p = String(filePath);
72
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts') || p.endsWith('pom.xml'))
73
- return false;
74
- if (p.endsWith('package.json') || p.endsWith('pnpm-lock.yaml'))
75
- return true;
76
- return false;
77
- });
78
- mockedFs.readJson.mockResolvedValue({});
79
- const result = await detectStack('/project');
80
- expect(result).not.toBeNull();
81
- expect(result.stackType).toBe('node');
82
- expect(result.buildTool).toBe('pnpm');
83
- });
84
- it('detects package.json + yarn.lock → node/yarn', async () => {
85
- mockedFs.pathExists.mockImplementation(async (filePath) => {
86
- const p = String(filePath);
87
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts') || p.endsWith('pom.xml'))
88
- return false;
89
- if (p.endsWith('package.json') || p.endsWith('yarn.lock'))
90
- return true;
91
- if (p.endsWith('pnpm-lock.yaml'))
92
- return false;
93
- return false;
94
- });
95
- mockedFs.readJson.mockResolvedValue({});
96
- const result = await detectStack('/project');
97
- expect(result).not.toBeNull();
98
- expect(result.stackType).toBe('node');
99
- expect(result.buildTool).toBe('yarn');
100
- });
101
- it('detects package.json alone → node/npm', async () => {
102
- mockedFs.pathExists.mockImplementation(async (filePath) => {
103
- const p = String(filePath);
104
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts') || p.endsWith('pom.xml'))
105
- return false;
106
- if (p.endsWith('package.json'))
107
- return true;
108
- return false;
109
- });
110
- mockedFs.readJson.mockResolvedValue({});
111
- const result = await detectStack('/project');
112
- expect(result).not.toBeNull();
113
- expect(result.stackType).toBe('node');
114
- expect(result.buildTool).toBe('npm');
115
- });
116
- it('detects pyproject.toml → python/pyproject', async () => {
117
- mockedFs.pathExists.mockImplementation(async (filePath) => {
118
- const p = String(filePath);
119
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts') || p.endsWith('pom.xml') || p.endsWith('package.json'))
120
- return false;
121
- if (p.endsWith('pyproject.toml'))
122
- return true;
123
- return false;
124
- });
125
- const result = await detectStack('/project');
126
- expect(result).not.toBeNull();
127
- expect(result.stackType).toBe('python');
128
- expect(result.buildTool).toBe('pyproject');
129
- });
130
- it('detects requirements.txt → python/pip', async () => {
131
- mockedFs.pathExists.mockImplementation(async (filePath) => {
132
- const p = String(filePath);
133
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts') || p.endsWith('pom.xml') || p.endsWith('package.json'))
134
- return false;
135
- if (p.endsWith('pyproject.toml'))
136
- return false;
137
- if (p.endsWith('requirements.txt'))
138
- return true;
139
- if (p.endsWith('Pipfile'))
140
- return false;
141
- return false;
142
- });
143
- const result = await detectStack('/project');
144
- expect(result).not.toBeNull();
145
- expect(result.stackType).toBe('python');
146
- expect(result.buildTool).toBe('pip');
147
- });
148
- it('detects Pipfile → python/pipenv', async () => {
149
- mockedFs.pathExists.mockImplementation(async (filePath) => {
150
- const p = String(filePath);
151
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts') || p.endsWith('pom.xml') || p.endsWith('package.json'))
152
- return false;
153
- if (p.endsWith('pyproject.toml'))
154
- return false;
155
- if (p.endsWith('requirements.txt') || p.endsWith('setup.py'))
156
- return true;
157
- if (p.endsWith('Pipfile'))
158
- return true;
159
- return false;
160
- });
161
- const result = await detectStack('/project');
162
- expect(result).not.toBeNull();
163
- expect(result.stackType).toBe('python');
164
- expect(result.buildTool).toBe('pipenv');
165
- });
166
- it('detects go.mod → go', async () => {
167
- mockedFs.pathExists.mockImplementation(async (filePath) => {
168
- const p = String(filePath);
169
- if (p.endsWith('go.mod'))
170
- return true;
171
- return false;
172
- });
173
- const result = await detectStack('/project');
174
- expect(result).not.toBeNull();
175
- expect(result.stackType).toBe('go');
176
- expect(result.buildTool).toBe('go');
177
- });
178
- it('detects Cargo.toml → rust', async () => {
179
- mockedFs.pathExists.mockImplementation(async (filePath) => {
180
- const p = String(filePath);
181
- if (p.endsWith('Cargo.toml'))
182
- return true;
183
- return false;
184
- });
185
- const result = await detectStack('/project');
186
- expect(result).not.toBeNull();
187
- expect(result.stackType).toBe('rust');
188
- expect(result.buildTool).toBe('cargo');
189
- });
190
- it('detects mix.exs → elixir', async () => {
191
- mockedFs.pathExists.mockImplementation(async (filePath) => {
192
- const p = String(filePath);
193
- if (p.endsWith('mix.exs'))
194
- return true;
195
- return false;
196
- });
197
- const result = await detectStack('/project');
198
- expect(result).not.toBeNull();
199
- expect(result.stackType).toBe('elixir');
200
- expect(result.buildTool).toBe('mix');
201
- });
202
- it('returns null for empty directory', async () => {
203
- mockedFs.pathExists.mockResolvedValue(false);
204
- const result = await detectStack('/empty-project');
205
- expect(result).toBeNull();
206
- });
207
- it('gives java-gradle precedence when both gradle + package.json exist', async () => {
208
- mockedFs.pathExists.mockImplementation(async (filePath) => {
209
- const p = String(filePath);
210
- if (p.endsWith('build.gradle') || p.endsWith('package.json'))
211
- return true;
212
- return false;
213
- });
214
- mockedFs.readFile.mockResolvedValue('sourceCompatibility = 21');
215
- const result = await detectStack('/project');
216
- expect(result).not.toBeNull();
217
- expect(result.stackType).toBe('java-gradle');
218
- });
219
- it('detects JavaVersion.VERSION_21 in build.gradle', async () => {
220
- mockedFs.pathExists.mockImplementation(async (filePath) => {
221
- const p = String(filePath);
222
- if (p.endsWith('build.gradle'))
223
- return true;
224
- return false;
225
- });
226
- mockedFs.readFile.mockResolvedValue('JavaVersion.VERSION_21');
227
- const result = await detectStack('/project');
228
- expect(result.javaVersion).toBe('21');
229
- });
230
- it('detects JavaVersion.VERSION_17 in build.gradle.kts', async () => {
231
- mockedFs.pathExists.mockImplementation(async (filePath) => {
232
- const p = String(filePath);
233
- if (p.endsWith('build.gradle'))
234
- return false;
235
- if (p.endsWith('build.gradle.kts'))
236
- return true;
237
- return false;
238
- });
239
- mockedFs.readFile.mockResolvedValue('JavaVersion.VERSION_17');
240
- const result = await detectStack('/project');
241
- expect(result.javaVersion).toBe('17');
242
- });
243
- it('detects maven.compiler.source in pom.xml', async () => {
244
- mockedFs.pathExists.mockImplementation(async (filePath) => {
245
- const p = String(filePath);
246
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts'))
247
- return false;
248
- if (p.endsWith('pom.xml'))
249
- return true;
250
- return false;
251
- });
252
- mockedFs.readFile.mockResolvedValue('<maven.compiler.source>17</maven.compiler.source>');
253
- const result = await detectStack('/project');
254
- expect(result.javaVersion).toBe('17');
255
- });
256
- it('returns undefined javaVersion when no version pattern matches', async () => {
257
- mockedFs.pathExists.mockImplementation(async (filePath) => {
258
- const p = String(filePath);
259
- if (p.endsWith('build.gradle'))
260
- return true;
261
- return false;
262
- });
263
- mockedFs.readFile.mockResolvedValue('apply plugin: java');
264
- const result = await detectStack('/project');
265
- expect(result.javaVersion).toBeUndefined();
266
- });
267
- it('handles readJson error for package.json gracefully', async () => {
268
- mockedFs.pathExists.mockImplementation(async (filePath) => {
269
- const p = String(filePath);
270
- if (p.endsWith('build.gradle') || p.endsWith('build.gradle.kts') || p.endsWith('pom.xml'))
271
- return false;
272
- if (p.endsWith('package.json'))
273
- return true;
274
- return false;
275
- });
276
- mockedFs.readJson.mockRejectedValue(new Error('invalid json'));
277
- const result = await detectStack('/project');
278
- expect(result).not.toBeNull();
279
- expect(result.stackType).toBe('node');
280
- });
281
- });
282
- // ═══════════════════════════════════════════════════════════════════════════════
283
- // backupIfExists
284
- // ═══════════════════════════════════════════════════════════════════════════════
285
- describe('backupIfExists', () => {
286
- it('creates .bak and returns true when file exists', async () => {
287
- mockedFs.pathExists.mockResolvedValue(true);
288
- mockedFs.copy.mockResolvedValue(undefined);
289
- const result = await backupIfExists('/project/ci.yml');
290
- expect(result).toBe(true);
291
- expect(mockedFs.copy).toHaveBeenCalledWith('/project/ci.yml', '/project/ci.yml.bak', { overwrite: true });
292
- });
293
- it('returns false when file does not exist', async () => {
294
- mockedFs.pathExists.mockResolvedValue(false);
295
- const result = await backupIfExists('/project/nonexistent.yml');
296
- expect(result).toBe(false);
297
- expect(mockedFs.copy).not.toHaveBeenCalled();
298
- });
299
- });
300
- // ═══════════════════════════════════════════════════════════════════════════════
301
- // isGitRepo
302
- // ═══════════════════════════════════════════════════════════════════════════════
303
- describe('isGitRepo', () => {
304
- it('returns true when .git exists', async () => {
305
- mockedFs.pathExists.mockResolvedValue(true);
306
- const result = await isGitRepo('/project');
307
- expect(result).toBe(true);
308
- expect(mockedFs.pathExists).toHaveBeenCalledWith(path.join('/project', '.git'));
309
- });
310
- it('returns false when .git does not exist', async () => {
311
- mockedFs.pathExists.mockResolvedValue(false);
312
- const result = await isGitRepo('/project');
313
- expect(result).toBe(false);
314
- });
315
- });
316
- //# sourceMappingURL=common.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.test.js","sourceRoot":"","sources":["../../src/lib/common.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"frontmatter.d.ts","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAiBtE;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;CAChB;AAID;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,IAAI,EAAE,OAAO,GAAG,OAAO,GACtB,eAAe,EAAE,CAiCnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAOvB;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,EAAE,CAAA;IAC/B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACxC,IAAI,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAE9B,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAA;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAEhD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAA4B,CAAA;QAC7D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAOD,MAAM,aAAa,GAAG,0BAA0B,CAAA;AAEhD;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,WAAoC,EACpC,IAAuB;IAEvB,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,yCAAyC;IACzC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,uCAAuC,EAAE,CAAC,CAAA;IAClF,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAA;QACzE,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAA;QACzF,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,IAAI,GAAG,WAAW,CAAC,aAAa,CAAC,CAAA;IACvC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,8CAA8C,EAAE,CAAC,CAAA;IAChG,CAAC;SAAM,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,4CAA4C,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED,6DAA6D;IAC7D,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,aAAa;YACpB,OAAO,EAAE,oEAAoE;SAC9E,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"frontmatter.test.d.ts","sourceRoot":"","sources":["../../src/lib/frontmatter.test.ts"],"names":[],"mappings":""}
@@ -1,257 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { parseFrontmatter, validateFrontmatter } from './frontmatter.js';
3
- // ═══════════════════════════════════════════════════════════════════════════════
4
- // parseFrontmatter
5
- // ═══════════════════════════════════════════════════════════════════════════════
6
- describe('parseFrontmatter', () => {
7
- it('parses valid frontmatter with content', () => {
8
- const raw = `---
9
- name: my-skill
10
- description: A test skill
11
- ---
12
- Some body content here.`;
13
- const result = parseFrontmatter(raw);
14
- expect(result).not.toBeNull();
15
- expect(result.data).toEqual({ name: 'my-skill', description: 'A test skill' });
16
- expect(result.content).toBe('Some body content here.');
17
- });
18
- it('returns null when no closing ---', () => {
19
- const raw = `---
20
- name: broken
21
- description: missing close`;
22
- expect(parseFrontmatter(raw)).toBeNull();
23
- });
24
- it('returns null for non-frontmatter text', () => {
25
- const raw = 'Just some regular markdown text.';
26
- expect(parseFrontmatter(raw)).toBeNull();
27
- });
28
- it('returns null for empty YAML block', () => {
29
- const raw = `---
30
- ---
31
- Body content`;
32
- // An empty YAML block parses to null, which triggers the null check
33
- expect(parseFrontmatter(raw)).toBeNull();
34
- });
35
- it('returns null for invalid YAML', () => {
36
- const raw = `---
37
- : : : invalid: [yaml
38
- ---
39
- Body`;
40
- expect(parseFrontmatter(raw)).toBeNull();
41
- });
42
- it('returns null when YAML parses to a non-object (string)', () => {
43
- const raw = `---
44
- just a string
45
- ---
46
- Body`;
47
- expect(parseFrontmatter(raw)).toBeNull();
48
- });
49
- it('returns null when YAML parses to null', () => {
50
- const raw = `---
51
- null
52
- ---
53
- Body`;
54
- expect(parseFrontmatter(raw)).toBeNull();
55
- });
56
- it('handles frontmatter with empty content body', () => {
57
- const raw = `---
58
- name: test
59
- ---`;
60
- const result = parseFrontmatter(raw);
61
- expect(result).not.toBeNull();
62
- expect(result.data).toEqual({ name: 'test' });
63
- expect(result.content).toBe('');
64
- });
65
- it('only uses first pair of --- delimiters', () => {
66
- const raw = `---
67
- name: first
68
- ---
69
- Some content
70
- ---
71
- name: second
72
- ---`;
73
- const result = parseFrontmatter(raw);
74
- expect(result).not.toBeNull();
75
- expect(result.data).toEqual({ name: 'first' });
76
- expect(result.content).toContain('name: second');
77
- });
78
- it('handles complex nested YAML', () => {
79
- const raw = `---
80
- name: complex-skill
81
- metadata:
82
- version: 1.2.3
83
- tags:
84
- - typescript
85
- - react
86
- config:
87
- nested: true
88
- count: 42
89
- ---
90
- Body content`;
91
- const result = parseFrontmatter(raw);
92
- expect(result).not.toBeNull();
93
- expect(result.data['name']).toBe('complex-skill');
94
- expect(result.data['metadata']).toEqual({
95
- version: '1.2.3',
96
- tags: ['typescript', 'react'],
97
- config: { nested: true, count: 42 },
98
- });
99
- });
100
- it('handles leading whitespace before frontmatter', () => {
101
- const raw = `
102
- ---
103
- name: trimmed
104
- ---
105
- Body`;
106
- const result = parseFrontmatter(raw);
107
- expect(result).not.toBeNull();
108
- expect(result.data['name']).toBe('trimmed');
109
- });
110
- it('verifies slice indices — content excludes closing delimiter', () => {
111
- const raw = `---
112
- key: value
113
- ---
114
- Exact content`;
115
- const result = parseFrontmatter(raw);
116
- expect(result).not.toBeNull();
117
- // Verify yamlBlock is trimmed correctly (no leading/trailing whitespace artifacts)
118
- expect(result.data).toEqual({ key: 'value' });
119
- // Content should be exactly what follows after the closing ---
120
- expect(result.content).toBe('Exact content');
121
- });
122
- it('trims whitespace from yaml block', () => {
123
- const raw = `---
124
- spaced: true
125
- ---
126
- Body`;
127
- const result = parseFrontmatter(raw);
128
- expect(result).not.toBeNull();
129
- expect(result.data).toEqual({ spaced: true });
130
- });
131
- it('rejects input starting with text then ---', () => {
132
- // This should NOT match — the --- must be at the very start (after trimStart)
133
- const raw = `text before
134
- ---
135
- name: test
136
- ---`;
137
- expect(parseFrontmatter(raw)).toBeNull();
138
- });
139
- });
140
- // ═══════════════════════════════════════════════════════════════════════════════
141
- // validateFrontmatter
142
- // ═══════════════════════════════════════════════════════════════════════════════
143
- describe('validateFrontmatter', () => {
144
- it('returns no errors for valid agent frontmatter', () => {
145
- const fm = { name: 'my-agent', description: 'A valid agent description' };
146
- const errors = validateFrontmatter(fm, 'agent');
147
- expect(errors).toEqual([]);
148
- });
149
- it('returns no errors for valid skill with Trigger:', () => {
150
- const fm = { name: 'my-skill', description: 'A valid skill. Trigger: when testing' };
151
- const errors = validateFrontmatter(fm, 'skill');
152
- expect(errors).toEqual([]);
153
- });
154
- it('returns error for missing name', () => {
155
- const fm = { description: 'Valid description here' };
156
- const errors = validateFrontmatter(fm, 'agent');
157
- expect(errors).toHaveLength(1);
158
- expect(errors[0].field).toBe('name');
159
- expect(errors[0].message).toContain('required');
160
- });
161
- it('returns error for non-string name', () => {
162
- const fm = { name: 42, description: 'Valid description here' };
163
- const errors = validateFrontmatter(fm, 'agent');
164
- expect(errors.some(e => e.field === 'name')).toBe(true);
165
- });
166
- it('returns error for name too short (1 char)', () => {
167
- const fm = { name: 'a', description: 'Valid description here' };
168
- const errors = validateFrontmatter(fm, 'agent');
169
- expect(errors.some(e => e.field === 'name' && e.message.includes('2-60'))).toBe(true);
170
- });
171
- it('accepts name exactly 2 chars', () => {
172
- const fm = { name: 'ab', description: 'Valid description here' };
173
- const errors = validateFrontmatter(fm, 'agent');
174
- expect(errors).toEqual([]);
175
- });
176
- it('accepts name exactly 60 chars', () => {
177
- const name = 'a'.repeat(60);
178
- const fm = { name, description: 'Valid description here' };
179
- const errors = validateFrontmatter(fm, 'agent');
180
- // Name is 60 'a's — valid length but fails kebab-case (no hyphens needed for single segment of lowercase)
181
- // Actually 'a' repeated 60 times IS valid kebab-case: /^[a-z0-9]+(-[a-z0-9]+)*$/
182
- expect(errors.filter(e => e.message.includes('2-60'))).toEqual([]);
183
- });
184
- it('returns error for name 61 chars', () => {
185
- const name = 'a'.repeat(61);
186
- const fm = { name, description: 'Valid description here' };
187
- const errors = validateFrontmatter(fm, 'agent');
188
- expect(errors.some(e => e.field === 'name' && e.message.includes('2-60'))).toBe(true);
189
- });
190
- it('returns error for uppercase name', () => {
191
- const fm = { name: 'MyAgent', description: 'Valid description here' };
192
- const errors = validateFrontmatter(fm, 'agent');
193
- expect(errors.some(e => e.field === 'name' && e.message.includes('kebab-case'))).toBe(true);
194
- });
195
- it('returns error for name with spaces', () => {
196
- const fm = { name: 'my agent', description: 'Valid description here' };
197
- const errors = validateFrontmatter(fm, 'agent');
198
- expect(errors.some(e => e.field === 'name' && e.message.includes('kebab-case'))).toBe(true);
199
- });
200
- it('returns error for missing description', () => {
201
- const fm = { name: 'my-agent' };
202
- const errors = validateFrontmatter(fm, 'agent');
203
- expect(errors.some(e => e.field === 'description')).toBe(true);
204
- });
205
- it('returns error for description too short (9 chars)', () => {
206
- const fm = { name: 'my-agent', description: '123456789' };
207
- const errors = validateFrontmatter(fm, 'agent');
208
- expect(errors.some(e => e.field === 'description' && e.message.includes('10'))).toBe(true);
209
- });
210
- it('accepts description exactly 10 chars', () => {
211
- const fm = { name: 'my-agent', description: '1234567890' };
212
- const errors = validateFrontmatter(fm, 'agent');
213
- expect(errors.filter(e => e.field === 'description')).toEqual([]);
214
- });
215
- it('returns error for skill without Trigger:', () => {
216
- const fm = { name: 'my-skill', description: 'A valid skill description' };
217
- const errors = validateFrontmatter(fm, 'skill');
218
- expect(errors.some(e => e.field === 'description' && e.message.includes('Trigger:'))).toBe(true);
219
- });
220
- it('returns no Trigger: error for agent type', () => {
221
- const fm = { name: 'my-agent', description: 'A valid agent description' };
222
- const errors = validateFrontmatter(fm, 'agent');
223
- expect(errors.some(e => e.message.includes('Trigger:'))).toBe(false);
224
- });
225
- it('returns error for empty string name', () => {
226
- const fm = { name: '', description: 'Valid description here' };
227
- const errors = validateFrontmatter(fm, 'agent');
228
- expect(errors.some(e => e.field === 'name')).toBe(true);
229
- });
230
- it('returns error for empty string description', () => {
231
- const fm = { name: 'my-agent', description: '' };
232
- const errors = validateFrontmatter(fm, 'agent');
233
- expect(errors.some(e => e.field === 'description')).toBe(true);
234
- });
235
- it('returns multiple errors for multiple violations', () => {
236
- const fm = { name: 'AB', description: 'short' };
237
- const errors = validateFrontmatter(fm, 'skill');
238
- // Name is uppercase → kebab error, description < 10 → length error, no Trigger: → skill error
239
- expect(errors.length).toBeGreaterThanOrEqual(2);
240
- });
241
- it('validates name with numbers in kebab-case', () => {
242
- const fm = { name: 'my-skill-v2', description: 'A valid description for testing' };
243
- const errors = validateFrontmatter(fm, 'agent');
244
- expect(errors).toEqual([]);
245
- });
246
- it('rejects name starting with hyphen', () => {
247
- const fm = { name: '-invalid', description: 'A valid description for testing' };
248
- const errors = validateFrontmatter(fm, 'agent');
249
- expect(errors.some(e => e.field === 'name' && e.message.includes('kebab-case'))).toBe(true);
250
- });
251
- it('rejects name ending with hyphen', () => {
252
- const fm = { name: 'invalid-', description: 'A valid description for testing' };
253
- const errors = validateFrontmatter(fm, 'agent');
254
- expect(errors.some(e => e.field === 'name' && e.message.includes('kebab-case'))).toBe(true);
255
- });
256
- });
257
- //# sourceMappingURL=frontmatter.test.js.map