@omaikit/agents 0.1.3 → 0.1.4

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 (102) hide show
  1. package/README.md +17 -0
  2. package/dist/ai-provider/openai.d.ts +2 -2
  3. package/dist/ai-provider/openai.d.ts.map +1 -1
  4. package/dist/ai-provider/openai.js +38 -111
  5. package/dist/ai-provider/openai.js.map +1 -1
  6. package/dist/ai-provider/provider.d.ts +7 -6
  7. package/dist/ai-provider/provider.d.ts.map +1 -1
  8. package/dist/analysis/cache-manager.d.ts +9 -0
  9. package/dist/analysis/cache-manager.d.ts.map +1 -0
  10. package/dist/analysis/cache-manager.js +33 -0
  11. package/dist/analysis/cache-manager.js.map +1 -0
  12. package/dist/analysis/context-writer.d.ts +29 -0
  13. package/dist/analysis/context-writer.d.ts.map +1 -0
  14. package/dist/analysis/context-writer.js +168 -0
  15. package/dist/analysis/context-writer.js.map +1 -0
  16. package/dist/analysis/index.d.ts +5 -0
  17. package/dist/analysis/index.d.ts.map +1 -0
  18. package/dist/analysis/index.js +5 -0
  19. package/dist/analysis/index.js.map +1 -0
  20. package/dist/analysis/plan-writer.d.ts +11 -0
  21. package/dist/analysis/plan-writer.d.ts.map +1 -0
  22. package/dist/analysis/plan-writer.js +87 -0
  23. package/dist/analysis/plan-writer.js.map +1 -0
  24. package/dist/analysis/test-writer.d.ts +9 -0
  25. package/dist/analysis/test-writer.d.ts.map +1 -0
  26. package/dist/analysis/test-writer.js +42 -0
  27. package/dist/analysis/test-writer.js.map +1 -0
  28. package/dist/coder/coder.d.ts.map +1 -1
  29. package/dist/coder/coder.js +27 -38
  30. package/dist/coder/coder.js.map +1 -1
  31. package/dist/coder/prompt-templates.d.ts +1 -1
  32. package/dist/coder/prompt-templates.d.ts.map +1 -1
  33. package/dist/coder/prompt-templates.js +25 -60
  34. package/dist/coder/prompt-templates.js.map +1 -1
  35. package/dist/index.d.ts +1 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -1
  38. package/dist/index.js.map +1 -1
  39. package/dist/manager/manager.d.ts.map +1 -1
  40. package/dist/manager/manager.js +5 -16
  41. package/dist/manager/manager.js.map +1 -1
  42. package/dist/planner/clarification-handler.d.ts.map +1 -1
  43. package/dist/planner/clarification-handler.js +2 -12
  44. package/dist/planner/clarification-handler.js.map +1 -1
  45. package/dist/planner/plan-parser.d.ts.map +1 -1
  46. package/dist/planner/plan-parser.js +33 -31
  47. package/dist/planner/plan-parser.js.map +1 -1
  48. package/dist/planner/planner.d.ts +3 -7
  49. package/dist/planner/planner.d.ts.map +1 -1
  50. package/dist/planner/planner.js +77 -230
  51. package/dist/planner/planner.js.map +1 -1
  52. package/dist/planner/prompt-templates.d.ts +4 -2
  53. package/dist/planner/prompt-templates.d.ts.map +1 -1
  54. package/dist/planner/prompt-templates.js +38 -137
  55. package/dist/planner/prompt-templates.js.map +1 -1
  56. package/dist/tester/prompt-templates.d.ts.map +1 -1
  57. package/dist/tester/prompt-templates.js +14 -21
  58. package/dist/tester/prompt-templates.js.map +1 -1
  59. package/dist/tools/list-files.d.ts.map +1 -1
  60. package/dist/tools/list-files.js +8 -1
  61. package/dist/tools/list-files.js.map +1 -1
  62. package/dist/tools/registry.js +1 -1
  63. package/dist/tools/registry.js.map +1 -1
  64. package/dist/tools/utils.d.ts.map +1 -1
  65. package/dist/tools/utils.js +34 -3
  66. package/dist/tools/utils.js.map +1 -1
  67. package/dist/utils/cache-manager.d.ts +9 -0
  68. package/dist/utils/cache-manager.d.ts.map +1 -0
  69. package/dist/utils/cache-manager.js +33 -0
  70. package/dist/utils/cache-manager.js.map +1 -0
  71. package/dist/utils/context-writer.d.ts +29 -0
  72. package/dist/utils/context-writer.d.ts.map +1 -0
  73. package/dist/utils/context-writer.js +168 -0
  74. package/dist/utils/context-writer.js.map +1 -0
  75. package/dist/utils/index.d.ts +7 -0
  76. package/dist/utils/index.d.ts.map +1 -0
  77. package/dist/utils/index.js +7 -0
  78. package/dist/utils/index.js.map +1 -0
  79. package/dist/utils/plan-writer.d.ts +17 -0
  80. package/dist/utils/plan-writer.d.ts.map +1 -0
  81. package/dist/utils/plan-writer.js +175 -0
  82. package/dist/utils/plan-writer.js.map +1 -0
  83. package/dist/utils/prompt.d.ts +3 -0
  84. package/dist/utils/prompt.d.ts.map +1 -0
  85. package/dist/utils/prompt.js +55 -0
  86. package/dist/utils/prompt.js.map +1 -0
  87. package/dist/utils/test-writer.d.ts +9 -0
  88. package/dist/utils/test-writer.d.ts.map +1 -0
  89. package/dist/utils/test-writer.js +42 -0
  90. package/dist/utils/test-writer.js.map +1 -0
  91. package/package.json +3 -3
  92. package/prompts/coder/task.md +59 -0
  93. package/prompts/manager/context.md +11 -0
  94. package/prompts/planner/clarification.md +12 -0
  95. package/prompts/planner/clarification.questions.md +10 -0
  96. package/prompts/planner/optimize.md +75 -0
  97. package/prompts/planner/plan-milestones.md +73 -0
  98. package/prompts/planner/repair.md +6 -0
  99. package/prompts/planner/summary.md +22 -0
  100. package/prompts/planner/system.md +4 -0
  101. package/prompts/planner/tasks.md +82 -0
  102. package/prompts/tester/prompt.md +19 -0
