@loom-framework/core 0.1.0-alpha.4 → 0.1.0-alpha.40
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/adapter-base.d.ts +29 -0
- package/dist/adapter-base.d.ts.map +1 -0
- package/dist/adapter-base.js +62 -0
- package/dist/adapter-base.js.map +1 -0
- package/dist/adapter-factory.d.ts +8 -0
- package/dist/adapter-factory.d.ts.map +1 -0
- package/dist/adapter-factory.js +25 -0
- package/dist/adapter-factory.js.map +1 -0
- package/dist/adapter-filesystem.d.ts +6 -11
- package/dist/adapter-filesystem.d.ts.map +1 -1
- package/dist/adapter-filesystem.js +8 -33
- package/dist/adapter-filesystem.js.map +1 -1
- package/dist/adapter-sqlite.d.ts +6 -23
- package/dist/adapter-sqlite.d.ts.map +1 -1
- package/dist/adapter-sqlite.js +27 -47
- package/dist/adapter-sqlite.js.map +1 -1
- package/dist/backend/ai/button-resolver.d.ts +17 -0
- package/dist/backend/ai/button-resolver.d.ts.map +1 -0
- package/dist/backend/ai/button-resolver.js +40 -0
- package/dist/backend/ai/button-resolver.js.map +1 -0
- package/dist/backend/ai/engine.d.ts +51 -0
- package/dist/backend/ai/engine.d.ts.map +1 -0
- package/dist/backend/ai/engine.js +188 -0
- package/dist/backend/ai/engine.js.map +1 -0
- package/dist/backend/ai/index.d.ts +11 -0
- package/dist/backend/ai/index.d.ts.map +1 -0
- package/dist/backend/ai/index.js +8 -0
- package/dist/backend/ai/index.js.map +1 -0
- package/dist/backend/ai/output-parser.d.ts +29 -0
- package/dist/backend/ai/output-parser.d.ts.map +1 -0
- package/dist/backend/ai/output-parser.js +247 -0
- package/dist/backend/ai/output-parser.js.map +1 -0
- package/dist/backend/ai/session-manager.d.ts +102 -0
- package/dist/backend/ai/session-manager.d.ts.map +1 -0
- package/dist/backend/ai/session-manager.js +291 -0
- package/dist/backend/ai/session-manager.js.map +1 -0
- package/dist/backend/index.d.ts +61 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +160 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/observe/index.d.ts +6 -0
- package/dist/backend/observe/index.d.ts.map +1 -0
- package/dist/backend/observe/index.js +5 -0
- package/dist/backend/observe/index.js.map +1 -0
- package/dist/backend/observe/logger.d.ts +28 -0
- package/dist/backend/observe/logger.d.ts.map +1 -0
- package/dist/backend/observe/logger.js +80 -0
- package/dist/backend/observe/logger.js.map +1 -0
- package/dist/backend/observe/types.d.ts +26 -0
- package/dist/backend/observe/types.d.ts.map +1 -0
- package/dist/backend/observe/types.js +7 -0
- package/dist/backend/observe/types.js.map +1 -0
- package/dist/backend/routes/chat.d.ts +31 -0
- package/dist/backend/routes/chat.d.ts.map +1 -0
- package/dist/backend/routes/chat.js +426 -0
- package/dist/backend/routes/chat.js.map +1 -0
- package/dist/backend/routes/data.d.ts +13 -0
- package/dist/backend/routes/data.d.ts.map +1 -0
- package/dist/backend/routes/data.js +129 -0
- package/dist/backend/routes/data.js.map +1 -0
- package/dist/backend/routes/health.d.ts +7 -0
- package/dist/backend/routes/health.d.ts.map +1 -0
- package/dist/backend/routes/health.js +15 -0
- package/dist/backend/routes/health.js.map +1 -0
- package/dist/backend/routes/index.d.ts +9 -0
- package/dist/backend/routes/index.d.ts.map +1 -0
- package/dist/backend/routes/index.js +8 -0
- package/dist/backend/routes/index.js.map +1 -0
- package/dist/backend/routes/upload.d.ts +24 -0
- package/dist/backend/routes/upload.d.ts.map +1 -0
- package/dist/backend/routes/upload.js +67 -0
- package/dist/backend/routes/upload.js.map +1 -0
- package/dist/bin.d.ts +8 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +12 -0
- package/dist/bin.js.map +1 -0
- package/dist/capability-generator.d.ts.map +1 -1
- package/dist/capability-generator.js +4 -8
- package/dist/capability-generator.js.map +1 -1
- package/dist/cli/commands/build.d.ts +11 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +170 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/data.d.ts +11 -0
- package/dist/cli/commands/data.d.ts.map +1 -0
- package/dist/cli/commands/data.js +137 -0
- package/dist/cli/commands/data.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +9 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +114 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate-capabilities.d.ts +8 -0
- package/dist/cli/commands/generate-capabilities.d.ts.map +1 -0
- package/dist/cli/commands/generate-capabilities.js +40 -0
- package/dist/cli/commands/generate-capabilities.js.map +1 -0
- package/dist/cli/commands/generate-cli-command.d.ts +8 -0
- package/dist/cli/commands/generate-cli-command.d.ts.map +1 -0
- package/dist/cli/commands/generate-cli-command.js +64 -0
- package/dist/cli/commands/generate-cli-command.js.map +1 -0
- package/dist/cli/commands/generate-page.d.ts +9 -0
- package/dist/cli/commands/generate-page.d.ts.map +1 -0
- package/dist/cli/commands/generate-page.js +325 -0
- package/dist/cli/commands/generate-page.js.map +1 -0
- package/dist/cli/commands/generate-skill.d.ts +8 -0
- package/dist/cli/commands/generate-skill.d.ts.map +1 -0
- package/dist/cli/commands/generate-skill.js +75 -0
- package/dist/cli/commands/generate-skill.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +6 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +17 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +400 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/observe.d.ts +9 -0
- package/dist/cli/commands/observe.d.ts.map +1 -0
- package/dist/cli/commands/observe.js +142 -0
- package/dist/cli/commands/observe.js.map +1 -0
- package/dist/cli/commands/skill.d.ts +9 -0
- package/dist/cli/commands/skill.d.ts.map +1 -0
- package/dist/cli/commands/skill.js +186 -0
- package/dist/cli/commands/skill.js.map +1 -0
- package/dist/cli/helpers/duration.d.ts +5 -0
- package/dist/cli/helpers/duration.d.ts.map +1 -0
- package/dist/cli/helpers/duration.js +19 -0
- package/dist/cli/helpers/duration.js.map +1 -0
- package/dist/cli/helpers/field-template.d.ts +9 -0
- package/dist/cli/helpers/field-template.d.ts.map +1 -0
- package/dist/cli/helpers/field-template.js +59 -0
- package/dist/cli/helpers/field-template.js.map +1 -0
- package/dist/cli/helpers/naming.d.ts +6 -0
- package/dist/cli/helpers/naming.d.ts.map +1 -0
- package/dist/cli/helpers/naming.js +14 -0
- package/dist/cli/helpers/naming.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +33 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils.d.ts +10 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +31 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/server-bin.d.ts +12 -0
- package/dist/server-bin.d.ts.map +1 -0
- package/dist/server-bin.js +75 -0
- package/dist/server-bin.js.map +1 -0
- package/dist/types.d.ts +5 -12
- package/dist/types.d.ts.map +1 -1
- package/package.json +17 -5
- package/templates/skill/SKILL.md +91 -0
- package/templates/skill/references/README.md +67 -0
- package/templates/skill/references/data-model.md +87 -0
- package/templates/skill/references/skill-development.md +46 -0
- package/templates/skill/references/troubleshooting.md +35 -0
package/dist/types.d.ts
CHANGED
|
@@ -92,11 +92,12 @@ export interface ReadOptions {
|
|
|
92
92
|
limit?: number;
|
|
93
93
|
offset?: number;
|
|
94
94
|
}
|
|
95
|
+
export type DataRecord = Record<string, unknown>;
|
|
95
96
|
export interface DataAdapter {
|
|
96
97
|
readonly name: string;
|
|
97
|
-
read(model: string, options?: ReadOptions): Promise<
|
|
98
|
-
write(model: string, data:
|
|
99
|
-
update(model: string, id: string, data:
|
|
98
|
+
read(model: string, options?: ReadOptions): Promise<DataRecord | DataRecord[] | null>;
|
|
99
|
+
write(model: string, data: DataRecord): Promise<DataRecord>;
|
|
100
|
+
update(model: string, id: string, data: DataRecord): Promise<DataRecord>;
|
|
100
101
|
delete(model: string, id: string): Promise<void>;
|
|
101
102
|
getSchema(model: string): Promise<ModelSchema | undefined>;
|
|
102
103
|
listModels(): Promise<string[]>;
|
|
@@ -138,7 +139,7 @@ export interface AIUsage {
|
|
|
138
139
|
contextWindow: number;
|
|
139
140
|
}
|
|
140
141
|
export interface AIChunk {
|
|
141
|
-
type: 'content' | 'session_info' | 'error' | 'done' | 'tool_call' | 'tool_result';
|
|
142
|
+
type: 'content' | 'thinking' | 'session_info' | 'error' | 'done' | 'tool_call' | 'tool_result';
|
|
142
143
|
content?: string;
|
|
143
144
|
sessionId?: string;
|
|
144
145
|
usage?: AIUsage;
|
|
@@ -152,12 +153,6 @@ export interface AIEngine {
|
|
|
152
153
|
readonly name: string;
|
|
153
154
|
call(prompt: string, options: AICallOptions): AsyncGenerator<AIChunk>;
|
|
154
155
|
}
|
|
155
|
-
export interface ActiveSession {
|
|
156
|
-
id: string;
|
|
157
|
-
claudeSessionId?: string;
|
|
158
|
-
lastActivity: number;
|
|
159
|
-
createdAt: number;
|
|
160
|
-
}
|
|
161
156
|
export interface UserMessageEvent {
|
|
162
157
|
type: 'user_message';
|
|
163
158
|
content: string;
|
|
@@ -198,7 +193,5 @@ export interface ToolCallEvent {
|
|
|
198
193
|
result?: unknown;
|
|
199
194
|
error?: string;
|
|
200
195
|
}
|
|
201
|
-
/** @deprecated Use ChatEvent instead */
|
|
202
|
-
export type WebSocketEvent = ChatEvent;
|
|
203
196
|
export type ChatEvent = UserMessageEvent | AssistantChunkEvent | AssistantCompleteEvent | ToolCallEvent;
|
|
204
197
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,MAAM,GACN,UAAU,GACV,UAAU,GACV,MAAM,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAID,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAID,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,YAAY,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,6BAA6B;IAC7B,MAAM,CAAC,EAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAID,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;CAC9B;AAID,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;IACtF,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACzE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC3D,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAChC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAID,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACzF;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,UAAU,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,IAAI,WAAW,CAAC;CAC/B;AAID,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;CACvE;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wFAAwF;IACxF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,IAAI,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,SAAS,GACjB,gBAAgB,GAChB,mBAAmB,GACnB,sBAAsB,GACtB,aAAa,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@loom-framework/core",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
4
|
-
"description": "Loom framework
|
|
3
|
+
"version": "0.1.0-alpha.40",
|
|
4
|
+
"description": "Loom framework - DataAdapter, Capability Generator, config system, backend server, CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -11,8 +11,13 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
+
"bin": {
|
|
15
|
+
"loom": "./dist/bin.js",
|
|
16
|
+
"loom-server": "./dist/server-bin.js"
|
|
17
|
+
},
|
|
14
18
|
"files": [
|
|
15
|
-
"dist"
|
|
19
|
+
"dist",
|
|
20
|
+
"templates"
|
|
16
21
|
],
|
|
17
22
|
"scripts": {
|
|
18
23
|
"build": "tsc",
|
|
@@ -22,7 +27,14 @@
|
|
|
22
27
|
},
|
|
23
28
|
"dependencies": {
|
|
24
29
|
"jiti": "^2.6.1",
|
|
25
|
-
"zod": "^3.23.0"
|
|
30
|
+
"zod": "^3.23.0",
|
|
31
|
+
"fastify": "^5.2.0",
|
|
32
|
+
"@fastify/cors": "^10.0.0",
|
|
33
|
+
"@fastify/static": "^8.0.0",
|
|
34
|
+
"commander": "^12.1.0",
|
|
35
|
+
"chalk": "^5.3.0",
|
|
36
|
+
"ora": "^8.0.0",
|
|
37
|
+
"glob": "^11.0.0"
|
|
26
38
|
},
|
|
27
39
|
"optionalDependencies": {
|
|
28
40
|
"better-sqlite3": "^12.8.0"
|
|
@@ -31,4 +43,4 @@
|
|
|
31
43
|
"@types/better-sqlite3": "^7.6.13",
|
|
32
44
|
"typescript": "^5.6.0"
|
|
33
45
|
}
|
|
34
|
-
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Loom
|
|
3
|
+
description: |
|
|
4
|
+
Use this skill when the user asks to "create a new loom project", "用loom开发一个系统",
|
|
5
|
+
"开发一个AI平台应用", "为系统添加页面", "为项目配置 AI 按钮功能", or any Loom framework task.
|
|
6
|
+
Loom is an AI-Native full-stack framework.
|
|
7
|
+
version: 0.1.0
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Loom - AI-Native Framework Skill
|
|
11
|
+
|
|
12
|
+
## Quick Start
|
|
13
|
+
|
|
14
|
+
1. Confirm project scope: name, description, data models, skills
|
|
15
|
+
2. Create project:
|
|
16
|
+
`npx @loom-framework/core@latest loom init <name> --description <desc> --adapter <filesystem|sqlite>`
|
|
17
|
+
3. Define data models in `loom.config.ts` (see Schema below)
|
|
18
|
+
4. Generate pages: `loom generate page <Name> --model <model>`
|
|
19
|
+
5. Start dev: `loom dev` → http://localhost:5173 (frontend), http://localhost:3000 (backend)
|
|
20
|
+
|
|
21
|
+
**Important:** Always run commands from the project directory (not the loom monorepo root).
|
|
22
|
+
|
|
23
|
+
## Core CLI Commands
|
|
24
|
+
|
|
25
|
+
- `loom dev` - Start dev environment (hot-reload)
|
|
26
|
+
- `--skip-generate`, `--backend-only`, `--frontend-only`
|
|
27
|
+
- `loom build` - Build for production
|
|
28
|
+
- `loom generate capabilities` - Generate MCP Server + CLI from config
|
|
29
|
+
- `loom generate page <name> --model <model>` - Generate CRUD page (includes capabilities + wiring)
|
|
30
|
+
- `loom generate skill <name>` - Generate skill scaffold
|
|
31
|
+
|
|
32
|
+
## Detailed Workflows
|
|
33
|
+
|
|
34
|
+
### Adding a New Data Model
|
|
35
|
+
|
|
36
|
+
1. Edit `loom.config.ts` → add model definition (see Schema below; for advanced options see `references/data-model.md`)
|
|
37
|
+
2. Run `loom generate page <Name> --model <model-name>`
|
|
38
|
+
3. Model is immediately available via MCP Tools and `loom data` CLI
|
|
39
|
+
|
|
40
|
+
### Adding a New Skill
|
|
41
|
+
|
|
42
|
+
1. Create scaffold: `loom generate skill <name>`
|
|
43
|
+
2. Edit `.claude/skills/<name>/SKILL.md` (see `references/skill-development.md` for format)
|
|
44
|
+
3. Add reference prompts in `.claude/skills/<name>/references/`
|
|
45
|
+
|
|
46
|
+
### Adding an AI Button
|
|
47
|
+
|
|
48
|
+
1. Edit `loom.config.ts` → add entry to `aiButtons` array (top-level, not inside `ai`)
|
|
49
|
+
2. In frontend page, use `useAIButton('<button-id>')` or `<AIActionButton buttonId="<id>" />`
|
|
50
|
+
|
|
51
|
+
## loom.config.ts Schema (Core)
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
import { defineConfig } from '@loom-framework/core';
|
|
55
|
+
|
|
56
|
+
export default defineConfig({
|
|
57
|
+
project: {
|
|
58
|
+
name: 'my-app', // required
|
|
59
|
+
description: '...',', // optional
|
|
60
|
+
},
|
|
61
|
+
data: {
|
|
62
|
+
defaultAdapter: 'filesystem', // 'filesystem' | 'sqlite'
|
|
63
|
+
models: [{
|
|
64
|
+
name: 'items', // lowercase, hyphens/underscores allowed
|
|
65
|
+
description: '...',', // optional: shown in generated pages
|
|
66
|
+
fields: [{
|
|
67
|
+
name: 'status', // alphanumeric + underscore, start with letter/underscore
|
|
68
|
+
type: 'string', // 'string' | 'number' | 'boolean' | 'date' | 'string[]' | 'number[]' | 'json'
|
|
69
|
+
required: true, // optional, default false
|
|
70
|
+
description: '...,', // optional: shown in forms
|
|
71
|
+
default: 'active', // optional: auto-filled on write
|
|
72
|
+
enum: ['active', 'inactive'], // optional: restrict values
|
|
73
|
+
}],
|
|
74
|
+
}],
|
|
75
|
+
},
|
|
76
|
+
aiButtons: [{ // optional
|
|
77
|
+
id: 'summarize', // required: unique identifier
|
|
78
|
+
label: '总结', // required: button text
|
|
79
|
+
prompt: '请总结以下内容', // required (or promptTemplate)
|
|
80
|
+
}],
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
For advanced config (`ai.claudeCode`, `server`, per-model `adapters`, `indexes`, `aiButtons.promptTemplate/contextVars`), see `references/data-model.md`.
|
|
85
|
+
|
|
86
|
+
## Troubleshooting
|
|
87
|
+
|
|
88
|
+
- **`loom` commands fail "No loom.config.ts found"**: Run commands from the project directory, not the loom monorepo root
|
|
89
|
+
- **create-loom-app not on npm**: Use `npx @loom-framework/core loom init <name> --description <desc> --adapter <filesystem|sqlite>`
|
|
90
|
+
|
|
91
|
+
See `references/troubleshooting.md` for more issues.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Loom - AI-Native Full-Stack Framework
|
|
2
|
+
|
|
3
|
+
编织 AI 能力为应用织物
|
|
4
|
+
|
|
5
|
+
## 核心理念
|
|
6
|
+
|
|
7
|
+
- **Prompt as Code**: 业务逻辑写在 Skill 的 Markdown 中,而非后端代码
|
|
8
|
+
- **Schema-driven**: 一个模型定义 → MCP Tool + CLI 命令 + REST API(自动同步)
|
|
9
|
+
- **Zero Backend Logic**: 后端是透明代理,所有智能在 Skill 中
|
|
10
|
+
|
|
11
|
+
## 三种交互类型
|
|
12
|
+
|
|
13
|
+
| 类型 | 说明 | 实现方式 |
|
|
14
|
+
|------|------|---------|
|
|
15
|
+
| AI Chat | 自然语言对话 | HTTP SSE 流式,Claude Code 引擎 |
|
|
16
|
+
| AI Buttons | 一键 AI 动作 | 预定义 Prompt,`aiButtons` 配置 |
|
|
17
|
+
| CRUD | 结构化数据管理 | REST API,Schema 驱动自动生成 |
|
|
18
|
+
|
|
19
|
+
## 项目结构
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
my-loom-app/
|
|
23
|
+
├── loom.config.ts # 唯一配置源(模型、AI 按钮、服务器配置)
|
|
24
|
+
├── frontend/ # React + TypeScript + Vite
|
|
25
|
+
│ └── src/pages/ # 业务页面(CRUD 等)
|
|
26
|
+
├── backend/src/ # Fastify + AI 通信(LoomServer)
|
|
27
|
+
├── .claude/skills/ # Skills(Prompt as Code)
|
|
28
|
+
├── cli/src/commands/ # CLI 业务命令扩展
|
|
29
|
+
├── data/ # 数据存储(DataAdapter 管理)
|
|
30
|
+
└── .loom/ # 自动生成(gitignore)
|
|
31
|
+
├── mcp-server/ # MCP Server(自动生成)
|
|
32
|
+
└── mcp.json # MCP 配置
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## CLI 命令速查
|
|
36
|
+
|
|
37
|
+
### 开发
|
|
38
|
+
|
|
39
|
+
| 命令 | 说明 |
|
|
40
|
+
|------|------|
|
|
41
|
+
| `loom dev` | 启动开发环境(前端 + 后端,热更新) |
|
|
42
|
+
| `loom build` | 生产构建 |
|
|
43
|
+
|
|
44
|
+
### 生成
|
|
45
|
+
|
|
46
|
+
| 命令 | 说明 |
|
|
47
|
+
|------|------|
|
|
48
|
+
| `loom generate page <Name> --model <model>` | 生成 CRUD 页面 |
|
|
49
|
+
| `loom generate skill <name>` | 生成 Skill 脚手架 |
|
|
50
|
+
| `loom generate capabilities` | 重新生成 MCP Server + CLI |
|
|
51
|
+
|
|
52
|
+
### 数据
|
|
53
|
+
|
|
54
|
+
| 命令 | 说明 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| `loom data read <model>` | 读取记录 |
|
|
57
|
+
| `loom data write <model> --data '<json>'` | 写入记录 |
|
|
58
|
+
| `loom data schema [model]` | 查看模型定义 |
|
|
59
|
+
|
|
60
|
+
### 其他
|
|
61
|
+
|
|
62
|
+
| 命令 | 说明 |
|
|
63
|
+
|------|------|
|
|
64
|
+
| `loom skill list` | 列出所有 Skill |
|
|
65
|
+
| `loom skill validate [name]` | 校验 Skill 结构 |
|
|
66
|
+
| `loom observe logs` | 查看 AI 交互日志 |
|
|
67
|
+
| `loom observe metrics` | 查看聚合指标 |
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Data Model Reference
|
|
2
|
+
|
|
3
|
+
Advanced configuration for `loom.config.ts` data models. Load this when defining complex models.
|
|
4
|
+
|
|
5
|
+
## Full Field Options
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
{
|
|
9
|
+
name: 'status', // must match ^[a-zA-Z_][a-zA-Z0-9_]*$
|
|
10
|
+
type: 'string', // 'string' | 'number' | 'boolean' | 'date' | 'string[]' | 'number[]' | 'json'
|
|
11
|
+
required: true, // optional, default false
|
|
12
|
+
description: '...',', // optional: shown in generated forms
|
|
13
|
+
default: 'active', // optional: auto-filled on write if not provided
|
|
14
|
+
enum: ['active', 'inactive', 'archived'], // optional: restrict to allowed values
|
|
15
|
+
}
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Model-Level Options
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
{
|
|
22
|
+
name: 'orders',
|
|
23
|
+
description: 'Order records', // shown in generated page heading
|
|
24
|
+
fields: [...],
|
|
25
|
+
indexes: [ // optional: database indexes
|
|
26
|
+
{ fields: ['userId', 'status'], unique: false },
|
|
27
|
+
],
|
|
28
|
+
adapters: { // optional: per-model adapter override
|
|
29
|
+
filesystem: { dir: 'orders', format: 'json' | 'yaml', datePattern: 'yyyy-MM-dd' },
|
|
30
|
+
sqlite: { table: 'orders' },
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## AI Configuration
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
ai: {
|
|
39
|
+
engine: 'claude-code', // default 'claude-code'
|
|
40
|
+
claudeCode: {
|
|
41
|
+
path: '/usr/local/bin/claude', // custom claude binary path
|
|
42
|
+
pluginRoot: '.claude', // plugin root directory
|
|
43
|
+
timeout: 120000, // command timeout in ms
|
|
44
|
+
skipPermissions: false, // skip permission prompts
|
|
45
|
+
defaultModel: 'claude-sonnet-4-6',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Server Configuration
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
server: {
|
|
54
|
+
port: 3000, // default 3000
|
|
55
|
+
host: '0.0.0.0',
|
|
56
|
+
cors: true, // default true
|
|
57
|
+
staticDir: './dist/frontend',
|
|
58
|
+
},
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## SQLite Configuration
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
data: {
|
|
65
|
+
defaultAdapter: 'sqlite',
|
|
66
|
+
sqlite: { filename: 'data.db' }, // default 'loom.db'
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## AI Buttons (Full Options)
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
aiButtons: [{
|
|
74
|
+
id: 'summarize', // required: unique identifier
|
|
75
|
+
label: '总结', // required: button text
|
|
76
|
+
icon: 'FileTextOutlined', // optional: Ant Design icon name
|
|
77
|
+
prompt: '请总结以下内容', // required (or promptTemplate)
|
|
78
|
+
promptTemplate: 'Summarize {{content}}', // alternative to prompt, with {{vars}}
|
|
79
|
+
contextVars: ['content'], // optional: variable names for promptTemplate
|
|
80
|
+
placement: 'page-header', // optional: UI placement hint
|
|
81
|
+
}],
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Data Access in Skills
|
|
85
|
+
|
|
86
|
+
- **Prefer MCP Tools** for data CRUD: `read_<model>`, `write_<model>`, `update_<model>`, `delete_<model>`
|
|
87
|
+
- Use `loom data read/write <model>` CLI only for debugging
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Skill Development Reference
|
|
2
|
+
|
|
3
|
+
Guide for creating and managing Loom Skills. Load this when adding or editing `.claude/skills/`.
|
|
4
|
+
|
|
5
|
+
## Skill Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
.claude/skills/<skill-name>/
|
|
9
|
+
├── SKILL.md # Required: trigger conditions + workflow
|
|
10
|
+
└── references/ # Optional: detailed rules and reference docs
|
|
11
|
+
└── *.md
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## SKILL.md Format
|
|
15
|
+
|
|
16
|
+
```markdown
|
|
17
|
+
---
|
|
18
|
+
name: <skill-name>
|
|
19
|
+
description: |
|
|
20
|
+
This skill should be used when the user asks to "<trigger phrases>".
|
|
21
|
+
Include both English and Chinese trigger phrases.
|
|
22
|
+
version: 1.0.0
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
# <Skill Name>
|
|
26
|
+
|
|
27
|
+
<Description of what this skill does>
|
|
28
|
+
|
|
29
|
+
## Workflow
|
|
30
|
+
|
|
31
|
+
1. <Step 1>
|
|
32
|
+
2. <Step 2>
|
|
33
|
+
|
|
34
|
+
## Rules
|
|
35
|
+
|
|
36
|
+
- <Rule 1>
|
|
37
|
+
- <Rule 2>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Best Practices
|
|
41
|
+
|
|
42
|
+
- Keep SKILL.md focused on one capability domain
|
|
43
|
+
- Use `references/` for detailed rules that would clutter the main SKILL.md
|
|
44
|
+
- Specify which MCP Tools (`read_<model>`, `write_<model>`) the skill should use
|
|
45
|
+
- Skills define behavior through prompts, not code generation
|
|
46
|
+
- Run `loom skill validate [name]` to check SKILL.md structure
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Troubleshooting Guide
|
|
2
|
+
|
|
3
|
+
Common issues when creating and running Loom projects.
|
|
4
|
+
|
|
5
|
+
## `loom generate` Fails: Cannot find module '@loom-framework/core'
|
|
6
|
+
|
|
7
|
+
Dependencies not installed. Run `npm install` from the project directory.
|
|
8
|
+
|
|
9
|
+
## `loom dev` Port Already in Use (EADDRINUSE)
|
|
10
|
+
|
|
11
|
+
Previous process still running. Kill it: `lsof -ti:3000 | xargs kill -9`
|
|
12
|
+
|
|
13
|
+
## Commands Fail: "No loom.config.ts found"
|
|
14
|
+
|
|
15
|
+
Running from the wrong directory. `cd` into the project directory before running `loom` commands.
|
|
16
|
+
|
|
17
|
+
## Model Name Validation Error
|
|
18
|
+
|
|
19
|
+
Model names must match `^[a-z][a-z0-9_-]*$` (lowercase, hyphens/underscores allowed).
|
|
20
|
+
Field names must match `^[a-zA-Z_][a-zA-Z0-9_]*$`.
|
|
21
|
+
|
|
22
|
+
## `loom build` Backend TSC Fails: Cannot use JSX
|
|
23
|
+
|
|
24
|
+
Root `tsconfig.json` includes `frontend/` with `.tsx` files.
|
|
25
|
+
Add `"frontend"` to `exclude` in root `tsconfig.json`:
|
|
26
|
+
```json
|
|
27
|
+
{ "exclude": ["node_modules", "dist", "frontend"] }
|
|
28
|
+
```
|
|
29
|
+
Frontend has its own `frontend/tsconfig.json` with `jsx: "react-jsx"`.
|
|
30
|
+
|
|
31
|
+
## Debug Tips
|
|
32
|
+
|
|
33
|
+
- `loom data schema <model>` — inspect model fields
|
|
34
|
+
- `loom observe logs` — view AI interaction logs
|
|
35
|
+
- `loom skill validate` — check skill structure
|