@octo-cyber/ai 0.5.0 → 0.5.2

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 (124) hide show
  1. package/dist/ai.module.d.ts +2 -1
  2. package/dist/ai.module.d.ts.map +1 -1
  3. package/dist/ai.module.js +22 -3
  4. package/dist/ai.module.js.map +1 -1
  5. package/dist/cli/cli-executor.service.js +1 -1
  6. package/dist/cli/cli-executor.service.js.map +1 -1
  7. package/dist/cli/cli-registry.service.js +1 -1
  8. package/dist/cli/cli-registry.service.js.map +1 -1
  9. package/dist/cli/controllers/ai-cli.controller.d.ts +1 -1
  10. package/dist/cli/controllers/ai-cli.controller.d.ts.map +1 -1
  11. package/dist/cli/controllers/ai-cli.controller.js +1 -1
  12. package/dist/cli/controllers/ai-cli.controller.js.map +1 -1
  13. package/dist/cli/workspace.service.js +1 -1
  14. package/dist/cli/workspace.service.js.map +1 -1
  15. package/dist/index.d.ts +1 -0
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +8 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/skill/controllers/skill.controller.d.ts +33 -0
  20. package/dist/skill/controllers/skill.controller.d.ts.map +1 -0
  21. package/dist/skill/controllers/skill.controller.js +264 -0
  22. package/dist/skill/controllers/skill.controller.js.map +1 -0
  23. package/dist/skill/entities/octo-skill.entity.d.ts +22 -0
  24. package/dist/skill/entities/octo-skill.entity.d.ts.map +1 -0
  25. package/dist/skill/entities/octo-skill.entity.js +91 -0
  26. package/dist/skill/entities/octo-skill.entity.js.map +1 -0
  27. package/dist/skill/index.d.ts +7 -0
  28. package/dist/skill/index.d.ts.map +1 -0
  29. package/dist/skill/index.js +17 -0
  30. package/dist/skill/index.js.map +1 -0
  31. package/dist/skill/services/skill-generator.service.d.ts +47 -0
  32. package/dist/skill/services/skill-generator.service.d.ts.map +1 -0
  33. package/dist/skill/services/skill-generator.service.js +232 -0
  34. package/dist/skill/services/skill-generator.service.js.map +1 -0
  35. package/dist/skill/services/skill-installer.service.d.ts +38 -0
  36. package/dist/skill/services/skill-installer.service.d.ts.map +1 -0
  37. package/dist/skill/services/skill-installer.service.js +150 -0
  38. package/dist/skill/services/skill-installer.service.js.map +1 -0
  39. package/dist/skill/services/skill-registry.service.d.ts +60 -0
  40. package/dist/skill/services/skill-registry.service.d.ts.map +1 -0
  41. package/dist/skill/services/skill-registry.service.js +147 -0
  42. package/dist/skill/services/skill-registry.service.js.map +1 -0
  43. package/dist/skill/types.d.ts +45 -0
  44. package/dist/skill/types.d.ts.map +1 -0
  45. package/dist/skill/types.js +6 -0
  46. package/dist/skill/types.js.map +1 -0
  47. package/package.json +4 -4
  48. package/web/components/SkillCard.tsx +139 -0
  49. package/web/components/SkillEditorDialog.tsx +77 -0
  50. package/web/components/SkillInstallDialog.tsx +134 -0
  51. package/web/index.ts +2 -0
  52. package/web/manifest.ts +1 -0
  53. package/web/messages/en-US.json +53 -0
  54. package/web/messages/zh-CN.json +53 -0
  55. package/web/pages/SkillsPage.tsx +206 -0
  56. package/web/services/skill-service.ts +89 -0
  57. package/dist/controllers/agent.controller.d.ts +0 -13
  58. package/dist/controllers/agent.controller.d.ts.map +0 -1
  59. package/dist/controllers/agent.controller.js +0 -117
  60. package/dist/controllers/agent.controller.js.map +0 -1
  61. package/dist/controllers/capability.controller.d.ts +0 -16
  62. package/dist/controllers/capability.controller.d.ts.map +0 -1
  63. package/dist/controllers/capability.controller.js +0 -108
  64. package/dist/controllers/capability.controller.js.map +0 -1
  65. package/dist/controllers/client.controller.d.ts +0 -10
  66. package/dist/controllers/client.controller.d.ts.map +0 -1
  67. package/dist/controllers/client.controller.js +0 -79
  68. package/dist/controllers/client.controller.js.map +0 -1
  69. package/dist/controllers/execution.controller.d.ts +0 -11
  70. package/dist/controllers/execution.controller.d.ts.map +0 -1
  71. package/dist/controllers/execution.controller.js +0 -50
  72. package/dist/controllers/execution.controller.js.map +0 -1
  73. package/dist/controllers/index.d.ts +0 -5
  74. package/dist/controllers/index.d.ts.map +0 -1
  75. package/dist/controllers/index.js +0 -12
  76. package/dist/controllers/index.js.map +0 -1
  77. package/dist/entities/agent-binding.entity.d.ts +0 -17
  78. package/dist/entities/agent-binding.entity.d.ts.map +0 -1
  79. package/dist/entities/agent-binding.entity.js +0 -64
  80. package/dist/entities/agent-binding.entity.js.map +0 -1
  81. package/dist/entities/agent-definition.entity.d.ts +0 -17
  82. package/dist/entities/agent-definition.entity.d.ts.map +0 -1
  83. package/dist/entities/agent-definition.entity.js +0 -70
  84. package/dist/entities/agent-definition.entity.js.map +0 -1
  85. package/dist/entities/agent-execution.entity.d.ts +0 -23
  86. package/dist/entities/agent-execution.entity.d.ts.map +0 -1
  87. package/dist/entities/agent-execution.entity.js +0 -93
  88. package/dist/entities/agent-execution.entity.js.map +0 -1
  89. package/dist/entities/agent-instance.entity.d.ts +0 -19
  90. package/dist/entities/agent-instance.entity.d.ts.map +0 -1
  91. package/dist/entities/agent-instance.entity.js +0 -76
  92. package/dist/entities/agent-instance.entity.js.map +0 -1
  93. package/dist/entities/capability-definition.entity.d.ts +0 -20
  94. package/dist/entities/capability-definition.entity.d.ts.map +0 -1
  95. package/dist/entities/capability-definition.entity.js +0 -77
  96. package/dist/entities/capability-definition.entity.js.map +0 -1
  97. package/dist/entities/client-registration.entity.d.ts +0 -19
  98. package/dist/entities/client-registration.entity.d.ts.map +0 -1
  99. package/dist/entities/client-registration.entity.js +0 -79
  100. package/dist/entities/client-registration.entity.js.map +0 -1
  101. package/dist/entities/index.d.ts +0 -7
  102. package/dist/entities/index.d.ts.map +0 -1
  103. package/dist/entities/index.js +0 -16
  104. package/dist/entities/index.js.map +0 -1
  105. package/dist/services/agent.service.d.ts +0 -23
  106. package/dist/services/agent.service.d.ts.map +0 -1
  107. package/dist/services/agent.service.js +0 -76
  108. package/dist/services/agent.service.js.map +0 -1
  109. package/dist/services/capability-router.service.d.ts +0 -45
  110. package/dist/services/capability-router.service.d.ts.map +0 -1
  111. package/dist/services/capability-router.service.js +0 -120
  112. package/dist/services/capability-router.service.js.map +0 -1
  113. package/dist/services/client-registration.service.d.ts +0 -27
  114. package/dist/services/client-registration.service.d.ts.map +0 -1
  115. package/dist/services/client-registration.service.js +0 -83
  116. package/dist/services/client-registration.service.js.map +0 -1
  117. package/dist/services/index.d.ts +0 -5
  118. package/dist/services/index.d.ts.map +0 -1
  119. package/dist/services/index.js +0 -12
  120. package/dist/services/index.js.map +0 -1
  121. package/dist/services/sync-bridge.service.d.ts +0 -41
  122. package/dist/services/sync-bridge.service.d.ts.map +0 -1
  123. package/dist/services/sync-bridge.service.js +0 -118
  124. package/dist/services/sync-bridge.service.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.OctoSkill = void 0;
