@context-forge/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +70 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +4 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/node.d.ts +6 -0
  8. package/dist/node.d.ts.map +1 -0
  9. package/dist/node.js +10 -0
  10. package/dist/node.js.map +1 -0
  11. package/dist/services/ContextGenerator.d.ts +19 -0
  12. package/dist/services/ContextGenerator.d.ts.map +1 -0
  13. package/dist/services/ContextGenerator.js +66 -0
  14. package/dist/services/ContextGenerator.js.map +1 -0
  15. package/dist/services/ContextIntegrator.d.ts +84 -0
  16. package/dist/services/ContextIntegrator.d.ts.map +1 -0
  17. package/dist/services/ContextIntegrator.js +211 -0
  18. package/dist/services/ContextIntegrator.js.map +1 -0
  19. package/dist/services/ContextTemplateEngine.d.ts +65 -0
  20. package/dist/services/ContextTemplateEngine.d.ts.map +1 -0
  21. package/dist/services/ContextTemplateEngine.js +239 -0
  22. package/dist/services/ContextTemplateEngine.js.map +1 -0
  23. package/dist/services/CoreServiceFactory.d.ts +14 -0
  24. package/dist/services/CoreServiceFactory.d.ts.map +1 -0
  25. package/dist/services/CoreServiceFactory.js +23 -0
  26. package/dist/services/CoreServiceFactory.js.map +1 -0
  27. package/dist/services/ProjectPathService.d.ts +14 -0
  28. package/dist/services/ProjectPathService.d.ts.map +1 -0
  29. package/dist/services/ProjectPathService.js +142 -0
  30. package/dist/services/ProjectPathService.js.map +1 -0
  31. package/dist/services/SectionBuilder.d.ts +70 -0
  32. package/dist/services/SectionBuilder.d.ts.map +1 -0
  33. package/dist/services/SectionBuilder.js +303 -0
  34. package/dist/services/SectionBuilder.js.map +1 -0
  35. package/dist/services/StatementManager.d.ts +44 -0
  36. package/dist/services/StatementManager.d.ts.map +1 -0
  37. package/dist/services/StatementManager.js +216 -0
  38. package/dist/services/StatementManager.js.map +1 -0
  39. package/dist/services/SystemPromptParser.d.ts +72 -0
  40. package/dist/services/SystemPromptParser.d.ts.map +1 -0
  41. package/dist/services/SystemPromptParser.js +271 -0
  42. package/dist/services/SystemPromptParser.js.map +1 -0
  43. package/dist/services/TemplateProcessor.d.ts +35 -0
  44. package/dist/services/TemplateProcessor.d.ts.map +1 -0
  45. package/dist/services/TemplateProcessor.js +150 -0
  46. package/dist/services/TemplateProcessor.js.map +1 -0
  47. package/dist/services/constants.d.ts +8 -0
  48. package/dist/services/constants.d.ts.map +1 -0
  49. package/dist/services/constants.js +62 -0
  50. package/dist/services/constants.js.map +1 -0
  51. package/dist/services/index.d.ts +8 -0
  52. package/dist/services/index.d.ts.map +1 -0
  53. package/dist/services/index.js +12 -0
  54. package/dist/services/index.js.map +1 -0
  55. package/dist/services/interfaces.d.ts +21 -0
  56. package/dist/services/interfaces.d.ts.map +1 -0
  57. package/dist/services/interfaces.js +2 -0
  58. package/dist/services/interfaces.js.map +1 -0
  59. package/dist/storage/FileProjectStore.d.ts +24 -0
  60. package/dist/storage/FileProjectStore.d.ts.map +1 -0
  61. package/dist/storage/FileProjectStore.js +141 -0
  62. package/dist/storage/FileProjectStore.js.map +1 -0
  63. package/dist/storage/FileStorageService.d.ts +14 -0
  64. package/dist/storage/FileStorageService.d.ts.map +1 -0
  65. package/dist/storage/FileStorageService.js +114 -0
  66. package/dist/storage/FileStorageService.js.map +1 -0
  67. package/dist/storage/backupService.d.ts +28 -0
  68. package/dist/storage/backupService.d.ts.map +1 -0
  69. package/dist/storage/backupService.js +84 -0
  70. package/dist/storage/backupService.js.map +1 -0
  71. package/dist/storage/index.d.ts +6 -0
  72. package/dist/storage/index.d.ts.map +1 -0
  73. package/dist/storage/index.js +7 -0
  74. package/dist/storage/index.js.map +1 -0
  75. package/dist/storage/interfaces.d.ts +23 -0
  76. package/dist/storage/interfaces.d.ts.map +1 -0
  77. package/dist/storage/interfaces.js +2 -0
  78. package/dist/storage/interfaces.js.map +1 -0
  79. package/dist/storage/storagePaths.d.ts +9 -0
  80. package/dist/storage/storagePaths.d.ts.map +1 -0
  81. package/dist/storage/storagePaths.js +20 -0
  82. package/dist/storage/storagePaths.js.map +1 -0
  83. package/dist/types/context.d.ts +36 -0
  84. package/dist/types/context.d.ts.map +1 -0
  85. package/dist/types/context.js +2 -0
  86. package/dist/types/context.js.map +1 -0
  87. package/dist/types/index.d.ts +9 -0
  88. package/dist/types/index.d.ts.map +1 -0
  89. package/dist/types/index.js +3 -0
  90. package/dist/types/index.js.map +1 -0
  91. package/dist/types/paths.d.ts +18 -0
  92. package/dist/types/paths.d.ts.map +1 -0
  93. package/dist/types/paths.js +2 -0
  94. package/dist/types/paths.js.map +1 -0
  95. package/dist/types/project.d.ts +48 -0
  96. package/dist/types/project.d.ts.map +1 -0
  97. package/dist/types/project.js +2 -0
  98. package/dist/types/project.js.map +1 -0
  99. package/dist/types/prompts.d.ts +49 -0
  100. package/dist/types/prompts.d.ts.map +1 -0
  101. package/dist/types/prompts.js +10 -0
  102. package/dist/types/prompts.js.map +1 -0
  103. package/dist/types/sections.d.ts +64 -0
  104. package/dist/types/sections.d.ts.map +1 -0
  105. package/dist/types/sections.js +13 -0
  106. package/dist/types/sections.js.map +1 -0
  107. package/dist/types/statements.d.ts +40 -0
  108. package/dist/types/statements.d.ts.map +1 -0
  109. package/dist/types/statements.js +2 -0
  110. package/dist/types/statements.js.map +1 -0
  111. package/package.json +54 -0
