@loom-skills/core 0.0.0-stage → 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.
- package/LICENSE +21 -0
- package/dist/compositor.d.ts +25 -0
- package/dist/compositor.d.ts.map +1 -0
- package/dist/compositor.js +215 -0
- package/dist/compositor.js.map +1 -0
- package/dist/context.d.ts +38 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +280 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/loader.d.ts +27 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +148 -0
- package/dist/loader.js.map +1 -0
- package/dist/types.d.ts +124 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/validator.d.ts +44 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +293 -0
- package/dist/validator.js.map +1 -0
- package/package.json +43 -3
- package/README.md +0 -3
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Loom
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { LoadedSkill, Composition, Requirement } from './types.js';
|
|
2
|
+
export declare class Compositor {
|
|
3
|
+
/**
|
|
4
|
+
* Compose multiple skills into a single workflow
|
|
5
|
+
*/
|
|
6
|
+
compose(skills: LoadedSkill[]): Composition;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve dependencies for a set of skills
|
|
9
|
+
*/
|
|
10
|
+
resolve(skills: LoadedSkill[], available: LoadedSkill[]): {
|
|
11
|
+
resolved: LoadedSkill[];
|
|
12
|
+
missing: Requirement[];
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Check if two skills are compatible
|
|
16
|
+
*/
|
|
17
|
+
areCompatible(a: LoadedSkill, b: LoadedSkill): boolean;
|
|
18
|
+
private mergeDefinitions;
|
|
19
|
+
private detectCapabilityConflicts;
|
|
20
|
+
private detectVersionConflicts;
|
|
21
|
+
private detectContextConflicts;
|
|
22
|
+
}
|
|
23
|
+
export declare function getCompositor(): Compositor;
|
|
24
|
+
export declare function composeSkills(skills: LoadedSkill[]): Composition;
|
|
25
|
+
//# sourceMappingURL=compositor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compositor.d.ts","sourceRoot":"","sources":["../src/compositor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EAEX,WAAW,EAGX,WAAW,EACZ,MAAM,YAAY,CAAC;AAMpB,qBAAa,UAAU;IACrB;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW;IAgB3C;;OAEG;IACH,OAAO,CACL,MAAM,EAAE,WAAW,EAAE,EACrB,SAAS,EAAE,WAAW,EAAE,GACvB;QAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;QAAC,OAAO,EAAE,WAAW,EAAE,CAAA;KAAE;IAwCtD;;OAEG;IACH,aAAa,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,OAAO;IAYtD,OAAO,CAAC,gBAAgB;IAuExB,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,sBAAsB;IA6B9B,OAAO,CAAC,sBAAsB;CAyB/B;AAQD,wBAAgB,aAAa,IAAI,UAAU,CAK1C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,CAEhE"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// Loom Skill Compositor
|
|
2
|
+
// Resolves dependencies, detects conflicts, and merges skills
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Compositor
|
|
5
|
+
// ============================================================================
|
|
6
|
+
export class Compositor {
|
|
7
|
+
/**
|
|
8
|
+
* Compose multiple skills into a single workflow
|
|
9
|
+
*/
|
|
10
|
+
compose(skills) {
|
|
11
|
+
const conflicts = [];
|
|
12
|
+
const merged = this.mergeDefinitions(skills);
|
|
13
|
+
// Detect conflicts
|
|
14
|
+
conflicts.push(...this.detectCapabilityConflicts(skills));
|
|
15
|
+
conflicts.push(...this.detectVersionConflicts(skills));
|
|
16
|
+
conflicts.push(...this.detectContextConflicts(skills));
|
|
17
|
+
return {
|
|
18
|
+
skills,
|
|
19
|
+
merged,
|
|
20
|
+
conflicts,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve dependencies for a set of skills
|
|
25
|
+
*/
|
|
26
|
+
resolve(skills, available) {
|
|
27
|
+
const resolved = new Map();
|
|
28
|
+
const missing = [];
|
|
29
|
+
// Add all provided skills
|
|
30
|
+
for (const skill of skills) {
|
|
31
|
+
resolved.set(skill.definition.name, skill);
|
|
32
|
+
}
|
|
33
|
+
// Resolve dependencies
|
|
34
|
+
for (const skill of skills) {
|
|
35
|
+
const deps = skill.definition.requires || [];
|
|
36
|
+
for (const dep of deps) {
|
|
37
|
+
if (dep.optional)
|
|
38
|
+
continue;
|
|
39
|
+
// Check if already resolved
|
|
40
|
+
const depName = dep.id;
|
|
41
|
+
if (resolved.has(depName))
|
|
42
|
+
continue;
|
|
43
|
+
// Find in available
|
|
44
|
+
const availableSkill = available.find((a) => a.definition.name === depName ||
|
|
45
|
+
a.definition.provides.some((p) => dep.capabilities?.includes(p.id)));
|
|
46
|
+
if (availableSkill) {
|
|
47
|
+
resolved.set(availableSkill.definition.name, availableSkill);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
missing.push(dep);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
resolved: Array.from(resolved.values()),
|
|
56
|
+
missing,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check if two skills are compatible
|
|
61
|
+
*/
|
|
62
|
+
areCompatible(a, b) {
|
|
63
|
+
const conflicts = [
|
|
64
|
+
...this.detectCapabilityConflicts([a, b]),
|
|
65
|
+
...this.detectVersionConflicts([a, b]),
|
|
66
|
+
];
|
|
67
|
+
return conflicts.filter((c) => c.type !== 'context').length === 0;
|
|
68
|
+
}
|
|
69
|
+
// ==========================================================================
|
|
70
|
+
// Private Methods
|
|
71
|
+
// ==========================================================================
|
|
72
|
+
mergeDefinitions(skills) {
|
|
73
|
+
const first = skills[0]?.definition;
|
|
74
|
+
if (!first) {
|
|
75
|
+
throw new Error('No skills to merge');
|
|
76
|
+
}
|
|
77
|
+
const merged = {
|
|
78
|
+
name: first.name,
|
|
79
|
+
version: first.version,
|
|
80
|
+
description: first.description,
|
|
81
|
+
provides: [],
|
|
82
|
+
requires: [],
|
|
83
|
+
context: [],
|
|
84
|
+
quality: [],
|
|
85
|
+
references: [],
|
|
86
|
+
tags: [],
|
|
87
|
+
};
|
|
88
|
+
const seenCapabilities = new Set();
|
|
89
|
+
const seenRequirements = new Set();
|
|
90
|
+
const seenContext = new Set();
|
|
91
|
+
const seenQuality = new Set();
|
|
92
|
+
const seenTags = new Set();
|
|
93
|
+
for (const skill of skills) {
|
|
94
|
+
const def = skill.definition;
|
|
95
|
+
// Merge capabilities
|
|
96
|
+
for (const cap of def.provides || []) {
|
|
97
|
+
if (!seenCapabilities.has(cap.id)) {
|
|
98
|
+
seenCapabilities.add(cap.id);
|
|
99
|
+
merged.provides.push(cap);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Merge requirements
|
|
103
|
+
for (const req of def.requires || []) {
|
|
104
|
+
if (!seenRequirements.has(req.id)) {
|
|
105
|
+
seenRequirements.add(req.id);
|
|
106
|
+
merged.requires.push(req);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Merge context
|
|
110
|
+
for (const ctx of def.context || []) {
|
|
111
|
+
if (!seenContext.has(ctx.type)) {
|
|
112
|
+
seenContext.add(ctx.type);
|
|
113
|
+
merged.context.push(ctx);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Merge quality gates
|
|
117
|
+
for (const q of def.quality || []) {
|
|
118
|
+
if (!seenQuality.has(q.id)) {
|
|
119
|
+
seenQuality.add(q.id);
|
|
120
|
+
merged.quality.push(q);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Merge tags
|
|
124
|
+
for (const tag of def.tags || []) {
|
|
125
|
+
if (!seenTags.has(tag)) {
|
|
126
|
+
seenTags.add(tag);
|
|
127
|
+
merged.tags.push(tag);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return merged;
|
|
132
|
+
}
|
|
133
|
+
detectCapabilityConflicts(skills) {
|
|
134
|
+
const conflicts = [];
|
|
135
|
+
const capabilityMap = new Map();
|
|
136
|
+
for (const skill of skills) {
|
|
137
|
+
for (const cap of skill.definition.provides || []) {
|
|
138
|
+
const existing = capabilityMap.get(cap.id) || [];
|
|
139
|
+
existing.push(skill.definition.name);
|
|
140
|
+
capabilityMap.set(cap.id, existing);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
for (const [capId, skillNames] of capabilityMap) {
|
|
144
|
+
if (skillNames.length > 1) {
|
|
145
|
+
conflicts.push({
|
|
146
|
+
type: 'capability',
|
|
147
|
+
skills: skillNames,
|
|
148
|
+
description: `Multiple skills provide capability '${capId}'`,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return conflicts;
|
|
153
|
+
}
|
|
154
|
+
detectVersionConflicts(skills) {
|
|
155
|
+
const conflicts = [];
|
|
156
|
+
const versionMap = new Map();
|
|
157
|
+
for (const skill of skills) {
|
|
158
|
+
for (const req of skill.definition.requires || []) {
|
|
159
|
+
if (req.version) {
|
|
160
|
+
const versions = versionMap.get(req.id) || new Map();
|
|
161
|
+
const skillVersions = versions.get(req.version) || [];
|
|
162
|
+
skillVersions.push(skill.definition.name);
|
|
163
|
+
versions.set(req.version, skillVersions);
|
|
164
|
+
versionMap.set(req.id, versions);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
for (const [reqId, versions] of versionMap) {
|
|
169
|
+
if (versions.size > 1) {
|
|
170
|
+
conflicts.push({
|
|
171
|
+
type: 'version',
|
|
172
|
+
skills: Array.from(versions.values()).flat(),
|
|
173
|
+
description: `Conflicting version requirements for '${reqId}'`,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return conflicts;
|
|
178
|
+
}
|
|
179
|
+
detectContextConflicts(skills) {
|
|
180
|
+
const conflicts = [];
|
|
181
|
+
const contextMap = new Map();
|
|
182
|
+
for (const skill of skills) {
|
|
183
|
+
for (const ctx of skill.definition.context || []) {
|
|
184
|
+
if (ctx.required && ctx.values) {
|
|
185
|
+
const existing = contextMap.get(ctx.type) || [];
|
|
186
|
+
existing.push(skill.definition.name);
|
|
187
|
+
contextMap.set(ctx.type, existing);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Check for incompatible context requirements
|
|
192
|
+
// This is simplified - real implementation would check value overlap
|
|
193
|
+
for (const [ctxType, skillNames] of contextMap) {
|
|
194
|
+
if (skillNames.length > 1) {
|
|
195
|
+
// Would need to check if context values are compatible
|
|
196
|
+
// For now, just flag as potential conflict
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return conflicts;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// ============================================================================
|
|
203
|
+
// Convenience Functions
|
|
204
|
+
// ============================================================================
|
|
205
|
+
let defaultCompositor = null;
|
|
206
|
+
export function getCompositor() {
|
|
207
|
+
if (!defaultCompositor) {
|
|
208
|
+
defaultCompositor = new Compositor();
|
|
209
|
+
}
|
|
210
|
+
return defaultCompositor;
|
|
211
|
+
}
|
|
212
|
+
export function composeSkills(skills) {
|
|
213
|
+
return getCompositor().compose(skills);
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=compositor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compositor.js","sourceRoot":"","sources":["../src/compositor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Context } from './types.js';
|
|
2
|
+
export declare class ContextManager {
|
|
3
|
+
private context;
|
|
4
|
+
private detectionResults;
|
|
5
|
+
/**
|
|
6
|
+
* Detect context from a project directory
|
|
7
|
+
*/
|
|
8
|
+
detect(projectPath: string): Promise<Context>;
|
|
9
|
+
/**
|
|
10
|
+
* Get current context
|
|
11
|
+
*/
|
|
12
|
+
getContext(): Context;
|
|
13
|
+
/**
|
|
14
|
+
* Check if context matches requirements
|
|
15
|
+
*/
|
|
16
|
+
matchesRequirements(requirements: Array<{
|
|
17
|
+
type: string;
|
|
18
|
+
values?: string[];
|
|
19
|
+
}>): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Get context value
|
|
22
|
+
*/
|
|
23
|
+
get<T = unknown>(key: string): T | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Set context value
|
|
26
|
+
*/
|
|
27
|
+
set(key: string, value: unknown): void;
|
|
28
|
+
private analyzeProjectStructure;
|
|
29
|
+
private listFiles;
|
|
30
|
+
private detectLanguage;
|
|
31
|
+
private detectFramework;
|
|
32
|
+
private detectTestRunner;
|
|
33
|
+
private detectPackageManager;
|
|
34
|
+
private detectAgent;
|
|
35
|
+
}
|
|
36
|
+
export declare function getContextManager(): ContextManager;
|
|
37
|
+
export declare function detectContext(projectPath: string): Promise<Context>;
|
|
38
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAoB,MAAM,YAAY,CAAC;AAM5D,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,gBAAgB,CAA8B;IAEtD;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAanD;;OAEG;IACH,UAAU,IAAI,OAAO;IAIrB;;OAEG;IACH,mBAAmB,CACjB,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GACvD,OAAO;IAiBV;;OAEG;IACH,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAI5C;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAQtC,OAAO,CAAC,uBAAuB;IAc/B,OAAO,CAAC,SAAS;IAkCjB,OAAO,CAAC,cAAc;IAsCtB,OAAO,CAAC,eAAe;IA4CvB,OAAO,CAAC,gBAAgB;IA8CxB,OAAO,CAAC,oBAAoB;IAuB5B,OAAO,CAAC,WAAW;CAsBpB;AAQD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEzE"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
// Loom Context Manager
|
|
2
|
+
// Detects and manages runtime context (language, framework, project structure)
|
|
3
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
// ============================================================================
|
|
6
|
+
// Context Manager
|
|
7
|
+
// ============================================================================
|
|
8
|
+
export class ContextManager {
|
|
9
|
+
context = {};
|
|
10
|
+
detectionResults = new Map();
|
|
11
|
+
/**
|
|
12
|
+
* Detect context from a project directory
|
|
13
|
+
*/
|
|
14
|
+
async detect(projectPath) {
|
|
15
|
+
const structure = this.analyzeProjectStructure(projectPath);
|
|
16
|
+
this.context = {
|
|
17
|
+
projectStructure: structure,
|
|
18
|
+
language: this.detectLanguage(structure),
|
|
19
|
+
framework: this.detectFramework(structure),
|
|
20
|
+
agent: this.detectAgent(),
|
|
21
|
+
};
|
|
22
|
+
return this.context;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get current context
|
|
26
|
+
*/
|
|
27
|
+
getContext() {
|
|
28
|
+
return { ...this.context };
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Check if context matches requirements
|
|
32
|
+
*/
|
|
33
|
+
matchesRequirements(requirements) {
|
|
34
|
+
for (const req of requirements) {
|
|
35
|
+
const value = this.context[req.type];
|
|
36
|
+
if (value === undefined) {
|
|
37
|
+
if (req.values && req.values.length > 0) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
if (req.values && !req.values.includes(value)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get context value
|
|
50
|
+
*/
|
|
51
|
+
get(key) {
|
|
52
|
+
return this.context[key];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Set context value
|
|
56
|
+
*/
|
|
57
|
+
set(key, value) {
|
|
58
|
+
this.context[key] = value;
|
|
59
|
+
}
|
|
60
|
+
// ==========================================================================
|
|
61
|
+
// Private Methods - Project Analysis
|
|
62
|
+
// ==========================================================================
|
|
63
|
+
analyzeProjectStructure(root) {
|
|
64
|
+
const files = this.listFiles(root, 2); // 2 levels deep
|
|
65
|
+
return {
|
|
66
|
+
root,
|
|
67
|
+
hasPackageJson: existsSync(join(root, 'package.json')),
|
|
68
|
+
hasTsConfig: existsSync(join(root, 'tsconfig.json')),
|
|
69
|
+
hasTestRunner: this.detectTestRunner(root, files) !== null,
|
|
70
|
+
testRunner: this.detectTestRunner(root, files) || undefined,
|
|
71
|
+
packageManager: this.detectPackageManager(root, files),
|
|
72
|
+
files,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
listFiles(dir, maxDepth, currentDepth = 0) {
|
|
76
|
+
const files = [];
|
|
77
|
+
if (currentDepth >= maxDepth)
|
|
78
|
+
return files;
|
|
79
|
+
try {
|
|
80
|
+
const entries = readdirSync(dir);
|
|
81
|
+
for (const entry of entries) {
|
|
82
|
+
if (entry.startsWith('.') || entry === 'node_modules')
|
|
83
|
+
continue;
|
|
84
|
+
const fullPath = join(dir, entry);
|
|
85
|
+
try {
|
|
86
|
+
const stat = statSync(fullPath);
|
|
87
|
+
if (stat.isFile()) {
|
|
88
|
+
files.push(entry);
|
|
89
|
+
}
|
|
90
|
+
else if (stat.isDirectory()) {
|
|
91
|
+
files.push(`${entry}/`);
|
|
92
|
+
files.push(...this.listFiles(fullPath, maxDepth, currentDepth + 1));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Skip inaccessible files
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Skip inaccessible directories
|
|
102
|
+
}
|
|
103
|
+
return files;
|
|
104
|
+
}
|
|
105
|
+
// ==========================================================================
|
|
106
|
+
// Private Methods - Language Detection
|
|
107
|
+
// ==========================================================================
|
|
108
|
+
detectLanguage(structure) {
|
|
109
|
+
// Check for TypeScript
|
|
110
|
+
if (structure.hasTsConfig)
|
|
111
|
+
return 'typescript';
|
|
112
|
+
// Check file extensions
|
|
113
|
+
const extCounts = new Map();
|
|
114
|
+
for (const file of structure.files) {
|
|
115
|
+
if (file.endsWith('/'))
|
|
116
|
+
continue;
|
|
117
|
+
const ext = file.split('.').pop();
|
|
118
|
+
if (ext) {
|
|
119
|
+
extCounts.set(ext, (extCounts.get(ext) || 0) + 1);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Priority order
|
|
123
|
+
const langPriority = [
|
|
124
|
+
['ts', 'typescript'],
|
|
125
|
+
['tsx', 'typescript'],
|
|
126
|
+
['js', 'javascript'],
|
|
127
|
+
['jsx', 'javascript'],
|
|
128
|
+
['py', 'python'],
|
|
129
|
+
['rb', 'ruby'],
|
|
130
|
+
['go', 'go'],
|
|
131
|
+
['rs', 'rust'],
|
|
132
|
+
['java', 'java'],
|
|
133
|
+
];
|
|
134
|
+
for (const [ext, lang] of langPriority) {
|
|
135
|
+
if (extCounts.has(ext))
|
|
136
|
+
return lang;
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
// ==========================================================================
|
|
141
|
+
// Private Methods - Framework Detection
|
|
142
|
+
// ==========================================================================
|
|
143
|
+
detectFramework(structure) {
|
|
144
|
+
if (!structure.hasPackageJson)
|
|
145
|
+
return undefined;
|
|
146
|
+
try {
|
|
147
|
+
const pkgPath = join(structure.root, 'package.json');
|
|
148
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
149
|
+
const allDeps = {
|
|
150
|
+
...pkg.dependencies,
|
|
151
|
+
...pkg.devDependencies,
|
|
152
|
+
};
|
|
153
|
+
// Priority order
|
|
154
|
+
const frameworkPriority = [
|
|
155
|
+
['next', 'next'],
|
|
156
|
+
['nuxt', 'nuxt'],
|
|
157
|
+
['@sveltejs/kit', 'svelte'],
|
|
158
|
+
['svelte', 'svelte'],
|
|
159
|
+
['vue', 'vue'],
|
|
160
|
+
['react', 'react'],
|
|
161
|
+
['react-dom', 'react'],
|
|
162
|
+
['@angular/core', 'angular'],
|
|
163
|
+
['express', 'express'],
|
|
164
|
+
['fastify', 'fastify'],
|
|
165
|
+
['@fastify/fastify', 'fastify'],
|
|
166
|
+
['hono', 'hono'],
|
|
167
|
+
['tailwindcss', 'tailwind'],
|
|
168
|
+
['@prisma/client', 'prisma'],
|
|
169
|
+
['drizzle-orm', 'drizzle'],
|
|
170
|
+
];
|
|
171
|
+
for (const [pkg, framework] of frameworkPriority) {
|
|
172
|
+
if (allDeps[pkg])
|
|
173
|
+
return framework;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Ignore parse errors
|
|
178
|
+
}
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
181
|
+
// ==========================================================================
|
|
182
|
+
// Private Methods - Test Runner Detection
|
|
183
|
+
// ==========================================================================
|
|
184
|
+
detectTestRunner(root, files) {
|
|
185
|
+
// Check for test config files
|
|
186
|
+
const configFiles = [
|
|
187
|
+
['vitest.config.ts', 'vitest'],
|
|
188
|
+
['vitest.config.js', 'vitest'],
|
|
189
|
+
['jest.config.ts', 'jest'],
|
|
190
|
+
['jest.config.js', 'jest'],
|
|
191
|
+
['jest.config.mjs', 'jest'],
|
|
192
|
+
['pytest.ini', 'pytest'],
|
|
193
|
+
['pyproject.toml', 'pytest'],
|
|
194
|
+
['.mocharc.yml', 'mocha'],
|
|
195
|
+
['cypress.config.ts', 'cypress'],
|
|
196
|
+
['playwright.config.ts', 'playwright'],
|
|
197
|
+
];
|
|
198
|
+
for (const [file, runner] of configFiles) {
|
|
199
|
+
if (files.includes(file) || existsSync(join(root, file))) {
|
|
200
|
+
return runner;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Check package.json scripts
|
|
204
|
+
if (existsSync(join(root, 'package.json'))) {
|
|
205
|
+
try {
|
|
206
|
+
const pkg = JSON.parse(readFileSync(join(root, 'package.json'), 'utf-8'));
|
|
207
|
+
const scripts = pkg.scripts || {};
|
|
208
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
209
|
+
if (scripts.test?.includes('vitest') || deps.vitest)
|
|
210
|
+
return 'vitest';
|
|
211
|
+
if (scripts.test?.includes('jest') || deps.jest)
|
|
212
|
+
return 'jest';
|
|
213
|
+
if (scripts.test?.includes('mocha') || deps.mocha)
|
|
214
|
+
return 'mocha';
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// Ignore
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
// ==========================================================================
|
|
223
|
+
// Private Methods - Package Manager Detection
|
|
224
|
+
// ==========================================================================
|
|
225
|
+
detectPackageManager(root, files) {
|
|
226
|
+
if (files.includes('pnpm-lock.yaml') || existsSync(join(root, 'pnpm-lock.yaml'))) {
|
|
227
|
+
return 'pnpm';
|
|
228
|
+
}
|
|
229
|
+
if (files.includes('yarn.lock') || existsSync(join(root, 'yarn.lock'))) {
|
|
230
|
+
return 'yarn';
|
|
231
|
+
}
|
|
232
|
+
if (files.includes('package-lock.json') || existsSync(join(root, 'package-lock.json'))) {
|
|
233
|
+
return 'npm';
|
|
234
|
+
}
|
|
235
|
+
if (files.includes('bun.lockb') || existsSync(join(root, 'bun.lockb'))) {
|
|
236
|
+
return 'bun';
|
|
237
|
+
}
|
|
238
|
+
return undefined;
|
|
239
|
+
}
|
|
240
|
+
// ==========================================================================
|
|
241
|
+
// Private Methods - Agent Detection
|
|
242
|
+
// ==========================================================================
|
|
243
|
+
detectAgent() {
|
|
244
|
+
// Check environment variables
|
|
245
|
+
if (process.env.LOOM_AGENT)
|
|
246
|
+
return process.env.LOOM_AGENT;
|
|
247
|
+
if (process.env.CLAUDE_CODE)
|
|
248
|
+
return 'claude';
|
|
249
|
+
if (process.env.CURSOR_TRACE_ID)
|
|
250
|
+
return 'cursor';
|
|
251
|
+
// Check for agent-specific files
|
|
252
|
+
const agentFiles = [
|
|
253
|
+
['.claude', 'claude'],
|
|
254
|
+
['.cursor', 'cursor'],
|
|
255
|
+
['.codex', 'codex'],
|
|
256
|
+
['.github/copilot-instructions.md', 'copilot'],
|
|
257
|
+
['.opencode', 'opencode'],
|
|
258
|
+
['.gemini', 'gemini'],
|
|
259
|
+
];
|
|
260
|
+
for (const [file, agent] of agentFiles) {
|
|
261
|
+
if (existsSync(file))
|
|
262
|
+
return agent;
|
|
263
|
+
}
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// ============================================================================
|
|
268
|
+
// Convenience Functions
|
|
269
|
+
// ============================================================================
|
|
270
|
+
let defaultManager = null;
|
|
271
|
+
export function getContextManager() {
|
|
272
|
+
if (!defaultManager) {
|
|
273
|
+
defaultManager = new ContextManager();
|
|
274
|
+
}
|
|
275
|
+
return defaultManager;
|
|
276
|
+
}
|
|
277
|
+
export async function detectContext(projectPath) {
|
|
278
|
+
return getContextManager().detect(projectPath);
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { SkillDefinition, Author, Capability, Parameter, Requirement, Context, ContextRequirement, ProjectStructure, QualityGate, Reference, LoadedSkill, Composition, Conflict, RegistryPackage, QualityScore, AgentAdapter, AgentSkillOutput, } from './types.js';
|
|
2
|
+
export { SkillLoader, loadSkill, loadSkillByName, getLoader } from './loader.js';
|
|
3
|
+
export { Compositor, composeSkills, getCompositor } from './compositor.js';
|
|
4
|
+
export { ContextManager, detectContext, getContextManager } from './context.js';
|
|
5
|
+
export { Validator, validateSkill, getValidator, type ValidationResult, type ValidationError, } from './validator.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EAEV,eAAe,EACf,MAAM,EAEN,UAAU,EACV,SAAS,EAET,WAAW,EAEX,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAEhB,WAAW,EAEX,SAAS,EAET,WAAW,EAEX,WAAW,EACX,QAAQ,EAER,eAAe,EACf,YAAY,EAEZ,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Loom Core
|
|
2
|
+
// The skill operating system for AI coding agents
|
|
3
|
+
export { SkillLoader, loadSkill, loadSkillByName, getLoader } from './loader.js';
|
|
4
|
+
export { Compositor, composeSkills, getCompositor } from './compositor.js';
|
|
5
|
+
export { ContextManager, detectContext, getContextManager } from './context.js';
|
|
6
|
+
export { Validator, validateSkill, getValidator, } from './validator.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,kDAAkD;AAgClD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EACL,SAAS,EACT,aAAa,EACb,YAAY,GAGb,MAAM,gBAAgB,CAAC"}
|