@famgia/omnify-ai-guides 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -0
- package/dist/chunk-RCTEXK7C.js +549 -0
- package/dist/chunk-RCTEXK7C.js.map +1 -0
- package/dist/config/rules.yaml +524 -0
- package/dist/index.cjs +587 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +55 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/agents/architect.md.stub +150 -0
- package/dist/knowledge/agents/developer.md.stub +190 -0
- package/dist/knowledge/agents/reviewer.md.stub +134 -0
- package/dist/knowledge/agents/tester.md.stub +196 -0
- package/dist/knowledge/checklists/backend.md.stub +112 -0
- package/dist/knowledge/checklists/react.md.stub +108 -0
- package/dist/knowledge/claude-rules/laravel-controllers.md.stub +57 -0
- package/dist/knowledge/claude-rules/laravel-migrations.md.stub +47 -0
- package/dist/knowledge/claude-rules/laravel-tests.md.stub +52 -0
- package/dist/knowledge/claude-rules/naming.md.stub +369 -0
- package/dist/knowledge/claude-rules/performance.md.stub +256 -0
- package/dist/knowledge/claude-rules/php-standards.md.stub +305 -0
- package/dist/knowledge/claude-rules/react-components.md.stub +67 -0
- package/dist/knowledge/claude-rules/schema-yaml.md.stub +83 -0
- package/dist/knowledge/claude-rules/security.md.stub +164 -0
- package/dist/knowledge/cursor-rules/antd-deprecations.mdc.stub +62 -0
- package/dist/knowledge/cursor-rules/basemodel-readonly.mdc.stub +66 -0
- package/dist/knowledge/cursor-rules/baserequest-readonly.mdc.stub +74 -0
- package/dist/knowledge/cursor-rules/baseresource-readonly.mdc.stub +78 -0
- package/dist/knowledge/cursor-rules/laravel-controller.mdc.stub +421 -0
- package/dist/knowledge/cursor-rules/laravel-request.mdc.stub +112 -0
- package/dist/knowledge/cursor-rules/laravel-resource.mdc.stub +73 -0
- package/dist/knowledge/cursor-rules/laravel-review.mdc.stub +69 -0
- package/dist/knowledge/cursor-rules/laravel-testing.mdc.stub +138 -0
- package/dist/knowledge/cursor-rules/laravel.mdc.stub +138 -0
- package/dist/knowledge/cursor-rules/migrations-workflow.mdc.stub +224 -0
- package/dist/knowledge/cursor-rules/model-editable.mdc.stub +120 -0
- package/dist/knowledge/cursor-rules/omnify-migrations.mdc.stub +109 -0
- package/dist/knowledge/cursor-rules/omnify-schema.mdc.stub +358 -0
- package/dist/knowledge/cursor-rules/omnify.mdc.stub +58 -0
- package/dist/knowledge/cursor-rules/react-design.mdc.stub +693 -0
- package/dist/knowledge/cursor-rules/react-form.mdc.stub +292 -0
- package/dist/knowledge/cursor-rules/react-services.mdc.stub +304 -0
- package/dist/knowledge/cursor-rules/react.mdc.stub +336 -0
- package/dist/knowledge/cursor-rules/request-editable.mdc.stub +111 -0
- package/dist/knowledge/cursor-rules/resource-editable.mdc.stub +125 -0
- package/dist/knowledge/cursor-rules/schema-create.mdc.stub +440 -0
- package/dist/knowledge/cursor-rules/validation-rules.mdc.stub +181 -0
- package/dist/knowledge/laravel/README.md.stub +59 -0
- package/dist/knowledge/laravel/architecture.md.stub +424 -0
- package/dist/knowledge/laravel/authentication.md.stub +588 -0
- package/dist/knowledge/laravel/controller.md.stub +484 -0
- package/dist/knowledge/laravel/datetime.md.stub +334 -0
- package/dist/knowledge/laravel/migrations-team.md.stub +376 -0
- package/dist/knowledge/laravel/openapi.md.stub +449 -0
- package/dist/knowledge/laravel/request.md.stub +450 -0
- package/dist/knowledge/laravel/resource.md.stub +516 -0
- package/dist/knowledge/laravel/service.md.stub +503 -0
- package/dist/knowledge/laravel/testing.md.stub +1504 -0
- package/dist/knowledge/omnify/antdesign-guide.md.stub +401 -0
- package/dist/knowledge/omnify/config-guide.md.stub +405 -0
- package/dist/knowledge/omnify/japan-guide.md.stub +186 -0
- package/dist/knowledge/omnify/laravel-guide.md.stub +61 -0
- package/dist/knowledge/omnify/partial-schema-guide.md.stub +353 -0
- package/dist/knowledge/omnify/react-form-guide.md.stub +225 -0
- package/dist/knowledge/omnify/schema-guide.md.stub +144 -0
- package/dist/knowledge/omnify/typescript-guide.md.stub +337 -0
- package/dist/knowledge/react/README.md.stub +221 -0
- package/dist/knowledge/react/antd-guide.md +528 -0
- package/dist/knowledge/react/antd-guide.md.stub +528 -0
- package/dist/knowledge/react/checklist.md.stub +108 -0
- package/dist/knowledge/react/datetime-guide.md.stub +137 -0
- package/dist/knowledge/react/design-philosophy.md.stub +363 -0
- package/dist/knowledge/react/i18n-guide.md.stub +211 -0
- package/dist/knowledge/react/laravel-integration.md.stub +181 -0
- package/dist/knowledge/react/service-pattern.md.stub +180 -0
- package/dist/knowledge/react/tanstack-query.md.stub +339 -0
- package/dist/knowledge/react/types-guide.md +669 -0
- package/dist/knowledge/react/types-guide.md.stub +669 -0
- package/dist/knowledge/workflows/bug-fix.md.stub +201 -0
- package/dist/knowledge/workflows/code-review.md.stub +164 -0
- package/dist/knowledge/workflows/new-feature.md.stub +327 -0
- package/dist/plugin-M95GyBll.d.cts +191 -0
- package/dist/plugin-M95GyBll.d.ts +191 -0
- package/dist/plugin.cjs +573 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.d.cts +2 -0
- package/dist/plugin.d.ts +2 -0
- package/dist/plugin.js +15 -0
- package/dist/plugin.js.map +1 -0
- package/package.json +53 -0
package/dist/plugin.cjs
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/plugin.ts
|
|
21
|
+
var plugin_exports = {};
|
|
22
|
+
__export(plugin_exports, {
|
|
23
|
+
default: () => aiGuidesPlugin,
|
|
24
|
+
generateAIGuides: () => generateAIGuides,
|
|
25
|
+
getAvailableAdapters: () => getAvailableAdapters,
|
|
26
|
+
getAvailableCategories: () => getAvailableCategories,
|
|
27
|
+
shouldGenerateAIGuides: () => shouldGenerateAIGuides
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(plugin_exports);
|
|
30
|
+
var import_node_fs2 = require("fs");
|
|
31
|
+
|
|
32
|
+
// src/generator.ts
|
|
33
|
+
var import_node_fs = require("fs");
|
|
34
|
+
var import_node_path = require("path");
|
|
35
|
+
var import_node_url = require("url");
|
|
36
|
+
var import_yaml = require("yaml");
|
|
37
|
+
|
|
38
|
+
// src/adapters/cursor.ts
|
|
39
|
+
function replacePlaceholders(content, placeholders) {
|
|
40
|
+
let result = content;
|
|
41
|
+
for (const [key, value] of Object.entries(placeholders)) {
|
|
42
|
+
result = result.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
var cursorAdapter = {
|
|
47
|
+
name: "cursor",
|
|
48
|
+
outputDir: ".cursor/rules/omnify",
|
|
49
|
+
transform(content, rule, placeholders) {
|
|
50
|
+
const target = rule.targets.cursor;
|
|
51
|
+
let transformedContent = replacePlaceholders(content, placeholders);
|
|
52
|
+
if (transformedContent.startsWith("---")) {
|
|
53
|
+
return transformedContent;
|
|
54
|
+
}
|
|
55
|
+
const description = target?.description || "";
|
|
56
|
+
const globs = target?.globs || [];
|
|
57
|
+
const alwaysApply = target?.alwaysApply ?? false;
|
|
58
|
+
const frontmatter = `---
|
|
59
|
+
description: "${description}"
|
|
60
|
+
globs: ${JSON.stringify(globs)}
|
|
61
|
+
alwaysApply: ${alwaysApply}
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
`;
|
|
65
|
+
return frontmatter + transformedContent;
|
|
66
|
+
},
|
|
67
|
+
getFilename(rule) {
|
|
68
|
+
const target = rule.targets.cursor;
|
|
69
|
+
if (target?.filename) {
|
|
70
|
+
return target.filename;
|
|
71
|
+
}
|
|
72
|
+
return `${rule.id}.mdc`;
|
|
73
|
+
},
|
|
74
|
+
isEnabled(rule) {
|
|
75
|
+
const target = rule.targets.cursor;
|
|
76
|
+
return target?.enabled ?? false;
|
|
77
|
+
},
|
|
78
|
+
getOutputPath(rule) {
|
|
79
|
+
const filename = this.getFilename(rule);
|
|
80
|
+
return filename;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// src/adapters/claude.ts
|
|
85
|
+
function replacePlaceholders2(content, placeholders) {
|
|
86
|
+
let result = content;
|
|
87
|
+
for (const [key, value] of Object.entries(placeholders)) {
|
|
88
|
+
result = result.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
|
|
89
|
+
}
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
var claudeAdapter = {
|
|
93
|
+
name: "claude",
|
|
94
|
+
outputDir: ".claude/omnify",
|
|
95
|
+
transform(content, _rule, placeholders) {
|
|
96
|
+
return replacePlaceholders2(content, placeholders);
|
|
97
|
+
},
|
|
98
|
+
getFilename(rule) {
|
|
99
|
+
const target = rule.targets.claude;
|
|
100
|
+
if (target?.filename) {
|
|
101
|
+
return target.filename;
|
|
102
|
+
}
|
|
103
|
+
return `${rule.id}.md`;
|
|
104
|
+
},
|
|
105
|
+
isEnabled(rule) {
|
|
106
|
+
const target = rule.targets.claude;
|
|
107
|
+
return target?.enabled ?? false;
|
|
108
|
+
},
|
|
109
|
+
getOutputPath(rule) {
|
|
110
|
+
const target = rule.targets.claude;
|
|
111
|
+
const filename = this.getFilename(rule);
|
|
112
|
+
const subdir = target?.subdir || rule.category;
|
|
113
|
+
if (subdir) {
|
|
114
|
+
return `${subdir}/${filename}`;
|
|
115
|
+
}
|
|
116
|
+
return filename;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// src/adapters/antigravity.ts
|
|
121
|
+
function replacePlaceholders3(content, placeholders) {
|
|
122
|
+
let result = content;
|
|
123
|
+
for (const [key, value] of Object.entries(placeholders)) {
|
|
124
|
+
result = result.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
var antigravityAdapter = {
|
|
129
|
+
name: "antigravity",
|
|
130
|
+
outputDir: ".agent/rules/omnify",
|
|
131
|
+
transform(content, rule, placeholders) {
|
|
132
|
+
const target = rule.targets.antigravity;
|
|
133
|
+
let transformedContent = replacePlaceholders3(content, placeholders);
|
|
134
|
+
if (transformedContent.startsWith("---")) {
|
|
135
|
+
const endIndex = transformedContent.indexOf("---", 3);
|
|
136
|
+
if (endIndex !== -1) {
|
|
137
|
+
const existingFrontmatter = transformedContent.substring(3, endIndex).trim();
|
|
138
|
+
const bodyContent = transformedContent.substring(endIndex + 3).trim();
|
|
139
|
+
const antigravityFrontmatter = buildAntigravityFrontmatter(rule, target, existingFrontmatter);
|
|
140
|
+
return `---
|
|
141
|
+
${antigravityFrontmatter}---
|
|
142
|
+
|
|
143
|
+
${bodyContent}`;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
const frontmatter = buildAntigravityFrontmatter(rule, target);
|
|
147
|
+
return `---
|
|
148
|
+
${frontmatter}---
|
|
149
|
+
|
|
150
|
+
${transformedContent}`;
|
|
151
|
+
},
|
|
152
|
+
getFilename(rule) {
|
|
153
|
+
const target = rule.targets.antigravity;
|
|
154
|
+
if (target?.filename) {
|
|
155
|
+
return target.filename;
|
|
156
|
+
}
|
|
157
|
+
return `${rule.id}.md`;
|
|
158
|
+
},
|
|
159
|
+
isEnabled(rule) {
|
|
160
|
+
const target = rule.targets.antigravity;
|
|
161
|
+
return target?.enabled ?? false;
|
|
162
|
+
},
|
|
163
|
+
getOutputPath(rule) {
|
|
164
|
+
const filename = this.getFilename(rule);
|
|
165
|
+
return filename;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
function buildAntigravityFrontmatter(rule, target, existingFrontmatter) {
|
|
169
|
+
const lines = [];
|
|
170
|
+
lines.push(`id: ${rule.id}`);
|
|
171
|
+
const description = target?.description || extractDescription(existingFrontmatter) || rule.id;
|
|
172
|
+
lines.push(`description: "${description}"`);
|
|
173
|
+
const priority = target?.priority || "medium";
|
|
174
|
+
lines.push(`priority: ${priority}`);
|
|
175
|
+
const globs = target?.globs || extractGlobs(existingFrontmatter) || [];
|
|
176
|
+
if (globs.length > 0) {
|
|
177
|
+
lines.push(`globs:`);
|
|
178
|
+
for (const glob of globs) {
|
|
179
|
+
lines.push(` - "${glob}"`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
const tags = target?.tags || inferTags(rule);
|
|
183
|
+
if (tags.length > 0) {
|
|
184
|
+
lines.push(`tags:`);
|
|
185
|
+
for (const tag of tags) {
|
|
186
|
+
lines.push(` - ${tag}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return lines.join("\n") + "\n";
|
|
190
|
+
}
|
|
191
|
+
function extractDescription(frontmatter) {
|
|
192
|
+
if (!frontmatter) return void 0;
|
|
193
|
+
const match = frontmatter.match(/description:\s*["']?([^"'\n]+)["']?/);
|
|
194
|
+
return match?.[1];
|
|
195
|
+
}
|
|
196
|
+
function extractGlobs(frontmatter) {
|
|
197
|
+
if (!frontmatter) return [];
|
|
198
|
+
const match = frontmatter.match(/globs:\s*\[([^\]]+)\]/);
|
|
199
|
+
if (match?.[1]) {
|
|
200
|
+
return match[1].split(",").map((g) => g.trim().replace(/["']/g, ""));
|
|
201
|
+
}
|
|
202
|
+
return [];
|
|
203
|
+
}
|
|
204
|
+
function inferTags(rule) {
|
|
205
|
+
const tags = [];
|
|
206
|
+
if (rule.category) {
|
|
207
|
+
const parts = rule.category.split("/");
|
|
208
|
+
tags.push(...parts.filter((p) => p !== "guides"));
|
|
209
|
+
}
|
|
210
|
+
if (rule.id.includes("laravel")) tags.push("laravel");
|
|
211
|
+
if (rule.id.includes("react")) tags.push("react");
|
|
212
|
+
if (rule.id.includes("schema")) tags.push("schema");
|
|
213
|
+
if (rule.id.includes("omnify")) tags.push("omnify");
|
|
214
|
+
return [...new Set(tags)];
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// src/adapters/index.ts
|
|
218
|
+
var allAdapters = [cursorAdapter, claudeAdapter, antigravityAdapter];
|
|
219
|
+
function getAdapters(names) {
|
|
220
|
+
if (!names || names.length === 0) {
|
|
221
|
+
return allAdapters;
|
|
222
|
+
}
|
|
223
|
+
return allAdapters.filter((a) => names.includes(a.name));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// src/generator.ts
|
|
227
|
+
var import_meta = {};
|
|
228
|
+
var __filename = (0, import_node_url.fileURLToPath)(import_meta.url);
|
|
229
|
+
var __dirname = (0, import_node_path.dirname)(__filename);
|
|
230
|
+
function getKnowledgeDir() {
|
|
231
|
+
const possiblePaths = [
|
|
232
|
+
// Dev: running in src
|
|
233
|
+
(0, import_node_path.resolve)(__dirname, "knowledge"),
|
|
234
|
+
// Dist: running from dist/
|
|
235
|
+
(0, import_node_path.resolve)(__dirname, "../knowledge"),
|
|
236
|
+
// Installed package: in node_modules
|
|
237
|
+
(0, import_node_path.resolve)(__dirname, "../../knowledge")
|
|
238
|
+
];
|
|
239
|
+
for (const path of possiblePaths) {
|
|
240
|
+
if ((0, import_node_fs.existsSync)(path)) {
|
|
241
|
+
return path;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
throw new Error(`AI guides knowledge directory not found. Tried: ${possiblePaths.join(", ")}`);
|
|
245
|
+
}
|
|
246
|
+
function getConfigDir() {
|
|
247
|
+
const possiblePaths = [
|
|
248
|
+
// Dev: running in src
|
|
249
|
+
(0, import_node_path.resolve)(__dirname, "config"),
|
|
250
|
+
// Dist: running from dist/
|
|
251
|
+
(0, import_node_path.resolve)(__dirname, "../config"),
|
|
252
|
+
// Installed package: in node_modules
|
|
253
|
+
(0, import_node_path.resolve)(__dirname, "../../config")
|
|
254
|
+
];
|
|
255
|
+
for (const path of possiblePaths) {
|
|
256
|
+
if ((0, import_node_fs.existsSync)(path)) {
|
|
257
|
+
return path;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
throw new Error(`AI guides config directory not found. Tried: ${possiblePaths.join(", ")}`);
|
|
261
|
+
}
|
|
262
|
+
function loadRulesConfig() {
|
|
263
|
+
const configDir = getConfigDir();
|
|
264
|
+
const rulesPath = (0, import_node_path.join)(configDir, "rules.yaml");
|
|
265
|
+
if (!(0, import_node_fs.existsSync)(rulesPath)) {
|
|
266
|
+
throw new Error(`Rules config not found: ${rulesPath}`);
|
|
267
|
+
}
|
|
268
|
+
const content = (0, import_node_fs.readFileSync)(rulesPath, "utf-8");
|
|
269
|
+
return (0, import_yaml.parse)(content);
|
|
270
|
+
}
|
|
271
|
+
function loadKnowledgeFile(source) {
|
|
272
|
+
const knowledgeDir = getKnowledgeDir();
|
|
273
|
+
const filePath = (0, import_node_path.join)(knowledgeDir, source);
|
|
274
|
+
if (!(0, import_node_fs.existsSync)(filePath)) {
|
|
275
|
+
throw new Error(`Knowledge file not found: ${filePath}`);
|
|
276
|
+
}
|
|
277
|
+
return (0, import_node_fs.readFileSync)(filePath, "utf-8");
|
|
278
|
+
}
|
|
279
|
+
function replacePlaceholders4(content, placeholders) {
|
|
280
|
+
let result = content;
|
|
281
|
+
for (const [key, value] of Object.entries(placeholders)) {
|
|
282
|
+
result = result.replace(new RegExp(`\\{\\{${key}\\}\\}`, "g"), value);
|
|
283
|
+
}
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
function writeOutputFile(filePath, content, dryRun) {
|
|
287
|
+
if (dryRun) {
|
|
288
|
+
console.log(`[DRY RUN] Would write: ${filePath}`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const dir = (0, import_node_path.dirname)(filePath);
|
|
292
|
+
if (!(0, import_node_fs.existsSync)(dir)) {
|
|
293
|
+
(0, import_node_fs.mkdirSync)(dir, { recursive: true });
|
|
294
|
+
}
|
|
295
|
+
(0, import_node_fs.writeFileSync)(filePath, content);
|
|
296
|
+
}
|
|
297
|
+
function matchesCategory(ruleCategory, categories) {
|
|
298
|
+
if (!categories || categories.length === 0) {
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
const parts = ruleCategory.split("/");
|
|
302
|
+
const category = parts[parts.length - 1];
|
|
303
|
+
return categories.includes(category);
|
|
304
|
+
}
|
|
305
|
+
function sourceMatchesCategory(source, categories) {
|
|
306
|
+
if (!categories || categories.length === 0) {
|
|
307
|
+
return true;
|
|
308
|
+
}
|
|
309
|
+
const filename = (0, import_node_path.basename)(source).toLowerCase();
|
|
310
|
+
for (const category of categories) {
|
|
311
|
+
if (filename.startsWith(category)) {
|
|
312
|
+
return true;
|
|
313
|
+
}
|
|
314
|
+
if (source.includes(`/${category}/`) || source.startsWith(`${category}/`)) {
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
if (categories.includes("react")) {
|
|
319
|
+
if (filename.startsWith("react") || filename.includes("antd")) {
|
|
320
|
+
return true;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (categories.includes("omnify")) {
|
|
324
|
+
if (filename.startsWith("omnify") || filename.startsWith("schema") || filename.startsWith("validation") || filename.includes("migration")) {
|
|
325
|
+
return true;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
function generateAIGuides(rootDir, options = {}) {
|
|
331
|
+
const config = loadRulesConfig();
|
|
332
|
+
const adapters = getAdapters(options.adapters);
|
|
333
|
+
const dryRun = options.dryRun ?? false;
|
|
334
|
+
const categories = options.categories;
|
|
335
|
+
const placeholders = {
|
|
336
|
+
...config.placeholders,
|
|
337
|
+
...options.placeholders
|
|
338
|
+
};
|
|
339
|
+
const result = {
|
|
340
|
+
counts: {},
|
|
341
|
+
files: []
|
|
342
|
+
};
|
|
343
|
+
for (const adapter of adapters) {
|
|
344
|
+
result.counts[adapter.name] = 0;
|
|
345
|
+
}
|
|
346
|
+
for (const rule of config.guides) {
|
|
347
|
+
if (!matchesCategory(rule.category, categories)) {
|
|
348
|
+
continue;
|
|
349
|
+
}
|
|
350
|
+
try {
|
|
351
|
+
const content = loadKnowledgeFile(rule.source);
|
|
352
|
+
for (const adapter of adapters) {
|
|
353
|
+
if (!adapter.isEnabled(rule)) {
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
const transformed = adapter.transform(content, rule, placeholders);
|
|
357
|
+
const outputPath = adapter.getOutputPath(rule);
|
|
358
|
+
const fullPath = (0, import_node_path.resolve)(rootDir, adapter.outputDir, outputPath);
|
|
359
|
+
writeOutputFile(fullPath, transformed, dryRun);
|
|
360
|
+
result.files.push(fullPath);
|
|
361
|
+
result.counts[adapter.name] = (result.counts[adapter.name] ?? 0) + 1;
|
|
362
|
+
}
|
|
363
|
+
} catch (error) {
|
|
364
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
365
|
+
result.errors = result.errors ?? [];
|
|
366
|
+
result.errors.push(`Error processing ${rule.id}: ${message}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
const cursorAdapter2 = adapters.find((a) => a.name === "cursor");
|
|
370
|
+
if (cursorAdapter2 && config.cursorRules) {
|
|
371
|
+
for (const rule of config.cursorRules) {
|
|
372
|
+
if (!sourceMatchesCategory(rule.source, categories)) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
try {
|
|
376
|
+
const content = loadKnowledgeFile(rule.source);
|
|
377
|
+
const transformed = replacePlaceholders4(content, placeholders);
|
|
378
|
+
const filename = (0, import_node_path.basename)(rule.source).replace(".mdc.stub", ".mdc").replace(".md.stub", ".md");
|
|
379
|
+
const fullPath = (0, import_node_path.resolve)(rootDir, cursorAdapter2.outputDir, filename);
|
|
380
|
+
writeOutputFile(fullPath, transformed, dryRun);
|
|
381
|
+
result.files.push(fullPath);
|
|
382
|
+
result.counts[cursorAdapter2.name] = (result.counts[cursorAdapter2.name] ?? 0) + 1;
|
|
383
|
+
} catch (error) {
|
|
384
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
385
|
+
result.errors = result.errors ?? [];
|
|
386
|
+
result.errors.push(`Error processing cursor rule ${rule.source}: ${message}`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
const claudeAdapter2 = adapters.find((a) => a.name === "claude");
|
|
391
|
+
if (claudeAdapter2 && config.claudeRules) {
|
|
392
|
+
for (const rule of config.claudeRules) {
|
|
393
|
+
if (!sourceMatchesCategory(rule.source, categories)) {
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
try {
|
|
397
|
+
const content = loadKnowledgeFile(rule.source);
|
|
398
|
+
const strippedContent = stripFrontmatter(content);
|
|
399
|
+
const transformed = replacePlaceholders4(strippedContent, placeholders);
|
|
400
|
+
const filename = (0, import_node_path.basename)(rule.source).replace(".mdc.stub", ".mdc").replace(".md.stub", ".md").replace(".mdc", ".md");
|
|
401
|
+
const fullPath = (0, import_node_path.resolve)(rootDir, ".claude/rules/omnify", filename);
|
|
402
|
+
writeOutputFile(fullPath, transformed, dryRun);
|
|
403
|
+
result.files.push(fullPath);
|
|
404
|
+
result.counts[claudeAdapter2.name] = (result.counts[claudeAdapter2.name] ?? 0) + 1;
|
|
405
|
+
} catch (error) {
|
|
406
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
407
|
+
result.errors = result.errors ?? [];
|
|
408
|
+
result.errors.push(`Error processing claude rule ${rule.source}: ${message}`);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
const antigravityAdapterInstance = adapters.find((a) => a.name === "antigravity");
|
|
413
|
+
if (antigravityAdapterInstance && config.antigravityRules) {
|
|
414
|
+
for (const rule of config.antigravityRules) {
|
|
415
|
+
if (!sourceMatchesCategory(rule.source, categories)) {
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
try {
|
|
419
|
+
const content = loadKnowledgeFile(rule.source);
|
|
420
|
+
const transformed = transformForAntigravity(content, rule, placeholders);
|
|
421
|
+
const filename = (0, import_node_path.basename)(rule.source).replace(".mdc.stub", ".mdc").replace(".md.stub", ".md").replace(".mdc", ".md");
|
|
422
|
+
const fullPath = (0, import_node_path.resolve)(rootDir, antigravityAdapterInstance.outputDir, filename);
|
|
423
|
+
writeOutputFile(fullPath, transformed, dryRun);
|
|
424
|
+
result.files.push(fullPath);
|
|
425
|
+
result.counts[antigravityAdapterInstance.name] = (result.counts[antigravityAdapterInstance.name] ?? 0) + 1;
|
|
426
|
+
} catch (error) {
|
|
427
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
428
|
+
result.errors = result.errors ?? [];
|
|
429
|
+
result.errors.push(`Error processing antigravity rule ${rule.source}: ${message}`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return result;
|
|
434
|
+
}
|
|
435
|
+
function transformForAntigravity(content, rule, placeholders) {
|
|
436
|
+
let transformed = replacePlaceholders4(content, placeholders);
|
|
437
|
+
if (transformed.startsWith("---")) {
|
|
438
|
+
const endIndex = transformed.indexOf("---", 3);
|
|
439
|
+
if (endIndex !== -1) {
|
|
440
|
+
const existingFrontmatter = transformed.substring(3, endIndex).trim();
|
|
441
|
+
const bodyContent = transformed.substring(endIndex + 3).trim();
|
|
442
|
+
const id = (0, import_node_path.basename)(rule.source).replace(".mdc.stub", "").replace(".md.stub", "").replace(".mdc", "").replace(".md", "");
|
|
443
|
+
const description = extractYamlValue(existingFrontmatter, "description") || id;
|
|
444
|
+
const globs = extractYamlArray(existingFrontmatter, "globs");
|
|
445
|
+
const priority = rule.priority || "medium";
|
|
446
|
+
const tags = rule.tags || [];
|
|
447
|
+
const lines = [`id: ${id}`, `description: "${description}"`, `priority: ${priority}`];
|
|
448
|
+
if (globs.length > 0) {
|
|
449
|
+
lines.push("globs:");
|
|
450
|
+
for (const glob of globs) {
|
|
451
|
+
lines.push(` - "${glob}"`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (tags.length > 0) {
|
|
455
|
+
lines.push("tags:");
|
|
456
|
+
for (const tag of tags) {
|
|
457
|
+
lines.push(` - ${tag}`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
return `---
|
|
461
|
+
${lines.join("\n")}
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
${bodyContent}`;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
return transformed;
|
|
468
|
+
}
|
|
469
|
+
function extractYamlValue(yaml, key) {
|
|
470
|
+
const match = yaml.match(new RegExp(`${key}:\\s*["']?([^"'\\n]+)["']?`));
|
|
471
|
+
return match?.[1]?.trim();
|
|
472
|
+
}
|
|
473
|
+
function extractYamlArray(yaml, key) {
|
|
474
|
+
const match = yaml.match(new RegExp(`${key}:\\s*\\[([^\\]]+)\\]`));
|
|
475
|
+
if (match?.[1]) {
|
|
476
|
+
return match[1].split(",").map((g) => g.trim().replace(/["']/g, ""));
|
|
477
|
+
}
|
|
478
|
+
return [];
|
|
479
|
+
}
|
|
480
|
+
function stripFrontmatter(content) {
|
|
481
|
+
if (!content.startsWith("---")) {
|
|
482
|
+
return content;
|
|
483
|
+
}
|
|
484
|
+
const endIndex = content.indexOf("---", 3);
|
|
485
|
+
if (endIndex === -1) {
|
|
486
|
+
return content;
|
|
487
|
+
}
|
|
488
|
+
return content.substring(endIndex + 3).trim();
|
|
489
|
+
}
|
|
490
|
+
function shouldGenerateAIGuides(rootDir) {
|
|
491
|
+
const claudeDir = (0, import_node_path.resolve)(rootDir, ".claude/omnify/guides");
|
|
492
|
+
const cursorDir = (0, import_node_path.resolve)(rootDir, ".cursor/rules/omnify");
|
|
493
|
+
if (!(0, import_node_fs.existsSync)(claudeDir) || !(0, import_node_fs.existsSync)(cursorDir)) {
|
|
494
|
+
return true;
|
|
495
|
+
}
|
|
496
|
+
try {
|
|
497
|
+
const claudeFiles = (0, import_node_fs.readdirSync)(claudeDir, { recursive: true });
|
|
498
|
+
const cursorFiles = (0, import_node_fs.readdirSync)(cursorDir);
|
|
499
|
+
return claudeFiles.length === 0 || cursorFiles.length === 0;
|
|
500
|
+
} catch {
|
|
501
|
+
return true;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
function getAvailableAdapters() {
|
|
505
|
+
return getAdapters().map((a) => a.name);
|
|
506
|
+
}
|
|
507
|
+
function getAvailableCategories() {
|
|
508
|
+
return ["omnify", "laravel", "react"];
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// src/plugin.ts
|
|
512
|
+
var import_meta2 = {};
|
|
513
|
+
function getPluginVersion() {
|
|
514
|
+
try {
|
|
515
|
+
const pkgPath = new URL("../package.json", import_meta2.url);
|
|
516
|
+
const pkgContent = (0, import_node_fs2.readFileSync)(pkgPath, "utf-8");
|
|
517
|
+
const pkg = JSON.parse(pkgContent);
|
|
518
|
+
return pkg.version;
|
|
519
|
+
} catch {
|
|
520
|
+
return "0.0.0";
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
function aiGuidesPlugin(options = {}) {
|
|
524
|
+
const resolvedOptions = {
|
|
525
|
+
categories: options.categories ?? getAvailableCategories(),
|
|
526
|
+
laravelBasePath: options.laravelBasePath ?? "app",
|
|
527
|
+
typescriptBasePath: options.typescriptBasePath ?? "resources/ts",
|
|
528
|
+
adapters: options.adapters
|
|
529
|
+
};
|
|
530
|
+
return {
|
|
531
|
+
name: "@famgia/omnify-ai-guides",
|
|
532
|
+
version: getPluginVersion(),
|
|
533
|
+
generators: [
|
|
534
|
+
{
|
|
535
|
+
name: "ai-guides",
|
|
536
|
+
description: "Generate AI assistant guides (Cursor, Claude, Antigravity)",
|
|
537
|
+
generate: async (ctx) => {
|
|
538
|
+
const result = generateAIGuides(ctx.cwd, {
|
|
539
|
+
categories: resolvedOptions.categories,
|
|
540
|
+
adapters: resolvedOptions.adapters,
|
|
541
|
+
placeholders: {
|
|
542
|
+
LARAVEL_BASE: resolvedOptions.laravelBasePath,
|
|
543
|
+
LARAVEL_ROOT: "",
|
|
544
|
+
TYPESCRIPT_BASE: resolvedOptions.typescriptBasePath
|
|
545
|
+
}
|
|
546
|
+
});
|
|
547
|
+
const claudeCount = result.counts["claude"] || 0;
|
|
548
|
+
const cursorCount = result.counts["cursor"] || 0;
|
|
549
|
+
const antigravityCount = result.counts["antigravity"] || 0;
|
|
550
|
+
const parts = [];
|
|
551
|
+
if (claudeCount > 0) parts.push(`${claudeCount} Claude`);
|
|
552
|
+
if (cursorCount > 0) parts.push(`${cursorCount} Cursor`);
|
|
553
|
+
if (antigravityCount > 0) parts.push(`${antigravityCount} Antigravity`);
|
|
554
|
+
ctx.logger.info(`Generated ${parts.join(", ")} files`);
|
|
555
|
+
if (result.errors?.length) {
|
|
556
|
+
for (const error of result.errors) {
|
|
557
|
+
ctx.logger.warn(error);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
return [];
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
]
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
567
|
+
0 && (module.exports = {
|
|
568
|
+
generateAIGuides,
|
|
569
|
+
getAvailableAdapters,
|
|
570
|
+
getAvailableCategories,
|
|
571
|
+
shouldGenerateAIGuides
|
|
572
|
+
});
|
|
573
|
+
//# sourceMappingURL=plugin.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts","../src/generator.ts","../src/adapters/cursor.ts","../src/adapters/claude.ts","../src/adapters/antigravity.ts","../src/adapters/index.ts"],"sourcesContent":["/**\n * AI Guides Plugin for Omnify\n *\n * Generates AI guides for Cursor, Claude, and Antigravity\n */\n\nimport { readFileSync } from 'node:fs';\nimport type { OmnifyPlugin, GeneratorContext, GeneratorOutput } from '@famgia/omnify-types';\nimport { generateAIGuides, getAvailableCategories } from './generator.js';\nimport type { GuideCategory } from './adapters/types.js';\n\n/**\n * Gets the plugin version from package.json\n */\nfunction getPluginVersion(): string {\n try {\n const pkgPath = new URL('../package.json', import.meta.url);\n const pkgContent = readFileSync(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgContent) as { version: string };\n return pkg.version;\n } catch {\n return '0.0.0';\n }\n}\n\n/**\n * AI Guides plugin options\n */\nexport interface AIGuidesPluginOptions {\n /**\n * Categories to generate\n * @default ['omnify', 'laravel', 'react'] (all)\n */\n categories?: GuideCategory[];\n\n /**\n * Base path for Laravel files\n * @default 'app'\n */\n laravelBasePath?: string;\n\n /**\n * Base path for TypeScript/React files\n * @default 'resources/ts'\n */\n typescriptBasePath?: string;\n\n /**\n * Adapters to use\n * @default ['cursor', 'claude', 'antigravity'] (all)\n */\n adapters?: ('cursor' | 'claude' | 'antigravity')[];\n}\n\n/**\n * Create AI Guides plugin\n */\nexport default function aiGuidesPlugin(options: AIGuidesPluginOptions = {}): OmnifyPlugin {\n const resolvedOptions = {\n categories: options.categories ?? getAvailableCategories(),\n laravelBasePath: options.laravelBasePath ?? 'app',\n typescriptBasePath: options.typescriptBasePath ?? 'resources/ts',\n adapters: options.adapters,\n };\n\n return {\n name: '@famgia/omnify-ai-guides',\n version: getPluginVersion(),\n\n generators: [\n {\n name: 'ai-guides',\n description: 'Generate AI assistant guides (Cursor, Claude, Antigravity)',\n\n generate: async (ctx: GeneratorContext): Promise<GeneratorOutput[]> => {\n const result = generateAIGuides(ctx.cwd, {\n categories: resolvedOptions.categories,\n adapters: resolvedOptions.adapters,\n placeholders: {\n LARAVEL_BASE: resolvedOptions.laravelBasePath,\n LARAVEL_ROOT: '',\n TYPESCRIPT_BASE: resolvedOptions.typescriptBasePath,\n },\n });\n\n // Log summary\n const claudeCount = result.counts['claude'] || 0;\n const cursorCount = result.counts['cursor'] || 0;\n const antigravityCount = result.counts['antigravity'] || 0;\n\n const parts: string[] = [];\n if (claudeCount > 0) parts.push(`${claudeCount} Claude`);\n if (cursorCount > 0) parts.push(`${cursorCount} Cursor`);\n if (antigravityCount > 0) parts.push(`${antigravityCount} Antigravity`);\n\n ctx.logger.info(`Generated ${parts.join(', ')} files`);\n\n if (result.errors?.length) {\n for (const error of result.errors) {\n ctx.logger.warn(error);\n }\n }\n\n // Return empty outputs (files are written directly)\n return [];\n },\n },\n ],\n };\n}\n\nexport { generateAIGuides, shouldGenerateAIGuides, getAvailableAdapters, getAvailableCategories } from './generator.js';\nexport type { AIGuidesOptions, AIGuidesResult, GuideCategory } from './adapters/types.js';\n","/**\n * AI Guides Generator\n *\n * Generates AI guides from knowledge base with category filtering\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync } from 'node:fs';\nimport { resolve, dirname, join, basename } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { parse as parseYaml } from 'yaml';\nimport { getAdapters } from './adapters/index.js';\nimport type { AIGuidesResult, AIGuidesOptions, RulesConfig, GuideCategory } from './adapters/types.js';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n/**\n * Get knowledge directory path\n */\nfunction getKnowledgeDir(): string {\n const possiblePaths = [\n // Dev: running in src\n resolve(__dirname, 'knowledge'),\n // Dist: running from dist/\n resolve(__dirname, '../knowledge'),\n // Installed package: in node_modules\n resolve(__dirname, '../../knowledge'),\n ];\n\n for (const path of possiblePaths) {\n if (existsSync(path)) {\n return path;\n }\n }\n\n throw new Error(`AI guides knowledge directory not found. Tried: ${possiblePaths.join(', ')}`);\n}\n\n/**\n * Get config directory path\n */\nfunction getConfigDir(): string {\n const possiblePaths = [\n // Dev: running in src\n resolve(__dirname, 'config'),\n // Dist: running from dist/\n resolve(__dirname, '../config'),\n // Installed package: in node_modules\n resolve(__dirname, '../../config'),\n ];\n\n for (const path of possiblePaths) {\n if (existsSync(path)) {\n return path;\n }\n }\n\n throw new Error(`AI guides config directory not found. Tried: ${possiblePaths.join(', ')}`);\n}\n\n/**\n * Load rules config\n */\nfunction loadRulesConfig(): RulesConfig {\n const configDir = getConfigDir();\n const rulesPath = join(configDir, 'rules.yaml');\n\n if (!existsSync(rulesPath)) {\n throw new Error(`Rules config not found: ${rulesPath}`);\n }\n\n const content = readFileSync(rulesPath, 'utf-8');\n return parseYaml(content) as RulesConfig;\n}\n\n/**\n * Load knowledge file\n */\nfunction loadKnowledgeFile(source: string): string {\n const knowledgeDir = getKnowledgeDir();\n const filePath = join(knowledgeDir, source);\n\n if (!existsSync(filePath)) {\n throw new Error(`Knowledge file not found: ${filePath}`);\n }\n\n return readFileSync(filePath, 'utf-8');\n}\n\n/**\n * Replace placeholders in content\n */\nfunction replacePlaceholders(content: string, placeholders: Record<string, string>): string {\n let result = content;\n for (const [key, value] of Object.entries(placeholders)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n}\n\n/**\n * Write file (auto-create directory)\n */\nfunction writeOutputFile(filePath: string, content: string, dryRun: boolean): void {\n if (dryRun) {\n console.log(`[DRY RUN] Would write: ${filePath}`);\n return;\n }\n\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n writeFileSync(filePath, content);\n}\n\n/**\n * Check if a rule matches the specified categories\n */\nfunction matchesCategory(ruleCategory: string, categories?: GuideCategory[]): boolean {\n if (!categories || categories.length === 0) {\n return true; // No filter = all categories\n }\n\n // Extract category from rule.category (e.g., \"guides/laravel\" -> \"laravel\")\n const parts = ruleCategory.split('/');\n const category = parts[parts.length - 1] as GuideCategory;\n\n return categories.includes(category);\n}\n\n/**\n * Check if a source file matches the specified categories\n */\nfunction sourceMatchesCategory(source: string, categories?: GuideCategory[]): boolean {\n if (!categories || categories.length === 0) {\n return true; // No filter = all categories\n }\n\n // Extract category from source path (e.g., \"cursor-rules/laravel.mdc.stub\" -> \"laravel\")\n const filename = basename(source).toLowerCase();\n\n for (const category of categories) {\n if (filename.startsWith(category)) {\n return true;\n }\n // Also check folder name\n if (source.includes(`/${category}/`) || source.startsWith(`${category}/`)) {\n return true;\n }\n }\n\n // Special handling for react-* files\n if (categories.includes('react')) {\n if (filename.startsWith('react') || filename.includes('antd')) {\n return true;\n }\n }\n\n // Special handling for omnify/schema files\n if (categories.includes('omnify')) {\n if (\n filename.startsWith('omnify') ||\n filename.startsWith('schema') ||\n filename.startsWith('validation') ||\n filename.includes('migration')\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Generate AI Guides\n */\nexport function generateAIGuides(rootDir: string, options: AIGuidesOptions = {}): AIGuidesResult {\n const config = loadRulesConfig();\n const adapters = getAdapters(options.adapters);\n const dryRun = options.dryRun ?? false;\n const categories = options.categories;\n\n // Merge placeholders\n const placeholders = {\n ...config.placeholders,\n ...options.placeholders,\n };\n\n const result: AIGuidesResult = {\n counts: {},\n files: [],\n };\n\n // Initialize adapter counts\n for (const adapter of adapters) {\n result.counts[adapter.name] = 0;\n }\n\n // Process guides with category filter\n for (const rule of config.guides) {\n // Skip if doesn't match category filter\n if (!matchesCategory(rule.category, categories)) {\n continue;\n }\n\n try {\n const content = loadKnowledgeFile(rule.source);\n\n for (const adapter of adapters) {\n if (!adapter.isEnabled(rule)) {\n continue;\n }\n\n const transformed = adapter.transform(content, rule, placeholders);\n const outputPath = adapter.getOutputPath(rule);\n const fullPath = resolve(rootDir, adapter.outputDir, outputPath);\n\n writeOutputFile(fullPath, transformed, dryRun);\n result.files.push(fullPath);\n result.counts[adapter.name] = (result.counts[adapter.name] ?? 0) + 1;\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.errors = result.errors ?? [];\n result.errors.push(`Error processing ${rule.id}: ${message}`);\n }\n }\n\n // Process Cursor Rules (direct copy with frontmatter)\n const cursorAdapter = adapters.find((a) => a.name === 'cursor');\n if (cursorAdapter && config.cursorRules) {\n for (const rule of config.cursorRules) {\n // Skip if doesn't match category filter\n if (!sourceMatchesCategory(rule.source, categories)) {\n continue;\n }\n\n try {\n const content = loadKnowledgeFile(rule.source);\n const transformed = replacePlaceholders(content, placeholders);\n const filename = basename(rule.source).replace('.mdc.stub', '.mdc').replace('.md.stub', '.md');\n const fullPath = resolve(rootDir, cursorAdapter.outputDir, filename);\n\n writeOutputFile(fullPath, transformed, dryRun);\n result.files.push(fullPath);\n result.counts[cursorAdapter.name] = (result.counts[cursorAdapter.name] ?? 0) + 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.errors = result.errors ?? [];\n result.errors.push(`Error processing cursor rule ${rule.source}: ${message}`);\n }\n }\n }\n\n // Process Claude Rules (strip frontmatter)\n const claudeAdapter = adapters.find((a) => a.name === 'claude');\n if (claudeAdapter && config.claudeRules) {\n for (const rule of config.claudeRules) {\n // Skip if doesn't match category filter\n if (!sourceMatchesCategory(rule.source, categories)) {\n continue;\n }\n\n try {\n const content = loadKnowledgeFile(rule.source);\n const strippedContent = stripFrontmatter(content);\n const transformed = replacePlaceholders(strippedContent, placeholders);\n const filename = basename(rule.source)\n .replace('.mdc.stub', '.mdc')\n .replace('.md.stub', '.md')\n .replace('.mdc', '.md');\n const fullPath = resolve(rootDir, '.claude/rules/omnify', filename);\n\n writeOutputFile(fullPath, transformed, dryRun);\n result.files.push(fullPath);\n result.counts[claudeAdapter.name] = (result.counts[claudeAdapter.name] ?? 0) + 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.errors = result.errors ?? [];\n result.errors.push(`Error processing claude rule ${rule.source}: ${message}`);\n }\n }\n }\n\n // Process Antigravity Rules\n const antigravityAdapterInstance = adapters.find((a) => a.name === 'antigravity');\n if (antigravityAdapterInstance && config.antigravityRules) {\n for (const rule of config.antigravityRules) {\n // Skip if doesn't match category filter\n if (!sourceMatchesCategory(rule.source, categories)) {\n continue;\n }\n\n try {\n const content = loadKnowledgeFile(rule.source);\n const transformed = transformForAntigravity(content, rule, placeholders);\n const filename = basename(rule.source)\n .replace('.mdc.stub', '.mdc')\n .replace('.md.stub', '.md')\n .replace('.mdc', '.md');\n const fullPath = resolve(rootDir, antigravityAdapterInstance.outputDir, filename);\n\n writeOutputFile(fullPath, transformed, dryRun);\n result.files.push(fullPath);\n result.counts[antigravityAdapterInstance.name] = (result.counts[antigravityAdapterInstance.name] ?? 0) + 1;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n result.errors = result.errors ?? [];\n result.errors.push(`Error processing antigravity rule ${rule.source}: ${message}`);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Transform for Antigravity format\n */\nfunction transformForAntigravity(\n content: string,\n rule: { source: string; priority?: string; tags?: string[] },\n placeholders: Record<string, string>\n): string {\n let transformed = replacePlaceholders(content, placeholders);\n\n if (transformed.startsWith('---')) {\n const endIndex = transformed.indexOf('---', 3);\n if (endIndex !== -1) {\n const existingFrontmatter = transformed.substring(3, endIndex).trim();\n const bodyContent = transformed.substring(endIndex + 3).trim();\n\n const id = basename(rule.source)\n .replace('.mdc.stub', '')\n .replace('.md.stub', '')\n .replace('.mdc', '')\n .replace('.md', '');\n const description = extractYamlValue(existingFrontmatter, 'description') || id;\n const globs = extractYamlArray(existingFrontmatter, 'globs');\n const priority = rule.priority || 'medium';\n const tags = rule.tags || [];\n\n const lines: string[] = [`id: ${id}`, `description: \"${description}\"`, `priority: ${priority}`];\n\n if (globs.length > 0) {\n lines.push('globs:');\n for (const glob of globs) {\n lines.push(` - \"${glob}\"`);\n }\n }\n\n if (tags.length > 0) {\n lines.push('tags:');\n for (const tag of tags) {\n lines.push(` - ${tag}`);\n }\n }\n\n return `---\\n${lines.join('\\n')}\\n---\\n\\n${bodyContent}`;\n }\n }\n\n return transformed;\n}\n\n/**\n * Extract YAML value\n */\nfunction extractYamlValue(yaml: string, key: string): string | undefined {\n const match = yaml.match(new RegExp(`${key}:\\\\s*[\"']?([^\"'\\\\n]+)[\"']?`));\n return match?.[1]?.trim();\n}\n\n/**\n * Extract YAML array\n */\nfunction extractYamlArray(yaml: string, key: string): string[] {\n const match = yaml.match(new RegExp(`${key}:\\\\s*\\\\[([^\\\\]]+)\\\\]`));\n if (match?.[1]) {\n return match[1].split(',').map((g) => g.trim().replace(/[\"']/g, ''));\n }\n return [];\n}\n\n/**\n * Strip frontmatter (for Claude Code)\n */\nfunction stripFrontmatter(content: string): string {\n if (!content.startsWith('---')) {\n return content;\n }\n\n const endIndex = content.indexOf('---', 3);\n if (endIndex === -1) {\n return content;\n }\n\n return content.substring(endIndex + 3).trim();\n}\n\n/**\n * Check if AI guides need to be generated\n */\nexport function shouldGenerateAIGuides(rootDir: string): boolean {\n const claudeDir = resolve(rootDir, '.claude/omnify/guides');\n const cursorDir = resolve(rootDir, '.cursor/rules/omnify');\n\n if (!existsSync(claudeDir) || !existsSync(cursorDir)) {\n return true;\n }\n\n try {\n const claudeFiles = readdirSync(claudeDir, { recursive: true });\n const cursorFiles = readdirSync(cursorDir);\n\n return claudeFiles.length === 0 || cursorFiles.length === 0;\n } catch {\n return true;\n }\n}\n\n/**\n * Get available adapter names\n */\nexport function getAvailableAdapters(): string[] {\n return getAdapters().map((a) => a.name);\n}\n\n/**\n * Get available categories\n */\nexport function getAvailableCategories(): GuideCategory[] {\n return ['omnify', 'laravel', 'react'];\n}\n","/**\n * Cursor AI Adapter\n *\n * Generates .mdc rule files with frontmatter for Cursor editor\n */\n\nimport type { AIAdapter, GuideRule, CursorTargetConfig } from './types.js';\n\n/**\n * Replace placeholders in content\n */\nfunction replacePlaceholders(content: string, placeholders: Record<string, string>): string {\n let result = content;\n for (const [key, value] of Object.entries(placeholders)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n}\n\n/**\n * Cursor adapter\n */\nexport const cursorAdapter: AIAdapter = {\n name: 'cursor',\n outputDir: '.cursor/rules/omnify',\n\n transform(content: string, rule: GuideRule, placeholders: Record<string, string>): string {\n const target = rule.targets.cursor as CursorTargetConfig | undefined;\n\n // Replace placeholders in content\n let transformedContent = replacePlaceholders(content, placeholders);\n\n // If already has frontmatter, return as-is (cursor-rules/)\n if (transformedContent.startsWith('---')) {\n return transformedContent;\n }\n\n // Add frontmatter\n const description = target?.description || '';\n const globs = target?.globs || [];\n const alwaysApply = target?.alwaysApply ?? false;\n\n const frontmatter = `---\ndescription: \"${description}\"\nglobs: ${JSON.stringify(globs)}\nalwaysApply: ${alwaysApply}\n---\n\n`;\n\n return frontmatter + transformedContent;\n },\n\n getFilename(rule: GuideRule): string {\n const target = rule.targets.cursor as CursorTargetConfig | undefined;\n if (target?.filename) {\n return target.filename;\n }\n return `${rule.id}.mdc`;\n },\n\n isEnabled(rule: GuideRule): boolean {\n const target = rule.targets.cursor;\n return target?.enabled ?? false;\n },\n\n getOutputPath(rule: GuideRule): string {\n const filename = this.getFilename(rule);\n // Cursor uses flat structure (ignores category)\n return filename;\n },\n};\n\nexport default cursorAdapter;\n","/**\n * Claude AI Adapter\n *\n * Generates .md guide files for Claude Code\n */\n\nimport type { AIAdapter, GuideRule, ClaudeTargetConfig } from './types.js';\n\n/**\n * Replace placeholders in content\n */\nfunction replacePlaceholders(content: string, placeholders: Record<string, string>): string {\n let result = content;\n for (const [key, value] of Object.entries(placeholders)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n}\n\n/**\n * Claude adapter\n */\nexport const claudeAdapter: AIAdapter = {\n name: 'claude',\n outputDir: '.claude/omnify',\n\n transform(content: string, _rule: GuideRule, placeholders: Record<string, string>): string {\n // Claude uses plain markdown, just replace placeholders\n return replacePlaceholders(content, placeholders);\n },\n\n getFilename(rule: GuideRule): string {\n const target = rule.targets.claude as ClaudeTargetConfig | undefined;\n if (target?.filename) {\n return target.filename;\n }\n return `${rule.id}.md`;\n },\n\n isEnabled(rule: GuideRule): boolean {\n const target = rule.targets.claude;\n return target?.enabled ?? false;\n },\n\n getOutputPath(rule: GuideRule): string {\n const target = rule.targets.claude as ClaudeTargetConfig | undefined;\n const filename = this.getFilename(rule);\n const subdir = target?.subdir || rule.category;\n\n if (subdir) {\n return `${subdir}/${filename}`;\n }\n return filename;\n },\n};\n\nexport default claudeAdapter;\n","/**\n * Antigravity AI Adapter\n *\n * Generates .md rule files with YAML frontmatter for Antigravity AI\n */\n\nimport type { AIAdapter, GuideRule, AITargetConfig } from './types.js';\n\n/**\n * Antigravity-specific target config\n */\nexport interface AntigravityTargetConfig extends AITargetConfig {\n /** Description */\n description?: string;\n /** Glob patterns */\n globs?: string[];\n /** Priority (high, medium, low) */\n priority?: 'high' | 'medium' | 'low';\n /** Tags */\n tags?: string[];\n}\n\n/**\n * Replace placeholders in content\n */\nfunction replacePlaceholders(content: string, placeholders: Record<string, string>): string {\n let result = content;\n for (const [key, value] of Object.entries(placeholders)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value);\n }\n return result;\n}\n\n/**\n * Antigravity adapter\n * Official docs: https://antigravity.im/documentation\n * Rules location: .agent/rules/\n */\nexport const antigravityAdapter: AIAdapter = {\n name: 'antigravity',\n outputDir: '.agent/rules/omnify',\n\n transform(content: string, rule: GuideRule, placeholders: Record<string, string>): string {\n const target = rule.targets.antigravity as AntigravityTargetConfig | undefined;\n\n // Replace placeholders in content\n let transformedContent = replacePlaceholders(content, placeholders);\n\n // If already has frontmatter, convert it\n if (transformedContent.startsWith('---')) {\n const endIndex = transformedContent.indexOf('---', 3);\n if (endIndex !== -1) {\n const existingFrontmatter = transformedContent.substring(3, endIndex).trim();\n const bodyContent = transformedContent.substring(endIndex + 3).trim();\n\n const antigravityFrontmatter = buildAntigravityFrontmatter(rule, target, existingFrontmatter);\n return `---\\n${antigravityFrontmatter}---\\n\\n${bodyContent}`;\n }\n }\n\n // Add frontmatter\n const frontmatter = buildAntigravityFrontmatter(rule, target);\n return `---\\n${frontmatter}---\\n\\n${transformedContent}`;\n },\n\n getFilename(rule: GuideRule): string {\n const target = rule.targets.antigravity as AntigravityTargetConfig | undefined;\n if (target?.filename) {\n return target.filename;\n }\n return `${rule.id}.md`;\n },\n\n isEnabled(rule: GuideRule): boolean {\n const target = rule.targets.antigravity;\n return target?.enabled ?? false;\n },\n\n getOutputPath(rule: GuideRule): string {\n const filename = this.getFilename(rule);\n // Antigravity uses flat structure (ignores category)\n return filename;\n },\n};\n\n/**\n * Build Antigravity-format frontmatter\n */\nfunction buildAntigravityFrontmatter(\n rule: GuideRule,\n target?: AntigravityTargetConfig,\n existingFrontmatter?: string\n): string {\n const lines: string[] = [];\n\n // ID\n lines.push(`id: ${rule.id}`);\n\n // Description\n const description = target?.description || extractDescription(existingFrontmatter) || rule.id;\n lines.push(`description: \"${description}\"`);\n\n // Priority\n const priority = target?.priority || 'medium';\n lines.push(`priority: ${priority}`);\n\n // Globs\n const globs = target?.globs || extractGlobs(existingFrontmatter) || [];\n if (globs.length > 0) {\n lines.push(`globs:`);\n for (const glob of globs) {\n lines.push(` - \"${glob}\"`);\n }\n }\n\n // Tags\n const tags = target?.tags || inferTags(rule);\n if (tags.length > 0) {\n lines.push(`tags:`);\n for (const tag of tags) {\n lines.push(` - ${tag}`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/**\n * Extract description from existing frontmatter\n */\nfunction extractDescription(frontmatter?: string): string | undefined {\n if (!frontmatter) return undefined;\n const match = frontmatter.match(/description:\\s*[\"']?([^\"'\\n]+)[\"']?/);\n return match?.[1];\n}\n\n/**\n * Extract globs from existing frontmatter\n */\nfunction extractGlobs(frontmatter?: string): string[] {\n if (!frontmatter) return [];\n const match = frontmatter.match(/globs:\\s*\\[([^\\]]+)\\]/);\n if (match?.[1]) {\n return match[1].split(',').map((g) => g.trim().replace(/[\"']/g, ''));\n }\n return [];\n}\n\n/**\n * Infer tags from rule\n */\nfunction inferTags(rule: GuideRule): string[] {\n const tags: string[] = [];\n\n // Generate tags from category\n if (rule.category) {\n const parts = rule.category.split('/');\n tags.push(...parts.filter((p) => p !== 'guides'));\n }\n\n // Generate tags from ID\n if (rule.id.includes('laravel')) tags.push('laravel');\n if (rule.id.includes('react')) tags.push('react');\n if (rule.id.includes('schema')) tags.push('schema');\n if (rule.id.includes('omnify')) tags.push('omnify');\n\n // Remove duplicates\n return [...new Set(tags)];\n}\n\nexport default antigravityAdapter;\n","/**\n * AI Adapters\n *\n * Export all AI model adapters\n */\n\nexport * from './types.js';\nexport { cursorAdapter } from './cursor.js';\nexport { claudeAdapter } from './claude.js';\nexport { antigravityAdapter, type AntigravityTargetConfig } from './antigravity.js';\n\nimport { cursorAdapter } from './cursor.js';\nimport { claudeAdapter } from './claude.js';\nimport { antigravityAdapter } from './antigravity.js';\nimport type { AIAdapter } from './types.js';\n\n/**\n * All available adapters\n */\nexport const allAdapters: AIAdapter[] = [cursorAdapter, claudeAdapter, antigravityAdapter];\n\n/**\n * Get adapter by name\n */\nexport function getAdapter(name: string): AIAdapter | undefined {\n return allAdapters.find((a) => a.name === name);\n}\n\n/**\n * Get adapters by names\n */\nexport function getAdapters(names?: string[]): AIAdapter[] {\n if (!names || names.length === 0) {\n return allAdapters;\n }\n return allAdapters.filter((a) => names.includes(a.name));\n}\n"],"mappings":"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","names":["import_node_fs","replacePlaceholders","replacePlaceholders","parseYaml","replacePlaceholders","cursorAdapter","claudeAdapter","import_meta"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import '@famgia/omnify-types';
|
|
2
|
+
export { e as AIGuidesOptions, b as AIGuidesPluginOptions, f as AIGuidesResult, G as GuideCategory, a as default, g as generateAIGuides, c as getAvailableAdapters, d as getAvailableCategories, s as shouldGenerateAIGuides } from './plugin-M95GyBll.cjs';
|
package/dist/plugin.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import '@famgia/omnify-types';
|
|
2
|
+
export { e as AIGuidesOptions, b as AIGuidesPluginOptions, f as AIGuidesResult, G as GuideCategory, a as default, g as generateAIGuides, c as getAvailableAdapters, d as getAvailableCategories, s as shouldGenerateAIGuides } from './plugin-M95GyBll.js';
|