@@ -0,0 +1,303 @@
1
+ import { TemplateProcessor } from './TemplateProcessor.js';
2
+ /**
3
+ * Service for building individual context sections
4
+ * Handles conditional logic, template processing, and section assembly
5
+ */
6
+ export class SectionBuilder {
7
+ statementManager;
8
+ promptParser;
9
+ templateProcessor;
10
+ config;
11
+ constructor(statementManager, promptParser, config) {
12
+ this.statementManager = statementManager;
13
+ this.promptParser = promptParser;
14
+ this.templateProcessor = new TemplateProcessor();
15
+ this.config = {
16
+ includeEmptySections: false,
17
+ includeTitles: true,
18
+ sectionSeparator: '\n\n',
19
+ ...config
20
+ };
21
+ }
22
+ /**
23
+ * Build the tools and MCP section
24
+ */
25
+ async buildToolsSection(data) {
26
+ try {
27
+ const toolIntro = this.statementManager.getStatement('tool-intro-statement');
28
+ const toolPrompt = await this.promptParser.getToolUsePrompt();
29
+ const mcpInfo = this.detectMCPAvailability(data);
30
+ const sections = [];
31
+ // Add intro statement
32
+ if (toolIntro) {
33
+ sections.push(toolIntro);
34
+ }
35
+ // Add available tools and MCP servers at the top
36
+ const toolsList = [];
37
+ // Add user-specified tools
38
+ if (data.customData?.availableTools && data.customData.availableTools.trim()) {
39
+ toolsList.push(`Tools: ${data.customData.availableTools}`);
40
+ }
41
+ // Add MCP servers (mcpInfo already includes "Available MCP servers:" prefix)
42
+ if (mcpInfo) {
43
+ toolsList.push(mcpInfo);
44
+ }
45
+ if (toolsList.length > 0) {
46
+ sections.push(toolsList.join('\n'));
47
+ }
48
+ // Add tool prompt if available
49
+ if (toolPrompt) {
50
+ const processedPrompt = this.templateProcessor.processTemplate(toolPrompt.content, data);
51
+ sections.push(processedPrompt);
52
+ }
53
+ // If no tools available, use fallback statement
54
+ if (sections.length === 0 || (!data.availableTools?.length && !data.mcpServers?.length)) {
55
+ const noToolsStatement = this.statementManager.getStatement('no-tools-statement');
56
+ return noToolsStatement || 'No additional tools or MCP servers detected.';
57
+ }
58
+ return sections.join('\n\n');
59
+ }
60
+ catch (error) {
61
+ console.error('Error building tools section:', error);
62
+ return '';
63
+ }
64
+ }
65
+ /**
66
+ * Build the monorepo-specific section
67
+ */
68
+ buildMonorepoSection(data) {
69
+ try {
70
+ const monorepoStatement = this.statementManager.getStatement('monorepo-statement');
71
+ let baseStatement;
72
+ if (!monorepoStatement) {
73
+ baseStatement = `Project is configured as a monorepo. Working in package: ${data.template}, Slice: ${data.slice}`;
74
+ }
75
+ else {
76
+ baseStatement = this.templateProcessor.processTemplate(monorepoStatement, data);
77
+ }
78
+ // Append custom monorepo note if provided
79
+ const customNote = data.customData?.monorepoNote;
80
+ if (customNote && customNote.trim()) {
81
+ return `${baseStatement}\n\n${customNote.trim()}`;
82
+ }
83
+ return baseStatement;
84
+ }
85
+ catch (error) {
86
+ console.error('Error building monorepo section:', error);
87
+ return '';
88
+ }
89
+ }
90
+ /**
91
+ * Build the instruction section with appropriate system prompt
92
+ */
93
+ async buildInstructionSection(data) {
94
+ try {
95
+ const intro = this.statementManager.getStatement('instruction-intro-statement');
96
+ const prompt = await this.promptParser.getPromptForInstruction(data.instruction);
97
+ const sections = [];
98
+ // Add intro if available
99
+ if (intro) {
100
+ sections.push(intro);
101
+ }
102
+ // Add instruction prompt
103
+ if (prompt) {
104
+ const processedPrompt = this.templateProcessor.processTemplate(prompt.content, data);
105
+ sections.push(processedPrompt);
106
+ }
107
+ else {
108
+ // Fallback for custom or unknown instructions
109
+ const customStatement = this.statementManager.getStatement('custom-instruction-statement');
110
+ if (customStatement) {
111
+ const processed = this.templateProcessor.processTemplate(customStatement, data);
112
+ sections.push(processed);
113
+ }
114
+ else {
115
+ sections.push(`Custom instruction: ${data.instruction}`);
116
+ }
117
+ }
118
+ return sections.join('\n\n');
119
+ }
120
+ catch (error) {
121
+ console.error('Error building instruction section:', error);
122
+ return `Instruction: ${data.instruction}`;
123
+ }
124
+ }
125
+ /**
126
+ * Build the project information object section
127
+ */
128
+ async buildProjectInfoSection(data) {
129
+ try {
130
+ const infoLines = [];
131
+ // Always include project name
132
+ infoLines.push(` project: ${data.projectName}`);
133
+ // Include template only for monorepo projects
134
+ if (data.isMonorepo && data.template && data.template !== 'default') {
135
+ infoLines.push(` template: ${data.template}`);
136
+ }
137
+ // Include current date if present (helps AI understand today's date)
138
+ if (data.projectDate) {
139
+ infoLines.push(` currentDate: ${data.projectDate}`);
140
+ }
141
+ // Include slice if present, or null if empty
142
+ if (data.slice && data.slice.trim()) {
143
+ infoLines.push(` slice: ${data.slice}`);
144
+ }
145
+ else {
146
+ infoLines.push(` slice: null`);
147
+ }
148
+ // Include task file if present
149
+ if (data.taskFile && data.taskFile.trim()) {
150
+ infoLines.push(` taskFile: ${data.taskFile}`);
151
+ }
152
+ else {
153
+ infoLines.push(` taskFile: null`);
154
+ }
155
+ // Include development phase if present
156
+ if (data.developmentPhase) {
157
+ infoLines.push(` phase: ${data.developmentPhase}`);
158
+ }
159
+ // Always include monorepo status
160
+ infoLines.push(` monorepo: ${data.isMonorepo}`);
161
+ return `### Current Work Context\n[\n${infoLines.join(',\n')}\n]`;
162
+ }
163
+ catch (error) {
164
+ console.error('Error building project info section:', error);
165
+ return `### Current Work Context\n[\n project: ${data.projectName || 'unknown'}\n]`;
166
+ }
167
+ }
168
+ /**
169
+ * Build a generic section with content
170
+ */
171
+ buildSection(section, data) {
172
+ try {
173
+ // Check conditional
174
+ if (section.conditional && section.condition) {
175
+ if (!section.condition(data)) {
176
+ return '';
177
+ }
178
+ }
179
+ // Process content with template variables
180
+ const processedContent = this.templateProcessor.processTemplate(section.content, data);
181
+ // Skip empty sections if configured
182
+ if (!this.config.includeEmptySections && !processedContent.trim()) {
183
+ return '';
184
+ }
185
+ // Add title if configured and available
186
+ const parts = [];
187
+ if (this.config.includeTitles && section.title) {
188
+ parts.push(section.title);
189
+ }
190
+ if (processedContent) {
191
+ parts.push(processedContent);
192
+ }
193
+ return parts.join('\n\n');
194
+ }
195
+ catch (error) {
196
+ console.error(`Error building section ${section.key}:`, error);
197
+ return '';
198
+ }
199
+ }
200
+ /**
201
+ * Build current events section
202
+ */
203
+ buildCurrentEventsSection(data) {
204
+ try {
205
+ const header = this.statementManager.getStatement('current-events-header');
206
+ const content = data.recentEvents;
207
+ if (!content || !content.trim()) {
208
+ return '';
209
+ }
210
+ const parts = [];
211
+ if (header) {
212
+ parts.push(header);
213
+ }
214
+ parts.push(content);
215
+ return parts.join('\n\n');
216
+ }
217
+ catch (error) {
218
+ console.error('Error building current events section:', error);
219
+ return '';
220
+ }
221
+ }
222
+ /**
223
+ * Build additional notes section
224
+ */
225
+ buildAdditionalNotesSection(data) {
226
+ try {
227
+ const header = this.statementManager.getStatement('additional-notes-header');
228
+ const content = data.additionalNotes;
229
+ if (!content || !content.trim()) {
230
+ return '';
231
+ }
232
+ const parts = [];
233
+ if (header) {
234
+ parts.push(header);
235
+ }
236
+ parts.push(content);
237
+ return parts.join('\n\n');
238
+ }
239
+ catch (error) {
240
+ console.error('Error building additional notes section:', error);
241
+ return '';
242
+ }
243
+ }
244
+ /**
245
+ * Detect available MCP servers and return info
246
+ */
247
+ detectMCPAvailability(data) {
248
+ // Placeholder implementation - will be enhanced later
249
+ if (!data.mcpServers || data.mcpServers.length === 0) {
250
+ return '';
251
+ }
252
+ return `Available MCP servers: ${data.mcpServers.join(', ')}`;
253
+ }
254
+ /**
255
+ * Detect available tools and return info
256
+ */
257
+ detectAvailableTools(data) {
258
+ // Placeholder implementation - will be enhanced later
259
+ const defaultTools = [];
260
+ if (data.availableTools && data.availableTools.length > 0) {
261
+ return data.availableTools;
262
+ }
263
+ return defaultTools;
264
+ }
265
+ /**
266
+ * Check if tools or MCP are available
267
+ */
268
+ hasToolsOrMCP(data) {
269
+ return !!((data.availableTools && data.availableTools.length > 0) ||
270
+ (data.mcpServers && data.mcpServers.length > 0));
271
+ }
272
+ /**
273
+ * Validate section structure
274
+ */
275
+ validateSection(section) {
276
+ const errors = [];
277
+ if (!section.key) {
278
+ errors.push('Section must have a key');
279
+ }
280
+ if (typeof section.order !== 'number') {
281
+ errors.push('Section must have a numeric order');
282
+ }
283
+ if (section.conditional && !section.condition) {
284
+ errors.push('Conditional section must have a condition function');
285
+ }
286
+ return {
287
+ isValid: errors.length === 0,
288
+ errors
289
+ };
290
+ }
291
+ /**
292
+ * Create a section object
293
+ */
294
+ createSection(key, content, order, options) {
295
+ return {
296
+ key,
297
+ content,
298
+ order,
299
+ ...options
300
+ };
301
+ }
302
+ }
303
+ //# sourceMappingURL=SectionBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionBuilder.js","sourceRoot":"","sources":["../../src/services/SectionBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { TemplateStatement } from '../types/statements.js';
2
+ /**
3
+ * Service for managing configurable template statements
4
+ * Loads statements from markdown files and provides CRUD operations
5
+ */
6
+ export declare class StatementManager {
7
+ private statements;
8
+ private filePath;
9
+ private isLoaded;
10
+ constructor(filePath?: string);
11
+ /**
12
+ * Parse markdown file to extract statements from HTML comments
13
+ */
14
+ private parseMarkdownStatements;
15
+ /**
16
+ * Load statements from markdown file
17
+ */
18
+ loadStatements(): Promise<void>;
19
+ /**
20
+ * Save statements back to markdown file
21
+ */
22
+ saveStatements(): Promise<void>;
23
+ /**
24
+ * Get a specific statement by key
25
+ */
26
+ getStatement(key: string): string;
27
+ /**
28
+ * Update a statement's content
29
+ */
30
+ updateStatement(key: string, content: string): void;
31
+ /**
32
+ * Get all statements
33
+ */
34
+ getAllStatements(): Record<string, TemplateStatement>;
35
+ /**
36
+ * Set a new file path and reset loaded state
37
+ */
38
+ setFilePath(path: string): void;
39
+ /**
40
+ * Reset statements to defaults
41
+ */
42
+ resetToDefaults(): void;
43
+ }
44
+ //# sourceMappingURL=StatementManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatementManager.d.ts","sourceRoot":"","sources":["../../src/services/StatementManager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,wBAAwB,CAAC;AAGjF;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAyC;IAC3D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,QAAQ,CAAC,EAAE,MAAM;IAU7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAyC/B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAuDrC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAyCrC;;OAEG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAqBjC;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAsBnD;;OAEG;IACH,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC;IASrD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM/B;;OAEG;IACH,eAAe,IAAI,IAAI;CAQxB"}
@@ -0,0 +1,216 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { DEFAULT_STATEMENTS } from './constants.js';
4
+ /**
5
+ * Service for managing configurable template statements
6
+ * Loads statements from markdown files and provides CRUD operations
7
+ */
8
+ export class StatementManager {
9
+ statements = {};
10
+ filePath;
11
+ isLoaded = false;
12
+ constructor(filePath) {
13
+ if (!filePath) {
14
+ throw new Error('StatementManager requires an explicit file path. ' +
15
+ 'Configure a project path in the UI to resolve statement files.');
16
+ }
17
+ this.filePath = filePath;
18
+ }
19
+ /**
20
+ * Parse markdown file to extract statements from HTML comments
21
+ */
22
+ parseMarkdownStatements(content) {
23
+ const statements = [];
24
+ // Split content into sections by headers
25
+ const sections = content.split(/^## /m).filter(section => section.trim());
26
+ // Pattern to extract metadata from HTML comments
27
+ const commentPattern = /<!--\s*key:\s*([^,]+),\s*editable:\s*(true|false)\s*-->/;
28
+ for (const section of sections) {
29
+ const lines = section.split('\n');
30
+ // Look for comment metadata
31
+ const commentMatch = lines.find(line => commentPattern.test(line));
32
+ if (commentMatch) {
33
+ const match = commentMatch.match(commentPattern);
34
+ if (match) {
35
+ const key = match[1].trim();
36
+ const editable = match[2] === 'true';
37
+ // Extract content after comment (everything after the comment line)
38
+ const commentIndex = lines.indexOf(commentMatch);
39
+ const contentLines = lines.slice(commentIndex + 1)
40
+ .filter(line => !line.match(/^##\s/)) // Stop at next section (## followed by space, not ###)
41
+ .join('\n')
42
+ .trim();
43
+ if (contentLines) {
44
+ statements.push({
45
+ key,
46
+ content: contentLines,
47
+ editable
48
+ });
49
+ }
50
+ }
51
+ }
52
+ }
53
+ return statements;
54
+ }
55
+ /**
56
+ * Load statements from markdown file
57
+ */
58
+ async loadStatements() {
59
+ try {
60
+ // Check if file exists
61
+ if (!fs.existsSync(this.filePath)) {
62
+ console.warn(`Statement file not found at ${this.filePath}, using defaults`);
63
+ // Deep copy defaults to avoid reference issues
64
+ this.statements = {};
65
+ for (const [key, statement] of Object.entries(DEFAULT_STATEMENTS)) {
66
+ this.statements[key] = { ...statement };
67
+ }
68
+ this.isLoaded = true;
69
+ return;
70
+ }
71
+ // Read file content
72
+ const fileContent = fs.readFileSync(this.filePath, 'utf-8');
73
+ // Parse statements from markdown
74
+ const parsedStatements = this.parseMarkdownStatements(fileContent);
75
+ // Convert to statement objects
76
+ this.statements = {};
77
+ for (const parsed of parsedStatements) {
78
+ // Find description from defaults or create one
79
+ const defaultStatement = DEFAULT_STATEMENTS[parsed.key];
80
+ const description = defaultStatement?.description || `Statement: ${parsed.key}`;
81
+ this.statements[parsed.key] = {
82
+ key: parsed.key,
83
+ content: parsed.content,
84
+ description,
85
+ editable: parsed.editable
86
+ };
87
+ }
88
+ // Add any missing default statements
89
+ for (const [key, defaultStatement] of Object.entries(DEFAULT_STATEMENTS)) {
90
+ if (!this.statements[key]) {
91
+ console.warn(`Statement '${key}' not found in file, using default`);
92
+ this.statements[key] = { ...defaultStatement };
93
+ }
94
+ }
95
+ this.isLoaded = true;
96
+ }
97
+ catch (error) {
98
+ console.error('Error loading statements:', error);
99
+ // Fall back to defaults on any error (deep copy)
100
+ this.statements = {};
101
+ for (const [key, statement] of Object.entries(DEFAULT_STATEMENTS)) {
102
+ this.statements[key] = { ...statement };
103
+ }
104
+ this.isLoaded = true;
105
+ }
106
+ }
107
+ /**
108
+ * Save statements back to markdown file
109
+ */
110
+ async saveStatements() {
111
+ try {
112
+ // Ensure directory exists
113
+ const dir = path.dirname(this.filePath);
114
+ if (!fs.existsSync(dir)) {
115
+ fs.mkdirSync(dir, { recursive: true });
116
+ }
117
+ // Build markdown content
118
+ let content = `---
119
+ version: "1.0.0"
120
+ lastUpdated: "${new Date().toISOString().split('T')[0]}"
121
+ ---
122
+
123
+ `;
124
+ // Add each statement as a section
125
+ for (const statement of Object.values(this.statements)) {
126
+ // Create header from key (convert kebab-case to Title Case)
127
+ const header = statement.key
128
+ .split('-')
129
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
130
+ .join(' ');
131
+ content += `## ${header}\n`;
132
+ content += `<!-- key: ${statement.key}, editable: ${statement.editable} -->\n\n`;
133
+ content += `${statement.content}\n\n`;
134
+ }
135
+ // Write atomically using temp file
136
+ const tempPath = `${this.filePath}.tmp`;
137
+ fs.writeFileSync(tempPath, content, 'utf-8');
138
+ fs.renameSync(tempPath, this.filePath);
139
+ }
140
+ catch (error) {
141
+ console.error('Error saving statements:', error);
142
+ const message = error instanceof Error ? error.message : String(error);
143
+ throw new Error(`Failed to save statements: ${message}`);
144
+ }
145
+ }
146
+ /**
147
+ * Get a specific statement by key
148
+ */
149
+ getStatement(key) {
150
+ if (!this.isLoaded) {
151
+ throw new Error('Statements not loaded. Call loadStatements() first.');
152
+ }
153
+ const statement = this.statements[key];
154
+ if (!statement) {
155
+ // Try to find in defaults
156
+ const defaultStatement = DEFAULT_STATEMENTS[key];
157
+ if (defaultStatement) {
158
+ console.warn(`Statement '${key}' not found, using default`);
159
+ return defaultStatement.content;
160
+ }
161
+ console.warn(`Statement '${key}' not found, returning empty string`);
162
+ return '';
163
+ }
164
+ return statement.content;
165
+ }
166
+ /**
167
+ * Update a statement's content
168
+ */
169
+ updateStatement(key, content) {
170
+ if (!this.isLoaded) {
171
+ throw new Error('Statements not loaded. Call loadStatements() first.');
172
+ }
173
+ const statement = this.statements[key];
174
+ if (!statement) {
175
+ throw new Error(`Statement '${key}' not found`);
176
+ }
177
+ if (!statement.editable) {
178
+ throw new Error(`Statement '${key}' is not editable`);
179
+ }
180
+ // Validate content
181
+ if (!content || content.trim().length === 0) {
182
+ throw new Error('Statement content cannot be empty');
183
+ }
184
+ statement.content = content;
185
+ }
186
+ /**
187
+ * Get all statements
188
+ */
189
+ getAllStatements() {
190
+ if (!this.isLoaded) {
191
+ throw new Error('Statements not loaded. Call loadStatements() first.');
192
+ }
193
+ // Return a copy to prevent external modifications
194
+ return { ...this.statements };
195
+ }
196
+ /**
197
+ * Set a new file path and reset loaded state
198
+ */
199
+ setFilePath(path) {
200
+ this.filePath = path;
201
+ this.isLoaded = false;
202
+ this.statements = {};
203
+ }
204
+ /**
205
+ * Reset statements to defaults
206
+ */
207
+ resetToDefaults() {
208
+ // Create deep copy of defaults to avoid reference issues
209
+ this.statements = {};
210
+ for (const [key, statement] of Object.entries(DEFAULT_STATEMENTS)) {
211
+ this.statements[key] = { ...statement };
212
+ }
213
+ this.isLoaded = true;
214
+ }
215
+ }
216
+ //# sourceMappingURL=StatementManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatementManager.js","sourceRoot":"","sources":["../../src/services/StatementManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { type SystemPrompt, type ParsedPromptFile } from '../types/prompts.js';
2
+ /**
3
+ * Service for parsing system prompts from the prompt.ai-project.system.md file
4
+ * Handles markdown section parsing, instruction mapping, and caching
5
+ */
6
+ export declare class SystemPromptParser {
7
+ private promptsCache;
8
+ private filePath;
9
+ private static readonly CACHE_TTL_MS;
10
+ constructor(filePath?: string);
11
+ /**
12
+ * Parse the entire prompt file and extract all sections
13
+ */
14
+ parsePromptFile(): Promise<ParsedPromptFile>;
15
+ /**
16
+ * Parse markdown sections using ##### headers
17
+ */
18
+ private parseMarkdownSections;
19
+ /**
20
+ * Extract prompt content from section, handling markdown code blocks
21
+ */
22
+ private extractPromptContent;
23
+ /**
24
+ * Generate a key from section header
25
+ */
26
+ private generateKeyFromHeader;
27
+ /**
28
+ * Extract parameters from prompt content
29
+ */
30
+ private extractParameters;
31
+ /**
32
+ * Get context initialization prompt (Model Change or Context Refresh)
33
+ * @param isMonorepo - If true, returns monorepo-specific version; otherwise returns regular version
34
+ */
35
+ getContextInitializationPrompt(isMonorepo?: boolean): Promise<SystemPrompt | null>;
36
+ /**
37
+ * Get tool use prompt (Use 3rd Party Tool)
38
+ */
39
+ getToolUsePrompt(): Promise<SystemPrompt | null>;
40
+ /**
41
+ * Get prompt for specific instruction type
42
+ */
43
+ getPromptForInstruction(instruction: string): Promise<SystemPrompt | null>;
44
+ /**
45
+ * Get all available prompts
46
+ */
47
+ getAllPrompts(): Promise<SystemPrompt[]>;
48
+ /**
49
+ * Check cached prompts and return if valid
50
+ */
51
+ private getCachedPrompts;
52
+ /**
53
+ * Cache parsed prompts with file modification time
54
+ */
55
+ private cachePrompts;
56
+ /**
57
+ * Set a new file path and invalidate the cache
58
+ */
59
+ setFilePath(path: string): void;
60
+ /**
61
+ * Clear cache (useful for testing or forced refresh)
62
+ */
63
+ clearCache(): void;
64
+ /**
65
+ * Validate prompt file structure
66
+ */
67
+ validatePromptFile(): Promise<{
68
+ isValid: boolean;
69
+ errors: string[];
70
+ }>;
71
+ }
72
+ //# sourceMappingURL=SystemPromptParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemPromptParser.d.ts","sourceRoot":"","sources":["../../src/services/SystemPromptParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAyB,MAAM,qBAAqB,CAAC;AAEzH;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,YAAY,CAA4C;IAChE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAiB;gBAEzC,QAAQ,CAAC,EAAE,MAAM;IAU7B;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC;IA4BlD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA6B5B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAS7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;;OAGG;IACG,8BAA8B,CAAC,UAAU,GAAE,OAAe,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAyB/F;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAStD;;OAEG;IACG,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAehF;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAK9C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/B;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAsC5E"}