13
+ const core_1 = require("@octo-cyber/core");
14
+ let OctoSkill = class OctoSkill {
15
+ id;
16
+ /** Skill name in kebab-case (e.g. 'octo-auth-api'). */
17
+ name;
18
+ description;
19
+ /** Source module name (e.g. 'auth', 'erp'). */
20
+ sourceModule;
21
+ /** 'module' = auto-generated from RouteRegistry, 'custom' = user-created. */
22
+ sourceType;
23
+ /** Full SKILL.md content. */
24
+ content;
25
+ version;
26
+ isEnabled;
27
+ /** Whether the user has manually edited the content (prevents auto-regeneration overwrite). */
28
+ isEdited;
29
+ /** JSON array of targets where this skill is installed (e.g. '["claude","cursor"]'). */
30
+ installTargets;
31
+ createdAt;
32
+ updatedAt;
33
+ lastInstalledAt;
34
+ };
35
+ exports.OctoSkill = OctoSkill;
36
+ __decorate([
37
+ (0, core_1.PrimaryGeneratedColumn)('uuid'),
38
+ __metadata("design:type", String)
39
+ ], OctoSkill.prototype, "id", void 0);
40
+ __decorate([
41
+ (0, core_1.Column)({ type: 'varchar', length: 128, unique: true }),
42
+ __metadata("design:type", String)
43
+ ], OctoSkill.prototype, "name", void 0);
44
+ __decorate([
45
+ (0, core_1.Column)({ type: 'varchar', length: 256 }),
46
+ __metadata("design:type", String)
47
+ ], OctoSkill.prototype, "description", void 0);
48
+ __decorate([
49
+ (0, core_1.Column)({ type: 'varchar', length: 64, name: 'source_module' }),
50
+ __metadata("design:type", String)
51
+ ], OctoSkill.prototype, "sourceModule", void 0);
52
+ __decorate([
53
+ (0, core_1.Column)({ type: 'varchar', length: 16, default: 'module', name: 'source_type' }),
54
+ __metadata("design:type", String)
55
+ ], OctoSkill.prototype, "sourceType", void 0);
56
+ __decorate([
57
+ (0, core_1.Column)({ type: 'text' }),
58
+ __metadata("design:type", String)
59
+ ], OctoSkill.prototype, "content", void 0);
60
+ __decorate([
61
+ (0, core_1.Column)({ type: 'varchar', length: 16, default: '1.0' }),
62
+ __metadata("design:type", String)
63
+ ], OctoSkill.prototype, "version", void 0);
64
+ __decorate([
65
+ (0, core_1.Column)({ type: 'boolean', default: true, name: 'is_enabled' }),
66
+ __metadata("design:type", Boolean)
67
+ ], OctoSkill.prototype, "isEnabled", void 0);
68
+ __decorate([
69
+ (0, core_1.Column)({ type: 'boolean', default: false, name: 'is_edited' }),
70
+ __metadata("design:type", Boolean)
71
+ ], OctoSkill.prototype, "isEdited", void 0);
72
+ __decorate([
73
+ (0, core_1.Column)({ type: 'text', nullable: true, name: 'install_targets' }),
74
+ __metadata("design:type", Object)
75
+ ], OctoSkill.prototype, "installTargets", void 0);
76
+ __decorate([
77
+ (0, core_1.CreateDateColumn)({ name: 'created_at' }),
78
+ __metadata("design:type", Date)
79
+ ], OctoSkill.prototype, "createdAt", void 0);
80
+ __decorate([
81
+ (0, core_1.UpdateDateColumn)({ name: 'updated_at' }),
82
+ __metadata("design:type", Date)
83
+ ], OctoSkill.prototype, "updatedAt", void 0);
84
+ __decorate([
85
+ (0, core_1.Column)({ type: 'datetime', nullable: true, name: 'last_installed_at' }),
86
+ __metadata("design:type", Object)
87
+ ], OctoSkill.prototype, "lastInstalledAt", void 0);
88
+ exports.OctoSkill = OctoSkill = __decorate([
89
+ (0, core_1.Entity)('octo_skill')
90
+ ], OctoSkill);
91
+ //# sourceMappingURL=octo-skill.entity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"octo-skill.entity.js","sourceRoot":"","sources":["../../../src/skill/entities/octo-skill.entity.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAM0B;AAGnB,IAAM,SAAS,GAAf,MAAM,SAAS;IAEpB,EAAE,CAAU;IAEZ,uDAAuD;IAEvD,IAAI,CAAU;IAGd,WAAW,CAAU;IAErB,+CAA+C;IAE/C,YAAY,CAAU;IAEtB,6EAA6E;IAE7E,UAAU,CAAuB;IAEjC,6BAA6B;IAE7B,OAAO,CAAU;IAGjB,OAAO,CAAU;IAGjB,SAAS,CAAW;IAEpB,+FAA+F;IAE/F,QAAQ,CAAW;IAEnB,wFAAwF;IAExF,cAAc,CAAiB;IAG/B,SAAS,CAAQ;IAGjB,SAAS,CAAQ;IAGjB,eAAe,CAAe;CAC/B,CAAA;AA7CY,8BAAS;AAEpB;IADC,IAAA,6BAAsB,EAAC,MAAM,CAAC;;qCACnB;AAIZ;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;uCACzC;AAGd;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;8CACpB;AAIrB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;+CACzC;AAItB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;6CAC/C;AAIjC;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0CACR;AAGjB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;0CACvC;AAGjB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;;4CAC3C;AAIpB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;2CAC5C;AAInB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC;;iDACnC;AAG/B;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;4CAAC;AAGjB;IADC,IAAA,uBAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;8BAC7B,IAAI;4CAAC;AAGjB;IADC,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;;kDAC1C;oBA5CnB,SAAS;IADrB,IAAA,aAAM,EAAC,YAAY,CAAC;GACR,SAAS,CA6CrB"}
@@ -0,0 +1,7 @@
1
+ export { OctoSkill } from './entities/octo-skill.entity.js';
2
+ export { SkillGeneratorService } from './services/skill-generator.service.js';
3
+ export { SkillRegistryService } from './services/skill-registry.service.js';
4
+ export { SkillInstallerService } from './services/skill-installer.service.js';
5
+ export { SkillController } from './controllers/skill.controller.js';
6
+ export type { SkillTarget, SkillTargetInfo, SkillSourceType, SkillGenerateParams, SkillGenerateResult, EndpointInfo, } from './types.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAG5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAGpE,YAAY,EACV,WAAW,EACX,eAAe,EACf,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,GACb,MAAM,YAAY,CAAC"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkillController = exports.SkillInstallerService = exports.SkillRegistryService = exports.SkillGeneratorService = exports.OctoSkill = void 0;
4
+ // Entities
5
+ var octo_skill_entity_js_1 = require("./entities/octo-skill.entity.js");
6
+ Object.defineProperty(exports, "OctoSkill", { enumerable: true, get: function () { return octo_skill_entity_js_1.OctoSkill; } });
7
+ // Services
8
+ var skill_generator_service_js_1 = require("./services/skill-generator.service.js");
9
+ Object.defineProperty(exports, "SkillGeneratorService", { enumerable: true, get: function () { return skill_generator_service_js_1.SkillGeneratorService; } });
10
+ var skill_registry_service_js_1 = require("./services/skill-registry.service.js");
11
+ Object.defineProperty(exports, "SkillRegistryService", { enumerable: true, get: function () { return skill_registry_service_js_1.SkillRegistryService; } });
12
+ var skill_installer_service_js_1 = require("./services/skill-installer.service.js");
13
+ Object.defineProperty(exports, "SkillInstallerService", { enumerable: true, get: function () { return skill_installer_service_js_1.SkillInstallerService; } });
14
+ // Controllers
15
+ var skill_controller_js_1 = require("./controllers/skill.controller.js");
16
+ Object.defineProperty(exports, "SkillController", { enumerable: true, get: function () { return skill_controller_js_1.SkillController; } });
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":";;;AAAA,WAAW;AACX,wEAA4D;AAAnD,iHAAA,SAAS,OAAA;AAElB,WAAW;AACX,oFAA8E;AAArE,mIAAA,qBAAqB,OAAA;AAC9B,kFAA4E;AAAnE,iIAAA,oBAAoB,OAAA;AAC7B,oFAA8E;AAArE,mIAAA,qBAAqB,OAAA;AAE9B,cAAc;AACd,yEAAoE;AAA3D,sHAAA,eAAe,OAAA"}
@@ -0,0 +1,47 @@
1
+ import type { SkillGenerateParams, SkillGenerateResult } from '../types.js';
2
+ /**
3
+ * Generates SKILL.md content from RouteRegistry metadata.
4
+ *
5
+ * Generation granularity: one module → one Skill file.
6
+ * Handles sparse metadata by inferring summaries from multiple sources.
7
+ */
8
+ export declare class SkillGeneratorService {
9
+ /**
10
+ * Generate a skill for a specific module.
11
+ */
12
+ generateForModule(params: SkillGenerateParams): SkillGenerateResult;
13
+ /**
14
+ * Generate skills for all registered modules.
15
+ */
16
+ generateAll(baseUrl: string, apiKey?: string): SkillGenerateResult[];
17
+ /**
18
+ * Convert a RegisteredRoute to a simpler EndpointInfo,
19
+ * inferring summary if not present.
20
+ */
21
+ private routeToEndpoint;
22
+ /**
23
+ * Infer a human-readable summary when route.summary is missing.
24
+ *
25
+ * Priority:
26
+ * 1. controllerMeta.name + HTTP method (e.g. "物料管理" + POST → "创建物料")
27
+ * 2. permission code (e.g. "erp:material:create" → "Create material")
28
+ * 3. handlerName camelCase split (e.g. "createMaterial" → "Create material")
29
+ * 4. HTTP method + path last segment (e.g. POST /materials → "Create materials")
30
+ */
31
+ private inferSummary;
32
+ private methodToChineseVerb;
33
+ private methodToEnglishVerb;
34
+ private camelToWords;
35
+ private capitalizeFirst;
36
+ private formatModuleName;
37
+ /**
38
+ * Group endpoints by controller name for organized output.
39
+ */
40
+ private groupByController;
41
+ private buildDescription;
42
+ /**
43
+ * Render the full SKILL.md content.
44
+ */
45
+ private renderSkillMd;
46
+ }
47
+ //# sourceMappingURL=skill-generator.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.service.d.ts","sourceRoot":"","sources":["../../../src/skill/services/skill-generator.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AAErB;;;;;GAKG;AACH,qBAAa,qBAAqB;IAChC;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB;IA+BnE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE;IAOpE;;;OAGG;IACH,OAAO,CAAC,eAAe;IAYvB;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IA+BpB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,aAAa;CA2FtB"}
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SkillGeneratorService = void 0;
4
+ const core_1 = require("@octo-cyber/core");
5
+ /**
6
+ * Generates SKILL.md content from RouteRegistry metadata.
7
+ *
8
+ * Generation granularity: one module → one Skill file.
9
+ * Handles sparse metadata by inferring summaries from multiple sources.
10
+ */
11
+ class SkillGeneratorService {
12
+ /**
13
+ * Generate a skill for a specific module.
14
+ */
15
+ generateForModule(params) {
16
+ const { module, baseUrl, apiKey } = params;
17
+ const routes = core_1.RouteRegistry.getByModule(module);
18
+ if (routes.length === 0) {
19
+ throw new Error(`No routes found for module: ${module}`);
20
+ }
21
+ const endpoints = routes.map((r) => this.routeToEndpoint(r));
22
+ const grouped = this.groupByController(endpoints);
23
+ const moduleName = this.formatModuleName(module);
24
+ const skillName = `octo-${module}-api`;
25
+ const description = this.buildDescription(module, moduleName, endpoints);
26
+ const content = this.renderSkillMd({
27
+ skillName,
28
+ moduleName,
29
+ description,
30
+ baseUrl,
31
+ apiKey,
32
+ grouped,
33
+ });
34
+ return {
35
+ name: skillName,
36
+ description,
37
+ content,
38
+ sourceModule: module,
39
+ version: '1.0',
40
+ };
41
+ }
42
+ /**
43
+ * Generate skills for all registered modules.
44
+ */
45
+ generateAll(baseUrl, apiKey) {
46
+ const modules = core_1.RouteRegistry.getModules();
47
+ return modules.map((module) => this.generateForModule({ module, baseUrl, apiKey }));
48
+ }
49
+ /**
50
+ * Convert a RegisteredRoute to a simpler EndpointInfo,
51
+ * inferring summary if not present.
52
+ */
53
+ routeToEndpoint(route) {
54
+ return {
55
+ method: route.method.toUpperCase(),
56
+ path: route.fullPath,
57
+ summary: route.summary || this.inferSummary(route),
58
+ permission: route.permission,
59
+ controller: route.controller,
60
+ controllerName: route.controllerMeta?.name,
61
+ tags: route.tags,
62
+ };
63
+ }
64
+ /**
65
+ * Infer a human-readable summary when route.summary is missing.
66
+ *
67
+ * Priority:
68
+ * 1. controllerMeta.name + HTTP method (e.g. "物料管理" + POST → "创建物料")
69
+ * 2. permission code (e.g. "erp:material:create" → "Create material")
70
+ * 3. handlerName camelCase split (e.g. "createMaterial" → "Create material")
71
+ * 4. HTTP method + path last segment (e.g. POST /materials → "Create materials")
72
+ */
73
+ inferSummary(route) {
74
+ // Strategy 1: controller name + method verb
75
+ const ctrlName = route.controllerMeta?.name;
76
+ if (ctrlName) {
77
+ const verb = this.methodToChineseVerb(route.method);
78
+ if (verb)
79
+ return `${verb}${ctrlName}`;
80
+ }
81
+ // Strategy 2: permission code
82
+ if (route.permission) {
83
+ const parts = route.permission.split(':');
84
+ const action = parts[parts.length - 1];
85
+ const resource = parts.length >= 2 ? parts[parts.length - 2] : '';
86
+ if (action && resource) {
87
+ return `${this.capitalizeFirst(action)} ${resource}`;
88
+ }
89
+ }
90
+ // Strategy 3: handlerName camelCase split
91
+ if (route.handlerName) {
92
+ return this.camelToWords(route.handlerName);
93
+ }
94
+ // Strategy 4: method + path last segment
95
+ const segments = route.fullPath.split('/').filter(Boolean);
96
+ const lastSeg = segments[segments.length - 1] ?? '';
97
+ const cleanSeg = lastSeg.startsWith(':') ? segments[segments.length - 2] ?? '' : lastSeg;
98
+ const verb = this.methodToEnglishVerb(route.method);
99
+ return `${verb} ${cleanSeg}`;
100
+ }
101
+ methodToChineseVerb(method) {
102
+ const map = {
103
+ get: '获取',
104
+ post: '创建',
105
+ put: '更新',
106
+ delete: '删除',
107
+ patch: '更新',
108
+ };
109
+ return map[method.toLowerCase()] ?? null;
110
+ }
111
+ methodToEnglishVerb(method) {
112
+ const map = {
113
+ get: 'Get',
114
+ post: 'Create',
115
+ put: 'Update',
116
+ delete: 'Delete',
117
+ patch: 'Patch',
118
+ };
119
+ return map[method.toLowerCase()] ?? method;
120
+ }
121
+ camelToWords(name) {
122
+ return name
123
+ .replace(/([A-Z])/g, ' $1')
124
+ .replace(/^./, (s) => s.toUpperCase())
125
+ .trim();
126
+ }
127
+ capitalizeFirst(str) {
128
+ return str.charAt(0).toUpperCase() + str.slice(1);
129
+ }
130
+ formatModuleName(module) {
131
+ return module.charAt(0).toUpperCase() + module.slice(1);
132
+ }
133
+ /**
134
+ * Group endpoints by controller name for organized output.
135
+ */
136
+ groupByController(endpoints) {
137
+ const map = new Map();
138
+ for (const ep of endpoints) {
139
+ const key = ep.controllerName || ep.controller || 'General';
140
+ const list = map.get(key) ?? [];
141
+ list.push(ep);
142
+ map.set(key, list);
143
+ }
144
+ return map;
145
+ }
146
+ buildDescription(module, moduleName, endpoints) {
147
+ const actions = endpoints
148
+ .slice(0, 3)
149
+ .map((e) => e.summary.toLowerCase())
150
+ .join(', ');
151
+ return `Octo ${moduleName} API — ${actions}, etc.`;
152
+ }
153
+ /**
154
+ * Render the full SKILL.md content.
155
+ */
156
+ renderSkillMd(params) {
157
+ const { skillName, moduleName, description, baseUrl, apiKey, grouped } = params;
158
+ const authHeader = apiKey
159
+ ? `Bearer ${apiKey}`
160
+ : 'Bearer <YOUR_API_KEY>';
161
+ const lines = [];
162
+ // YAML frontmatter
163
+ lines.push('---');
164
+ lines.push(`name: ${skillName}`);
165
+ lines.push(`description: >-`);
166
+ lines.push(` ${description}`);
167
+ lines.push(` Use when needing to interact with Octo ${moduleName} functionality.`);
168
+ lines.push('metadata:');
169
+ lines.push(' author: octo-system');
170
+ lines.push(' version: "1.0"');
171
+ lines.push(` module: ${params.skillName.replace('octo-', '').replace('-api', '')}`);
172
+ lines.push(' generated: "true"');
173
+ lines.push('---');
174
+ lines.push('');
175
+ // Title
176
+ lines.push(`# Octo ${moduleName} API`);
177
+ lines.push('');
178
+ // Connection
179
+ lines.push('## Connection');
180
+ lines.push(`- **Base URL**: ${baseUrl}`);
181
+ lines.push(`- **Auth Header**: \`Authorization: ${authHeader}\``);
182
+ lines.push('');
183
+ lines.push('Always include the Auth Header in every API request.');
184
+ lines.push('');
185
+ // Endpoints
186
+ lines.push('## Endpoints');
187
+ lines.push('');
188
+ for (const [groupName, endpoints] of grouped) {
189
+ lines.push(`### ${groupName}`);
190
+ lines.push('');
191
+ for (const ep of endpoints) {
192
+ const permNote = ep.permission
193
+ ? ` *(requires: ${ep.permission})*`
194
+ : '';
195
+ lines.push(`- \`${ep.method} ${ep.path}\` — ${ep.summary}${permNote}`);
196
+ }
197
+ lines.push('');
198
+ }
199
+ // Response format
200
+ lines.push('## Response Format');
201
+ lines.push('');
202
+ lines.push('All endpoints return JSON in the standard format:');
203
+ lines.push('');
204
+ lines.push('```json');
205
+ lines.push('{');
206
+ lines.push(' "code": 0,');
207
+ lines.push(' "data": "<response data>",');
208
+ lines.push(' "message": "ok"');
209
+ lines.push('}');
210
+ lines.push('```');
211
+ lines.push('');
212
+ lines.push('- `code: 0` means success; non-zero indicates an error.');
213
+ lines.push('- Error responses include `code`, `message`, and optional `details`.');
214
+ lines.push('');
215
+ // Example
216
+ lines.push('## Examples');
217
+ lines.push('');
218
+ const firstEndpoint = [...grouped.values()][0]?.[0];
219
+ if (firstEndpoint) {
220
+ lines.push('```bash');
221
+ lines.push(`curl -X ${firstEndpoint.method} ${baseUrl}${firstEndpoint.path} \\`);
222
+ lines.push(` -H "Authorization: ${authHeader}" \\`);
223
+ lines.push(' -H "Content-Type: application/json"');
224
+ lines.push('```');
225
+ }
226
+ return lines.join('\n');
227
+ }
228
+ }
229
+ exports.SkillGeneratorService = SkillGeneratorService;
230
+ // Register with DI container
231
+ core_1.Container.register(SkillGeneratorService);
232
+ //# sourceMappingURL=skill-generator.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-generator.service.js","sourceRoot":"","sources":["../../../src/skill/services/skill-generator.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { SkillTarget, SkillTargetInfo } from '../types.js';
2
+ /**
3
+ * Handles installing/uninstalling SKILL.md files to AI tool directories.
4
+ */
5
+ export declare class SkillInstallerService {
6
+ private readonly logger;
7
+ /**
8
+ * List available installation targets and their status.
9
+ */
10
+ getTargets(): SkillTargetInfo[];
11
+ /**
12
+ * Install a skill to specified targets.
13
+ * Creates the skills directory and writes SKILL.md.
14
+ */
15
+ install(skillName: string, content: string, targets: SkillTarget[]): {
16
+ installed: SkillTarget[];
17
+ failed: Array<{
18
+ target: SkillTarget;
19
+ error: string;
20
+ }>;
21
+ };
22
+ /**
23
+ * Uninstall a skill from specified targets.
24
+ * Removes the skill directory.
25
+ */
26
+ uninstall(skillName: string, targets: SkillTarget[]): {
27
+ uninstalled: SkillTarget[];
28
+ failed: Array<{
29
+ target: SkillTarget;
30
+ error: string;
31
+ }>;
32
+ };
33
+ /**
34
+ * Check which targets currently have a specific skill installed.
35
+ */
36
+ getInstalledTargets(skillName: string): SkillTarget[];
37
+ }
38
+ //# sourceMappingURL=skill-installer.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installer.service.d.ts","sourceRoot":"","sources":["../../../src/skill/services/skill-installer.service.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAuBhE;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IAEvD;;OAEG;IACH,UAAU,IAAI,eAAe,EAAE;IAU/B;;;OAGG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EAAE,GACrB;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,WAAW,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;IA4BtF;;;OAGG;IACH,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,WAAW,EAAE,GACrB;QAAE,WAAW,EAAE,WAAW,EAAE,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,WAAW,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;IA2BxF;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;CAUtD"}
@@ -0,0 +1,150 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SkillInstallerService = void 0;
37
+ const fs = __importStar(require("node:fs"));
38
+ const path = __importStar(require("node:path"));
39
+ const os = __importStar(require("node:os"));
40
+ const core_1 = require("@octo-cyber/core");
41
+ /**
42
+ * Default skill directory mappings for each AI tool.
43
+ */
44
+ const TARGET_CONFIGS = {
45
+ claude: {
46
+ name: 'Claude Code',
47
+ detectDir: path.join(os.homedir(), '.claude'),
48
+ skillsDir: path.join(os.homedir(), '.claude', 'skills'),
49
+ },
50
+ cursor: {
51
+ name: 'Cursor',
52
+ detectDir: path.join(os.homedir(), '.cursor'),
53
+ skillsDir: path.join(os.homedir(), '.cursor', 'skills'),
54
+ },
55
+ codex: {
56
+ name: 'Codex',
57
+ detectDir: path.join(os.homedir(), '.codex'),
58
+ skillsDir: path.join(os.homedir(), '.codex', 'skills'),
59
+ },
60
+ };
61
+ /**
62
+ * Handles installing/uninstalling SKILL.md files to AI tool directories.
63
+ */
64
+ class SkillInstallerService {
65
+ logger = core_1.Container.get(core_1.LoggerService);
66
+ /**
67
+ * List available installation targets and their status.
68
+ */
69
+ getTargets() {
70
+ return Object.entries(TARGET_CONFIGS).map(([id, config]) => ({
71
+ id: id,
72
+ name: config.name,
73
+ skillsDir: config.skillsDir,
74
+ detectDir: config.detectDir,
75
+ isInstalled: fs.existsSync(config.detectDir),
76
+ }));
77
+ }
78
+ /**
79
+ * Install a skill to specified targets.
80
+ * Creates the skills directory and writes SKILL.md.
81
+ */
82
+ install(skillName, content, targets) {
83
+ const installed = [];
84
+ const failed = [];
85
+ for (const target of targets) {
86
+ try {
87
+ const config = TARGET_CONFIGS[target];
88
+ if (!config) {
89
+ failed.push({ target, error: `Unknown target: ${target}` });
90
+ continue;
91
+ }
92
+ const skillDir = path.join(config.skillsDir, skillName);
93
+ fs.mkdirSync(skillDir, { recursive: true });
94
+ fs.writeFileSync(path.join(skillDir, 'SKILL.md'), content, 'utf-8');
95
+ installed.push(target);
96
+ this.logger.info(`Skill "${skillName}" installed to ${config.name} at ${skillDir}`);
97
+ }
98
+ catch (err) {
99
+ const msg = err instanceof Error ? err.message : String(err);
100
+ failed.push({ target, error: msg });
101
+ this.logger.error(`Failed to install skill "${skillName}" to ${target}: ${msg}`);
102
+ }
103
+ }
104
+ return { installed, failed };
105
+ }
106
+ /**
107
+ * Uninstall a skill from specified targets.
108
+ * Removes the skill directory.
109
+ */
110
+ uninstall(skillName, targets) {
111
+ const uninstalled = [];
112
+ const failed = [];
113
+ for (const target of targets) {
114
+ try {
115
+ const config = TARGET_CONFIGS[target];
116
+ if (!config) {
117
+ failed.push({ target, error: `Unknown target: ${target}` });
118
+ continue;
119
+ }
120
+ const skillDir = path.join(config.skillsDir, skillName);
121
+ if (fs.existsSync(skillDir)) {
122
+ fs.rmSync(skillDir, { recursive: true });
123
+ this.logger.info(`Skill "${skillName}" uninstalled from ${config.name}`);
124
+ }
125
+ uninstalled.push(target);
126
+ }
127
+ catch (err) {
128
+ const msg = err instanceof Error ? err.message : String(err);
129
+ failed.push({ target, error: msg });
130
+ }
131
+ }
132
+ return { uninstalled, failed };
133
+ }
134
+ /**
135
+ * Check which targets currently have a specific skill installed.
136
+ */
137
+ getInstalledTargets(skillName) {
138
+ const installed = [];
139
+ for (const [id, config] of Object.entries(TARGET_CONFIGS)) {
140
+ const skillPath = path.join(config.skillsDir, skillName, 'SKILL.md');
141
+ if (fs.existsSync(skillPath)) {
142
+ installed.push(id);
143
+ }
144
+ }
145
+ return installed;
146
+ }
147
+ }
148
+ exports.SkillInstallerService = SkillInstallerService;
149
+ core_1.Container.register(SkillInstallerService);
150
+ //# sourceMappingURL=skill-installer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installer.service.js","sourceRoot":"","sources":["../../../src/skill/services/skill-installer.service.ts"],"names":[],"mappings":"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"}