@phantomind/core 0.1.1 → 0.1.2
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/compare.d.ts +6 -0
- package/dist/cli/compare.d.ts.map +1 -0
- package/dist/cli/compare.js +34 -0
- package/dist/cli/compare.js.map +1 -0
- package/dist/cli/context.d.ts +8 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +37 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/diff.d.ts +6 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +46 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/hooks.d.ts +5 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +35 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +5 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +2 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +163 -84
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/learn.d.ts +11 -0
- package/dist/cli/learn.d.ts.map +1 -0
- package/dist/cli/learn.js +50 -0
- package/dist/cli/learn.js.map +1 -0
- package/dist/cli/main.js +56 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/watch.d.ts +5 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +60 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +8 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/context/learner.d.ts +31 -6
- package/dist/context/learner.d.ts.map +1 -1
- package/dist/context/learner.js +328 -29
- package/dist/context/learner.js.map +1 -1
- package/dist/context/project-template.d.ts +21 -0
- package/dist/context/project-template.d.ts.map +1 -0
- package/dist/context/project-template.js +81 -0
- package/dist/context/project-template.js.map +1 -0
- package/dist/context/rules-generator.d.ts +7 -0
- package/dist/context/rules-generator.d.ts.map +1 -0
- package/dist/context/rules-generator.js +158 -0
- package/dist/context/rules-generator.js.map +1 -0
- package/dist/templates/engine.d.ts.map +1 -1
- package/dist/templates/engine.js +159 -10
- package/dist/templates/engine.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { TemplateEngine } from '../templates/engine.js';
|
|
5
|
+
import { ContextLearner } from './learner.js';
|
|
6
|
+
import { PROJECT_TEMPLATES, detectProjectTemplate, } from './project-template.js';
|
|
7
|
+
function detectProjectName(projectRoot) {
|
|
8
|
+
try {
|
|
9
|
+
const pkgPath = join(projectRoot, 'package.json');
|
|
10
|
+
if (existsSync(pkgPath)) {
|
|
11
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
12
|
+
return pkg.name ?? projectRoot.split('/').pop() ?? 'project';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Ignore invalid package.json
|
|
17
|
+
}
|
|
18
|
+
return projectRoot.split('/').pop() ?? 'project';
|
|
19
|
+
}
|
|
20
|
+
async function readJson(projectRoot, relativePath) {
|
|
21
|
+
const fullPath = join(projectRoot, relativePath);
|
|
22
|
+
if (!existsSync(fullPath))
|
|
23
|
+
return null;
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(await readFile(fullPath, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
async function readOptionalText(projectRoot, relativePath) {
|
|
32
|
+
const fullPath = join(projectRoot, relativePath);
|
|
33
|
+
if (!existsSync(fullPath))
|
|
34
|
+
return '';
|
|
35
|
+
try {
|
|
36
|
+
return await readFile(fullPath, 'utf-8');
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return '';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function languageRulesFromConfig(techStack, tsconfig) {
|
|
43
|
+
const rules = [];
|
|
44
|
+
if (techStack.languages.includes('TypeScript')) {
|
|
45
|
+
rules.push('Keep TypeScript strictness intact when adding new code.');
|
|
46
|
+
const compilerOptions = tsconfig?.compilerOptions ?? {};
|
|
47
|
+
if (compilerOptions.strict === true)
|
|
48
|
+
rules.push('Do not weaken strict TypeScript compiler options.');
|
|
49
|
+
if (compilerOptions.noImplicitAny === true)
|
|
50
|
+
rules.push('Avoid introducing implicit any types.');
|
|
51
|
+
if (typeof compilerOptions.module === 'string') {
|
|
52
|
+
rules.push(`Preserve the configured module target: ${compilerOptions.module}.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (techStack.languages.includes('JavaScript')) {
|
|
56
|
+
rules.push('Prefer modern syntax that matches the current runtime target.');
|
|
57
|
+
}
|
|
58
|
+
if (techStack.languages.includes('Python')) {
|
|
59
|
+
rules.push('Prefer explicit dependencies and small modules for Python code.');
|
|
60
|
+
}
|
|
61
|
+
return [...new Set(rules)];
|
|
62
|
+
}
|
|
63
|
+
function frameworkRulesFromTechStack(techStack) {
|
|
64
|
+
const rules = [];
|
|
65
|
+
if (techStack.frameworks.includes('React'))
|
|
66
|
+
rules.push('Keep UI state local unless cross-feature coordination is required.');
|
|
67
|
+
if (techStack.frameworks.includes('Next.js'))
|
|
68
|
+
rules.push('Respect server/client boundaries and route conventions.');
|
|
69
|
+
if (techStack.frameworks.includes('Express'))
|
|
70
|
+
rules.push('Keep routing, validation, and business logic separated.');
|
|
71
|
+
if (techStack.frameworks.includes('NestJS'))
|
|
72
|
+
rules.push('Follow module/provider/controller boundaries consistently.');
|
|
73
|
+
return rules;
|
|
74
|
+
}
|
|
75
|
+
function importRulesFromFiles(techStack, eslintText) {
|
|
76
|
+
const rules = [];
|
|
77
|
+
if (techStack.runtime.includes('Node.js'))
|
|
78
|
+
rules.push('Use the node: prefix for built-in modules where already adopted.');
|
|
79
|
+
if (eslintText.includes('import/order'))
|
|
80
|
+
rules.push('Preserve configured import ordering.');
|
|
81
|
+
if (eslintText.includes('@typescript-eslint/consistent-type-imports')) {
|
|
82
|
+
rules.push('Use type-only imports when importing types.');
|
|
83
|
+
}
|
|
84
|
+
return [...new Set(rules)];
|
|
85
|
+
}
|
|
86
|
+
function testingRulesFromTechStack(techStack) {
|
|
87
|
+
const rules = [];
|
|
88
|
+
if (techStack.testingTools.length === 0) {
|
|
89
|
+
rules.push('Add regression coverage when changing behavior in critical paths.');
|
|
90
|
+
}
|
|
91
|
+
if (techStack.testingTools.includes('Vitest'))
|
|
92
|
+
rules.push('Keep tests fast and focused when using Vitest.');
|
|
93
|
+
if (techStack.testingTools.includes('Playwright'))
|
|
94
|
+
rules.push('Reserve end-to-end coverage for critical flows.');
|
|
95
|
+
return rules;
|
|
96
|
+
}
|
|
97
|
+
function forbiddenPatternsFromConfig(eslintText, techStack) {
|
|
98
|
+
const patterns = ['Hardcoded secrets or credentials', 'Commented-out code committed as dead weight'];
|
|
99
|
+
if (techStack.languages.includes('TypeScript'))
|
|
100
|
+
patterns.push('Using any in new code without a strong reason');
|
|
101
|
+
if (eslintText.includes('no-console'))
|
|
102
|
+
patterns.push('Console logging in production code paths');
|
|
103
|
+
return [...new Set(patterns)];
|
|
104
|
+
}
|
|
105
|
+
export async function generateRulesContent(projectRoot, options = {}) {
|
|
106
|
+
const learner = new ContextLearner(projectRoot);
|
|
107
|
+
await learner.learn();
|
|
108
|
+
const techStack = learner.getTechStack();
|
|
109
|
+
const tsconfig = await readJson(projectRoot, 'tsconfig.json');
|
|
110
|
+
const eslintText = [
|
|
111
|
+
await readOptionalText(projectRoot, '.eslintrc'),
|
|
112
|
+
await readOptionalText(projectRoot, '.eslintrc.json'),
|
|
113
|
+
await readOptionalText(projectRoot, 'eslint.config.js'),
|
|
114
|
+
await readOptionalText(projectRoot, 'eslint.config.mjs'),
|
|
115
|
+
].join('\n');
|
|
116
|
+
const prettierText = [
|
|
117
|
+
await readOptionalText(projectRoot, '.prettierrc'),
|
|
118
|
+
await readOptionalText(projectRoot, '.prettierrc.json'),
|
|
119
|
+
await readOptionalText(projectRoot, 'prettier.config.js'),
|
|
120
|
+
await readOptionalText(projectRoot, 'prettier.config.mjs'),
|
|
121
|
+
].join('\n');
|
|
122
|
+
const selectedTemplateName = options.template && options.template !== 'auto'
|
|
123
|
+
? options.template
|
|
124
|
+
: detectProjectTemplate({
|
|
125
|
+
frameworks: techStack.frameworks,
|
|
126
|
+
entryPoints: techStack.entryPoints,
|
|
127
|
+
projectType: techStack.projectType,
|
|
128
|
+
});
|
|
129
|
+
const template = PROJECT_TEMPLATES[selectedTemplateName];
|
|
130
|
+
return TemplateEngine.renderRules({
|
|
131
|
+
projectName: detectProjectName(projectRoot),
|
|
132
|
+
primaryLanguage: techStack.languages[0] ?? 'Unknown',
|
|
133
|
+
framework: techStack.frameworks[0] ?? template.displayName,
|
|
134
|
+
languageRules: [...template.languageRules, ...languageRulesFromConfig(techStack, tsconfig)],
|
|
135
|
+
frameworkRules: [...template.frameworkRules, ...frameworkRulesFromTechStack(techStack)],
|
|
136
|
+
fileOrganization: template.fileOrganization,
|
|
137
|
+
importRules: [...template.importRules, ...importRulesFromFiles(techStack, eslintText)],
|
|
138
|
+
testingRules: [...template.testingRules, ...testingRulesFromTechStack(techStack)],
|
|
139
|
+
branchNaming: 'feature/*, fix/*, chore/*',
|
|
140
|
+
commitFormat: 'conventional commits',
|
|
141
|
+
prRequirements: 'Explain behavioral changes, risks, and validation steps.',
|
|
142
|
+
securityRules: ['Do not trust unchecked external input.'],
|
|
143
|
+
performanceRules: [...template.performanceRules],
|
|
144
|
+
documentationRules: [
|
|
145
|
+
...template.documentationRules,
|
|
146
|
+
...(prettierText ? ['Do not fight formatter output; align changes with configured formatting.'] : []),
|
|
147
|
+
],
|
|
148
|
+
forbiddenPatterns: [...template.forbiddenPatterns, ...forbiddenPatternsFromConfig(eslintText, techStack)],
|
|
149
|
+
customRules: template.customRules,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
export async function writeRulesContent(projectRoot, options = {}) {
|
|
153
|
+
const content = await generateRulesContent(projectRoot, options);
|
|
154
|
+
const rulesPath = join(projectRoot, '.phantomind', 'RULES.md');
|
|
155
|
+
await writeFile(rulesPath, content, 'utf-8');
|
|
156
|
+
return content;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=rules-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules-generator.js","sourceRoot":"","sources":["../../src/context/rules-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/templates/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/templates/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiKH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,MAAM;IA8CpE;;OAEG;WACU,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOvE;;OAEG;WACU,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;CAMvE"}
|
package/dist/templates/engine.js
CHANGED
|
@@ -2,10 +2,163 @@
|
|
|
2
2
|
* PhantomMindAI — Template Engine
|
|
3
3
|
* Renders mustache-like templates with project data.
|
|
4
4
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
const SKILLS_TEMPLATE = `# {{projectName}} — AI Skills & Context
|
|
6
|
+
<!-- Auto-generated by PhantomMindAI. Do not edit manually. -->
|
|
7
|
+
<!-- Last updated: {{timestamp}} -->
|
|
8
|
+
|
|
9
|
+
## Project Overview
|
|
10
|
+
- **Name**: {{projectName}}
|
|
11
|
+
- **Type**: {{projectType}}
|
|
12
|
+
- **Language**: {{primaryLanguage}}
|
|
13
|
+
- **Framework**: {{framework}}
|
|
14
|
+
|
|
15
|
+
## Tech Stack
|
|
16
|
+
{{#techStack}}
|
|
17
|
+
- {{.}}
|
|
18
|
+
{{/techStack}}
|
|
19
|
+
|
|
20
|
+
## Architecture
|
|
21
|
+
{{architectureDescription}}
|
|
22
|
+
|
|
23
|
+
### Directory Structure
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
{{directoryStructure}}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## Coding Conventions
|
|
30
|
+
|
|
31
|
+
### Naming Conventions
|
|
32
|
+
{{#namingConventions}}
|
|
33
|
+
- {{.}}
|
|
34
|
+
{{/namingConventions}}
|
|
35
|
+
|
|
36
|
+
### Import Patterns
|
|
37
|
+
{{#importPatterns}}
|
|
38
|
+
- {{.}}
|
|
39
|
+
{{/importPatterns}}
|
|
40
|
+
|
|
41
|
+
### Code Style
|
|
42
|
+
{{#codeStyle}}
|
|
43
|
+
- {{.}}
|
|
44
|
+
{{/codeStyle}}
|
|
45
|
+
|
|
46
|
+
## Project Patterns
|
|
47
|
+
|
|
48
|
+
### Common Patterns
|
|
49
|
+
{{#commonPatterns}}
|
|
50
|
+
- **{{name}}**: {{description}}
|
|
51
|
+
{{/commonPatterns}}
|
|
52
|
+
|
|
53
|
+
### Anti-Patterns (Avoid)
|
|
54
|
+
{{#antiPatterns}}
|
|
55
|
+
- ❌ {{.}}
|
|
56
|
+
{{/antiPatterns}}
|
|
57
|
+
|
|
58
|
+
## Key Files
|
|
59
|
+
{{#keyFiles}}
|
|
60
|
+
- \`{{path}}\` — {{description}}
|
|
61
|
+
{{/keyFiles}}
|
|
62
|
+
|
|
63
|
+
## Dependencies
|
|
64
|
+
### Production
|
|
65
|
+
{{#dependencies}}
|
|
66
|
+
- \`{{name}}\` ({{version}}) — {{description}}
|
|
67
|
+
{{/dependencies}}
|
|
68
|
+
|
|
69
|
+
### Dev Dependencies
|
|
70
|
+
{{#devDependencies}}
|
|
71
|
+
- \`{{name}}\` ({{version}})
|
|
72
|
+
{{/devDependencies}}
|
|
73
|
+
|
|
74
|
+
## Testing
|
|
75
|
+
- **Framework**: {{testFramework}}
|
|
76
|
+
- **Run**: \`{{testCommand}}\`
|
|
77
|
+
- **Pattern**: {{testPattern}}
|
|
78
|
+
|
|
79
|
+
## Build & Deploy
|
|
80
|
+
- **Build**: \`{{buildCommand}}\`
|
|
81
|
+
- **Dev**: \`{{devCommand}}\`
|
|
82
|
+
- **Deploy**: {{deployTarget}}
|
|
83
|
+
|
|
84
|
+
## Additional Context
|
|
85
|
+
{{additionalContext}}
|
|
86
|
+
`;
|
|
87
|
+
const RULES_TEMPLATE = `# {{projectName}} — AI Rules & Guidelines
|
|
88
|
+
<!-- Auto-generated by PhantomMindAI. Do not edit manually. -->
|
|
89
|
+
<!-- Last updated: {{timestamp}} -->
|
|
90
|
+
|
|
91
|
+
## General Rules
|
|
92
|
+
1. Follow the project's existing code style and conventions
|
|
93
|
+
2. Never hardcode secrets, API keys, or credentials
|
|
94
|
+
3. Always handle errors appropriately — never use empty catch blocks
|
|
95
|
+
4. Write self-documenting code with meaningful names
|
|
96
|
+
5. Keep functions focused — each function should do one thing
|
|
97
|
+
|
|
98
|
+
## Language-Specific Rules
|
|
99
|
+
|
|
100
|
+
### {{primaryLanguage}}
|
|
101
|
+
{{#languageRules}}
|
|
102
|
+
- {{.}}
|
|
103
|
+
{{/languageRules}}
|
|
104
|
+
|
|
105
|
+
## Framework Rules
|
|
106
|
+
|
|
107
|
+
### {{framework}}
|
|
108
|
+
{{#frameworkRules}}
|
|
109
|
+
- {{.}}
|
|
110
|
+
{{/frameworkRules}}
|
|
111
|
+
|
|
112
|
+
## File Organization
|
|
113
|
+
{{#fileOrganization}}
|
|
114
|
+
- {{.}}
|
|
115
|
+
{{/fileOrganization}}
|
|
116
|
+
|
|
117
|
+
## Import Rules
|
|
118
|
+
{{#importRules}}
|
|
119
|
+
- {{.}}
|
|
120
|
+
{{/importRules}}
|
|
121
|
+
|
|
122
|
+
## Testing Rules
|
|
123
|
+
{{#testingRules}}
|
|
124
|
+
- {{.}}
|
|
125
|
+
{{/testingRules}}
|
|
126
|
+
|
|
127
|
+
## Git Conventions
|
|
128
|
+
- **Branch naming**: {{branchNaming}}
|
|
129
|
+
- **Commit format**: {{commitFormat}}
|
|
130
|
+
- **PR requirements**: {{prRequirements}}
|
|
131
|
+
|
|
132
|
+
## Security Rules
|
|
133
|
+
1. Never commit secrets or API keys
|
|
134
|
+
2. Validate all user input
|
|
135
|
+
3. Use parameterized queries for database access
|
|
136
|
+
4. Sanitize output to prevent XSS
|
|
137
|
+
5. Follow the principle of least privilege
|
|
138
|
+
{{#securityRules}}
|
|
139
|
+
6. {{.}}
|
|
140
|
+
{{/securityRules}}
|
|
141
|
+
|
|
142
|
+
## Performance Rules
|
|
143
|
+
{{#performanceRules}}
|
|
144
|
+
- {{.}}
|
|
145
|
+
{{/performanceRules}}
|
|
146
|
+
|
|
147
|
+
## Documentation Rules
|
|
148
|
+
{{#documentationRules}}
|
|
149
|
+
- {{.}}
|
|
150
|
+
{{/documentationRules}}
|
|
151
|
+
|
|
152
|
+
## Forbidden Patterns
|
|
153
|
+
{{#forbiddenPatterns}}
|
|
154
|
+
- ❌ **Never**: {{.}}
|
|
155
|
+
{{/forbiddenPatterns}}
|
|
156
|
+
|
|
157
|
+
## Custom Rules
|
|
158
|
+
{{#customRules}}
|
|
159
|
+
- {{.}}
|
|
160
|
+
{{/customRules}}
|
|
161
|
+
`;
|
|
9
162
|
export class TemplateEngine {
|
|
10
163
|
/**
|
|
11
164
|
* Render a template with data
|
|
@@ -49,9 +202,7 @@ export class TemplateEngine {
|
|
|
49
202
|
* Load and render the SKILLS template
|
|
50
203
|
*/
|
|
51
204
|
static async renderSkills(data) {
|
|
52
|
-
|
|
53
|
-
const template = await readFile(templatePath, 'utf-8');
|
|
54
|
-
return this.render(template, {
|
|
205
|
+
return this.render(SKILLS_TEMPLATE, {
|
|
55
206
|
...data,
|
|
56
207
|
timestamp: new Date().toISOString(),
|
|
57
208
|
});
|
|
@@ -60,9 +211,7 @@ export class TemplateEngine {
|
|
|
60
211
|
* Load and render the RULES template
|
|
61
212
|
*/
|
|
62
213
|
static async renderRules(data) {
|
|
63
|
-
|
|
64
|
-
const template = await readFile(templatePath, 'utf-8');
|
|
65
|
-
return this.render(template, {
|
|
214
|
+
return this.render(RULES_TEMPLATE, {
|
|
66
215
|
...data,
|
|
67
216
|
timestamp: new Date().toISOString(),
|
|
68
217
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/templates/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/templates/engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiFvB,CAAC;AAEF,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0EtB,CAAC;AA0CF,MAAM,OAAO,cAAc;IACzB;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,QAAgB,EAAE,IAA2B;QACzD,IAAI,MAAM,GAAG,QAAQ,CAAC;QAEtB,4CAA4C;QAC5C,MAAM,GAAG,MAAM,CAAC,OAAO,CACrB,uCAAuC,EACvC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YAClB,MAAM,KAAK,GAAI,IAAY,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK;gBAAE,OAAO,EAAE,CAAC;YAEtB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACtB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;oBAC9C,CAAC;oBACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7B,IAAI,QAAQ,GAAG,OAAO,CAAC;wBACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC1C,QAAQ,GAAG,QAAQ,CAAC,OAAO,CACzB,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,EACnC,MAAM,CAAC,CAAC,CAAC,CACV,CAAC;wBACJ,CAAC;wBACD,OAAO,QAAQ,CAAC;oBAClB,CAAC;oBACD,OAAO,OAAO,CAAC;gBACjB,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACd,CAAC;YAED,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,CAAC,CACF,CAAC;QAEF,kCAAkC;QAClC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;YACnD,MAAM,KAAK,GAAI,IAAY,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,EAAE,CAAC;YACrD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,6CAA6C;QAC7C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAE3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAA2B;QACnD,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAClC,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,IAA2B;QAClD,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;YACjC,GAAG,IAAI;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;CACF"}
|