@quanvo99/ai-rules 0.1.4 → 0.1.5
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/dist/cli/commands/generate-questions.d.ts +7 -0
- package/dist/cli/commands/generate-questions.d.ts.map +1 -0
- package/dist/cli/commands/generate-questions.js +120 -0
- package/dist/cli/commands/generate-questions.js.map +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +45 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/lib/files.d.ts +8 -0
- package/dist/cli/lib/files.d.ts.map +1 -1
- package/dist/cli/lib/files.js +19 -0
- package/dist/cli/lib/files.js.map +1 -1
- package/dist/cli/lib/github.d.ts +9 -0
- package/dist/cli/lib/github.d.ts.map +1 -1
- package/dist/cli/lib/github.js +20 -0
- package/dist/cli/lib/github.js.map +1 -1
- package/dist/cli/lib/ollama-client.d.ts +66 -0
- package/dist/cli/lib/ollama-client.d.ts.map +1 -0
- package/dist/cli/lib/ollama-client.js +198 -0
- package/dist/cli/lib/ollama-client.js.map +1 -0
- package/dist/cli/lib/question-prompt.d.ts +37 -0
- package/dist/cli/lib/question-prompt.d.ts.map +1 -0
- package/dist/cli/lib/question-prompt.js +204 -0
- package/dist/cli/lib/question-prompt.js.map +1 -0
- package/dist/cli/lib/question-schema.d.ts +84 -0
- package/dist/cli/lib/question-schema.d.ts.map +1 -0
- package/dist/cli/lib/question-schema.js +135 -0
- package/dist/cli/lib/question-schema.js.map +1 -0
- package/dist/cli/lib/question-types.d.ts +72 -0
- package/dist/cli/lib/question-types.d.ts.map +1 -0
- package/dist/cli/lib/question-types.js +28 -0
- package/dist/cli/lib/question-types.js.map +1 -0
- package/dist/cli/lib/types.d.ts +2 -1
- package/dist/cli/lib/types.d.ts.map +1 -1
- package/dist/cli/lib/types.js +1 -0
- package/dist/cli/lib/types.js.map +1 -1
- package/dist/lib/question-types.d.ts +69 -0
- package/dist/lib/question-types.d.ts.map +1 -0
- package/dist/lib/question-types.js +3 -0
- package/dist/lib/question-types.js.map +1 -0
- package/dist/server/types.d.ts +47 -1
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +2 -1
- package/dist/server/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-questions.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/generate-questions.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
#!/usr/bin/env tsx
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Question generation script for AI rules
|
|
5
|
+
* Generates questions using local LLM (Ollama) and validates with Zod
|
|
6
|
+
*/
|
|
7
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
|
+
};
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const node_path_1 = require("node:path");
|
|
13
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
14
|
+
const commander_1 = require("commander");
|
|
15
|
+
const ollama_client_1 = require("../lib/ollama-client");
|
|
16
|
+
const question_prompt_1 = require("../lib/question-prompt");
|
|
17
|
+
const question_schema_1 = require("../lib/question-schema");
|
|
18
|
+
/**
|
|
19
|
+
* Ensures the suggested_questions directory exists
|
|
20
|
+
*/
|
|
21
|
+
function ensureSuggestedQuestionsDir() {
|
|
22
|
+
const dir = (0, node_path_1.join)(process.cwd(), "suggested_questions");
|
|
23
|
+
if (!(0, node_fs_1.existsSync)(dir)) {
|
|
24
|
+
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
25
|
+
console.log(chalk_1.default.gray("Created suggested_questions directory"));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Writes questions to file with pretty formatting
|
|
30
|
+
* @param questions - Questions to write
|
|
31
|
+
* @param ruleId - Rule ID for filename
|
|
32
|
+
* @param customOutput - Custom output path (optional)
|
|
33
|
+
*/
|
|
34
|
+
function writeQuestionsFile(questions, ruleId, customOutput) {
|
|
35
|
+
const filename = customOutput || `${ruleId}.json`;
|
|
36
|
+
const filepath = customOutput ? (0, node_path_1.join)(process.cwd(), filename) : (0, node_path_1.join)(process.cwd(), "suggested_questions", filename);
|
|
37
|
+
const jsonContent = JSON.stringify(questions, null, 2);
|
|
38
|
+
(0, node_fs_1.writeFileSync)(filepath, jsonContent, "utf-8");
|
|
39
|
+
console.log(chalk_1.default.green(`✅ Questions written to: ${filepath}`));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Main function for question generation
|
|
43
|
+
*/
|
|
44
|
+
async function generateQuestions(rulePath, options) {
|
|
45
|
+
// Extract rule ID from path for display and filename
|
|
46
|
+
const ruleId = rulePath.split("/").pop() || rulePath;
|
|
47
|
+
console.log(chalk_1.default.blue(`🔍 Generating questions for rule: ${ruleId}`));
|
|
48
|
+
console.log(chalk_1.default.gray(`Using model: ${options.model}`));
|
|
49
|
+
try {
|
|
50
|
+
// Build prompt from rule content
|
|
51
|
+
console.log(chalk_1.default.gray("📖 Reading rule content..."));
|
|
52
|
+
const prompt = (0, question_prompt_1.buildQuestionPrompt)(rulePath);
|
|
53
|
+
// Generate questions using Ollama
|
|
54
|
+
console.log(chalk_1.default.gray("🤖 Calling Ollama LLM..."));
|
|
55
|
+
const jsonResponse = await (0, ollama_client_1.generateQuestionsWithOllama)(prompt, options.model);
|
|
56
|
+
// Parse and validate response
|
|
57
|
+
console.log(chalk_1.default.gray("✅ Validating response..."));
|
|
58
|
+
const parseResult = JSON.parse(jsonResponse);
|
|
59
|
+
const validationResult = (0, question_schema_1.validateQuestionResponse)(parseResult);
|
|
60
|
+
// TODO: Add a way to retry the generation
|
|
61
|
+
if (validationResult.success === false) {
|
|
62
|
+
console.error(chalk_1.default.red("❌ Validation failed:"));
|
|
63
|
+
console.error(chalk_1.default.red(validationResult.error));
|
|
64
|
+
console.log(chalk_1.default.yellow("\nRaw LLM response:"));
|
|
65
|
+
console.log(chalk_1.default.gray(jsonResponse));
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
// TypeScript now knows validationResult is success case
|
|
69
|
+
const validatedQuestions = validationResult.data;
|
|
70
|
+
// Ensure output directory exists
|
|
71
|
+
ensureSuggestedQuestionsDir();
|
|
72
|
+
// Write questions to file
|
|
73
|
+
writeQuestionsFile(validatedQuestions, ruleId, options.output);
|
|
74
|
+
// Show summary
|
|
75
|
+
const questionCount = validatedQuestions.questions.length;
|
|
76
|
+
console.log(chalk_1.default.green(`\n🎉 Successfully generated ${questionCount} questions for '${ruleId}'`));
|
|
77
|
+
// Show question preview
|
|
78
|
+
console.log(chalk_1.default.blue("\n📋 Generated questions:"));
|
|
79
|
+
validatedQuestions.questions.forEach((q, index) => {
|
|
80
|
+
console.log(chalk_1.default.gray(`${index + 1}. [${q.type}] ${q.text}`));
|
|
81
|
+
});
|
|
82
|
+
console.log(chalk_1.default.yellow("\n💡 Next steps:"));
|
|
83
|
+
console.log(chalk_1.default.gray("1. Review the generated questions"));
|
|
84
|
+
console.log(chalk_1.default.gray("2. Edit if needed"));
|
|
85
|
+
console.log(chalk_1.default.gray("3. Move to questions/ folder when ready"));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof ollama_client_1.OllamaError) {
|
|
89
|
+
console.error(chalk_1.default.red(`❌ Ollama Error: ${error.message}`));
|
|
90
|
+
if (error.message.includes("not running")) {
|
|
91
|
+
console.log(chalk_1.default.yellow("\n💡 To fix this:"));
|
|
92
|
+
console.log(chalk_1.default.gray("1. Install Ollama: https://ollama.ai"));
|
|
93
|
+
console.log(chalk_1.default.gray("2. Start Ollama server"));
|
|
94
|
+
console.log(chalk_1.default.gray("3. Pull a model: ollama pull llama3.2"));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.error(chalk_1.default.red(`❌ Error: ${error instanceof Error ? error.message : "Unknown error"}`));
|
|
99
|
+
}
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Create CLI program using Commander.js
|
|
104
|
+
const program = new commander_1.Command();
|
|
105
|
+
program
|
|
106
|
+
.name("generate-questions")
|
|
107
|
+
.description("Generate questions for AI rules using local LLM (Ollama)")
|
|
108
|
+
.argument("<rule-path>", "Path to rule directory (e.g., 'rules/cursor/brainstorming')")
|
|
109
|
+
.argument("[model]", "Model name (alternative to --model flag)", "")
|
|
110
|
+
.option("-m, --model <model>", "Ollama model to use")
|
|
111
|
+
.option("-o, --output <file>", "Custom output filename")
|
|
112
|
+
.action(async (rulePath, modelArg, options) => {
|
|
113
|
+
// Use option model, then fall back to positional model arg
|
|
114
|
+
const model = options.model || modelArg || "llama3.2";
|
|
115
|
+
// Call with merged options including model
|
|
116
|
+
await generateQuestions(rulePath, { ...options, model });
|
|
117
|
+
});
|
|
118
|
+
// Parse arguments and run
|
|
119
|
+
program.parse();
|
|
120
|
+
//# sourceMappingURL=generate-questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-questions.js","sourceRoot":"","sources":["../../../../src/cli/commands/generate-questions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,cAAc,CAAC;AAEjE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8M1E"}
|
|
@@ -145,6 +145,51 @@ async function initCommand(options = {}) {
|
|
|
145
145
|
Object.assign(config, updatedConfig);
|
|
146
146
|
installedRules.push(manifest.id);
|
|
147
147
|
}
|
|
148
|
+
// For Claude Code, also install skills
|
|
149
|
+
if (selectedAgent === "claude-code") {
|
|
150
|
+
console.log(chalk_1.default.blue("\n🎯 Installing Claude Code skills..."));
|
|
151
|
+
const skills = await (0, github_1.fetchSkills)(selectedAgent);
|
|
152
|
+
if (skills.length > 0) {
|
|
153
|
+
let installedSkillsCount = 0;
|
|
154
|
+
for (const skill of skills) {
|
|
155
|
+
try {
|
|
156
|
+
// Apply skill naming convention
|
|
157
|
+
const targetPath = (0, files_1.applySkillNamingConvention)(selectedAgent, skill.name);
|
|
158
|
+
// Check for conflicts
|
|
159
|
+
const conflict = await (0, files_1.detectConflict)((0, node_path_1.join)(process.cwd(), targetPath));
|
|
160
|
+
if (conflict.hasConflict) {
|
|
161
|
+
// Handle conflict based on strategy
|
|
162
|
+
if (overwriteStrategy === "skip") {
|
|
163
|
+
console.log(chalk_1.default.yellow(`⏭️ Skipped (file exists): ${targetPath}`));
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
if (overwriteStrategy === "force") {
|
|
167
|
+
console.log(chalk_1.default.yellow(`⚠️ Overwriting: ${targetPath}`));
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
// prompt strategy
|
|
171
|
+
const shouldOverwrite = await (0, prompts_1.promptConflictResolution)(targetPath);
|
|
172
|
+
if (!shouldOverwrite) {
|
|
173
|
+
console.log(chalk_1.default.yellow(`⏭️ Skipped: ${targetPath}`));
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Write skill file
|
|
179
|
+
await (0, files_1.writeRuleFile)(skill.content, (0, node_path_1.join)(process.cwd(), targetPath));
|
|
180
|
+
console.log(chalk_1.default.green(`✓ Installed skill: ${skill.name}`));
|
|
181
|
+
installedSkillsCount++;
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
console.log(chalk_1.default.red(`❌ Error installing skill ${skill.name}: ${error}`));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
console.log(chalk_1.default.green(`\n🎉 Successfully installed ${installedSkillsCount} skills`));
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
console.log(chalk_1.default.yellow("No skills found for Claude Code"));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
148
193
|
// Save updated config
|
|
149
194
|
await (0, config_1.saveConfig)(process.cwd(), config);
|
|
150
195
|
// Display success message
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":";;;;;AAYA,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/lib/files.d.ts
CHANGED
|
@@ -18,4 +18,12 @@ export declare function writeRuleFile(content: string, targetPath: string): Prom
|
|
|
18
18
|
* @returns Target file path following agent conventions
|
|
19
19
|
*/
|
|
20
20
|
export declare function applyNamingConvention(agent: AIAgent, filename: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Applies skill-specific naming conventions for skill files
|
|
23
|
+
* Converts flat file structure (skill-name.md) to directory structure (skill-name/SKILL.md)
|
|
24
|
+
* @param agent - AI agent type
|
|
25
|
+
* @param skillName - Name of the skill (without .md extension)
|
|
26
|
+
* @returns Target file path for the skill
|
|
27
|
+
*/
|
|
28
|
+
export declare function applySkillNamingConvention(agent: AIAgent, skillName: string): string;
|
|
21
29
|
//# sourceMappingURL=files.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/files.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAW9E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/files.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAEvD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAW9E;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOtF;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwB9E;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CASpF"}
|
package/dist/cli/lib/files.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.detectConflict = detectConflict;
|
|
4
4
|
exports.writeRuleFile = writeRuleFile;
|
|
5
5
|
exports.applyNamingConvention = applyNamingConvention;
|
|
6
|
+
exports.applySkillNamingConvention = applySkillNamingConvention;
|
|
6
7
|
const node_fs_1 = require("node:fs");
|
|
7
8
|
const promises_1 = require("node:fs/promises");
|
|
8
9
|
const node_path_1 = require("node:path");
|
|
@@ -56,8 +57,26 @@ function applyNamingConvention(agent, filename) {
|
|
|
56
57
|
return `.continue/rules/${filename}`;
|
|
57
58
|
case types_1.AIAgent.CODY:
|
|
58
59
|
return `.cody/rules/${filename}`;
|
|
60
|
+
case types_1.AIAgent.CLAUDE_CODE:
|
|
61
|
+
return `.claude/rules/${filename}`;
|
|
59
62
|
default:
|
|
60
63
|
throw new Error(`Unsupported AI agent: ${agent}`);
|
|
61
64
|
}
|
|
62
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Applies skill-specific naming conventions for skill files
|
|
68
|
+
* Converts flat file structure (skill-name.md) to directory structure (skill-name/SKILL.md)
|
|
69
|
+
* @param agent - AI agent type
|
|
70
|
+
* @param skillName - Name of the skill (without .md extension)
|
|
71
|
+
* @returns Target file path for the skill
|
|
72
|
+
*/
|
|
73
|
+
function applySkillNamingConvention(agent, skillName) {
|
|
74
|
+
switch (agent) {
|
|
75
|
+
case types_1.AIAgent.CLAUDE_CODE:
|
|
76
|
+
// Convert skill-name to skill-name/SKILL.md
|
|
77
|
+
return `.claude/skills/${skillName}/SKILL.md`;
|
|
78
|
+
default:
|
|
79
|
+
throw new Error(`Skills are not supported for agent: ${agent}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
63
82
|
//# sourceMappingURL=files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../src/cli/lib/files.ts"],"names":[],"mappings":";;AAUA,wCAWC;AAOD,sCAOC;AAQD,
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../src/cli/lib/files.ts"],"names":[],"mappings":";;AAUA,wCAWC;AAOD,sCAOC;AAQD,sDAwBC;AASD,gEASC;AArFD,qCAAoC;AACpC,+CAA4D;AAC5D,yCAAoC;AACpC,mCAAuD;AAEvD;;;;GAIG;AACI,KAAK,UAAU,cAAc,CAAC,QAAgB;IACpD,IAAI,CAAC;QACJ,MAAM,IAAA,iBAAM,EAAC,QAAQ,EAAE,mBAAS,CAAC,IAAI,CAAC,CAAC;QACvC,OAAO;YACN,WAAW,EAAE,IAAI;SACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;YACN,WAAW,EAAE,KAAK;SAClB,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,UAAkB;IACtE,iDAAiD;IACjD,MAAM,GAAG,GAAG,IAAA,mBAAO,EAAC,UAAU,CAAC,CAAC;IAChC,MAAM,IAAA,gBAAK,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtC,iBAAiB;IACjB,MAAM,IAAA,oBAAS,EAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,SAAgB,qBAAqB,CAAC,KAAc,EAAE,QAAgB;IACrE,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,eAAO,CAAC,MAAM;YAClB,OAAO,iBAAiB,QAAQ,EAAE,CAAC;QAEpC,KAAK,eAAO,CAAC,QAAQ;YACpB,kFAAkF;YAClF,OAAO,mBAAmB,QAAQ,EAAE,CAAC;QAEtC,KAAK,eAAO,CAAC,KAAK;YACjB,OAAO,gBAAgB,QAAQ,EAAE,CAAC;QAEnC,KAAK,eAAO,CAAC,QAAQ;YACpB,OAAO,mBAAmB,QAAQ,EAAE,CAAC;QAEtC,KAAK,eAAO,CAAC,IAAI;YAChB,OAAO,eAAe,QAAQ,EAAE,CAAC;QAElC,KAAK,eAAO,CAAC,WAAW;YACvB,OAAO,iBAAiB,QAAQ,EAAE,CAAC;QAEpC;YACC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,0BAA0B,CAAC,KAAc,EAAE,SAAiB;IAC3E,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,eAAO,CAAC,WAAW;YACvB,4CAA4C;YAC5C,OAAO,kBAAkB,SAAS,WAAW,CAAC;QAE/C;YACC,MAAM,IAAI,KAAK,CAAC,uCAAuC,KAAK,EAAE,CAAC,CAAC;IAClE,CAAC;AACF,CAAC"}
|
package/dist/cli/lib/github.d.ts
CHANGED
|
@@ -18,4 +18,13 @@ export declare function fetchManifests(agent: string): Promise<Manifest[]>;
|
|
|
18
18
|
* @returns File content as string, or null if file doesn't exist
|
|
19
19
|
*/
|
|
20
20
|
export declare function fetchRuleFile(agent: string, category: string, filename: string): Promise<string | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Fetches all skills for a specific agent from the API
|
|
23
|
+
* @param agent - AI agent name (e.g., 'claude-code')
|
|
24
|
+
* @returns Array of skill objects with name and content, or empty array if no skills
|
|
25
|
+
*/
|
|
26
|
+
export declare function fetchSkills(agent: string): Promise<Array<{
|
|
27
|
+
name: string;
|
|
28
|
+
content: string;
|
|
29
|
+
}>>;
|
|
21
30
|
//# sourceMappingURL=github.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AA+DnD;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ9D;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAcvE;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqB7G;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAclG"}
|
package/dist/cli/lib/github.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.fetchAvailableAgents = fetchAvailableAgents;
|
|
4
4
|
exports.fetchManifests = fetchManifests;
|
|
5
5
|
exports.fetchRuleFile = fetchRuleFile;
|
|
6
|
+
exports.fetchSkills = fetchSkills;
|
|
6
7
|
// API configuration
|
|
7
8
|
const API_BASE_URL = process.env.AI_RULES_API_URL || "https://ai-rules-setup.vercel.app";
|
|
8
9
|
// Cache for API responses to avoid multiple calls
|
|
@@ -94,4 +95,23 @@ async function fetchRuleFile(agent, category, filename) {
|
|
|
94
95
|
return null;
|
|
95
96
|
}
|
|
96
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Fetches all skills for a specific agent from the API
|
|
100
|
+
* @param agent - AI agent name (e.g., 'claude-code')
|
|
101
|
+
* @returns Array of skill objects with name and content, or empty array if no skills
|
|
102
|
+
*/
|
|
103
|
+
async function fetchSkills(agent) {
|
|
104
|
+
try {
|
|
105
|
+
const data = await fetchRulesData();
|
|
106
|
+
const agentData = data.agents[agent];
|
|
107
|
+
if (!agentData || !agentData.skills) {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
return agentData.skills;
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error(`Error fetching skills for agent ${agent}:`, error);
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
}
|
|
97
117
|
//# sourceMappingURL=github.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/cli/lib/github.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../src/cli/lib/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama LLM client for generating questions
|
|
3
|
+
* Handles connection, API calls, and response parsing
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for Ollama client
|
|
7
|
+
*/
|
|
8
|
+
interface OllamaConfig {
|
|
9
|
+
/** Ollama server URL */
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/** Default model to use */
|
|
12
|
+
defaultModel: string;
|
|
13
|
+
/** Request timeout in milliseconds */
|
|
14
|
+
timeout: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Error class for Ollama-specific errors
|
|
18
|
+
*/
|
|
19
|
+
export declare class OllamaError extends Error {
|
|
20
|
+
statusCode?: number | undefined;
|
|
21
|
+
constructor(message: string, statusCode?: number | undefined);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Checks if Ollama server is running and accessible
|
|
25
|
+
* @param config - Ollama configuration
|
|
26
|
+
* @returns Promise that resolves to true if server is accessible, false on any error
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkOllamaHealth(config?: OllamaConfig): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Calls Ollama API to generate text
|
|
31
|
+
* @param prompt - The prompt to send to the LLM
|
|
32
|
+
* @param model - Model to use (defaults to config default)
|
|
33
|
+
* @param config - Ollama configuration
|
|
34
|
+
* @returns Promise that resolves to the generated text
|
|
35
|
+
*/
|
|
36
|
+
export declare function callOllama(prompt: string, model?: string, config?: OllamaConfig): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Extracts JSON from LLM response text
|
|
39
|
+
* Handles cases where LLM returns pure JSON or wraps it in markdown code blocks
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* // Pure JSON object
|
|
43
|
+
* extractJsonFromResponse('{"questions": [{"id": "1", "text": "test"}]}')
|
|
44
|
+
*
|
|
45
|
+
* // Pure JSON array
|
|
46
|
+
* extractJsonFromResponse('[{"id": "1", "text": "test"}]')
|
|
47
|
+
*
|
|
48
|
+
* // JSON in markdown code block
|
|
49
|
+
* extractJsonFromResponse('```json\n{"questions": []}\n```')
|
|
50
|
+
*
|
|
51
|
+
* // JSON with extra text
|
|
52
|
+
* extractJsonFromResponse('Here is the JSON: {"id": "1"}')
|
|
53
|
+
*
|
|
54
|
+
* @param response - Raw response from LLM
|
|
55
|
+
* @returns Extracted JSON string or null if not found
|
|
56
|
+
*/
|
|
57
|
+
export declare function extractJsonFromResponse(response: string): string | null;
|
|
58
|
+
/**
|
|
59
|
+
* Generates questions using Ollama with error handling
|
|
60
|
+
* @param prompt - The prompt to send to the LLM
|
|
61
|
+
* @param model - Model to use (optional)
|
|
62
|
+
* @returns Promise that resolves to the generated JSON string
|
|
63
|
+
*/
|
|
64
|
+
export declare function generateQuestionsWithOllama(prompt: string, model?: string): Promise<string>;
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=ollama-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama-client.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/ollama-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,UAAU,YAAY;IACrB,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;CAChB;AAoCD;;GAEG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAG7B,UAAU,CAAC,EAAE,MAAM;gBAD1B,OAAO,EAAE,MAAM,EACR,UAAU,CAAC,EAAE,MAAM,YAAA;CAK3B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,GAAE,YAA6B,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB/F;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC/B,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,GAAE,YAA6B,GACnC,OAAO,CAAC,MAAM,CAAC,CAkDjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmDvE;AAED;;;;;GAKG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBjG"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Ollama LLM client for generating questions
|
|
4
|
+
* Handles connection, API calls, and response parsing
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.OllamaError = void 0;
|
|
8
|
+
exports.checkOllamaHealth = checkOllamaHealth;
|
|
9
|
+
exports.callOllama = callOllama;
|
|
10
|
+
exports.extractJsonFromResponse = extractJsonFromResponse;
|
|
11
|
+
exports.generateQuestionsWithOllama = generateQuestionsWithOllama;
|
|
12
|
+
/**
|
|
13
|
+
* Default configuration
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_CONFIG = {
|
|
16
|
+
baseUrl: "http://localhost:11434",
|
|
17
|
+
defaultModel: process.env.OLLAMA_MODEL || "llama3.2",
|
|
18
|
+
timeout: parseInt(process.env.OLLAMA_TIMEOUT || "180000", 10), // 3 minutes default, configurable via env
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Error class for Ollama-specific errors
|
|
22
|
+
*/
|
|
23
|
+
class OllamaError extends Error {
|
|
24
|
+
constructor(message, statusCode) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.statusCode = statusCode;
|
|
27
|
+
this.name = "OllamaError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.OllamaError = OllamaError;
|
|
31
|
+
/**
|
|
32
|
+
* Checks if Ollama server is running and accessible
|
|
33
|
+
* @param config - Ollama configuration
|
|
34
|
+
* @returns Promise that resolves to true if server is accessible, false on any error
|
|
35
|
+
*/
|
|
36
|
+
async function checkOllamaHealth(config = DEFAULT_CONFIG) {
|
|
37
|
+
const controller = new AbortController();
|
|
38
|
+
const timeoutId = setTimeout(() => controller.abort(), config.timeout);
|
|
39
|
+
try {
|
|
40
|
+
const response = await fetch(`${config.baseUrl}/api/tags`, {
|
|
41
|
+
method: "GET",
|
|
42
|
+
signal: controller.signal,
|
|
43
|
+
});
|
|
44
|
+
clearTimeout(timeoutId);
|
|
45
|
+
return response.ok;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
clearTimeout(timeoutId);
|
|
49
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
50
|
+
return false; // Timeout occurred
|
|
51
|
+
}
|
|
52
|
+
return false; // Any other error means server is not accessible
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Calls Ollama API to generate text
|
|
57
|
+
* @param prompt - The prompt to send to the LLM
|
|
58
|
+
* @param model - Model to use (defaults to config default)
|
|
59
|
+
* @param config - Ollama configuration
|
|
60
|
+
* @returns Promise that resolves to the generated text
|
|
61
|
+
*/
|
|
62
|
+
async function callOllama(prompt, model, config = DEFAULT_CONFIG) {
|
|
63
|
+
const modelToUse = model || config.defaultModel;
|
|
64
|
+
const requestBody = {
|
|
65
|
+
model: modelToUse,
|
|
66
|
+
prompt,
|
|
67
|
+
stream: false,
|
|
68
|
+
options: {
|
|
69
|
+
temperature: 0.7,
|
|
70
|
+
max_tokens: 1500,
|
|
71
|
+
top_p: 0.9,
|
|
72
|
+
frequency_penalty: 0.5,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
const controller = new AbortController();
|
|
76
|
+
const timeoutId = setTimeout(() => {
|
|
77
|
+
controller.abort();
|
|
78
|
+
}, config.timeout);
|
|
79
|
+
let response;
|
|
80
|
+
try {
|
|
81
|
+
response = await fetch(`${config.baseUrl}/api/generate`, {
|
|
82
|
+
method: "POST",
|
|
83
|
+
headers: {
|
|
84
|
+
"Content-Type": "application/json",
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify(requestBody),
|
|
87
|
+
signal: controller.signal,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
clearTimeout(timeoutId);
|
|
92
|
+
if (error instanceof Error && error.name === "AbortError") {
|
|
93
|
+
throw new OllamaError(`Request timeout after ${config.timeout}ms`);
|
|
94
|
+
}
|
|
95
|
+
throw new OllamaError(`Request failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
96
|
+
}
|
|
97
|
+
clearTimeout(timeoutId);
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
throw new OllamaError(`HTTP ${response.status}: ${response.statusText}`, response.status);
|
|
100
|
+
}
|
|
101
|
+
try {
|
|
102
|
+
const data = (await response.json());
|
|
103
|
+
return data.response;
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
throw new OllamaError(`Failed to parse JSON response: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Extracts JSON from LLM response text
|
|
111
|
+
* Handles cases where LLM returns pure JSON or wraps it in markdown code blocks
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
* // Pure JSON object
|
|
115
|
+
* extractJsonFromResponse('{"questions": [{"id": "1", "text": "test"}]}')
|
|
116
|
+
*
|
|
117
|
+
* // Pure JSON array
|
|
118
|
+
* extractJsonFromResponse('[{"id": "1", "text": "test"}]')
|
|
119
|
+
*
|
|
120
|
+
* // JSON in markdown code block
|
|
121
|
+
* extractJsonFromResponse('```json\n{"questions": []}\n```')
|
|
122
|
+
*
|
|
123
|
+
* // JSON with extra text
|
|
124
|
+
* extractJsonFromResponse('Here is the JSON: {"id": "1"}')
|
|
125
|
+
*
|
|
126
|
+
* @param response - Raw response from LLM
|
|
127
|
+
* @returns Extracted JSON string or null if not found
|
|
128
|
+
*/
|
|
129
|
+
function extractJsonFromResponse(response) {
|
|
130
|
+
// Trim whitespace first
|
|
131
|
+
const trimmed = response.trim();
|
|
132
|
+
// Case 1: Response is pure JSON (starts and ends with {})
|
|
133
|
+
if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
|
|
134
|
+
try {
|
|
135
|
+
// Try to parse to validate it's valid JSON
|
|
136
|
+
JSON.parse(trimmed);
|
|
137
|
+
return trimmed;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Not valid JSON, continue to other methods
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Case 2: Response is pure JSON array (starts and ends with [])
|
|
144
|
+
if (trimmed.startsWith("[") && trimmed.endsWith("]")) {
|
|
145
|
+
try {
|
|
146
|
+
// Try to parse to validate it's valid JSON
|
|
147
|
+
JSON.parse(trimmed);
|
|
148
|
+
return trimmed;
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Not valid JSON, continue to other methods
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Case 3: JSON wrapped in markdown code blocks
|
|
155
|
+
const codeBlockMatch = response.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/);
|
|
156
|
+
if (codeBlockMatch) {
|
|
157
|
+
return codeBlockMatch[1] ?? null;
|
|
158
|
+
}
|
|
159
|
+
// Case 4: JSON array wrapped in markdown code blocks
|
|
160
|
+
const arrayCodeBlockMatch = response.match(/```(?:json)?\s*(\[[\s\S]*?\])\s*```/);
|
|
161
|
+
if (arrayCodeBlockMatch) {
|
|
162
|
+
return arrayCodeBlockMatch[1] ?? null;
|
|
163
|
+
}
|
|
164
|
+
// Case 5: Find JSON object anywhere in the text (fallback)
|
|
165
|
+
const jsonObjectMatch = response.match(/\{[\s\S]*\}/);
|
|
166
|
+
if (jsonObjectMatch) {
|
|
167
|
+
return jsonObjectMatch[0] ?? null;
|
|
168
|
+
}
|
|
169
|
+
// Case 6: Find JSON array anywhere in the text (fallback)
|
|
170
|
+
const jsonArrayMatch = response.match(/\[[\s\S]*\]/);
|
|
171
|
+
if (jsonArrayMatch) {
|
|
172
|
+
return jsonArrayMatch[0] ?? null;
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Generates questions using Ollama with error handling
|
|
178
|
+
* @param prompt - The prompt to send to the LLM
|
|
179
|
+
* @param model - Model to use (optional)
|
|
180
|
+
* @returns Promise that resolves to the generated JSON string
|
|
181
|
+
*/
|
|
182
|
+
async function generateQuestionsWithOllama(prompt, model) {
|
|
183
|
+
const isHealthy = await checkOllamaHealth();
|
|
184
|
+
if (!isHealthy) {
|
|
185
|
+
throw new OllamaError("Ollama server is not running or not accessible at http://localhost:11434\n" +
|
|
186
|
+
"Please start Ollama and ensure the server is running.");
|
|
187
|
+
}
|
|
188
|
+
const response = await callOllama(prompt, model);
|
|
189
|
+
const jsonString = extractJsonFromResponse(response);
|
|
190
|
+
if (!jsonString) {
|
|
191
|
+
throw new OllamaError("LLM response does not contain valid JSON.\n" +
|
|
192
|
+
"Response received:\n" +
|
|
193
|
+
response.substring(0, 500) +
|
|
194
|
+
(response.length > 500 ? "..." : ""));
|
|
195
|
+
}
|
|
196
|
+
return jsonString;
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=ollama-client.js.map
|