@soulcraft/sdk 3.4.2 → 3.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/modules/auth/sveltekit.d.ts +11 -0
- package/dist/modules/auth/sveltekit.d.ts.map +1 -1
- package/dist/modules/auth/sveltekit.js +53 -2
- package/dist/modules/auth/sveltekit.js.map +1 -1
- package/dist/modules/skills/index.d.ts +19 -29
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +54 -171
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/types.d.ts +39 -62
- package/dist/modules/skills/types.d.ts.map +1 -1
- package/dist/modules/skills/types.js +12 -9
- package/dist/modules/skills/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -123,6 +123,17 @@ export interface SoulcraftAuthOptions {
|
|
|
123
123
|
* Default: `'/api/auth/backchannel-logout'`.
|
|
124
124
|
*/
|
|
125
125
|
backchannelPath?: string;
|
|
126
|
+
/**
|
|
127
|
+
* Default role for auto-login in dev mode. When set and no `SOULCRAFT_IDP_URL`
|
|
128
|
+
* is configured, the auth handle automatically creates a dev session on the
|
|
129
|
+
* first request if no dev cookie is present. The developer is logged in the
|
|
130
|
+
* moment the page loads — no manual `/api/dev/login` call needed.
|
|
131
|
+
*
|
|
132
|
+
* Set to `false` to disable auto-login (require explicit `/api/dev/login`).
|
|
133
|
+
*
|
|
134
|
+
* @default 'owner'
|
|
135
|
+
*/
|
|
136
|
+
defaultDevRole?: SoulcraftSessionUser['platformRole'] | false;
|
|
126
137
|
}
|
|
127
138
|
/**
|
|
128
139
|
* @description The return value of `createSoulcraftAuth()`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sveltekit.d.ts","sourceRoot":"","sources":["../../../src/modules/auth/sveltekit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAoB,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"sveltekit.d.ts","sourceRoot":"","sources":["../../../src/modules/auth/sveltekit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAoB,MAAM,YAAY,CAAA;AAOxE;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;IACR,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,OAAO,EAAE;QACP,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KACrD,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE;IACpC,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;CACtD,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEvB;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AAMlF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,eAAe,CAAA;IAE1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,oBAAoB,EAC1B,KAAK,EAAE,cAAc,KAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE/D;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;;;;;;;;OASG;IACH,cAAc,CAAC,EAAE,oBAAoB,CAAC,cAAc,CAAC,GAAG,KAAK,CAAA;CAC9D;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;;;;OAQG;IACH,MAAM,EAAE,eAAe,CAAA;IAEvB;;;;;;;;;;;;OAYG;IACH,kBAAkB,EAAE,uBAAuB,CAAA;IAE3C;;;;;;;;;;;OAWG;IACH,aAAa,EAAE,uBAAuB,CAAA;IAEtC;;;;;;;;;;;OAWG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,QAAQ,CAAA;IAEpD;;;OAGG;IACH,aAAa,EAAE,eAAe,CAAA;CAC/B;AAuFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAgNhF;AAMD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAE5B;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAiBnE"}
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
* ```
|
|
49
49
|
*/
|
|
50
50
|
import { createRemoteSessionVerifier, createDevCookieVerifier, createRequestDevLoginHandler } from './request-middleware.js';
|
|
51
|
+
import { computeEmailHash } from './config.js';
|
|
51
52
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
52
53
|
// Constants
|
|
53
54
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -142,13 +143,24 @@ async function verifyHS256JWT(token, secret) {
|
|
|
142
143
|
* ```
|
|
143
144
|
*/
|
|
144
145
|
export function createSoulcraftAuth(options) {
|
|
145
|
-
const { product, enrichUser, devCookieName = 'soulcraft_dev_session', backchannelPath = '/api/auth/backchannel-logout', } = options;
|
|
146
|
+
const { product, enrichUser, devCookieName = 'soulcraft_dev_session', backchannelPath = '/api/auth/backchannel-logout', defaultDevRole = 'owner', } = options;
|
|
146
147
|
// ── Session verifier selection ──────────────────────────────────────────
|
|
147
148
|
const idpUrl = process.env['SOULCRAFT_IDP_URL'];
|
|
149
|
+
const isDevMode = !idpUrl;
|
|
148
150
|
const verifySession = options.verifier
|
|
149
151
|
?? (idpUrl
|
|
150
152
|
? createRemoteSessionVerifier({ idpUrl })
|
|
151
153
|
: createDevCookieVerifier(devCookieName));
|
|
154
|
+
// ── Dev mode startup banner ─────────────────────────────────────────────
|
|
155
|
+
if (isDevMode && defaultDevRole !== false) {
|
|
156
|
+
const roles = ['owner', 'staff', 'manager', 'creator', 'customer'];
|
|
157
|
+
console.log(`\n ⚡ DEV MODE — ${product} (auto-login: ${defaultDevRole})`);
|
|
158
|
+
console.log(` Switch roles:`);
|
|
159
|
+
for (const role of roles) {
|
|
160
|
+
console.log(` ▸ ${role.padEnd(10)} /api/dev/login?role=${role}`);
|
|
161
|
+
}
|
|
162
|
+
console.log();
|
|
163
|
+
}
|
|
152
164
|
// ── Handle hook ─────────────────────────────────────────────────────────
|
|
153
165
|
const handle = async ({ event, resolve }) => {
|
|
154
166
|
// CSRF bypass for backchannel-logout — the IdP sends server-to-server
|
|
@@ -162,7 +174,7 @@ export function createSoulcraftAuth(options) {
|
|
|
162
174
|
}
|
|
163
175
|
// Resolve session
|
|
164
176
|
const cookieHeader = event.request.headers.get('cookie') ?? '';
|
|
165
|
-
|
|
177
|
+
let session = await verifySession(cookieHeader);
|
|
166
178
|
// Stale cookie recovery — if cookie present but session null, clear it
|
|
167
179
|
const hasSessionCookie = cookieHeader.includes(SESSION_COOKIE);
|
|
168
180
|
if (hasSessionCookie && !session) {
|
|
@@ -170,6 +182,45 @@ export function createSoulcraftAuth(options) {
|
|
|
170
182
|
response.headers.append('Set-Cookie', CLEAR_SESSION_COOKIE);
|
|
171
183
|
return response;
|
|
172
184
|
}
|
|
185
|
+
// ── Dev auto-login ──────────────────────────────────────────────────
|
|
186
|
+
// In dev mode, if no session exists and auto-login is enabled, create
|
|
187
|
+
// a dev session automatically. The developer is logged in the moment
|
|
188
|
+
// the first page loads — no manual /api/dev/login call needed.
|
|
189
|
+
if (isDevMode && !session && defaultDevRole !== false) {
|
|
190
|
+
const role = defaultDevRole;
|
|
191
|
+
const email = `dev-${role}@soulcraft.com`;
|
|
192
|
+
const autoSession = {
|
|
193
|
+
user: {
|
|
194
|
+
id: `dev-user-${role}`,
|
|
195
|
+
email,
|
|
196
|
+
name: `Dev ${role.charAt(0).toUpperCase() + role.slice(1)}`,
|
|
197
|
+
image: null,
|
|
198
|
+
platformRole: role,
|
|
199
|
+
emailHash: computeEmailHash(email),
|
|
200
|
+
},
|
|
201
|
+
sessionId: `dev-session-auto-${Date.now()}`,
|
|
202
|
+
expiresAt: Date.now() + 86_400_000,
|
|
203
|
+
};
|
|
204
|
+
session = autoSession;
|
|
205
|
+
// Set the cookie so subsequent requests don't re-create the session
|
|
206
|
+
const cookieValue = Buffer.from(JSON.stringify(autoSession)).toString('base64url');
|
|
207
|
+
const setCookie = [
|
|
208
|
+
`${devCookieName}=${cookieValue}`,
|
|
209
|
+
`Path=/`,
|
|
210
|
+
`HttpOnly`,
|
|
211
|
+
`SameSite=Lax`,
|
|
212
|
+
`Max-Age=86400`,
|
|
213
|
+
].join('; ');
|
|
214
|
+
// Attach session, resolve, then append the cookie to the response
|
|
215
|
+
event.locals['session'] = { sessionId: autoSession.sessionId, expiresAt: autoSession.expiresAt };
|
|
216
|
+
const user = enrichUser
|
|
217
|
+
? await enrichUser(autoSession.user, event)
|
|
218
|
+
: autoSession.user;
|
|
219
|
+
event.locals['user'] = user;
|
|
220
|
+
const response = await resolve(event);
|
|
221
|
+
response.headers.append('Set-Cookie', setCookie);
|
|
222
|
+
return response;
|
|
223
|
+
}
|
|
173
224
|
// Attach session and user to locals
|
|
174
225
|
event.locals['session'] = session
|
|
175
226
|
? { sessionId: session.sessionId, expiresAt: session.expiresAt }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sveltekit.js","sourceRoot":"","sources":["../../../src/modules/auth/sveltekit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"sveltekit.js","sourceRoot":"","sources":["../../../src/modules/auth/sveltekit.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,54 +2,44 @@
|
|
|
2
2
|
* @module modules/skills
|
|
3
3
|
* @description Skill loading and registry for @soulcraft/sdk.
|
|
4
4
|
*
|
|
5
|
-
* Skills are SKILL.md files
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Skills are SKILL.md files stored in the Brainy VFS at `/.soulcraft/skills/{id}/SKILL.md`.
|
|
6
|
+
* Each skill is a directory containing a SKILL.md with YAML frontmatter (name, description,
|
|
7
|
+
* type, etc.) and markdown instructions.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* the Forge Kit Registry during kit provisioning.
|
|
12
|
-
*
|
|
13
|
-
* For tests, pass `bundledRegistry` to inject an in-memory skill map without
|
|
14
|
-
* any VFS or filesystem access.
|
|
9
|
+
* Skills are seeded from the kit at workspace creation time and can be customized per workspace.
|
|
10
|
+
* All products (Workshop, Venue, Academy, Pulse) read from the same path.
|
|
15
11
|
*
|
|
16
12
|
* ## VFS path convention
|
|
17
13
|
* ```
|
|
18
|
-
* /skills/{
|
|
14
|
+
* /.soulcraft/skills/{skill-id}/SKILL.md
|
|
19
15
|
* ```
|
|
20
|
-
* Example:
|
|
16
|
+
* Example: `/.soulcraft/skills/candle-expertise/SKILL.md`
|
|
21
17
|
*/
|
|
22
18
|
import type { Brainy } from '@soulcraft/brainy';
|
|
23
19
|
import type { SkillsModule } from './types.js';
|
|
20
|
+
/** Standard path for skills in every Brainy instance. */
|
|
21
|
+
export declare const SKILLS_DIR = "/.soulcraft/skills";
|
|
24
22
|
/**
|
|
25
|
-
*
|
|
26
|
-
*/
|
|
27
|
-
export interface CreateSkillsModuleOptions {
|
|
28
|
-
/**
|
|
29
|
-
* Inject an in-memory skill registry for tests. When provided, these skills
|
|
30
|
-
* serve as the fallback when VFS lookup misses.
|
|
31
|
-
*/
|
|
32
|
-
bundledRegistry?: Record<string, Record<string, string>> | null;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Creates a `SkillsModule` backed by a Brainy VFS instance.
|
|
23
|
+
* @description Creates a `SkillsModule` backed by a Brainy VFS instance.
|
|
36
24
|
*
|
|
37
|
-
* Skills are loaded from
|
|
38
|
-
*
|
|
25
|
+
* Skills are loaded from `/.soulcraft/skills/{id}/SKILL.md`. Each skill directory
|
|
26
|
+
* contains a SKILL.md file with YAML frontmatter and markdown instructions.
|
|
39
27
|
*
|
|
40
|
-
* @param brain - An initialized Brainy instance
|
|
41
|
-
* Pass `null` to disable VFS skill loading (test registry only).
|
|
28
|
+
* @param brain - An initialized Brainy instance (or null for test-only mode).
|
|
42
29
|
* @param options - Optional configuration including a registry override for tests.
|
|
43
30
|
* @returns A configured {@link SkillsModule}.
|
|
44
31
|
*
|
|
45
32
|
* @example
|
|
46
33
|
* ```typescript
|
|
47
|
-
* const brain = await pool.forUser(user.emailHash, workspaceId)
|
|
48
34
|
* const skills = createSkillsModule(brain)
|
|
49
|
-
*
|
|
50
|
-
* const skill = await skills.load('
|
|
35
|
+
* const all = await skills.list()
|
|
36
|
+
* const skill = await skills.load('candle-expertise')
|
|
51
37
|
* ```
|
|
52
38
|
*/
|
|
39
|
+
export interface CreateSkillsModuleOptions {
|
|
40
|
+
/** In-memory skill registry for tests. */
|
|
41
|
+
bundledRegistry?: Record<string, string> | null;
|
|
42
|
+
}
|
|
53
43
|
export declare function createSkillsModule(brain: Brainy | null, options?: CreateSkillsModuleOptions): SkillsModule;
|
|
54
44
|
export type { SkillsModule, Skill, SkillListOptions, SkillInstallOptions, } from './types.js';
|
|
55
45
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAgD,MAAM,YAAY,CAAA;AAE5F,yDAAyD;AACzD,eAAO,MAAM,UAAU,uBAAuB,CAAA;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,yBAAyB;IACxC,0CAA0C;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;CAChD;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,OAAO,GAAE,yBAA8B,GACtC,YAAY,CA6Cd;AAgDD,YAAY,EACV,YAAY,EACZ,KAAK,EACL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,YAAY,CAAA"}
|
|
@@ -2,220 +2,103 @@
|
|
|
2
2
|
* @module modules/skills
|
|
3
3
|
* @description Skill loading and registry for @soulcraft/sdk.
|
|
4
4
|
*
|
|
5
|
-
* Skills are SKILL.md files
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Skills are SKILL.md files stored in the Brainy VFS at `/.soulcraft/skills/{id}/SKILL.md`.
|
|
6
|
+
* Each skill is a directory containing a SKILL.md with YAML frontmatter (name, description,
|
|
7
|
+
* type, etc.) and markdown instructions.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* the Forge Kit Registry during kit provisioning.
|
|
12
|
-
*
|
|
13
|
-
* For tests, pass `bundledRegistry` to inject an in-memory skill map without
|
|
14
|
-
* any VFS or filesystem access.
|
|
9
|
+
* Skills are seeded from the kit at workspace creation time and can be customized per workspace.
|
|
10
|
+
* All products (Workshop, Venue, Academy, Pulse) read from the same path.
|
|
15
11
|
*
|
|
16
12
|
* ## VFS path convention
|
|
17
13
|
* ```
|
|
18
|
-
* /skills/{
|
|
19
|
-
* ```
|
|
20
|
-
* Example: `/skills/wicks-and-whiskers/inventory-health.md`
|
|
21
|
-
*/
|
|
22
|
-
/**
|
|
23
|
-
* Creates a `SkillsModule` backed by a Brainy VFS instance.
|
|
24
|
-
*
|
|
25
|
-
* Skills are loaded from the VFS at `/skills/{kitId}/{skillId}.md`. For tests,
|
|
26
|
-
* pass `bundledRegistry` in options to provide an in-memory fallback.
|
|
27
|
-
*
|
|
28
|
-
* @param brain - An initialized Brainy instance. Required for VFS operations.
|
|
29
|
-
* Pass `null` to disable VFS skill loading (test registry only).
|
|
30
|
-
* @param options - Optional configuration including a registry override for tests.
|
|
31
|
-
* @returns A configured {@link SkillsModule}.
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* const brain = await pool.forUser(user.emailHash, workspaceId)
|
|
36
|
-
* const skills = createSkillsModule(brain)
|
|
37
|
-
*
|
|
38
|
-
* const skill = await skills.load('inventory-health', 'wicks-and-whiskers')
|
|
14
|
+
* /.soulcraft/skills/{skill-id}/SKILL.md
|
|
39
15
|
* ```
|
|
16
|
+
* Example: `/.soulcraft/skills/candle-expertise/SKILL.md`
|
|
40
17
|
*/
|
|
18
|
+
/** Standard path for skills in every Brainy instance. */
|
|
19
|
+
export const SKILLS_DIR = '/.soulcraft/skills';
|
|
41
20
|
export function createSkillsModule(brain, options = {}) {
|
|
42
|
-
const
|
|
43
|
-
? () => options.bundledRegistry ?? null
|
|
44
|
-
: () => null;
|
|
21
|
+
const testRegistry = options.bundledRegistry ?? null;
|
|
45
22
|
return {
|
|
46
|
-
async load(id
|
|
47
|
-
// 1. Try VFS first
|
|
23
|
+
async load(id) {
|
|
48
24
|
if (brain) {
|
|
49
|
-
const
|
|
50
|
-
if (
|
|
51
|
-
return
|
|
25
|
+
const skill = await _loadFromVfs(brain, id);
|
|
26
|
+
if (skill)
|
|
27
|
+
return skill;
|
|
52
28
|
}
|
|
53
|
-
|
|
54
|
-
|
|
29
|
+
if (testRegistry && testRegistry[id]) {
|
|
30
|
+
return { id, content: testRegistry[id], source: 'bundled' };
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
55
33
|
},
|
|
56
|
-
async list(
|
|
57
|
-
const { kitId, includeVfs = true, includeBundled = true } = options;
|
|
34
|
+
async list(opts = {}) {
|
|
58
35
|
const results = [];
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
const vfsSkills = await _listFromVfs(brain, kitId);
|
|
36
|
+
if (brain) {
|
|
37
|
+
const vfsSkills = await _listFromVfs(brain);
|
|
62
38
|
results.push(...vfsSkills);
|
|
63
39
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
40
|
+
if (testRegistry) {
|
|
41
|
+
for (const [id, content] of Object.entries(testRegistry)) {
|
|
42
|
+
if (!results.some(s => s.id === id)) {
|
|
43
|
+
results.push({ id, content, source: 'bundled' });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
68
46
|
}
|
|
69
47
|
return results;
|
|
70
48
|
},
|
|
71
49
|
async install(options) {
|
|
72
50
|
if (!brain) {
|
|
73
|
-
throw new Error('sdk.skills.install() requires a Brainy instance with VFS support.
|
|
74
|
-
'Ensure the SDK was created with a valid brain parameter.');
|
|
51
|
+
throw new Error('sdk.skills.install() requires a Brainy instance with VFS support.');
|
|
75
52
|
}
|
|
76
|
-
const { id,
|
|
77
|
-
const
|
|
78
|
-
|
|
53
|
+
const { id, content } = options;
|
|
54
|
+
const dirPath = `${SKILLS_DIR}/${id}`;
|
|
55
|
+
const filePath = `${dirPath}/SKILL.md`;
|
|
56
|
+
await brain.vfs.mkdir(dirPath, { recursive: true });
|
|
57
|
+
await brain.vfs.writeFile(filePath, content);
|
|
79
58
|
},
|
|
80
59
|
};
|
|
81
60
|
}
|
|
82
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
83
|
-
// VFS helpers
|
|
84
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
85
61
|
/**
|
|
86
|
-
* Load a skill from
|
|
87
|
-
*
|
|
88
|
-
* @param brain - Initialized Brainy instance.
|
|
89
|
-
* @param id - Skill ID.
|
|
90
|
-
* @param kitId - Kit ID.
|
|
91
|
-
* @returns The skill if found, or `null`.
|
|
62
|
+
* @description Load a skill from VFS at `/.soulcraft/skills/{id}/SKILL.md`.
|
|
92
63
|
*/
|
|
93
|
-
async function _loadFromVfs(brain, id
|
|
94
|
-
const
|
|
64
|
+
async function _loadFromVfs(brain, id) {
|
|
65
|
+
const filePath = `${SKILLS_DIR}/${id}/SKILL.md`;
|
|
95
66
|
try {
|
|
96
|
-
const raw = await brain.vfs.readFile(
|
|
67
|
+
const raw = await brain.vfs.readFile(filePath);
|
|
97
68
|
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
98
|
-
return { id,
|
|
69
|
+
return { id, content, source: 'vfs' };
|
|
99
70
|
}
|
|
100
71
|
catch {
|
|
101
|
-
// File not found in VFS — normal, fall through to bundled
|
|
102
72
|
return null;
|
|
103
73
|
}
|
|
104
74
|
}
|
|
105
75
|
/**
|
|
106
|
-
* List all skills
|
|
107
|
-
*
|
|
108
|
-
* @param brain - Initialized Brainy instance.
|
|
109
|
-
* @param kitId - Optional kit filter. If omitted, all skills are returned.
|
|
110
|
-
* @returns Array of VFS-sourced skills.
|
|
76
|
+
* @description List all skills from VFS at `/.soulcraft/skills/`.
|
|
111
77
|
*/
|
|
112
|
-
async function _listFromVfs(brain
|
|
78
|
+
async function _listFromVfs(brain) {
|
|
113
79
|
const results = [];
|
|
114
80
|
try {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const raw = await brain.vfs.readFile(vfsPath);
|
|
125
|
-
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
126
|
-
results.push({ id, kitId, content, source: 'vfs' });
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
// Skip unreadable files
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
else if (typeof entry === 'object' && 'name' in entry) {
|
|
133
|
-
const name = entry.name;
|
|
134
|
-
if (name.endsWith('.md')) {
|
|
135
|
-
const id = name.slice(0, -3);
|
|
136
|
-
const vfsPath = `${dir}/${name}`;
|
|
137
|
-
try {
|
|
138
|
-
const raw = await brain.vfs.readFile(vfsPath);
|
|
139
|
-
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
140
|
-
results.push({ id, kitId, content, source: 'vfs' });
|
|
141
|
-
}
|
|
142
|
-
catch {
|
|
143
|
-
// Skip unreadable files
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
// List all kits then list skills per kit
|
|
151
|
-
const skillsDir = '/skills';
|
|
152
|
-
let kitEntries;
|
|
81
|
+
const entries = await brain.vfs.readdir(SKILLS_DIR);
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const name = typeof entry === 'string' ? entry
|
|
84
|
+
: typeof entry === 'object' && entry !== null && 'name' in entry
|
|
85
|
+
? entry.name
|
|
86
|
+
: null;
|
|
87
|
+
if (!name)
|
|
88
|
+
continue;
|
|
89
|
+
const filePath = `${SKILLS_DIR}/${name}/SKILL.md`;
|
|
153
90
|
try {
|
|
154
|
-
|
|
91
|
+
const raw = await brain.vfs.readFile(filePath);
|
|
92
|
+
const content = Buffer.isBuffer(raw) ? raw.toString('utf-8') : String(raw);
|
|
93
|
+
results.push({ id: name, content, source: 'vfs' });
|
|
155
94
|
}
|
|
156
95
|
catch {
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
for (const kitEntry of kitEntries) {
|
|
160
|
-
const kitName = typeof kitEntry === 'string' ? kitEntry
|
|
161
|
-
: typeof kitEntry === 'object' && kitEntry !== null && 'name' in kitEntry
|
|
162
|
-
? kitEntry.name
|
|
163
|
-
: null;
|
|
164
|
-
if (!kitName)
|
|
165
|
-
continue;
|
|
166
|
-
const kitSkills = await _listFromVfs(brain, kitName);
|
|
167
|
-
results.push(...kitSkills);
|
|
96
|
+
// Subdirectory without SKILL.md — skip
|
|
168
97
|
}
|
|
169
98
|
}
|
|
170
99
|
}
|
|
171
100
|
catch {
|
|
172
|
-
//
|
|
173
|
-
}
|
|
174
|
-
return results;
|
|
175
|
-
}
|
|
176
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
177
|
-
// Bundled registry helpers
|
|
178
|
-
// ─────────────────────────────────────────────────────────────────────────────
|
|
179
|
-
/**
|
|
180
|
-
* Load a single skill from the in-memory test registry.
|
|
181
|
-
*
|
|
182
|
-
* @param id - Skill ID.
|
|
183
|
-
* @param kitId - Kit ID.
|
|
184
|
-
* @param getRegistry - Function that returns the test registry (or null).
|
|
185
|
-
* @returns The skill if found, or `null`.
|
|
186
|
-
*/
|
|
187
|
-
function _loadBundled(id, kitId, getRegistry) {
|
|
188
|
-
const registry = getRegistry();
|
|
189
|
-
if (!registry)
|
|
190
|
-
return null;
|
|
191
|
-
const kitSkills = registry[kitId];
|
|
192
|
-
if (!kitSkills)
|
|
193
|
-
return null;
|
|
194
|
-
const content = kitSkills[id];
|
|
195
|
-
if (!content)
|
|
196
|
-
return null;
|
|
197
|
-
return { id, kitId, content, source: 'bundled' };
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* List skills from the in-memory test registry, optionally filtered by kit ID.
|
|
201
|
-
*
|
|
202
|
-
* @param kitId - Optional kit filter.
|
|
203
|
-
* @param getRegistry - Function that returns the test registry (or null).
|
|
204
|
-
* @returns Array of skills from the registry.
|
|
205
|
-
*/
|
|
206
|
-
function _listBundled(kitId, getRegistry) {
|
|
207
|
-
const registry = getRegistry();
|
|
208
|
-
if (!registry)
|
|
209
|
-
return [];
|
|
210
|
-
const results = [];
|
|
211
|
-
const kitsToList = kitId ? [kitId] : Object.keys(registry);
|
|
212
|
-
for (const kit of kitsToList) {
|
|
213
|
-
const kitSkills = registry[kit];
|
|
214
|
-
if (!kitSkills)
|
|
215
|
-
continue;
|
|
216
|
-
for (const [skillId, content] of Object.entries(kitSkills)) {
|
|
217
|
-
results.push({ id: skillId, kitId: kit, content, source: 'bundled' });
|
|
218
|
-
}
|
|
101
|
+
// /.soulcraft/skills doesn't exist yet — return empty
|
|
219
102
|
}
|
|
220
103
|
return results;
|
|
221
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/skills/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,120 +2,97 @@
|
|
|
2
2
|
* @module modules/skills/types
|
|
3
3
|
* @description Type definitions for `sdk.skills.*` — the skill loading and registry system.
|
|
4
4
|
*
|
|
5
|
-
* Skills are
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* within a kit's context.
|
|
5
|
+
* Skills are SKILL.md files stored at `/.soulcraft/skills/{id}/SKILL.md` in the Brainy VFS.
|
|
6
|
+
* Each skill is a directory containing a SKILL.md with YAML frontmatter and markdown
|
|
7
|
+
* instructions that define an AI persona, capabilities, or workflow.
|
|
9
8
|
*
|
|
10
|
-
* Skills are
|
|
11
|
-
*
|
|
9
|
+
* Skills are workspace-scoped — seeded from the kit at creation time and customizable
|
|
10
|
+
* per workspace. All products (Workshop, Venue, Academy, Pulse) read from the same path.
|
|
12
11
|
*
|
|
13
|
-
* ## Skill
|
|
12
|
+
* ## Skill types (via `type:` frontmatter)
|
|
13
|
+
* - `background` — passive knowledge, always loaded into AI context
|
|
14
|
+
* - `active` — user and/or AI can invoke
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
16
|
+
* ## Path convention
|
|
17
|
+
* ```
|
|
18
|
+
* /.soulcraft/skills/{skill-id}/SKILL.md
|
|
19
|
+
* ```
|
|
17
20
|
*/
|
|
18
21
|
/**
|
|
19
|
-
* A parsed skill loaded from VFS or an in-memory test registry.
|
|
22
|
+
* @description A parsed skill loaded from VFS or an in-memory test registry.
|
|
20
23
|
*/
|
|
21
24
|
export interface Skill {
|
|
22
|
-
/** Kebab-case skill identifier (matches the `id:` frontmatter
|
|
25
|
+
/** Kebab-case skill identifier (matches the directory name and `id:` frontmatter). */
|
|
23
26
|
id: string;
|
|
24
|
-
/** The
|
|
25
|
-
kitId: string | null;
|
|
26
|
-
/** The full SKILL.md content including YAML frontmatter. */
|
|
27
|
+
/** The full SKILL.md content including YAML frontmatter and markdown instructions. */
|
|
27
28
|
content: string;
|
|
28
29
|
/** Where this skill was loaded from. */
|
|
29
30
|
source: 'vfs' | 'bundled';
|
|
30
31
|
}
|
|
31
32
|
/**
|
|
32
|
-
* Options for listing skills.
|
|
33
|
+
* @description Options for listing skills.
|
|
33
34
|
*/
|
|
34
35
|
export interface SkillListOptions {
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
*/
|
|
38
|
-
kitId?: string;
|
|
39
|
-
/**
|
|
40
|
-
* Whether to include VFS-installed skills in the results.
|
|
41
|
-
*
|
|
42
|
-
* @default true
|
|
43
|
-
*/
|
|
44
|
-
includeVfs?: boolean;
|
|
45
|
-
/**
|
|
46
|
-
* Whether to include skills from the test registry (when provided) in results.
|
|
47
|
-
*
|
|
48
|
-
* @default true
|
|
49
|
-
*/
|
|
50
|
-
includeBundled?: boolean;
|
|
36
|
+
/** Reserved for future filtering. */
|
|
37
|
+
_?: never;
|
|
51
38
|
}
|
|
52
39
|
/**
|
|
53
|
-
* Options for installing a skill into the VFS.
|
|
40
|
+
* @description Options for installing a skill into the VFS.
|
|
54
41
|
*/
|
|
55
42
|
export interface SkillInstallOptions {
|
|
56
|
-
/** The skill ID (kebab-case). */
|
|
43
|
+
/** The skill ID (kebab-case). Becomes the directory name. */
|
|
57
44
|
id: string;
|
|
58
|
-
/** The kit this skill belongs to. */
|
|
59
|
-
kitId: string;
|
|
60
45
|
/** The full SKILL.md content including YAML frontmatter. */
|
|
61
46
|
content: string;
|
|
62
47
|
}
|
|
63
48
|
/**
|
|
64
|
-
* The `sdk.skills` namespace.
|
|
49
|
+
* @description The `sdk.skills` namespace.
|
|
65
50
|
*
|
|
66
51
|
* Provides a unified interface for loading, listing, and installing skills
|
|
67
|
-
* from the Brainy VFS
|
|
52
|
+
* from the Brainy VFS at `/.soulcraft/skills/`.
|
|
68
53
|
*
|
|
69
54
|
* @example Loading a specific skill
|
|
70
55
|
* ```typescript
|
|
71
|
-
* const skill = await sdk.skills.load('
|
|
56
|
+
* const skill = await sdk.skills.load('candle-expertise')
|
|
72
57
|
* if (skill) {
|
|
73
|
-
* const systemPrompt = buildSystemPrompt(
|
|
58
|
+
* const systemPrompt = buildSystemPrompt([skill.content])
|
|
74
59
|
* }
|
|
75
60
|
* ```
|
|
76
61
|
*
|
|
77
|
-
* @example Listing all skills
|
|
62
|
+
* @example Listing all skills
|
|
78
63
|
* ```typescript
|
|
79
|
-
* const skills = await sdk.skills.list(
|
|
80
|
-
* const systemPrompt = buildSystemPrompt(
|
|
64
|
+
* const skills = await sdk.skills.list()
|
|
65
|
+
* const systemPrompt = buildSystemPrompt(skills.map(s => s.content))
|
|
81
66
|
* ```
|
|
82
67
|
*
|
|
83
|
-
* @example Installing a skill
|
|
68
|
+
* @example Installing a skill
|
|
84
69
|
* ```typescript
|
|
85
70
|
* await sdk.skills.install({
|
|
86
71
|
* id: 'custom-flow',
|
|
87
|
-
*
|
|
88
|
-
* content: `---\nid: custom-flow\ntitle: Custom Flow\n---\n...`,
|
|
72
|
+
* content: '---\nid: custom-flow\nname: Custom Flow\ntype: active\n---\n...',
|
|
89
73
|
* })
|
|
90
74
|
* ```
|
|
91
75
|
*/
|
|
92
76
|
export interface SkillsModule {
|
|
93
77
|
/**
|
|
94
|
-
* Load a single skill by ID
|
|
78
|
+
* @description Load a single skill by ID from `/.soulcraft/skills/{id}/SKILL.md`.
|
|
95
79
|
*
|
|
96
|
-
* @param id - Kebab-case skill ID (e.g. `'
|
|
97
|
-
* @
|
|
98
|
-
* @returns The skill, or `null` if not found in VFS or bundled registry.
|
|
80
|
+
* @param id - Kebab-case skill ID (e.g. `'candle-expertise'`).
|
|
81
|
+
* @returns The skill, or `null` if not found.
|
|
99
82
|
*/
|
|
100
|
-
load(id: string
|
|
83
|
+
load(id: string): Promise<Skill | null>;
|
|
101
84
|
/**
|
|
102
|
-
* List skills
|
|
103
|
-
*
|
|
104
|
-
* Skills are returned from VFS. When a test registry is provided, VFS skills
|
|
105
|
-
* appear first, followed by test registry skills (no deduplication).
|
|
85
|
+
* @description List all skills in the workspace.
|
|
106
86
|
*
|
|
107
|
-
* @param options -
|
|
108
|
-
* @returns
|
|
87
|
+
* @param options - Optional filtering (reserved for future use).
|
|
88
|
+
* @returns Array of all installed skills.
|
|
109
89
|
*/
|
|
110
90
|
list(options?: SkillListOptions): Promise<Skill[]>;
|
|
111
91
|
/**
|
|
112
|
-
* Install a skill into
|
|
113
|
-
*
|
|
114
|
-
* Writes the skill content to `/skills/{kitId}/{id}.md` in the Brainy VFS.
|
|
115
|
-
* Overwrites any existing skill at that path.
|
|
92
|
+
* @description Install a skill into `/.soulcraft/skills/{id}/SKILL.md`.
|
|
93
|
+
* Creates the directory if it doesn't exist. Overwrites if it does.
|
|
116
94
|
*
|
|
117
|
-
* @param options - The skill to install.
|
|
118
|
-
* @throws {Error} If the VFS is not available on this SDK instance.
|
|
95
|
+
* @param options - The skill ID and content to install.
|
|
119
96
|
*/
|
|
120
97
|
install(options: SkillInstallOptions): Promise<void>;
|
|
121
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/skills/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/modules/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAA;IACV,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAA;IACf,wCAAwC;IACxC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,CAAC,CAAC,EAAE,KAAK,CAAA;CACV;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,6DAA6D;IAC7D,EAAE,EAAE,MAAM,CAAA;IACV,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;IAEvC;;;;;OAKG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;IAElD;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACrD"}
|
|
@@ -2,18 +2,21 @@
|
|
|
2
2
|
* @module modules/skills/types
|
|
3
3
|
* @description Type definitions for `sdk.skills.*` — the skill loading and registry system.
|
|
4
4
|
*
|
|
5
|
-
* Skills are
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* within a kit's context.
|
|
5
|
+
* Skills are SKILL.md files stored at `/.soulcraft/skills/{id}/SKILL.md` in the Brainy VFS.
|
|
6
|
+
* Each skill is a directory containing a SKILL.md with YAML frontmatter and markdown
|
|
7
|
+
* instructions that define an AI persona, capabilities, or workflow.
|
|
9
8
|
*
|
|
10
|
-
* Skills are
|
|
11
|
-
*
|
|
9
|
+
* Skills are workspace-scoped — seeded from the kit at creation time and customizable
|
|
10
|
+
* per workspace. All products (Workshop, Venue, Academy, Pulse) read from the same path.
|
|
12
11
|
*
|
|
13
|
-
* ## Skill
|
|
12
|
+
* ## Skill types (via `type:` frontmatter)
|
|
13
|
+
* - `background` — passive knowledge, always loaded into AI context
|
|
14
|
+
* - `active` — user and/or AI can invoke
|
|
14
15
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
16
|
+
* ## Path convention
|
|
17
|
+
* ```
|
|
18
|
+
* /.soulcraft/skills/{skill-id}/SKILL.md
|
|
19
|
+
* ```
|
|
17
20
|
*/
|
|
18
21
|
export {};
|
|
19
22
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/skills/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/modules/skills/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
|