devforge-shared 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/db/client.d.ts +4 -0
  2. package/dist/db/client.d.ts.map +1 -0
  3. package/dist/db/client.js +31 -0
  4. package/dist/db/client.js.map +1 -0
  5. package/dist/db/index.d.ts +2 -0
  6. package/dist/db/index.d.ts.map +1 -0
  7. package/dist/db/index.js +7 -0
  8. package/dist/db/index.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +21 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/queue/definitions.d.ts +19 -0
  14. package/dist/queue/definitions.d.ts.map +1 -0
  15. package/dist/queue/definitions.js +36 -0
  16. package/dist/queue/definitions.js.map +1 -0
  17. package/dist/queue/index.d.ts +4 -0
  18. package/dist/queue/index.d.ts.map +1 -0
  19. package/dist/queue/index.js +10 -0
  20. package/dist/queue/index.js.map +1 -0
  21. package/dist/types/api.d.ts +48 -0
  22. package/dist/types/api.d.ts.map +1 -0
  23. package/dist/types/api.js +3 -0
  24. package/dist/types/api.js.map +1 -0
  25. package/dist/types/discovery.d.ts +25 -0
  26. package/dist/types/discovery.d.ts.map +1 -0
  27. package/dist/types/discovery.js +3 -0
  28. package/dist/types/discovery.js.map +1 -0
  29. package/dist/types/index.d.ts +6 -0
  30. package/dist/types/index.d.ts.map +1 -0
  31. package/dist/types/index.js +22 -0
  32. package/dist/types/index.js.map +1 -0
  33. package/dist/types/queue.d.ts +29 -0
  34. package/dist/types/queue.d.ts.map +1 -0
  35. package/dist/types/queue.js +3 -0
  36. package/dist/types/queue.js.map +1 -0
  37. package/dist/types/security.d.ts +21 -0
  38. package/dist/types/security.d.ts.map +1 -0
  39. package/dist/types/security.js +3 -0
  40. package/dist/types/security.js.map +1 -0
  41. package/dist/types/skill.d.ts +24 -0
  42. package/dist/types/skill.d.ts.map +1 -0
  43. package/dist/types/skill.js +3 -0
  44. package/dist/types/skill.js.map +1 -0
  45. package/dist/utils/config.d.ts +31 -0
  46. package/dist/utils/config.d.ts.map +1 -0
  47. package/dist/utils/config.js +76 -0
  48. package/dist/utils/config.js.map +1 -0
  49. package/dist/utils/index.d.ts +4 -0
  50. package/dist/utils/index.d.ts.map +1 -0
  51. package/dist/utils/index.js +11 -0
  52. package/dist/utils/index.js.map +1 -0
  53. package/dist/utils/logger.d.ts +3 -0
  54. package/dist/utils/logger.d.ts.map +1 -0
  55. package/dist/utils/logger.js +21 -0
  56. package/dist/utils/logger.js.map +1 -0
  57. package/dist/utils/registry.d.ts +31 -0
  58. package/dist/utils/registry.d.ts.map +1 -0
  59. package/dist/utils/registry.js +53 -0
  60. package/dist/utils/registry.js.map +1 -0
  61. package/package.json +28 -0
