nimai-core 0.4.8 → 0.5.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.
package/dist/context.js DELETED
@@ -1,186 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.extractContext = extractContext;
37
- const fs = __importStar(require("fs"));
38
- const path = __importStar(require("path"));
39
- const MAX_FILES = 20;
40
- const INCLUDE_EXTENSIONS = new Set(['.ts', '.js', '.md', '.json', '.yaml', '.yml']);
41
- const EXCLUDE_DIRS = new Set(['node_modules', '.git', 'dist', '.next', '__pycache__', 'tmp', '.tmp', 'coverage', '.cache', 'build', 'out']);
42
- const MAX_SNIPPET_CHARS = 2000;
43
- // Files whose base name (without extension) matches these patterns are always included
44
- // regardless of keyword relevance score — they anchor the spec builder's architecture decisions.
45
- const BASELINE_NAME_PATTERNS = /^(schema|schemas|types|type|models|model|db|database|entity|entities|migration|migrations)$/i;
46
- const BASELINE_ROOT_FILES = ['package.json', 'README.md', 'readme.md', 'Readme.md'];
47
- /**
48
- * Collect deterministic baseline files that are always included in context:
49
- * - Root-level package.json (tech stack, dependencies, scripts)
50
- * - Root-level README.md (architecture overview)
51
- * - Any schema/types/models/db files anywhere in the repo (data model anchors)
52
- */
53
- function collectBaseline(repoPath) {
54
- const results = [];
55
- const seen = new Set();
56
- function add(filePath, relPath) {
57
- if (seen.has(relPath))
58
- return;
59
- seen.add(relPath);
60
- try {
61
- const content = fs.readFileSync(filePath, 'utf-8');
62
- results.push({ file: relPath, snippet: content.slice(0, MAX_SNIPPET_CHARS), relevance: 0 });
63
- }
64
- catch { /* skip unreadable files */ }
65
- }
66
- // Root-level package.json and README (first match wins for README)
67
- for (const name of BASELINE_ROOT_FILES) {
68
- const p = path.join(repoPath, name);
69
- if (fs.existsSync(p))
70
- add(p, name);
71
- }
72
- // Schema/types/models/db files anywhere in the repo
73
- function walkForBaseline(dir) {
74
- let entries;
75
- try {
76
- entries = fs.readdirSync(dir, { withFileTypes: true });
77
- }
78
- catch {
79
- return;
80
- }
81
- for (const entry of entries) {
82
- const fullPath = path.join(dir, entry.name);
83
- if (entry.isDirectory()) {
84
- if (!EXCLUDE_DIRS.has(entry.name))
85
- walkForBaseline(fullPath);
86
- }
87
- else if (entry.isFile()) {
88
- const ext = path.extname(entry.name).toLowerCase();
89
- if (!INCLUDE_EXTENSIONS.has(ext))
90
- continue;
91
- const nameWithoutExt = path.basename(entry.name, path.extname(entry.name));
92
- if (BASELINE_NAME_PATTERNS.test(nameWithoutExt)) {
93
- add(fullPath, path.relative(repoPath, fullPath));
94
- }
95
- }
96
- }
97
- }
98
- walkForBaseline(repoPath);
99
- return results.slice(0, 10); // cap baseline at 10 files
100
- }
101
- function extractContext(repoPath, request) {
102
- const keywords = tokenize(request);
103
- const candidates = [];
104
- walkDir(repoPath, repoPath, candidates, keywords);
105
- // Baseline files always included — they anchor architecture decisions
106
- const baseline = collectBaseline(repoPath);
107
- const baselineFiles = new Set(baseline.map(i => i.file));
108
- // Keyword-ranked results fill remaining slots, deduplicated against baseline
109
- const keywordRanked = candidates
110
- .filter(i => !baselineFiles.has(i.file))
111
- .sort((a, b) => b.relevance - a.relevance)
112
- .slice(0, MAX_FILES - baseline.length);
113
- return [...baseline, ...keywordRanked];
114
- }
115
- function walkDir(rootPath, currentPath, results, keywords) {
116
- let entries;
117
- try {
118
- entries = fs.readdirSync(currentPath, { withFileTypes: true });
119
- }
120
- catch {
121
- return;
122
- }
123
- for (const entry of entries) {
124
- const fullPath = path.join(currentPath, entry.name);
125
- if (entry.isDirectory()) {
126
- if (!EXCLUDE_DIRS.has(entry.name)) {
127
- walkDir(rootPath, fullPath, results, keywords);
128
- }
129
- }
130
- else if (entry.isFile()) {
131
- const ext = path.extname(entry.name).toLowerCase();
132
- if (!INCLUDE_EXTENSIONS.has(ext))
133
- continue;
134
- let content;
135
- try {
136
- content = fs.readFileSync(fullPath, 'utf-8');
137
- }
138
- catch {
139
- continue;
140
- }
141
- const relPath = path.relative(rootPath, fullPath);
142
- const relevance = scoreRelevance(entry.name, content, keywords, relPath);
143
- if (relevance > 0) {
144
- results.push({
145
- file: relPath,
146
- snippet: content.slice(0, MAX_SNIPPET_CHARS),
147
- relevance,
148
- });
149
- }
150
- }
151
- }
152
- }
153
- // Source dirs score higher than docs/examples/schemas
154
- const SOURCE_DIR_PATTERNS = ['src/', 'lib/', 'app/', 'server/', 'api/'];
155
- const DOCS_DIR_PATTERNS = ['docs/', 'examples/', 'schemas/'];
156
- function scoreRelevance(filename, content, keywords, relPath) {
157
- if (keywords.length === 0)
158
- return 1;
159
- const lower = (filename + ' ' + content).toLowerCase();
160
- const keywordScore = keywords.filter(k => lower.includes(k)).length;
161
- if (keywordScore === 0)
162
- return 0;
163
- // Filename boost: if the filename itself matches a keyword, it's likely the most relevant file
164
- const filenameLower = filename.toLowerCase().replace(/\.[^.]+$/, '');
165
- const filenameBoost = keywords.some(k => filenameLower.includes(k)) ? 2 : 0;
166
- // Path boost: source files score higher than docs/examples
167
- let pathBoost = 0;
168
- if (relPath) {
169
- const rel = relPath.toLowerCase();
170
- if (SOURCE_DIR_PATTERNS.some(p => rel.startsWith(p)))
171
- pathBoost = 1;
172
- if (DOCS_DIR_PATTERNS.some(p => rel.startsWith(p)))
173
- pathBoost = -1;
174
- }
175
- // Nimai spec boost: files containing <!-- nimai-spec --> or <!-- nimai-spec: DATE --> marker
176
- const nimaiBoost = /<!--\s*nimai-spec[:\s]/.test(content) ? 2 : 0;
177
- return keywordScore + filenameBoost + pathBoost + nimaiBoost;
178
- }
179
- function tokenize(request) {
180
- return request
181
- .toLowerCase()
182
- .replace(/[^a-z0-9\s]/g, ' ')
183
- .split(/\s+/)
184
- .filter(t => t.length > 2);
185
- }
186
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}