@@ -0,0 +1,168 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ const DEFAULT_IGNORE_DIRS = new Set([
4
+ 'node_modules',
5
+ '.git',
6
+ '.omaikit',
7
+ 'dist',
8
+ 'build',
9
+ 'coverage',
10
+ '.analysis-cache',
11
+ ]);
12
+ const LANGUAGE_MAP = {
13
+ '.ts': 'typescript',
14
+ '.tsx': 'typescript',
15
+ '.js': 'javascript',
16
+ '.jsx': 'javascript',
17
+ '.py': 'python',
18
+ '.go': 'go',
19
+ '.rs': 'rust',
20
+ '.cs': 'csharp',
21
+ '.java': 'java',
22
+ '.cpp': 'cpp',
23
+ '.c': 'c',
24
+ '.rb': 'ruby',
25
+ '.php': 'php',
26
+ '.swift': 'swift',
27
+ '.kt': 'kotlin',
28
+ '.kts': 'kotlin',
29
+ '.dart': 'dart',
30
+ '.hs': 'haskell',
31
+ '.lua': 'lua',
32
+ '.sh': 'shell',
33
+ '.zsh': 'shell',
34
+ '.bash': 'shell',
35
+ };
36
+ export class ContextWriter {
37
+ baseDir = '.omaikit';
38
+ contextFile = 'context.json';
39
+ constructor(baseDir) {
40
+ if (baseDir) {
41
+ this.baseDir = baseDir;
42
+ }
43
+ }
44
+ async writeContext(rootPath, descriptionOverride) {
45
+ const context = this.buildContext(rootPath || process.cwd(), descriptionOverride);
46
+ return this.writeContextFile(context);
47
+ }
48
+ async readContext() {
49
+ const filepath = path.join(this.baseDir, this.contextFile);
50
+ if (!fs.existsSync(filepath)) {
51
+ return null;
52
+ }
53
+ try {
54
+ const content = fs.readFileSync(filepath, 'utf-8');
55
+ return JSON.parse(content);
56
+ }
57
+ catch {
58
+ return null;
59
+ }
60
+ }
61
+ writeContextFile(context) {
62
+ return new Promise((resolve, reject) => {
63
+ try {
64
+ if (!fs.existsSync(this.baseDir)) {
65
+ fs.mkdirSync(this.baseDir, { recursive: true });
66
+ }
67
+ const filepath = path.join(this.baseDir, this.contextFile);
68
+ fs.writeFileSync(filepath, JSON.stringify(context, null, 2), 'utf-8');
69
+ resolve(filepath);
70
+ }
71
+ catch (error) {
72
+ reject(error);
73
+ }
74
+ });
75
+ }
76
+ buildContext(rootPath, descriptionOverride) {
77
+ const stats = this.scanProject(rootPath);
78
+ const description = descriptionOverride?.trim()
79
+ ? descriptionOverride.trim()
80
+ : this.readDescription(rootPath);
81
+ return {
82
+ project: {
83
+ name: path.basename(rootPath),
84
+ rootPath,
85
+ description,
86
+ },
87
+ analysis: {
88
+ languages: stats.languages,
89
+ fileCount: stats.fileCount,
90
+ totalLOC: stats.totalLOC,
91
+ dependencies: this.readDependencies(rootPath),
92
+ },
93
+ generatedAt: new Date().toISOString(),
94
+ };
95
+ }
96
+ readDescription(rootPath) {
97
+ const packageJsonPath = path.join(rootPath, 'package.json');
98
+ if (!fs.existsSync(packageJsonPath)) {
99
+ return undefined;
100
+ }
101
+ try {
102
+ const content = fs.readFileSync(packageJsonPath, 'utf-8');
103
+ const pkg = JSON.parse(content);
104
+ return typeof pkg.description === 'string' ? pkg.description : undefined;
105
+ }
106
+ catch {
107
+ return undefined;
108
+ }
109
+ }
110
+ readDependencies(rootPath) {
111
+ const packageJsonPath = path.join(rootPath, 'package.json');
112
+ if (!fs.existsSync(packageJsonPath)) {
113
+ return [];
114
+ }
115
+ try {
116
+ const content = fs.readFileSync(packageJsonPath, 'utf-8');
117
+ const pkg = JSON.parse(content);
118
+ const deps = Object.keys(pkg.dependencies || {});
119
+ const devDeps = Object.keys(pkg.devDependencies || {});
120
+ return Array.from(new Set([...deps, ...devDeps]));
121
+ }
122
+ catch {
123
+ return [];
124
+ }
125
+ }
126
+ scanProject(rootPath) {
127
+ const languages = new Set();
128
+ let fileCount = 0;
129
+ let totalLOC = 0;
130
+ const walk = (dir) => {
131
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
132
+ for (const entry of entries) {
133
+ if (entry.isDirectory()) {
134
+ if (DEFAULT_IGNORE_DIRS.has(entry.name)) {
135
+ continue;
136
+ }
137
+ walk(path.join(dir, entry.name));
138
+ }
139
+ else {
140
+ const ext = path.extname(entry.name).toLowerCase();
141
+ const language = LANGUAGE_MAP[ext];
142
+ if (language) {
143
+ languages.add(language);
144
+ fileCount += 1;
145
+ const filePath = path.join(dir, entry.name);
146
+ totalLOC += this.countLines(filePath);
147
+ }
148
+ }
149
+ }
150
+ };
151
+ walk(rootPath);
152
+ return {
153
+ languages: Array.from(languages),
154
+ fileCount,
155
+ totalLOC,
156
+ };
157
+ }
158
+ countLines(filePath) {
159
+ try {
160
+ const content = fs.readFileSync(filePath, 'utf-8');
161
+ return content.split(/\r?\n/).length;
162
+ }
163
+ catch {
164
+ return 0;
165
+ }
166
+ }
167
+ }
168
+ //# sourceMappingURL=context-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-writer.js","sourceRoot":"","sources":["../../src/utils/context-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { PlanWriter } from './plan-writer.js';
2
+ export { TestWriter } from './test-writer.js';
3
+ export { ContextWriter } from './context-writer.js';
4
+ export { CacheManager } from './cache-manager.js';
5
+ export { parseJsonFromText } from './json.js';
6
+ export { readPrompt, readPromptList } from './prompt.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { PlanWriter } from './plan-writer.js';
2
+ export { TestWriter } from './test-writer.js';
3
+ export { ContextWriter } from './context-writer.js';
4
+ export { CacheManager } from './cache-manager.js';
5
+ export { parseJsonFromText } from './json.js';
6
+ export { readPrompt, readPromptList } from './prompt.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { Plan } from '@omaikit/models';
2
+ export declare class PlanWriter {
3
+ private baseDir;
4
+ private planFile;
5
+ private tasksDir;
6
+ constructor(baseDir?: string);
7
+ writePlan(plan: Plan, filename?: string): Promise<string>;
8
+ readPlan(filename?: string): Promise<Plan | null>;
9
+ listPlans(): Promise<string[]>;
10
+ deletePlan(filename?: string): Promise<boolean>;
11
+ private hydrateTasks;
12
+ private readTasksForPlan;
13
+ private buildTaskFilename;
14
+ private parseTaskFilename;
15
+ private safeSegment;
16
+ }
17
+ //# sourceMappingURL=plan-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-writer.d.ts","sourceRoot":"","sources":["../../src/utils/plan-writer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,QAAQ,CAAe;IAC/B,OAAO,CAAC,QAAQ,CAAkC;gBAEtC,OAAO,CAAC,EAAE,MAAM;IAOtB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAsDzD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAsBjD,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAmB9B,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBrD,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,175 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ export class PlanWriter {
4
+ baseDir = '.omaikit';
5
+ planFile = 'plan.json';
6
+ tasksDir = path.join('.omaikit', 'tasks');
7
+ constructor(baseDir) {
8
+ if (baseDir) {
9
+ this.baseDir = baseDir;
10
+ this.tasksDir = path.join(baseDir, 'tasks');
11
+ }
12
+ }
13
+ async writePlan(plan, filename) {
14
+ return new Promise((resolve, reject) => {
15
+ try {
16
+ // Ensure directory exists
17
+ if (!fs.existsSync(this.baseDir)) {
18
+ fs.mkdirSync(this.baseDir, { recursive: true });
19
+ }
20
+ if (!fs.existsSync(this.tasksDir)) {
21
+ fs.mkdirSync(this.tasksDir, { recursive: true });
22
+ }
23
+ const target = filename || this.planFile;
24
+ const filepath = path.isAbsolute(target) ? target : path.join(this.baseDir, target);
25
+ const dirPath = path.dirname(filepath);
26
+ if (!fs.existsSync(dirPath)) {
27
+ fs.mkdirSync(dirPath, { recursive: true });
28
+ }
29
+ // Persist tasks as separate files
30
+ if (Array.isArray(plan.milestones)) {
31
+ for (const milestone of plan.milestones) {
32
+ if (!Array.isArray(milestone.tasks))
33
+ continue;
34
+ for (const task of milestone.tasks) {
35
+ const taskFilename = this.buildTaskFilename(plan.id, milestone.id, task.id);
36
+ const taskPath = path.join(this.tasksDir, taskFilename);
37
+ const payload = { planId: plan.id, milestoneId: milestone.id, ...task };
38
+ fs.writeFileSync(taskPath, JSON.stringify(payload, null, 2), 'utf-8');
39
+ }
40
+ }
41
+ }
42
+ // Write plan as pretty JSON without embedded tasks
43
+ const strippedPlan = {
44
+ ...plan,
45
+ milestones: Array.isArray(plan.milestones)
46
+ ? plan.milestones.map((m) => {
47
+ const { tasks, ...rest } = m;
48
+ return rest;
49
+ })
50
+ : [],
51
+ };
52
+ const content = JSON.stringify(strippedPlan, null, 2);
53
+ fs.writeFileSync(filepath, content, 'utf-8');
54
+ resolve(filepath);
55
+ }
56
+ catch (error) {
57
+ reject(error);
58
+ }
59
+ });
60
+ }
61
+ async readPlan(filename) {
62
+ return new Promise((resolve) => {
63
+ try {
64
+ const target = filename || this.planFile;
65
+ const filepath = path.isAbsolute(target) ? target : path.join(this.baseDir, target);
66
+ if (!fs.existsSync(filepath)) {
67
+ resolve(null);
68
+ return;
69
+ }
70
+ const content = fs.readFileSync(filepath, 'utf-8');
71
+ const plan = JSON.parse(content);
72
+ const hydrated = this.hydrateTasks(plan);
73
+ resolve(hydrated);
74
+ }
75
+ catch (error) {
76
+ resolve(null);
77
+ }
78
+ });
79
+ }
80
+ async listPlans() {
81
+ return new Promise((resolve) => {
82
+ try {
83
+ if (!fs.existsSync(this.baseDir)) {
84
+ resolve([]);
85
+ return;
86
+ }
87
+ const files = fs
88
+ .readdirSync(this.baseDir)
89
+ .filter((f) => f.endsWith('.json') && f.includes('plan'));
90
+ resolve(files);
91
+ }
92
+ catch (error) {
93
+ resolve([]);
94
+ }
95
+ });
96
+ }
97
+ async deletePlan(filename) {
98
+ return new Promise((resolve) => {
99
+ try {
100
+ const filepath = path.join(this.baseDir, filename || this.planFile);
101
+ if (fs.existsSync(filepath)) {
102
+ fs.unlinkSync(filepath);
103
+ resolve(true);
104
+ }
105
+ else {
106
+ resolve(false);
107
+ }
108
+ }
109
+ catch (error) {
110
+ resolve(false);
111
+ }
112
+ });
113
+ }
114
+ hydrateTasks(plan) {
115
+ if (!plan || !plan.id || !Array.isArray(plan.milestones)) {
116
+ return plan;
117
+ }
118
+ const tasks = this.readTasksForPlan(plan.id);
119
+ const byMilestone = new Map();
120
+ for (const task of tasks) {
121
+ const milestoneId = task.milestoneId;
122
+ if (!milestoneId)
123
+ continue;
124
+ if (!byMilestone.has(milestoneId))
125
+ byMilestone.set(milestoneId, []);
126
+ const { milestoneId: _omit, planId: _omitPlan, ...taskData } = task;
127
+ byMilestone.get(milestoneId)?.push(taskData);
128
+ }
129
+ return {
130
+ ...plan,
131
+ milestones: plan.milestones.map((milestone) => ({
132
+ ...milestone,
133
+ tasks: byMilestone.get(milestone.id) ?? [],
134
+ })),
135
+ };
136
+ }
137
+ readTasksForPlan(planId) {
138
+ if (!fs.existsSync(this.tasksDir)) {
139
+ return [];
140
+ }
141
+ const files = fs.readdirSync(this.tasksDir);
142
+ const tasks = [];
143
+ for (const file of files) {
144
+ const parsed = this.parseTaskFilename(file);
145
+ if (!parsed || parsed.planId !== planId)
146
+ continue;
147
+ const filePath = path.join(this.tasksDir, file);
148
+ try {
149
+ const content = fs.readFileSync(filePath, 'utf-8');
150
+ const data = JSON.parse(content);
151
+ tasks.push(data);
152
+ }
153
+ catch {
154
+ // skip
155
+ }
156
+ }
157
+ return tasks;
158
+ }
159
+ buildTaskFilename(planId, milestoneId, taskId) {
160
+ const safePlan = this.safeSegment(planId);
161
+ const safeMilestone = this.safeSegment(milestoneId);
162
+ const safeTask = this.safeSegment(taskId);
163
+ return `T-${safePlan}-${safeMilestone}-${safeTask}.json`;
164
+ }
165
+ parseTaskFilename(filename) {
166
+ const match = /^T-(P\d+)-(M\d+)-(.+)\.json$/i.exec(filename);
167
+ if (!match)
168
+ return null;
169
+ return { planId: match[1], milestoneId: match[2], taskId: match[3] };
170
+ }
171
+ safeSegment(value) {
172
+ return value.replace(/[\\/]/g, '_');
173
+ }
174
+ }
175
+ //# sourceMappingURL=plan-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-writer.js","sourceRoot":"","sources":["../../src/utils/plan-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function readPrompt(name: string, variables?: Record<string, string>): string;
2
+ export declare function readPromptList(name: string): string[];
3
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAGnF;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAarD"}
@@ -0,0 +1,55 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { fileURLToPath } from 'url';
4
+ const PROMPT_CACHE = new Map();
5
+ export function readPrompt(name, variables) {
6
+ const template = getPromptTemplate(name);
7
+ return renderTemplate(template, variables).trimEnd();
8
+ }
9
+ export function readPromptList(name) {
10
+ const content = readPrompt(name);
11
+ const lines = content.split(/\r?\n/).map((line) => line.trim());
12
+ const bullets = lines
13
+ .filter((line) => line.startsWith('- ') || line.startsWith('* '))
14
+ .map((line) => line.slice(2).trim())
15
+ .filter(Boolean);
16
+ if (bullets.length > 0) {
17
+ return bullets;
18
+ }
19
+ return lines.filter(Boolean);
20
+ }
21
+ function getPromptTemplate(name) {
22
+ if (PROMPT_CACHE.has(name)) {
23
+ return PROMPT_CACHE.get(name);
24
+ }
25
+ const { folder, key } = parsePromptName(name);
26
+ const promptsPath = resolvePromptPath(folder, key);
27
+ const template = fs.readFileSync(promptsPath, 'utf-8');
28
+ PROMPT_CACHE.set(name, template);
29
+ return template;
30
+ }
31
+ function resolvePromptPath(folder, key) {
32
+ const currentDir = path.dirname(fileURLToPath(import.meta.url));
33
+ const rootDir = path.resolve(currentDir, '..', '..');
34
+ return path.join(rootDir, 'prompts', folder, `${key}.md`);
35
+ }
36
+ function parsePromptName(name) {
37
+ const index = name.indexOf('.');
38
+ if (index <= 0 || index === name.length - 1) {
39
+ throw new Error(`Invalid prompt name: ${name}`);
40
+ }
41
+ const folder = name.slice(0, index).trim();
42
+ const key = name.slice(index + 1).trim();
43
+ if (!folder || !key) {
44
+ throw new Error(`Invalid prompt name: ${name}`);
45
+ }
46
+ return { folder, key };
47
+ }
48
+ function renderTemplate(template, variables) {
49
+ if (!variables)
50
+ return template;
51
+ return template.replace(/{{\s*([\w.-]+)\s*}}/g, (_match, key) => {
52
+ return variables[key] ?? '';
53
+ });
54
+ }
55
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/utils/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { TestFile, TestSuite } from '@omaikit/models';
2
+ export declare class TestWriter {
3
+ private baseDir;
4
+ constructor(baseDir?: string);
5
+ writeTestSuite(testSuite: TestSuite, outputDir?: string): Promise<string[]>;
6
+ writeFiles(files: TestFile[], outputDir?: string): Promise<string[]>;
7
+ private sanitizeRelativePath;
8
+ }
9
+ //# sourceMappingURL=test-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-writer.d.ts","sourceRoot":"","sources":["../../src/utils/test-writer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE3D,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAkC;gBAErC,OAAO,CAAC,EAAE,MAAM;IAMtB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAI3E,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAuB1E,OAAO,CAAC,oBAAoB;CAW7B"}
@@ -0,0 +1,42 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ export class TestWriter {
4
+ baseDir = path.join('.omaikit', 'tests');
5
+ constructor(baseDir) {
6
+ if (baseDir) {
7
+ this.baseDir = baseDir;
8
+ }
9
+ }
10
+ async writeTestSuite(testSuite, outputDir) {
11
+ return this.writeFiles(testSuite.files || [], outputDir);
12
+ }
13
+ async writeFiles(files, outputDir) {
14
+ const targetDir = outputDir || this.baseDir;
15
+ if (!fs.existsSync(targetDir)) {
16
+ fs.mkdirSync(targetDir, { recursive: true });
17
+ }
18
+ const writtenPaths = [];
19
+ for (const file of files) {
20
+ const safeRelative = this.sanitizeRelativePath(file.path);
21
+ const fullPath = path.join(targetDir, safeRelative);
22
+ const dirPath = path.dirname(fullPath);
23
+ if (!fs.existsSync(dirPath)) {
24
+ fs.mkdirSync(dirPath, { recursive: true });
25
+ }
26
+ fs.writeFileSync(fullPath, file.content, 'utf-8');
27
+ writtenPaths.push(fullPath);
28
+ }
29
+ return writtenPaths;
30
+ }
31
+ sanitizeRelativePath(filePath) {
32
+ const normalized = path.normalize(filePath).replace(/^[\\/]+/, '');
33
+ if (path.isAbsolute(normalized)) {
34
+ return normalized.replace(/^[A-Z]:/i, '').replace(/^[\\/]+/, '');
35
+ }
36
+ const segments = normalized
37
+ .split(path.sep)
38
+ .filter((segment) => segment !== '..' && segment !== '');
39
+ return segments.join(path.sep);
40
+ }
41
+ }
42
+ //# sourceMappingURL=test-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-writer.js","sourceRoot":"","sources":["../../src/utils/test-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,MAAM,OAAO,UAAU;IACb,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAEjD,YAAY,OAAgB;QAC1B,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACzB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAoB,EAAE,SAAkB;QAC3D,OAAO,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAiB,EAAE,SAAkB;QACpD,MAAM,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,YAAY,GAAa,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACpD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAEvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,CAAC;YAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,oBAAoB,CAAC,QAAgB;QAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,OAAO,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU;aACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;aACf,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;CACF"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@omaikit/agents",
4
- "version": "0.1.3",
4
+ "version": "0.1.4",
5
5
  "description": "AI agent implementations for Omaikit",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "files": [
9
- "dist"
9
+ "dist",
10
+ "prompts"
10
11
  ],
