@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.
Files changed (29) hide show
  1. package/README.md +20 -4
  2. package/bin/joktec-skills.mjs +33 -27
  3. package/dist/claude/skills/joktec-adapter-skill/SKILL.md +4 -0
  4. package/dist/claude/skills/joktec-broker-skill/SKILL.md +4 -0
  5. package/dist/claude/skills/joktec-common-skill/SKILL.md +3 -0
  6. package/dist/claude/skills/joktec-database-extended-skill/SKILL.md +4 -0
  7. package/dist/claude/skills/joktec-integration-skill/SKILL.md +4 -0
  8. package/dist/claude/skills/joktec-mongo-skill/SKILL.md +4 -0
  9. package/dist/claude/skills/joktec-mysql-skill/SKILL.md +4 -0
  10. package/dist/claude/skills/joktec-tool-skill/SKILL.md +4 -0
  11. package/dist/codex/skills/joktec-adapter-skill/SKILL.md +4 -0
  12. package/dist/codex/skills/joktec-broker-skill/SKILL.md +4 -0
  13. package/dist/codex/skills/joktec-common-skill/SKILL.md +3 -0
  14. package/dist/codex/skills/joktec-database-extended-skill/SKILL.md +4 -0
  15. package/dist/codex/skills/joktec-integration-skill/SKILL.md +4 -0
  16. package/dist/codex/skills/joktec-mongo-skill/SKILL.md +4 -0
  17. package/dist/codex/skills/joktec-mysql-skill/SKILL.md +4 -0
  18. package/dist/codex/skills/joktec-tool-skill/SKILL.md +4 -0
  19. package/package.json +1 -1
  20. package/scripts/validate-skills.mjs +32 -0
  21. package/skill-pack.json +261 -52
  22. package/skills/joktec-adapter-skill/SKILL.md +4 -0
  23. package/skills/joktec-broker-skill/SKILL.md +4 -0
  24. package/skills/joktec-common-skill/SKILL.md +3 -0
  25. package/skills/joktec-database-extended-skill/SKILL.md +4 -0
  26. package/skills/joktec-integration-skill/SKILL.md +4 -0
  27. package/skills/joktec-mongo-skill/SKILL.md +4 -0
  28. package/skills/joktec-mysql-skill/SKILL.md +4 -0
  29. 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 default foundation skill. Focused package skills such as Mongo, MySQL, brokers, adapters, integrations, and tools depend on the entrypoint and recommend the common skill because most package usage flows rely on core config, lifecycle, or base abstractions.
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": ["joktec-common-skill"]
119
+ "dependencies": ["joktec-framework-skill", "joktec-common-skill"],
120
+ "recommended": []
121
121
  }
122
122
  ```
123
123
 
124
- The CLI resolves `dependencies` automatically. `recommended` skills are shown to the user and can be installed with `--yes` or explicit selection.
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
@@ -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, writeFile } from '../scripts/lib.mjs';
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
- readline.cursorTo(output, 0);
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
- console.log(`│ ${pointer} ${marker} ${items[i].label}`);
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
- renderMultiSelect(items, cursor, selected, message);
397
+ redraw();
392
398
  };
393
399
 
394
- renderMultiSelect(items, cursor, selected, message);
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} ${color.dim(`(${skill.packages.join(', ')})`)}`,
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(`Manifest: ${displayPath(path.join(project, '.joktec-skills.json'))}`)}`);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joktec/skills",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "private": false,
5
5
  "description": "Hybrid agent skill pack for using @joktec/* libraries in consumer projects.",
6
6
  "license": "MIT",
@@ -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.0",
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": ["@joktec/*"],
45
- "scope": { "paths": ["**/*"] },
46
- "triggers": ["joktec", "@joktec", "framework", "package selection"],
47
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
72
+ "dependencies": [
73
+ "joktec-framework-skill"
74
+ ],
55
75
  "recommended": [],
56
- "packages": ["@joktec/core", "@joktec/utils", "@joktec/cron", "@joktec/types"],
57
- "scope": { "paths": ["packages/common/**"] },
58
- "triggers": ["BaseController", "BaseService", "pagination", "config", "cron", "utils"],
59
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
67
- "recommended": ["joktec-common-skill"],
68
- "packages": ["@joktec/mongo"],
69
- "scope": { "paths": ["packages/databases/mongo/**"] },
70
- "triggers": ["mongo", "mongoose", "typegoose", "MongoRepo", "cursor pagination"],
71
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
79
- "recommended": ["joktec-common-skill"],
80
- "packages": ["@joktec/mysql"],
81
- "scope": { "paths": ["packages/databases/mysql/**"] },
82
- "triggers": ["mysql", "typeorm", "MysqlRepo", "schema-first decorators", "uuidv7"],
83
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
91
- "recommended": ["joktec-common-skill"],
92
- "packages": ["@joktec/kafka", "@joktec/rabbit", "@joktec/sqs", "@joktec/redcast"],
93
- "scope": { "paths": ["packages/brokers/**"] },
94
- "triggers": ["kafka", "rabbit", "sqs", "redcast", "broker", "message pattern"],
95
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
103
- "recommended": ["joktec-common-skill"],
104
- "packages": ["@joktec/cacher", "@joktec/mailer", "@joktec/notifier", "@joktec/storage"],
105
- "scope": { "paths": ["packages/adapters/**"] },
106
- "triggers": ["cache", "mail", "notification", "storage", "adapter"],
107
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
115
- "recommended": ["joktec-common-skill"],
116
- "packages": ["@joktec/elastic", "@joktec/arango", "@joktec/bigquery"],
117
- "scope": { "paths": ["packages/databases/elastic/**", "packages/databases/arango/**", "packages/databases/bigquery/**"] },
118
- "triggers": ["elastic", "arango", "bigquery", "extended database"],
119
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
127
- "recommended": ["joktec-common-skill"],
128
- "packages": ["@joktec/firebase", "@joktec/gpt"],
129
- "scope": { "paths": ["packages/integrations/**"] },
130
- "triggers": ["firebase", "gpt", "openai", "integration"],
131
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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": ["joktec-framework-skill"],
139
- "recommended": ["joktec-common-skill"],
140
- "packages": ["@joktec/http", "@joktec/file", "@joktec/alert"],
141
- "scope": { "paths": ["packages/tools/**"] },
142
- "triggers": ["http", "axios", "file", "alert", "tool"],
143
- "outputs": { "codex": true, "claude": true, "cursor": true, "gemini": true, "copilot": true, "windsurf": true }
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