@@ -0,0 +1,4 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ export declare function getDb(): PrismaClient;
3
+ export declare function disconnectDb(): Promise<void>;
4
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAK7C,wBAAgB,KAAK,IAAI,YAAY,CAkBpC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAKlD"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDb = getDb;
4
+ exports.disconnectDb = disconnectDb;
5
+ const client_1 = require("@prisma/client");
6
+ const logger_1 = require("../utils/logger");
7
+ let client = null;
8
+ function getDb() {
9
+ if (!client) {
10
+ client = new client_1.PrismaClient({
11
+ log: [
12
+ { level: 'warn', emit: 'event' },
13
+ { level: 'error', emit: 'event' },
14
+ ],
15
+ });
16
+ client.$on('warn', (e) => {
17
+ logger_1.logger.warn({ module: 'db' }, e.message);
18
+ });
19
+ client.$on('error', (e) => {
20
+ logger_1.logger.error({ module: 'db' }, e.message);
21
+ });
22
+ }
23
+ return client;
24
+ }
25
+ async function disconnectDb() {
26
+ if (client) {
27
+ await client.$disconnect();
28
+ client = null;
29
+ }
30
+ }
31
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":";;AAKA,sBAkBC;AAED,oCAKC;AA9BD,2CAA6C;AAC7C,4CAAwC;AAExC,IAAI,MAAM,GAAwB,IAAI,CAAA;AAEtC,SAAgB,KAAK;IACnB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,qBAAY,CAAC;YACxB,GAAG,EAAE;gBACH,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE;gBAChC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE;aAClC;SACF,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,MAAe,EAAE,CAAC,CAAsB,EAAE,EAAE;YACrD,eAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;QAC1C,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,GAAG,CAAC,OAAgB,EAAE,CAAC,CAAsB,EAAE,EAAE;YACtD,eAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;QAC3C,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAEM,KAAK,UAAU,YAAY;IAChC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,WAAW,EAAE,CAAA;QAC1B,MAAM,GAAG,IAAI,CAAA;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { getDb, disconnectDb } from './client';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.disconnectDb = exports.getDb = void 0;
4
+ var client_1 = require("./client");
5
+ Object.defineProperty(exports, "getDb", { enumerable: true, get: function () { return client_1.getDb; } });
6
+ Object.defineProperty(exports, "disconnectDb", { enumerable: true, get: function () { return client_1.disconnectDb; } });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":";;;AAAA,mCAA8C;AAArC,+FAAA,KAAK,OAAA;AAAE,sGAAA,YAAY,OAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './types';
2
+ export * from './utils';
3
+ export * from './db';
4
+ export * from './queue';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA;AACvB,cAAc,MAAM,CAAA;AACpB,cAAc,SAAS,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types"), exports);
18
+ __exportStar(require("./utils"), exports);
19
+ __exportStar(require("./db"), exports);
20
+ __exportStar(require("./queue"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,0CAAuB;AACvB,uCAAoB;AACpB,0CAAuB"}
@@ -0,0 +1,19 @@
1
+ import { Queue, Worker, ConnectionOptions } from 'bullmq';
2
+ export type QueueName = 'discovery' | 'scan' | 'parse' | 'analyze' | 'security';
3
+ export interface QueueConfig {
4
+ concurrency: number;
5
+ maxRetries: number;
6
+ backoff: 'exponential' | 'fixed';
7
+ backoffDelay?: number;
8
+ }
9
+ export declare const queueConfigs: Record<QueueName, QueueConfig>;
10
+ export declare function createQueue(name: QueueName, connection: ConnectionOptions): Queue;
11
+ export type QueueWorkerHandler<T = unknown> = (job: {
12
+ id?: string;
13
+ data: T;
14
+ }) => Promise<void>;
15
+ export declare function createWorker<T>(name: QueueName, handler: (job: {
16
+ id?: string;
17
+ data: T;
18
+ }) => Promise<void>, connection: ConnectionOptions): Worker;
19
+ //# sourceMappingURL=definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/queue/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAEzD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAA;AAE/E,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,aAAa,GAAG,OAAO,CAAA;IAChC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,CAMvD,CAAA;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,EACf,UAAU,EAAE,iBAAiB,GAC5B,KAAK,CAaP;AAED,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,GAAG,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;AAE9F,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,CAAC,GAAG,EAAE;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,CAAC,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EACzD,UAAU,EAAE,iBAAiB,GAC5B,MAAM,CAOR"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.queueConfigs = void 0;
4
+ exports.createQueue = createQueue;
5
+ exports.createWorker = createWorker;
6
+ const bullmq_1 = require("bullmq");
7
+ exports.queueConfigs = {
8
+ discovery: { concurrency: 1, maxRetries: 3, backoff: 'exponential' },
9
+ scan: { concurrency: 5, maxRetries: 2, backoff: 'exponential' },
10
+ parse: { concurrency: 10, maxRetries: 3, backoff: 'exponential' },
11
+ analyze: { concurrency: 3, maxRetries: 2, backoff: 'exponential' },
12
+ security: { concurrency: 5, maxRetries: 2, backoff: 'exponential' },
13
+ };
14
+ function createQueue(name, connection) {
15
+ return new bullmq_1.Queue(name, {
16
+ connection,
17
+ defaultJobOptions: {
18
+ attempts: exports.queueConfigs[name].maxRetries,
19
+ backoff: {
20
+ type: exports.queueConfigs[name].backoff,
21
+ delay: exports.queueConfigs[name].backoffDelay ?? 5000,
22
+ },
23
+ removeOnComplete: { age: 3600 * 24 * 3 }, // keep 3 days
24
+ removeOnFail: { age: 3600 * 24 * 7 }, // keep 7 days
25
+ },
26
+ });
27
+ }
28
+ function createWorker(name, handler, connection) {
29
+ return new bullmq_1.Worker(name, async (job) => {
30
+ await handler({ id: job.id, data: job.data });
31
+ }, {
32
+ connection,
33
+ concurrency: exports.queueConfigs[name].concurrency,
34
+ });
35
+ }
36
+ //# sourceMappingURL=definitions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/queue/definitions.ts"],"names":[],"mappings":";;;AAmBA,kCAgBC;AAID,oCAWC;AAlDD,mCAAyD;AAW5C,QAAA,YAAY,GAAmC;IAC1D,SAAS,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE;IACpE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE;IAC/D,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE;IACjE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE;IAClE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE;CACpE,CAAA;AAED,SAAgB,WAAW,CACzB,IAAe,EACf,UAA6B;IAE7B,OAAO,IAAI,cAAK,CAAC,IAAI,EAAE;QACrB,UAAU;QACV,iBAAiB,EAAE;YACjB,QAAQ,EAAE,oBAAY,CAAC,IAAI,CAAC,CAAC,UAAU;YACvC,OAAO,EAAE;gBACP,IAAI,EAAE,oBAAY,CAAC,IAAI,CAAC,CAAC,OAAO;gBAChC,KAAK,EAAE,oBAAY,CAAC,IAAI,CAAC,CAAC,YAAY,IAAI,IAAI;aAC/C;YACD,gBAAgB,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,EAAI,cAAc;YAC1D,YAAY,EAAE,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,EAAU,cAAc;SAC7D;KACF,CAAC,CAAA;AACJ,CAAC;AAID,SAAgB,YAAY,CAC1B,IAAe,EACf,OAAyD,EACzD,UAA6B;IAE7B,OAAO,IAAI,eAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;IAC/C,CAAC,EAAE;QACD,UAAU;QACV,WAAW,EAAE,oBAAY,CAAC,IAAI,CAAC,CAAC,WAAW;KAC5C,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createQueue, createWorker, queueConfigs } from './definitions';
2
+ export type { QueueName, QueueConfig, QueueWorkerHandler } from './definitions';
3
+ export { Queue } from 'bullmq';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACvE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Queue = exports.queueConfigs = exports.createWorker = exports.createQueue = void 0;
4
+ var definitions_1 = require("./definitions");
5
+ Object.defineProperty(exports, "createQueue", { enumerable: true, get: function () { return definitions_1.createQueue; } });
6
+ Object.defineProperty(exports, "createWorker", { enumerable: true, get: function () { return definitions_1.createWorker; } });
7
+ Object.defineProperty(exports, "queueConfigs", { enumerable: true, get: function () { return definitions_1.queueConfigs; } });
8
+ var bullmq_1 = require("bullmq");
9
+ Object.defineProperty(exports, "Queue", { enumerable: true, get: function () { return bullmq_1.Queue; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/queue/index.ts"],"names":[],"mappings":";;;AAAA,6CAAuE;AAA9D,0GAAA,WAAW,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,2GAAA,YAAY,OAAA;AAEhD,iCAA8B;AAArB,+FAAA,KAAK,OAAA"}
@@ -0,0 +1,48 @@
1
+ export interface SearchQuery {
2
+ q: string;
3
+ category?: string;
4
+ riskLevel?: string;
5
+ minQuality?: number;
6
+ sort?: 'relevance' | 'popular' | 'newest';
7
+ limit?: number;
8
+ offset?: number;
9
+ }
10
+ export interface SkillSummary {
11
+ id: string;
12
+ name: string;
13
+ displayName: string | null;
14
+ description: string | null;
15
+ category: string | null;
16
+ tags: string[];
17
+ repository: {
18
+ owner: string;
19
+ name: string;
20
+ stars: number;
21
+ };
22
+ riskLevel: string | null;
23
+ qualityScore: number | null;
24
+ }
25
+ export interface SkillDetail extends SkillSummary {
26
+ version: string | null;
27
+ author: string | null;
28
+ allowedTools: string[];
29
+ dependencies: string[];
30
+ installMethod: string | null;
31
+ compatibility: Record<string, string> | null;
32
+ aiSummary: string | null;
33
+ aiQualityScore: number | null;
34
+ security: {
35
+ riskScore: number | null;
36
+ riskLevel: string | null;
37
+ findings: unknown[];
38
+ } | null;
39
+ createdAt: string;
40
+ updatedAt: string;
41
+ }
42
+ export interface PaginatedResponse<T> {
43
+ data: T[];
44
+ total: number;
45
+ limit: number;
46
+ offset: number;
47
+ }
48
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAA;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;IACD,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,WAAW,WAAY,SAAQ,YAAY;IAC/C,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IAC5C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;QACxB,QAAQ,EAAE,OAAO,EAAE,CAAA;KACpB,GAAG,IAAI,CAAA;IACR,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAA;IACT,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/types/api.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ export interface DiscoveryQuery {
2
+ id: string;
3
+ query: string;
4
+ type: 'code_search' | 'repo_search' | 'topic_search' | 'forks';
5
+ strategy: 'primary' | 'fallback' | 'expansion';
6
+ frequency: '6h' | 'daily' | '3d' | 'weekly';
7
+ weight: number;
8
+ }
9
+ export interface DiscoveryResult {
10
+ fullName: string;
11
+ owner: string;
12
+ name: string;
13
+ description: string | null;
14
+ stars: number;
15
+ topics: string[];
16
+ url: string;
17
+ matchType: string;
18
+ matchQueryId: string;
19
+ relevanceScore: number;
20
+ }
21
+ export interface DedupResult {
22
+ uniqueRepos: Map<string, DiscoveryResult>;
23
+ duplicatesRemoved: number;
24
+ }
25
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/types/discovery.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,OAAO,CAAA;IAC9D,QAAQ,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAA;IAC9C,SAAS,EAAE,IAAI,GAAG,OAAO,GAAG,IAAI,GAAG,QAAQ,CAAA;IAC3C,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACzC,iBAAiB,EAAE,MAAM,CAAA;CAC1B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/types/discovery.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export * from './discovery';
2
+ export * from './skill';
3
+ export * from './security';
4
+ export * from './queue';
5
+ export * from './api';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,SAAS,CAAA;AACvB,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,OAAO,CAAA"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./discovery"), exports);
18
+ __exportStar(require("./skill"), exports);
19
+ __exportStar(require("./security"), exports);
20
+ __exportStar(require("./queue"), exports);
21
+ __exportStar(require("./api"), exports);
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA2B;AAC3B,0CAAuB;AACvB,6CAA0B;AAC1B,0CAAuB;AACvB,wCAAqB"}
@@ -0,0 +1,29 @@
1
+ export type JobType = 'discovery' | 'scan' | 'parse' | 'analyze' | 'security';
2
+ export type JobStatus = 'pending' | 'running' | 'done' | 'failed' | 'dead';
3
+ export interface DiscoveryJobPayload {
4
+ queryId?: string;
5
+ force?: boolean;
6
+ }
7
+ export interface ScanJobPayload {
8
+ repositoryId: string;
9
+ owner: string;
10
+ name: string;
11
+ branch?: string;
12
+ }
13
+ export interface ParseJobPayload {
14
+ repositoryId: string;
15
+ skillName: string;
16
+ filePath: string;
17
+ downloadUrl: string;
18
+ }
19
+ export interface AnalyzeJobPayload {
20
+ skillId: string;
21
+ rawContent: string;
22
+ }
23
+ export interface SecurityJobPayload {
24
+ skillId: string;
25
+ allowedTools: string[];
26
+ hooksDir?: string;
27
+ }
28
+ export type JobPayload = DiscoveryJobPayload | ScanJobPayload | ParseJobPayload | AnalyzeJobPayload | SecurityJobPayload;
29
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/types/queue.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAA;AAC7E,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;AAE1E,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,MAAM,UAAU,GAClB,mBAAmB,GACnB,cAAc,GACd,eAAe,GACf,iBAAiB,GACjB,kBAAkB,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/types/queue.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ export interface SecurityFinding {
2
+ ruleId: string;
3
+ ruleName: string;
4
+ severity: 'low' | 'medium' | 'high' | 'critical';
5
+ description: string;
6
+ codeSnippet?: string;
7
+ }
8
+ export interface SecurityReport {
9
+ scannerVersion: string;
10
+ riskScore: number;
11
+ riskLevel: 'low' | 'medium' | 'high' | 'critical';
12
+ findings: SecurityFinding[];
13
+ }
14
+ export interface SecurityRule {
15
+ id: string;
16
+ name: string;
17
+ description: string;
18
+ severity: 'low' | 'medium' | 'high' | 'critical';
19
+ analyze(tools: string[], hooks: string[], description?: string): SecurityFinding[];
20
+ }
21
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/types/security.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IAChD,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE,MAAM,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IACjD,QAAQ,EAAE,eAAe,EAAE,CAAA;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;IAChD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CAAA;CACnF"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/types/security.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ export interface SkillMetadata {
2
+ name: string;
3
+ displayName?: string;
4
+ description?: string;
5
+ tags?: string[];
6
+ category?: string;
7
+ version?: string;
8
+ author?: string;
9
+ 'allowed-tools'?: string[];
10
+ dependencies?: string[];
11
+ references?: string[];
12
+ installMethod?: string;
13
+ compatibility?: Record<string, string>;
14
+ [key: string]: unknown;
15
+ }
16
+ export interface ParsedSkill {
17
+ metadata: SkillMetadata;
18
+ rawFrontmatter: string;
19
+ rawContent: string;
20
+ parseError?: string;
21
+ }
22
+ export type SkillStatus = 'discovered' | 'parsed' | 'parse_failed' | 'analyzed';
23
+ export type RiskLevel = 'low' | 'medium' | 'high' | 'critical';
24
+ //# sourceMappingURL=skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../src/types/skill.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAA;IACvB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,CAAA;AAC/E,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/types/skill.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ export declare const config: {
2
+ readonly nodeEnv: string;
3
+ readonly logLevel: string;
4
+ readonly database: {
5
+ readonly url: string;
6
+ };
7
+ readonly redis: {
8
+ readonly host: string;
9
+ readonly port: number;
10
+ };
11
+ readonly github: {
12
+ readonly tokens: string[];
13
+ readonly codeSearchRatePerMin: 30;
14
+ readonly restRatePerHour: 5000;
15
+ };
16
+ readonly anthropic: {
17
+ readonly apiKey: string;
18
+ readonly model: string;
19
+ };
20
+ readonly ai: {
21
+ readonly provider: "claude" | "openai" | "deepseek" | "custom";
22
+ readonly apiKey: string;
23
+ readonly baseUrl: string;
24
+ readonly model: string;
25
+ };
26
+ readonly skillsmp: {
27
+ readonly apiKey: string;
28
+ readonly dailyLimit: number;
29
+ };
30
+ };
31
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAqCA,eAAO,MAAM,MAAM;;;;;;;;;;;yBAkBM,MAAM,EAAE;;;;;;;;;2BAasB,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ;;;;;;;;;CAUxF,CAAA"}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.config = void 0;
7
+ const dotenv_1 = __importDefault(require("dotenv"));
8
+ const fs_1 = require("fs");
9
+ const path_1 = require("path");
10
+ const os_1 = require("os");
11
+ // Load .env from current directory (project-level override)
12
+ dotenv_1.default.config();
13
+ // Load global config from ~/.devforge/.env (CLI-level default)
14
+ const globalEnv = (0, path_1.resolve)((0, os_1.homedir)(), '.devforge', '.env');
15
+ if ((0, fs_1.existsSync)(globalEnv)) {
16
+ const parsed = dotenv_1.default.parse((0, fs_1.readFileSync)(globalEnv, 'utf-8'));
17
+ for (const [k, v] of Object.entries(parsed)) {
18
+ // Don't override env vars already set (including those from cwd .env)
19
+ if (process.env[k] === undefined) {
20
+ process.env[k] = v;
21
+ }
22
+ }
23
+ }
24
+ function env(name, defaultValue) {
25
+ const value = process.env[name] || defaultValue;
26
+ if (!value) {
27
+ throw new Error(`Missing required environment variable: ${name}`);
28
+ }
29
+ return value;
30
+ }
31
+ function envInt(name, defaultValue) {
32
+ const raw = process.env[name];
33
+ if (!raw) {
34
+ if (defaultValue !== undefined)
35
+ return defaultValue;
36
+ throw new Error(`Missing required environment variable: ${name}`);
37
+ }
38
+ return parseInt(raw, 10);
39
+ }
40
+ exports.config = {
41
+ nodeEnv: process.env.NODE_ENV || 'development',
42
+ logLevel: process.env.LOG_LEVEL || 'info',
43
+ database: {
44
+ url: process.env.DATABASE_URL || '',
45
+ },
46
+ redis: {
47
+ host: process.env.REDIS_HOST || 'localhost',
48
+ port: envInt('REDIS_PORT', 6379),
49
+ },
50
+ github: {
51
+ tokens: [
52
+ process.env.GITHUB_TOKEN_1,
53
+ process.env.GITHUB_TOKEN_2,
54
+ process.env.GITHUB_TOKEN_3,
55
+ ].filter(Boolean),
56
+ // Code Search: ~30 req/min per token
57
+ // Repo Search: 5000 req/hr per token (shared pool with REST)
58
+ codeSearchRatePerMin: 30,
59
+ restRatePerHour: 5000,
60
+ },
61
+ anthropic: {
62
+ apiKey: process.env.ANTHROPIC_API_KEY || '',
63
+ model: process.env.ANTHROPIC_MODEL || 'claude-haiku-4-5',
64
+ },
65
+ ai: {
66
+ provider: (process.env.AI_PROVIDER || 'claude'),
67
+ apiKey: process.env.AI_API_KEY || process.env.OPENAI_API_KEY || process.env.ANTHROPIC_API_KEY || '',
68
+ baseUrl: process.env.AI_BASE_URL || '',
69
+ model: process.env.AI_MODEL || 'claude-sonnet-4-6',
70
+ },
71
+ skillsmp: {
72
+ apiKey: process.env.SKILLSMP_API_KEY || '',
73
+ dailyLimit: Number(process.env.SKILLSMP_DAILY_LIMIT) || 500,
74
+ },
75
+ };
76
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { config } from './config';
2
+ export { logger } from './logger';
3
+ export { Registry, StrategyRegistry } from './registry';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StrategyRegistry = exports.Registry = exports.logger = exports.config = void 0;
4
+ var config_1 = require("./config");
5
+ Object.defineProperty(exports, "config", { enumerable: true, get: function () { return config_1.config; } });
6
+ var logger_1 = require("./logger");
7
+ Object.defineProperty(exports, "logger", { enumerable: true, get: function () { return logger_1.logger; } });
8
+ var registry_1 = require("./registry");
9
+ Object.defineProperty(exports, "Registry", { enumerable: true, get: function () { return registry_1.Registry; } });
10
+ Object.defineProperty(exports, "StrategyRegistry", { enumerable: true, get: function () { return registry_1.StrategyRegistry; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";;;AAAA,mCAAiC;AAAxB,gGAAA,MAAM,OAAA;AACf,mCAAiC;AAAxB,gGAAA,MAAM,OAAA;AACf,uCAAuD;AAA9C,oGAAA,QAAQ,OAAA;AAAE,4GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,3 @@
1
+ import pino from 'pino';
2
+ export declare const logger: pino.Logger<never, boolean>;
3
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAA;AAGvB,eAAO,MAAM,MAAM,6BAYjB,CAAA"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.logger = void 0;
7
+ const pino_1 = __importDefault(require("pino"));
8
+ const config_1 = require("./config");
9
+ exports.logger = (0, pino_1.default)({
10
+ level: config_1.config.logLevel,
11
+ transport: config_1.config.nodeEnv === 'development'
12
+ ? { target: 'pino/file', options: { destination: 1 } }
13
+ : undefined,
14
+ formatters: {
15
+ level(label) {
16
+ return { level: label };
17
+ },
18
+ },
19
+ timestamp: pino_1.default.stdTimeFunctions.isoTime,
20
+ });
21
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AACvB,qCAAiC;AAEpB,QAAA,MAAM,GAAG,IAAA,cAAI,EAAC;IACzB,KAAK,EAAE,eAAM,CAAC,QAAQ;IACtB,SAAS,EACP,eAAM,CAAC,OAAO,KAAK,aAAa;QAC9B,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE;QACtD,CAAC,CAAC,SAAS;IACf,UAAU,EAAE;QACV,KAAK,CAAC,KAAK;YACT,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;QACzB,CAAC;KACF;IACD,SAAS,EAAE,cAAI,CAAC,gBAAgB,CAAC,OAAO;CACzC,CAAC,CAAA"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Registry Pattern — 插件/策略注册表基类
3
+ *
4
+ * 用于注册可扩展的策略、规则、适配器。
5
+ * 模块可以通过 registry.register() 添加实现,
6
+ * 通过 registry.getAll() / registry.get() 查找。
7
+ */
8
+ export declare class Registry<T> {
9
+ private items;
10
+ register(name: string, item: T): void;
11
+ get(name: string): T | undefined;
12
+ getAll(): Map<string, T>;
13
+ has(name: string): boolean;
14
+ get size(): number;
15
+ clear(): void;
16
+ }
17
+ /**
18
+ * Strategy Registry — 按 priority 排序的策略集合
19
+ */
20
+ export declare class StrategyRegistry<T extends {
21
+ priority?: number;
22
+ }> {
23
+ private items;
24
+ register(name: string, strategy: T): void;
25
+ getAll(): {
26
+ name: string;
27
+ strategy: T;
28
+ }[];
29
+ get(name: string): T | undefined;
30
+ }
31
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,QAAQ,CAAC,CAAC;IACrB,OAAO,CAAC,KAAK,CAAuB;IAEpC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAOrC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIhC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAIxB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,IAAI,IAAI;CAGd;AAED;;GAEG;AACH,qBAAa,gBAAgB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;IAC3D,OAAO,CAAC,KAAK,CAAsC;IAEnD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAKzC,MAAM,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,CAAC,CAAA;KAAE,EAAE;IAIzC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;CAGjC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StrategyRegistry = exports.Registry = void 0;
4
+ /**
5
+ * Registry Pattern — 插件/策略注册表基类
6
+ *
7
+ * 用于注册可扩展的策略、规则、适配器。
8
+ * 模块可以通过 registry.register() 添加实现,
9
+ * 通过 registry.getAll() / registry.get() 查找。
10
+ */
11
+ class Registry {
12
+ items = new Map();
13
+ register(name, item) {
14
+ if (this.items.has(name)) {
15
+ throw new Error(`Registry: duplicate key "${name}"`);
16
+ }
17
+ this.items.set(name, item);
18
+ }
19
+ get(name) {
20
+ return this.items.get(name);
21
+ }
22
+ getAll() {
23
+ return new Map(this.items);
24
+ }
25
+ has(name) {
26
+ return this.items.has(name);
27
+ }
28
+ get size() {
29
+ return this.items.size;
30
+ }
31
+ clear() {
32
+ this.items.clear();
33
+ }
34
+ }
35
+ exports.Registry = Registry;
36
+ /**
37
+ * Strategy Registry — 按 priority 排序的策略集合
38
+ */
39
+ class StrategyRegistry {
40
+ items = [];
41
+ register(name, strategy) {
42
+ this.items.push({ name, strategy });
43
+ this.items.sort((a, b) => (b.strategy.priority ?? 0) - (a.strategy.priority ?? 0));
44
+ }
45
+ getAll() {
46
+ return [...this.items];
47
+ }
48
+ get(name) {
49
+ return this.items.find((i) => i.name === name)?.strategy;
50
+ }
51
+ }
52
+ exports.StrategyRegistry = StrategyRegistry;
53
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,MAAa,QAAQ;IACX,KAAK,GAAG,IAAI,GAAG,EAAa,CAAA;IAEpC,QAAQ,CAAC,IAAY,EAAE,IAAO;QAC5B,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAA;QACtD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAA;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACpB,CAAC;CACF;AA7BD,4BA6BC;AAED;;GAEG;AACH,MAAa,gBAAgB;IACnB,KAAK,GAAoC,EAAE,CAAA;IAEnD,QAAQ,CAAC,IAAY,EAAE,QAAW;QAChC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QACnC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAA;IACpF,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,QAAQ,CAAA;IAC1D,CAAC;CACF;AAfD,4CAeC"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "devforge-shared",
3
+ "version": "0.1.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "files": [
7
+ "dist"
8
+ ],
9
+ "scripts": {
10
+ "build": "tsc -b",
11
+ "dev": "tsc --watch",
12
+ "test": "vitest run",
13
+ "db:generate": "prisma generate",
14
+ "db:push": "prisma db push",
15
+ "db:migrate": "prisma migrate dev"
16
+ },
17
+ "dependencies": {
18
+ "@prisma/client": "^5.14.0",
19
+ "bullmq": "^5.7.0",
20
+ "dotenv": "^16.4.0",
21
+ "ioredis": "^5.4.0",
22
+ "pino": "^9.0.0"
23
+ },
24
+ "devDependencies": {
25
+ "prisma": "^5.14.0",
26
+ "vitest": "^1.6.0"
27
+ }
28
+ }