11
12
  "scripts": {
12
13
  "build": "tsc && tsc-alias",
@@ -26,7 +27,6 @@
26
27
  "dependencies": {
27
28
  "@anthropic-ai/sdk": "^0.71.2",
28
29
  "@dqbd/tiktoken": "^0.4.0",
29
- "@omaikit/analysis": "*",
30
30
  "@omaikit/config": "*",
31
31
  "@omaikit/models": "*",
32
32
  "openai": "^4.104.0"
@@ -0,0 +1,59 @@
1
+ You are a senior software engineer generating production-ready code and files for the current task that:
2
+ - Follows PSR-12 and PSR-4
3
+ - Applies SOLID, KISS, DRY, and Clean Code principles
4
+ - Matches the existing project conventions from context
5
+ - Uses structured logging (or the project's logger)
6
+
7
+ Tool usage requirements (mandatory):
8
+ - You MUST use tools to inspect and modify files before responding.
9
+ - Use list_files to list files or find files by glob pattern (start with the project root from context).
10
+ - Use search_text to search content within files.
11
+ - Use read to inspect exact file contents and confirm existing structure.
12
+ - Use apply_patch for precise, minimal edits to existing files.
13
+ - Use edit only when apply_patch is not suitable (e.g., full overwrite or append).
14
+ - Do NOT propose code changes without first using tools.
15
+ - If the project is empty or the target file does not exist, create new files using apply_patch with create_file.
16
+ - If list_files returns empty, retry with the explicit root path from context before concluding no access.
17
+ - Never claim you cannot access files without trying list_files and read on the root path.
18
+ - After creating files successfully, do NOT include file contents in the response; only return the list of created file paths.
19
+ - Output should reflect tool-based edits only.
20
+
21
+ ## Task Details
22
+ Title: {{taskTitle}}
23
+ Description: {{taskDescription}}
24
+ Type: {{taskType}}
25
+ Estimated Effort: {{taskEffort}} hours
26
+
27
+ ## Acceptance Criteria
28
+ {{acceptanceCriteria}}
29
+
30
+ ## Project Context (from .omaikit/context.json)
31
+ {{contextSummary}}
32
+
33
+ ## Standards
34
+ - PSR-12
35
+ - PSR-4
36
+ - SOLID
37
+ - KISS
38
+ - DRY
39
+ - Clean Code principles
40
+
41
+ ## Requirements
42
+ 1. Implement the task fully by creating or updating all necessary files.
43
+ 2. Use the task's targetModule and affectedModules to guide which files/folders to edit or create.
44
+ 3. Write production-ready code with proper error handling.
45
+ 4. Include logging statements for debugging.
46
+ 5. Add clear documentation where needed.
47
+ 6. Keep functions small and focused.
48
+ 7. Keep the code testable and maintainable.
49
+
50
+ ## File creation/update workflow
51
+ 1. Inspect existing files with list_files/search_text/read.
52
+ 2. For each required file:
53
+ - If it exists, update it via apply_patch.
54
+ - If it does not exist, create it (use apply_patch + create_file).
55
+ 3. Ensure all task acceptance criteria are satisfied by the updated/created files.
56
+
57
+ ## Output Format
58
+ - Return ONLY the list of modified/created file paths.
59
+ - No code blocks, no file contents, no extra commentary.
@@ -0,0 +1,11 @@
1
+ You are the Manager agent. Analyze the current project using tools and produce a context.json payload.
2
+ Use tools to read key files (package.json, README, config files) and search_text the repo for languages, frameworks, and dependencies.
3
+ Return ONLY a JSON object with this exact schema:
4
+ {
5
+ "project": { "name": string, "rootPath": string, "description"?: string },
6
+ "analysis": { "languages": string[], "dependencies": string[] },
7
+ "generatedAt": string
8
+ }
9
+ {{descriptionLine}}
10
+ Project root: {{rootPath}}
11
+ If unsure, infer from files and keep values conservative. Do not include extra keys. Return raw JSON only.
@@ -0,0 +1,12 @@
1
+ Given this feature description: "{{description}}"
2
+
3
+ I need clarification on these points:
4
+ {{ambiguitiesList}}
5
+
6
+ Please provide brief, specific clarifications for each point. Format as JSON:
7
+ {
8
+ "clarifications": {
9
+ "point1": "answer",
10
+ "point2": "answer"
11
+ }
12
+ }