@joktec/skills 0.1.2 → 0.1.3
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/README.md +20 -4
- package/bin/joktec-skills.mjs +33 -27
- package/dist/claude/skills/joktec-adapter-skill/SKILL.md +4 -0
- package/dist/claude/skills/joktec-broker-skill/SKILL.md +4 -0
- package/dist/claude/skills/joktec-common-skill/SKILL.md +3 -0
- package/dist/claude/skills/joktec-database-extended-skill/SKILL.md +4 -0
- package/dist/claude/skills/joktec-integration-skill/SKILL.md +4 -0
- package/dist/claude/skills/joktec-mongo-skill/SKILL.md +4 -0
- package/dist/claude/skills/joktec-mysql-skill/SKILL.md +4 -0
- package/dist/claude/skills/joktec-tool-skill/SKILL.md +4 -0
- package/dist/codex/skills/joktec-adapter-skill/SKILL.md +4 -0
- package/dist/codex/skills/joktec-broker-skill/SKILL.md +4 -0
- package/dist/codex/skills/joktec-common-skill/SKILL.md +3 -0
- package/dist/codex/skills/joktec-database-extended-skill/SKILL.md +4 -0
- package/dist/codex/skills/joktec-integration-skill/SKILL.md +4 -0
- package/dist/codex/skills/joktec-mongo-skill/SKILL.md +4 -0
- package/dist/codex/skills/joktec-mysql-skill/SKILL.md +4 -0
- package/dist/codex/skills/joktec-tool-skill/SKILL.md +4 -0
- package/package.json +1 -1
- package/scripts/validate-skills.mjs +32 -0
- package/skill-pack.json +261 -52
- package/skills/joktec-adapter-skill/SKILL.md +4 -0
- package/skills/joktec-broker-skill/SKILL.md +4 -0
- package/skills/joktec-common-skill/SKILL.md +3 -0
- package/skills/joktec-database-extended-skill/SKILL.md +4 -0
- package/skills/joktec-integration-skill/SKILL.md +4 -0
- package/skills/joktec-mongo-skill/SKILL.md +4 -0
- package/skills/joktec-mysql-skill/SKILL.md +4 -0
- package/skills/joktec-tool-skill/SKILL.md +4 -0
package/README.md
CHANGED
|
@@ -109,19 +109,28 @@ The result is less prompt repetition, better package boundary discipline, and mo
|
|
|
109
109
|
|
|
110
110
|
`joktec-framework-skill` is the required entrypoint skill. Installers should always include it so agents can route from a generic JokTec request to the correct focused skill.
|
|
111
111
|
|
|
112
|
-
`joktec-common-skill` is the
|
|
112
|
+
`joktec-common-skill` is the required foundation skill. It depends on `joktec-framework-skill`. Focused package skills such as Mongo, MySQL, brokers, adapters, integrations, and tools depend on both `joktec-framework-skill` and `joktec-common-skill` because most package usage flows rely on core config, lifecycle, or base abstractions.
|
|
113
113
|
|
|
114
114
|
Dependency metadata lives in `skill-pack.json`:
|
|
115
115
|
|
|
116
116
|
```json
|
|
117
117
|
{
|
|
118
118
|
"id": "joktec-mongo-skill",
|
|
119
|
-
"dependencies": ["joktec-framework-skill"],
|
|
120
|
-
"recommended": [
|
|
119
|
+
"dependencies": ["joktec-framework-skill", "joktec-common-skill"],
|
|
120
|
+
"recommended": []
|
|
121
121
|
}
|
|
122
122
|
```
|
|
123
123
|
|
|
124
|
-
The CLI resolves `dependencies` automatically.
|
|
124
|
+
The `@joktec/skills` CLI resolves `dependencies` automatically.
|
|
125
|
+
|
|
126
|
+
The ecosystem `npx skills` CLI currently installs exactly the skills selected in its prompt. When using it, select dependencies manually or pass them explicitly:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
npx skills add joktec/joktec-skills -a codex --project . \
|
|
130
|
+
--skill joktec-framework-skill joktec-common-skill joktec-mongo-skill
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
`npx skills` also writes a project-level `skills-lock.json`. Keep that file if the project wants reproducible skill updates or restore support through the ecosystem CLI.
|
|
125
134
|
|
|
126
135
|
---
|
|
127
136
|
|
|
@@ -197,6 +206,13 @@ Install focused skills. Required dependencies are included automatically:
|
|
|
197
206
|
npx @joktec/skills add mongo,mysql --agent codex --project .
|
|
198
207
|
```
|
|
199
208
|
|
|
209
|
+
Using the ecosystem `skills` CLI:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
npx skills add joktec/joktec-skills -a codex --project . \
|
|
213
|
+
--skill joktec-framework-skill joktec-common-skill joktec-mongo-skill
|
|
214
|
+
```
|
|
215
|
+
|
|
200
216
|
Install for multiple agents:
|
|
201
217
|
|
|
202
218
|
```bash
|
package/bin/joktec-skills.mjs
CHANGED
|
@@ -5,7 +5,7 @@ import path from 'node:path';
|
|
|
5
5
|
import readline from 'node:readline';
|
|
6
6
|
import readlinePromises from 'node:readline/promises';
|
|
7
7
|
import { stdin as input, stdout as output } from 'node:process';
|
|
8
|
-
import { DIST_DIR, ROOT, ensureDir, loadSkills, readJson
|
|
8
|
+
import { DIST_DIR, ROOT, ensureDir, loadSkills, readJson } from '../scripts/lib.mjs';
|
|
9
9
|
|
|
10
10
|
const AGENTS = ['codex', 'claude', 'cursor', 'gemini', 'copilot', 'windsurf'];
|
|
11
11
|
const DEFAULT_SOURCE = 'https://github.com/joktec/joktec-skills.git';
|
|
@@ -268,22 +268,6 @@ function executeOperations(operations, force, dryRun) {
|
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
270
|
|
|
271
|
-
function writeManifest(project, pack, agents, skillIds, dryRun) {
|
|
272
|
-
const file = path.join(project, '.joktec-skills.json');
|
|
273
|
-
const existing = fs.existsSync(file) ? readJson(file) : {};
|
|
274
|
-
const manifest = {
|
|
275
|
-
package: '@joktec/skills',
|
|
276
|
-
version: pack.version,
|
|
277
|
-
installedAt: new Date().toISOString(),
|
|
278
|
-
agents: Array.from(new Set([...(existing.agents || []), ...agents])).sort(),
|
|
279
|
-
skills: Array.from(new Set([...(existing.skills || []), ...skillIds])).sort(),
|
|
280
|
-
frameworkBaseline: pack.frameworkBaseline,
|
|
281
|
-
packageBaseline: pack.packageBaseline,
|
|
282
|
-
};
|
|
283
|
-
if (!dryRun) writeFile(file, JSON.stringify(manifest, null, 2));
|
|
284
|
-
return manifest;
|
|
285
|
-
}
|
|
286
|
-
|
|
287
271
|
function logo() {
|
|
288
272
|
console.log(color.dim(` ██╗ ██████╗ ██╗ ██╗████████╗███████╗ ██████╗
|
|
289
273
|
██║██╔═══██╗██║ ██╔╝╚══██╔══╝██╔════╝██╔════╝
|
|
@@ -346,15 +330,26 @@ function buildInstalledLines(project, operations, skillIds, dryRun) {
|
|
|
346
330
|
]);
|
|
347
331
|
}
|
|
348
332
|
|
|
333
|
+
function stripAnsi(value) {
|
|
334
|
+
return String(value).replace(/\x1B\[[0-?]*[ -/]*[@-~]/g, '');
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
function fitLine(value) {
|
|
338
|
+
const width = Math.max(40, (output.columns || 100) - 4);
|
|
339
|
+
const plain = stripAnsi(value);
|
|
340
|
+
if (plain.length <= width) return value;
|
|
341
|
+
return `${plain.slice(0, width - 1)}…`;
|
|
342
|
+
}
|
|
343
|
+
|
|
349
344
|
function renderMultiSelect(items, cursor, selected, message) {
|
|
350
|
-
|
|
351
|
-
readline.clearScreenDown(output);
|
|
352
|
-
console.log(`${color.green('◇')} ${message} ${color.dim('(space to toggle, enter to confirm)')}`);
|
|
345
|
+
const lines = [`${color.green('◇')} ${message} ${color.dim('(space to toggle, enter to confirm)')}`];
|
|
353
346
|
for (let i = 0; i < items.length; i += 1) {
|
|
354
347
|
const marker = selected.has(items[i].value) ? color.green('●') : '○';
|
|
355
348
|
const pointer = i === cursor ? color.cyan('›') : ' ';
|
|
356
|
-
|
|
349
|
+
lines.push(`│ ${pointer} ${marker} ${fitLine(items[i].label)}`);
|
|
357
350
|
}
|
|
351
|
+
output.write(`${lines.join('\n')}\n`);
|
|
352
|
+
return lines.length;
|
|
358
353
|
}
|
|
359
354
|
|
|
360
355
|
async function multiSelect(items, defaults, message) {
|
|
@@ -362,12 +357,22 @@ async function multiSelect(items, defaults, message) {
|
|
|
362
357
|
|
|
363
358
|
const selected = new Set(defaults);
|
|
364
359
|
let cursor = 0;
|
|
360
|
+
let renderedLines = 0;
|
|
365
361
|
output.write('\n');
|
|
366
362
|
readline.emitKeypressEvents(input);
|
|
367
363
|
input.setRawMode(true);
|
|
368
364
|
|
|
369
365
|
try {
|
|
370
366
|
return await new Promise(resolve => {
|
|
367
|
+
const redraw = () => {
|
|
368
|
+
if (renderedLines) {
|
|
369
|
+
readline.moveCursor(output, 0, -renderedLines);
|
|
370
|
+
readline.cursorTo(output, 0);
|
|
371
|
+
readline.clearScreenDown(output);
|
|
372
|
+
}
|
|
373
|
+
renderedLines = renderMultiSelect(items, cursor, selected, message);
|
|
374
|
+
};
|
|
375
|
+
|
|
371
376
|
const onKey = (str, key) => {
|
|
372
377
|
if (key.name === 'c' && key.ctrl) {
|
|
373
378
|
input.setRawMode(false);
|
|
@@ -383,15 +388,16 @@ async function multiSelect(items, defaults, message) {
|
|
|
383
388
|
if (key.name === 'return') {
|
|
384
389
|
input.off('keypress', onKey);
|
|
385
390
|
input.setRawMode(false);
|
|
391
|
+
if (renderedLines) readline.moveCursor(output, 0, -renderedLines);
|
|
386
392
|
readline.cursorTo(output, 0);
|
|
387
393
|
readline.clearScreenDown(output);
|
|
388
394
|
resolve(Array.from(selected));
|
|
389
395
|
return;
|
|
390
396
|
}
|
|
391
|
-
|
|
397
|
+
redraw();
|
|
392
398
|
};
|
|
393
399
|
|
|
394
|
-
|
|
400
|
+
redraw();
|
|
395
401
|
input.on('keypress', onKey);
|
|
396
402
|
});
|
|
397
403
|
} finally {
|
|
@@ -410,6 +416,7 @@ async function confirm(message, yes) {
|
|
|
410
416
|
|
|
411
417
|
async function addCommand(args) {
|
|
412
418
|
const { pack } = loadSkills();
|
|
419
|
+
const pkg = readJson(path.join(ROOT, 'package.json'));
|
|
413
420
|
const project = path.resolve(args.project || '.');
|
|
414
421
|
const source = consumeSourceToken(args);
|
|
415
422
|
const agents = parseAgents(args.agent);
|
|
@@ -427,11 +434,12 @@ async function addCommand(args) {
|
|
|
427
434
|
selected = await multiSelect(
|
|
428
435
|
pack.skills.map(skill => ({
|
|
429
436
|
value: skill.id,
|
|
430
|
-
label: `${skill.id}
|
|
437
|
+
label: `${skill.id} (${skill.packages.join(', ')})`,
|
|
431
438
|
})),
|
|
432
439
|
pack.skills.filter(skill => skill.requiredByDefault).map(skill => skill.id),
|
|
433
440
|
'Select skills to install',
|
|
434
441
|
);
|
|
442
|
+
step('Select skills to install', selected.join(', '));
|
|
435
443
|
} else {
|
|
436
444
|
selected = resolveSkillIds(pack, requested, Boolean(args.all));
|
|
437
445
|
step('Select skills to install', selected.join(', '));
|
|
@@ -457,15 +465,13 @@ async function addCommand(args) {
|
|
|
457
465
|
}
|
|
458
466
|
|
|
459
467
|
executeOperations(operations, Boolean(args.force), Boolean(args['dry-run']));
|
|
460
|
-
const manifest = writeManifest(project, pack, agents, resolution.selected, Boolean(args['dry-run']));
|
|
461
468
|
|
|
462
469
|
step(args['dry-run'] ? 'Dry run complete' : 'Installation complete');
|
|
463
470
|
box(
|
|
464
471
|
`${args['dry-run'] ? 'Planned' : 'Installed'} ${resolution.selected.length} skills`,
|
|
465
472
|
buildInstalledLines(project, operations, resolution.selected, Boolean(args['dry-run'])),
|
|
466
473
|
);
|
|
467
|
-
console.log(`│ ${color.dim(
|
|
468
|
-
console.log(`│ ${color.dim(`@joktec/skills ${manifest.version}`)}`);
|
|
474
|
+
console.log(`│ ${color.dim(`@joktec/skills ${pkg.version}`)}`);
|
|
469
475
|
console.log('│');
|
|
470
476
|
done('Review skills before use; they run with full agent permissions.');
|
|
471
477
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-adapter-skill
|
|
3
3
|
description: Use when wiring or using JokTec adapter packages @joktec/cacher, @joktec/mailer, @joktec/notifier, or @joktec/storage for cache, mail delivery, push notifications, object storage, config-driven clients, and app-neutral adapter services.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Adapter Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-broker-skill
|
|
3
3
|
description: Use when wiring or using JokTec broker packages @joktec/kafka, @joktec/rabbit, @joktec/sqs, or @joktec/redcast, including client config, producer decorators, consumer loaders, message handlers, auto-binding, and app-level broker flows.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Broker Skill
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-common-skill
|
|
3
3
|
description: Use when implementing or wiring @joktec/core, @joktec/utils, or @joktec/cron in a consumer app, especially BaseController, BaseService, pagination, config, client lifecycle, bootstrap, cron decorators, or utility helpers.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
4
7
|
---
|
|
5
8
|
|
|
6
9
|
# JokTec Common Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-database-extended-skill
|
|
3
3
|
description: Use when working with extended JokTec database packages @joktec/elastic, @joktec/arango, or @joktec/bigquery in a consumer app, including app-neutral client setup, config-driven lifecycle, and package-specific query/service usage.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Extended Database Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-integration-skill
|
|
3
3
|
description: Use when wiring or using JokTec integration packages @joktec/firebase or @joktec/gpt, including validated config, SDK client lifecycle, app-neutral integration services, credentials handling, and consumer app composition.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Integration Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-mongo-skill
|
|
3
3
|
description: Use when working with @joktec/mongo in a consumer app, including MongoModule setup, Typegoose schema decorators, MongoRepo, MongoService, MongoHelper, plugins, ObjectId/query safety, soft delete, strict references, and cursor pagination.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Mongo Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-mysql-skill
|
|
3
3
|
description: Use when working with @joktec/mysql in a consumer app, including MysqlModule setup, TypeORM entities, schema-first @Column/@PrimaryColumn decorators, MysqlRepo, MysqlService, transactions, dialect support, uuidv7 ids, query safety, and cursor pagination.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec MySQL Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-tool-skill
|
|
3
3
|
description: Use when wiring or using JokTec tool packages @joktec/http, @joktec/file, or @joktec/alert, including Axios-backed HTTP clients, file classification helpers, Slack-compatible alert webhooks, config-driven lifecycle, and app-neutral utility services.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Tool Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-adapter-skill
|
|
3
3
|
description: Use when wiring or using JokTec adapter packages @joktec/cacher, @joktec/mailer, @joktec/notifier, or @joktec/storage for cache, mail delivery, push notifications, object storage, config-driven clients, and app-neutral adapter services.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Adapter Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-broker-skill
|
|
3
3
|
description: Use when wiring or using JokTec broker packages @joktec/kafka, @joktec/rabbit, @joktec/sqs, or @joktec/redcast, including client config, producer decorators, consumer loaders, message handlers, auto-binding, and app-level broker flows.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Broker Skill
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-common-skill
|
|
3
3
|
description: Use when implementing or wiring @joktec/core, @joktec/utils, or @joktec/cron in a consumer app, especially BaseController, BaseService, pagination, config, client lifecycle, bootstrap, cron decorators, or utility helpers.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
4
7
|
---
|
|
5
8
|
|
|
6
9
|
# JokTec Common Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-database-extended-skill
|
|
3
3
|
description: Use when working with extended JokTec database packages @joktec/elastic, @joktec/arango, or @joktec/bigquery in a consumer app, including app-neutral client setup, config-driven lifecycle, and package-specific query/service usage.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Extended Database Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-integration-skill
|
|
3
3
|
description: Use when wiring or using JokTec integration packages @joktec/firebase or @joktec/gpt, including validated config, SDK client lifecycle, app-neutral integration services, credentials handling, and consumer app composition.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Integration Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-mongo-skill
|
|
3
3
|
description: Use when working with @joktec/mongo in a consumer app, including MongoModule setup, Typegoose schema decorators, MongoRepo, MongoService, MongoHelper, plugins, ObjectId/query safety, soft delete, strict references, and cursor pagination.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Mongo Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-mysql-skill
|
|
3
3
|
description: Use when working with @joktec/mysql in a consumer app, including MysqlModule setup, TypeORM entities, schema-first @Column/@PrimaryColumn decorators, MysqlRepo, MysqlService, transactions, dialect support, uuidv7 ids, query safety, and cursor pagination.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec MySQL Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-tool-skill
|
|
3
3
|
description: Use when wiring or using JokTec tool packages @joktec/http, @joktec/file, or @joktec/alert, including Axios-backed HTTP clients, file classification helpers, Slack-compatible alert webhooks, config-driven lifecycle, and app-neutral utility services.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Tool Skill
|
package/package.json
CHANGED
|
@@ -7,6 +7,32 @@ const pack = readJson(PACK_PATH);
|
|
|
7
7
|
const { skills } = loadSkills();
|
|
8
8
|
|
|
9
9
|
const skillIds = new Set(skills.map(skill => skill.id));
|
|
10
|
+
function readFrontmatterDependencies(raw) {
|
|
11
|
+
const match = raw.match(/^---\n([\s\S]*?)\n---/);
|
|
12
|
+
if (!match) return [];
|
|
13
|
+
const lines = match[1].split('\n');
|
|
14
|
+
const deps = [];
|
|
15
|
+
let inMetadata = false;
|
|
16
|
+
let inDependencies = false;
|
|
17
|
+
for (const line of lines) {
|
|
18
|
+
if (/^\S/.test(line)) {
|
|
19
|
+
inMetadata = line.trim() === 'metadata:';
|
|
20
|
+
inDependencies = false;
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
if (inMetadata && /^ dependencies:\s*$/.test(line)) {
|
|
24
|
+
inDependencies = true;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (inDependencies) {
|
|
28
|
+
const item = line.match(/^ -\s+(.+?)\s*$/);
|
|
29
|
+
if (item) deps.push(item[1].trim());
|
|
30
|
+
else if (/^ \S/.test(line)) inDependencies = false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return deps;
|
|
34
|
+
}
|
|
35
|
+
|
|
10
36
|
for (const meta of pack.skills) {
|
|
11
37
|
if (!skillIds.has(meta.id)) errors.push(`Missing skill directory for metadata id: ${meta.id}`);
|
|
12
38
|
for (const dependency of meta.dependencies || []) {
|
|
@@ -38,6 +64,12 @@ for (const skill of skills) {
|
|
|
38
64
|
if (!skill.frontmatter.description || skill.frontmatter.description.length < 80) {
|
|
39
65
|
errors.push(`${skill.id}: description is missing or too short for reliable triggering`);
|
|
40
66
|
}
|
|
67
|
+
const meta = pack.skills.find(item => item.id === skill.id);
|
|
68
|
+
const declaredDeps = readFrontmatterDependencies(skill.raw);
|
|
69
|
+
const packDeps = meta?.dependencies || [];
|
|
70
|
+
if (declaredDeps.join('|') !== packDeps.join('|')) {
|
|
71
|
+
errors.push(`${skill.id}: frontmatter metadata.dependencies must match skill-pack dependencies`);
|
|
72
|
+
}
|
|
41
73
|
|
|
42
74
|
const refs = readReferences(skill);
|
|
43
75
|
const linkedRefs = Array.from(skill.raw.matchAll(/references\/[A-Za-z0-9_.-]+\.md/g)).map(match => match[0]);
|
package/skill-pack.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joktec/skills",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"sourceOfTruth": "../joktec-framework",
|
|
5
5
|
"frameworkBaseline": {
|
|
6
6
|
"repo": "https://github.com/joktec/joktec-framework",
|
|
@@ -41,106 +41,315 @@
|
|
|
41
41
|
"requiredByDefault": true,
|
|
42
42
|
"dependencies": [],
|
|
43
43
|
"recommended": [],
|
|
44
|
-
"packages": [
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
44
|
+
"packages": [
|
|
45
|
+
"@joktec/*"
|
|
46
|
+
],
|
|
47
|
+
"scope": {
|
|
48
|
+
"paths": [
|
|
49
|
+
"**/*"
|
|
50
|
+
]
|
|
51
|
+
},
|
|
52
|
+
"triggers": [
|
|
53
|
+
"joktec",
|
|
54
|
+
"@joktec",
|
|
55
|
+
"framework",
|
|
56
|
+
"package selection"
|
|
57
|
+
],
|
|
58
|
+
"outputs": {
|
|
59
|
+
"codex": true,
|
|
60
|
+
"claude": true,
|
|
61
|
+
"cursor": true,
|
|
62
|
+
"gemini": true,
|
|
63
|
+
"copilot": true,
|
|
64
|
+
"windsurf": true
|
|
65
|
+
}
|
|
48
66
|
},
|
|
49
67
|
{
|
|
50
68
|
"id": "joktec-common-skill",
|
|
51
69
|
"title": "JokTec Common Skill",
|
|
52
70
|
"role": "foundation",
|
|
53
71
|
"requiredByDefault": true,
|
|
54
|
-
"dependencies": [
|
|
72
|
+
"dependencies": [
|
|
73
|
+
"joktec-framework-skill"
|
|
74
|
+
],
|
|
55
75
|
"recommended": [],
|
|
56
|
-
"packages": [
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
76
|
+
"packages": [
|
|
77
|
+
"@joktec/core",
|
|
78
|
+
"@joktec/utils",
|
|
79
|
+
"@joktec/cron",
|
|
80
|
+
"@joktec/types"
|
|
81
|
+
],
|
|
82
|
+
"scope": {
|
|
83
|
+
"paths": [
|
|
84
|
+
"packages/common/**"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"triggers": [
|
|
88
|
+
"BaseController",
|
|
89
|
+
"BaseService",
|
|
90
|
+
"pagination",
|
|
91
|
+
"config",
|
|
92
|
+
"cron",
|
|
93
|
+
"utils"
|
|
94
|
+
],
|
|
95
|
+
"outputs": {
|
|
96
|
+
"codex": true,
|
|
97
|
+
"claude": true,
|
|
98
|
+
"cursor": true,
|
|
99
|
+
"gemini": true,
|
|
100
|
+
"copilot": true,
|
|
101
|
+
"windsurf": true
|
|
102
|
+
}
|
|
60
103
|
},
|
|
61
104
|
{
|
|
62
105
|
"id": "joktec-mongo-skill",
|
|
63
106
|
"title": "JokTec Mongo Skill",
|
|
64
107
|
"role": "focused",
|
|
65
108
|
"requiredByDefault": false,
|
|
66
|
-
"dependencies": [
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
"
|
|
109
|
+
"dependencies": [
|
|
110
|
+
"joktec-framework-skill",
|
|
111
|
+
"joktec-common-skill"
|
|
112
|
+
],
|
|
113
|
+
"recommended": [],
|
|
114
|
+
"packages": [
|
|
115
|
+
"@joktec/mongo"
|
|
116
|
+
],
|
|
117
|
+
"scope": {
|
|
118
|
+
"paths": [
|
|
119
|
+
"packages/databases/mongo/**"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
"triggers": [
|
|
123
|
+
"mongo",
|
|
124
|
+
"mongoose",
|
|
125
|
+
"typegoose",
|
|
126
|
+
"MongoRepo",
|
|
127
|
+
"cursor pagination"
|
|
128
|
+
],
|
|
129
|
+
"outputs": {
|
|
130
|
+
"codex": true,
|
|
131
|
+
"claude": true,
|
|
132
|
+
"cursor": true,
|
|
133
|
+
"gemini": true,
|
|
134
|
+
"copilot": true,
|
|
135
|
+
"windsurf": true
|
|
136
|
+
}
|
|
72
137
|
},
|
|
73
138
|
{
|
|
74
139
|
"id": "joktec-mysql-skill",
|
|
75
140
|
"title": "JokTec MySQL Skill",
|
|
76
141
|
"role": "focused",
|
|
77
142
|
"requiredByDefault": false,
|
|
78
|
-
"dependencies": [
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
"
|
|
83
|
-
"
|
|
143
|
+
"dependencies": [
|
|
144
|
+
"joktec-framework-skill",
|
|
145
|
+
"joktec-common-skill"
|
|
146
|
+
],
|
|
147
|
+
"recommended": [],
|
|
148
|
+
"packages": [
|
|
149
|
+
"@joktec/mysql"
|
|
150
|
+
],
|
|
151
|
+
"scope": {
|
|
152
|
+
"paths": [
|
|
153
|
+
"packages/databases/mysql/**"
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
"triggers": [
|
|
157
|
+
"mysql",
|
|
158
|
+
"typeorm",
|
|
159
|
+
"MysqlRepo",
|
|
160
|
+
"schema-first decorators",
|
|
161
|
+
"uuidv7"
|
|
162
|
+
],
|
|
163
|
+
"outputs": {
|
|
164
|
+
"codex": true,
|
|
165
|
+
"claude": true,
|
|
166
|
+
"cursor": true,
|
|
167
|
+
"gemini": true,
|
|
168
|
+
"copilot": true,
|
|
169
|
+
"windsurf": true
|
|
170
|
+
}
|
|
84
171
|
},
|
|
85
172
|
{
|
|
86
173
|
"id": "joktec-broker-skill",
|
|
87
174
|
"title": "JokTec Broker Skill",
|
|
88
175
|
"role": "grouped",
|
|
89
176
|
"requiredByDefault": false,
|
|
90
|
-
"dependencies": [
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"
|
|
95
|
-
"
|
|
177
|
+
"dependencies": [
|
|
178
|
+
"joktec-framework-skill",
|
|
179
|
+
"joktec-common-skill"
|
|
180
|
+
],
|
|
181
|
+
"recommended": [],
|
|
182
|
+
"packages": [
|
|
183
|
+
"@joktec/kafka",
|
|
184
|
+
"@joktec/rabbit",
|
|
185
|
+
"@joktec/sqs",
|
|
186
|
+
"@joktec/redcast"
|
|
187
|
+
],
|
|
188
|
+
"scope": {
|
|
189
|
+
"paths": [
|
|
190
|
+
"packages/brokers/**"
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
"triggers": [
|
|
194
|
+
"kafka",
|
|
195
|
+
"rabbit",
|
|
196
|
+
"sqs",
|
|
197
|
+
"redcast",
|
|
198
|
+
"broker",
|
|
199
|
+
"message pattern"
|
|
200
|
+
],
|
|
201
|
+
"outputs": {
|
|
202
|
+
"codex": true,
|
|
203
|
+
"claude": true,
|
|
204
|
+
"cursor": true,
|
|
205
|
+
"gemini": true,
|
|
206
|
+
"copilot": true,
|
|
207
|
+
"windsurf": true
|
|
208
|
+
}
|
|
96
209
|
},
|
|
97
210
|
{
|
|
98
211
|
"id": "joktec-adapter-skill",
|
|
99
212
|
"title": "JokTec Adapter Skill",
|
|
100
213
|
"role": "grouped",
|
|
101
214
|
"requiredByDefault": false,
|
|
102
|
-
"dependencies": [
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
"
|
|
107
|
-
"
|
|
215
|
+
"dependencies": [
|
|
216
|
+
"joktec-framework-skill",
|
|
217
|
+
"joktec-common-skill"
|
|
218
|
+
],
|
|
219
|
+
"recommended": [],
|
|
220
|
+
"packages": [
|
|
221
|
+
"@joktec/cacher",
|
|
222
|
+
"@joktec/mailer",
|
|
223
|
+
"@joktec/notifier",
|
|
224
|
+
"@joktec/storage"
|
|
225
|
+
],
|
|
226
|
+
"scope": {
|
|
227
|
+
"paths": [
|
|
228
|
+
"packages/adapters/**"
|
|
229
|
+
]
|
|
230
|
+
},
|
|
231
|
+
"triggers": [
|
|
232
|
+
"cache",
|
|
233
|
+
"mail",
|
|
234
|
+
"notification",
|
|
235
|
+
"storage",
|
|
236
|
+
"adapter"
|
|
237
|
+
],
|
|
238
|
+
"outputs": {
|
|
239
|
+
"codex": true,
|
|
240
|
+
"claude": true,
|
|
241
|
+
"cursor": true,
|
|
242
|
+
"gemini": true,
|
|
243
|
+
"copilot": true,
|
|
244
|
+
"windsurf": true
|
|
245
|
+
}
|
|
108
246
|
},
|
|
109
247
|
{
|
|
110
248
|
"id": "joktec-database-extended-skill",
|
|
111
249
|
"title": "JokTec Extended Database Skill",
|
|
112
250
|
"role": "grouped",
|
|
113
251
|
"requiredByDefault": false,
|
|
114
|
-
"dependencies": [
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"
|
|
119
|
-
"
|
|
252
|
+
"dependencies": [
|
|
253
|
+
"joktec-framework-skill",
|
|
254
|
+
"joktec-common-skill"
|
|
255
|
+
],
|
|
256
|
+
"recommended": [],
|
|
257
|
+
"packages": [
|
|
258
|
+
"@joktec/elastic",
|
|
259
|
+
"@joktec/arango",
|
|
260
|
+
"@joktec/bigquery"
|
|
261
|
+
],
|
|
262
|
+
"scope": {
|
|
263
|
+
"paths": [
|
|
264
|
+
"packages/databases/elastic/**",
|
|
265
|
+
"packages/databases/arango/**",
|
|
266
|
+
"packages/databases/bigquery/**"
|
|
267
|
+
]
|
|
268
|
+
},
|
|
269
|
+
"triggers": [
|
|
270
|
+
"elastic",
|
|
271
|
+
"arango",
|
|
272
|
+
"bigquery",
|
|
273
|
+
"extended database"
|
|
274
|
+
],
|
|
275
|
+
"outputs": {
|
|
276
|
+
"codex": true,
|
|
277
|
+
"claude": true,
|
|
278
|
+
"cursor": true,
|
|
279
|
+
"gemini": true,
|
|
280
|
+
"copilot": true,
|
|
281
|
+
"windsurf": true
|
|
282
|
+
}
|
|
120
283
|
},
|
|
121
284
|
{
|
|
122
285
|
"id": "joktec-integration-skill",
|
|
123
286
|
"title": "JokTec Integration Skill",
|
|
124
287
|
"role": "grouped",
|
|
125
288
|
"requiredByDefault": false,
|
|
126
|
-
"dependencies": [
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
"
|
|
131
|
-
"
|
|
289
|
+
"dependencies": [
|
|
290
|
+
"joktec-framework-skill",
|
|
291
|
+
"joktec-common-skill"
|
|
292
|
+
],
|
|
293
|
+
"recommended": [],
|
|
294
|
+
"packages": [
|
|
295
|
+
"@joktec/firebase",
|
|
296
|
+
"@joktec/gpt"
|
|
297
|
+
],
|
|
298
|
+
"scope": {
|
|
299
|
+
"paths": [
|
|
300
|
+
"packages/integrations/**"
|
|
301
|
+
]
|
|
302
|
+
},
|
|
303
|
+
"triggers": [
|
|
304
|
+
"firebase",
|
|
305
|
+
"gpt",
|
|
306
|
+
"openai",
|
|
307
|
+
"integration"
|
|
308
|
+
],
|
|
309
|
+
"outputs": {
|
|
310
|
+
"codex": true,
|
|
311
|
+
"claude": true,
|
|
312
|
+
"cursor": true,
|
|
313
|
+
"gemini": true,
|
|
314
|
+
"copilot": true,
|
|
315
|
+
"windsurf": true
|
|
316
|
+
}
|
|
132
317
|
},
|
|
133
318
|
{
|
|
134
319
|
"id": "joktec-tool-skill",
|
|
135
320
|
"title": "JokTec Tool Skill",
|
|
136
321
|
"role": "grouped",
|
|
137
322
|
"requiredByDefault": false,
|
|
138
|
-
"dependencies": [
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
"
|
|
143
|
-
"
|
|
323
|
+
"dependencies": [
|
|
324
|
+
"joktec-framework-skill",
|
|
325
|
+
"joktec-common-skill"
|
|
326
|
+
],
|
|
327
|
+
"recommended": [],
|
|
328
|
+
"packages": [
|
|
329
|
+
"@joktec/http",
|
|
330
|
+
"@joktec/file",
|
|
331
|
+
"@joktec/alert"
|
|
332
|
+
],
|
|
333
|
+
"scope": {
|
|
334
|
+
"paths": [
|
|
335
|
+
"packages/tools/**"
|
|
336
|
+
]
|
|
337
|
+
},
|
|
338
|
+
"triggers": [
|
|
339
|
+
"http",
|
|
340
|
+
"axios",
|
|
341
|
+
"file",
|
|
342
|
+
"alert",
|
|
343
|
+
"tool"
|
|
344
|
+
],
|
|
345
|
+
"outputs": {
|
|
346
|
+
"codex": true,
|
|
347
|
+
"claude": true,
|
|
348
|
+
"cursor": true,
|
|
349
|
+
"gemini": true,
|
|
350
|
+
"copilot": true,
|
|
351
|
+
"windsurf": true
|
|
352
|
+
}
|
|
144
353
|
}
|
|
145
354
|
]
|
|
146
355
|
}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-adapter-skill
|
|
3
3
|
description: Use when wiring or using JokTec adapter packages @joktec/cacher, @joktec/mailer, @joktec/notifier, or @joktec/storage for cache, mail delivery, push notifications, object storage, config-driven clients, and app-neutral adapter services.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Adapter Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-broker-skill
|
|
3
3
|
description: Use when wiring or using JokTec broker packages @joktec/kafka, @joktec/rabbit, @joktec/sqs, or @joktec/redcast, including client config, producer decorators, consumer loaders, message handlers, auto-binding, and app-level broker flows.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Broker Skill
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-common-skill
|
|
3
3
|
description: Use when implementing or wiring @joktec/core, @joktec/utils, or @joktec/cron in a consumer app, especially BaseController, BaseService, pagination, config, client lifecycle, bootstrap, cron decorators, or utility helpers.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
4
7
|
---
|
|
5
8
|
|
|
6
9
|
# JokTec Common Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-database-extended-skill
|
|
3
3
|
description: Use when working with extended JokTec database packages @joktec/elastic, @joktec/arango, or @joktec/bigquery in a consumer app, including app-neutral client setup, config-driven lifecycle, and package-specific query/service usage.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Extended Database Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-integration-skill
|
|
3
3
|
description: Use when wiring or using JokTec integration packages @joktec/firebase or @joktec/gpt, including validated config, SDK client lifecycle, app-neutral integration services, credentials handling, and consumer app composition.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Integration Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-mongo-skill
|
|
3
3
|
description: Use when working with @joktec/mongo in a consumer app, including MongoModule setup, Typegoose schema decorators, MongoRepo, MongoService, MongoHelper, plugins, ObjectId/query safety, soft delete, strict references, and cursor pagination.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Mongo Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-mysql-skill
|
|
3
3
|
description: Use when working with @joktec/mysql in a consumer app, including MysqlModule setup, TypeORM entities, schema-first @Column/@PrimaryColumn decorators, MysqlRepo, MysqlService, transactions, dialect support, uuidv7 ids, query safety, and cursor pagination.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec MySQL Skill
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: joktec-tool-skill
|
|
3
3
|
description: Use when wiring or using JokTec tool packages @joktec/http, @joktec/file, or @joktec/alert, including Axios-backed HTTP clients, file classification helpers, Slack-compatible alert webhooks, config-driven lifecycle, and app-neutral utility services.
|
|
4
|
+
metadata:
|
|
5
|
+
dependencies:
|
|
6
|
+
- joktec-framework-skill
|
|
7
|
+
- joktec-common-skill
|
|
4
8
|
---
|
|
5
9
|
|
|
6
10
|
# JokTec Tool Skill
|