attio-mcp 1.3.6 → 1.4.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 (293) hide show
  1. package/CHANGELOG.md +236 -2
  2. package/README.md +106 -266
  3. package/dist/api/attio-client.d.ts +13 -3
  4. package/dist/api/attio-client.d.ts.map +1 -1
  5. package/dist/api/attio-client.js +37 -7
  6. package/dist/api/attio-client.js.map +1 -1
  7. package/dist/api/attribute-types.d.ts.map +1 -1
  8. package/dist/api/attribute-types.js +42 -20
  9. package/dist/api/attribute-types.js.map +1 -1
  10. package/dist/api/client-context.d.ts.map +1 -1
  11. package/dist/api/client-context.js +28 -42
  12. package/dist/api/client-context.js.map +1 -1
  13. package/dist/cli/commands/generate-skill.d.ts +28 -0
  14. package/dist/cli/commands/generate-skill.d.ts.map +1 -0
  15. package/dist/cli/commands/generate-skill.js +101 -0
  16. package/dist/cli/commands/generate-skill.js.map +1 -0
  17. package/dist/cli/discover.js +65 -0
  18. package/dist/cli/discover.js.map +1 -1
  19. package/dist/config/deal-defaults.d.ts +2 -2
  20. package/dist/config/deal-defaults.d.ts.map +1 -1
  21. package/dist/config/deal-defaults.js +15 -6
  22. package/dist/config/deal-defaults.js.map +1 -1
  23. package/dist/config/tool-aliases.d.ts +12 -0
  24. package/dist/config/tool-aliases.d.ts.map +1 -1
  25. package/dist/config/tool-aliases.js +213 -69
  26. package/dist/config/tool-aliases.js.map +1 -1
  27. package/dist/constants/tool-names.d.ts +84 -0
  28. package/dist/constants/tool-names.d.ts.map +1 -0
  29. package/dist/constants/tool-names.js +81 -0
  30. package/dist/constants/tool-names.js.map +1 -0
  31. package/dist/constants/universal.constants.d.ts +24 -0
  32. package/dist/constants/universal.constants.d.ts.map +1 -1
  33. package/dist/constants/universal.constants.js +81 -9
  34. package/dist/constants/universal.constants.js.map +1 -1
  35. package/dist/handlers/tool-configs/universal/batch-search.js +4 -4
  36. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts +26 -4
  37. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.d.ts.map +1 -1
  38. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js +181 -21
  39. package/dist/handlers/tool-configs/universal/core/crud-error-handlers.js.map +1 -1
  40. package/dist/handlers/tool-configs/universal/core/crud-operations.js +13 -13
  41. package/dist/handlers/tool-configs/universal/core/crud-operations.js.map +1 -1
  42. package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js +3 -3
  43. package/dist/handlers/tool-configs/universal/core/detailed-info-operations.js.map +1 -1
  44. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts +17 -0
  45. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.d.ts.map +1 -0
  46. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js +118 -0
  47. package/dist/handlers/tool-configs/universal/core/error-enhancers/attribute-enhancer.js.map +1 -0
  48. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts +14 -0
  49. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.d.ts.map +1 -0
  50. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js +77 -0
  51. package/dist/handlers/tool-configs/universal/core/error-enhancers/complex-type-enhancer.js.map +1 -0
  52. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts +24 -0
  53. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.d.ts.map +1 -0
  54. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js +35 -0
  55. package/dist/handlers/tool-configs/universal/core/error-enhancers/index.js.map +1 -0
  56. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts +15 -0
  57. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.d.ts.map +1 -0
  58. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js +108 -0
  59. package/dist/handlers/tool-configs/universal/core/error-enhancers/record-reference-enhancer.js.map +1 -0
  60. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts +14 -0
  61. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.d.ts.map +1 -0
  62. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js +91 -0
  63. package/dist/handlers/tool-configs/universal/core/error-enhancers/required-fields-enhancer.js.map +1 -0
  64. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts +14 -0
  65. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.d.ts.map +1 -0
  66. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js +118 -0
  67. package/dist/handlers/tool-configs/universal/core/error-enhancers/select-status-enhancer.js.map +1 -0
  68. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts +77 -0
  69. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.d.ts.map +1 -0
  70. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js +42 -0
  71. package/dist/handlers/tool-configs/universal/core/error-enhancers/types.js.map +1 -0
  72. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts +15 -0
  73. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.d.ts.map +1 -0
  74. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js +109 -0
  75. package/dist/handlers/tool-configs/universal/core/error-enhancers/uniqueness-enhancer.js.map +1 -0
  76. package/dist/handlers/tool-configs/universal/core/index.d.ts +63 -22
  77. package/dist/handlers/tool-configs/universal/core/index.d.ts.map +1 -1
  78. package/dist/handlers/tool-configs/universal/core/index.js +24 -22
  79. package/dist/handlers/tool-configs/universal/core/index.js.map +1 -1
  80. package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts +43 -1
  81. package/dist/handlers/tool-configs/universal/core/metadata-operations.d.ts.map +1 -1
  82. package/dist/handlers/tool-configs/universal/core/metadata-operations.js +117 -11
  83. package/dist/handlers/tool-configs/universal/core/metadata-operations.js.map +1 -1
  84. package/dist/handlers/tool-configs/universal/core/notes-operations.js +12 -12
  85. package/dist/handlers/tool-configs/universal/core/notes-operations.js.map +1 -1
  86. package/dist/handlers/tool-configs/universal/core/record-details-operations.js +3 -3
  87. package/dist/handlers/tool-configs/universal/core/record-details-operations.js.map +1 -1
  88. package/dist/handlers/tool-configs/universal/core/search-operations.js +4 -4
  89. package/dist/handlers/tool-configs/universal/core/search-operations.js.map +1 -1
  90. package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.d.ts.map +1 -1
  91. package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js +32 -9
  92. package/dist/handlers/tool-configs/universal/field-mapper/constants/companies.js.map +1 -1
  93. package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.d.ts.map +1 -1
  94. package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js +45 -6
  95. package/dist/handlers/tool-configs/universal/field-mapper/constants/deals.js.map +1 -1
  96. package/dist/handlers/tool-configs/universal/field-mapper/constants/people.d.ts.map +1 -1
  97. package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js +36 -5
  98. package/dist/handlers/tool-configs/universal/field-mapper/constants/people.js.map +1 -1
  99. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts +1 -1
  100. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.d.ts.map +1 -1
  101. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js +17 -1
  102. package/dist/handlers/tool-configs/universal/field-mapper/transformers/value-transformer.js.map +1 -1
  103. package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.d.ts.map +1 -1
  104. package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js +3 -1
  105. package/dist/handlers/tool-configs/universal/field-mapper/validators/field-validator.js.map +1 -1
  106. package/dist/handlers/tool-configs/universal/index.d.ts +75 -34
  107. package/dist/handlers/tool-configs/universal/index.d.ts.map +1 -1
  108. package/dist/handlers/tool-configs/universal/index.js +58 -58
  109. package/dist/handlers/tool-configs/universal/index.js.map +1 -1
  110. package/dist/handlers/tool-configs/universal/operations/advanced-search.d.ts.map +1 -1
  111. package/dist/handlers/tool-configs/universal/operations/advanced-search.js +5 -4
  112. package/dist/handlers/tool-configs/universal/operations/advanced-search.js.map +1 -1
  113. package/dist/handlers/tool-configs/universal/operations/batch-operations.js +3 -3
  114. package/dist/handlers/tool-configs/universal/operations/content-search.js +3 -3
  115. package/dist/handlers/tool-configs/universal/operations/index.d.ts +10 -10
  116. package/dist/handlers/tool-configs/universal/operations/index.js +15 -15
  117. package/dist/handlers/tool-configs/universal/operations/relationship-search.js +3 -3
  118. package/dist/handlers/tool-configs/universal/operations/timeframe-search.js +3 -3
  119. package/dist/handlers/tool-configs/universal/schemas/utility-schemas.d.ts.map +1 -1
  120. package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js +5 -2
  121. package/dist/handlers/tool-configs/universal/schemas/utility-schemas.js.map +1 -1
  122. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts +29 -0
  123. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.d.ts.map +1 -1
  124. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js +28 -0
  125. package/dist/handlers/tool-configs/universal/schemas/validation-schemas.js.map +1 -1
  126. package/dist/handlers/tool-configs/universal/schemas.d.ts +1 -1
  127. package/dist/handlers/tool-configs/universal/schemas.d.ts.map +1 -1
  128. package/dist/handlers/tool-configs/universal/schemas.js +1 -1
  129. package/dist/handlers/tool-configs/universal/schemas.js.map +1 -1
  130. package/dist/handlers/tool-configs/universal/shared-handlers.d.ts +20 -1
  131. package/dist/handlers/tool-configs/universal/shared-handlers.d.ts.map +1 -1
  132. package/dist/handlers/tool-configs/universal/shared-handlers.js +216 -0
  133. package/dist/handlers/tool-configs/universal/shared-handlers.js.map +1 -1
  134. package/dist/handlers/tool-configs/universal/smithery-diagnostics.js +2 -2
  135. package/dist/handlers/tool-configs/universal/types.d.ts +9 -0
  136. package/dist/handlers/tool-configs/universal/types.d.ts.map +1 -1
  137. package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts +11 -0
  138. package/dist/handlers/tool-configs/universal/validators/schema-validator.d.ts.map +1 -1
  139. package/dist/handlers/tool-configs/universal/validators/schema-validator.js +63 -9
  140. package/dist/handlers/tool-configs/universal/validators/schema-validator.js.map +1 -1
  141. package/dist/handlers/tools/dispatcher/core.d.ts.map +1 -1
  142. package/dist/handlers/tools/dispatcher/core.js +5 -1
  143. package/dist/handlers/tools/dispatcher/core.js.map +1 -1
  144. package/dist/handlers/tools/formatters.d.ts +8 -1
  145. package/dist/handlers/tools/formatters.d.ts.map +1 -1
  146. package/dist/handlers/tools/formatters.js +30 -14
  147. package/dist/handlers/tools/formatters.js.map +1 -1
  148. package/dist/handlers/tools/registry.d.ts +125 -84
  149. package/dist/handlers/tools/registry.d.ts.map +1 -1
  150. package/dist/handlers/tools/registry.js +14 -9
  151. package/dist/handlers/tools/registry.js.map +1 -1
  152. package/dist/handlers/tools/standards/index.d.ts.map +1 -1
  153. package/dist/handlers/tools/standards/index.js +19 -11
  154. package/dist/handlers/tools/standards/index.js.map +1 -1
  155. package/dist/objects/companies/attributes.d.ts +5 -0
  156. package/dist/objects/companies/attributes.d.ts.map +1 -1
  157. package/dist/objects/companies/attributes.js +45 -31
  158. package/dist/objects/companies/attributes.js.map +1 -1
  159. package/dist/server/createServer.d.ts.map +1 -1
  160. package/dist/server/createServer.js +4 -3
  161. package/dist/server/createServer.js.map +1 -1
  162. package/dist/services/ErrorService.js +3 -3
  163. package/dist/services/ErrorService.js.map +1 -1
  164. package/dist/services/UniversalCreateService.d.ts.map +1 -1
  165. package/dist/services/UniversalCreateService.js +136 -12
  166. package/dist/services/UniversalCreateService.js.map +1 -1
  167. package/dist/services/UniversalSearchService.d.ts +4 -25
  168. package/dist/services/UniversalSearchService.d.ts.map +1 -1
  169. package/dist/services/UniversalSearchService.js +14 -324
  170. package/dist/services/UniversalSearchService.js.map +1 -1
  171. package/dist/services/UniversalUpdateService.d.ts +15 -4
  172. package/dist/services/UniversalUpdateService.d.ts.map +1 -1
  173. package/dist/services/UniversalUpdateService.js +79 -151
  174. package/dist/services/UniversalUpdateService.js.map +1 -1
  175. package/dist/services/create/factory.d.ts.map +1 -1
  176. package/dist/services/create/factory.js +2 -1
  177. package/dist/services/create/factory.js.map +1 -1
  178. package/dist/services/metadata/AttributeOptionsService.d.ts +38 -0
  179. package/dist/services/metadata/AttributeOptionsService.d.ts.map +1 -0
  180. package/dist/services/metadata/AttributeOptionsService.js +92 -0
  181. package/dist/services/metadata/AttributeOptionsService.js.map +1 -0
  182. package/dist/services/metadata/index.d.ts +1 -0
  183. package/dist/services/metadata/index.d.ts.map +1 -1
  184. package/dist/services/metadata/index.js +1 -0
  185. package/dist/services/metadata/index.js.map +1 -1
  186. package/dist/services/search/QueryApiService.d.ts +27 -0
  187. package/dist/services/search/QueryApiService.d.ts.map +1 -0
  188. package/dist/services/search/QueryApiService.js +144 -0
  189. package/dist/services/search/QueryApiService.js.map +1 -0
  190. package/dist/services/search/RecordsSearchService.d.ts +27 -0
  191. package/dist/services/search/RecordsSearchService.d.ts.map +1 -0
  192. package/dist/services/search/RecordsSearchService.js +122 -0
  193. package/dist/services/search/RecordsSearchService.js.map +1 -0
  194. package/dist/services/search/SearchCoordinator.d.ts +41 -0
  195. package/dist/services/search/SearchCoordinator.d.ts.map +1 -0
  196. package/dist/services/search/SearchCoordinator.js +83 -0
  197. package/dist/services/search/SearchCoordinator.js.map +1 -0
  198. package/dist/services/search/StrategyFactory.d.ts +31 -0
  199. package/dist/services/search/StrategyFactory.d.ts.map +1 -0
  200. package/dist/services/search/StrategyFactory.js +100 -0
  201. package/dist/services/search/StrategyFactory.js.map +1 -0
  202. package/dist/services/skill-generator/OutputWriterService.d.ts +41 -0
  203. package/dist/services/skill-generator/OutputWriterService.d.ts.map +1 -0
  204. package/dist/services/skill-generator/OutputWriterService.js +100 -0
  205. package/dist/services/skill-generator/OutputWriterService.js.map +1 -0
  206. package/dist/services/skill-generator/SchemaFormatterService.d.ts +61 -0
  207. package/dist/services/skill-generator/SchemaFormatterService.d.ts.map +1 -0
  208. package/dist/services/skill-generator/SchemaFormatterService.js +168 -0
  209. package/dist/services/skill-generator/SchemaFormatterService.js.map +1 -0
  210. package/dist/services/skill-generator/WorkspaceSchemaService.d.ts +84 -0
  211. package/dist/services/skill-generator/WorkspaceSchemaService.d.ts.map +1 -0
  212. package/dist/services/skill-generator/WorkspaceSchemaService.js +292 -0
  213. package/dist/services/skill-generator/WorkspaceSchemaService.js.map +1 -0
  214. package/dist/services/skill-generator/index.d.ts +12 -0
  215. package/dist/services/skill-generator/index.d.ts.map +1 -0
  216. package/dist/services/skill-generator/index.js +11 -0
  217. package/dist/services/skill-generator/index.js.map +1 -0
  218. package/dist/services/skill-generator/types.d.ts +137 -0
  219. package/dist/services/skill-generator/types.d.ts.map +1 -0
  220. package/dist/services/skill-generator/types.js +10 -0
  221. package/dist/services/skill-generator/types.js.map +1 -0
  222. package/dist/services/update/FieldPersistenceHandler.d.ts +101 -0
  223. package/dist/services/update/FieldPersistenceHandler.d.ts.map +1 -0
  224. package/dist/services/update/FieldPersistenceHandler.js +198 -0
  225. package/dist/services/update/FieldPersistenceHandler.js.map +1 -0
  226. package/dist/services/update/FieldValidationHandler.d.ts +77 -0
  227. package/dist/services/update/FieldValidationHandler.d.ts.map +1 -0
  228. package/dist/services/update/FieldValidationHandler.js +157 -0
  229. package/dist/services/update/FieldValidationHandler.js.map +1 -0
  230. package/dist/services/update/MetadataResolver.d.ts +50 -0
  231. package/dist/services/update/MetadataResolver.d.ts.map +1 -0
  232. package/dist/services/update/MetadataResolver.js +110 -0
  233. package/dist/services/update/MetadataResolver.js.map +1 -0
  234. package/dist/services/update/UpdateOrchestrator.d.ts +37 -0
  235. package/dist/services/update/UpdateOrchestrator.d.ts.map +1 -0
  236. package/dist/services/update/UpdateOrchestrator.js +58 -0
  237. package/dist/services/update/UpdateOrchestrator.js.map +1 -0
  238. package/dist/services/update/UpdateValidation.d.ts +5 -1
  239. package/dist/services/update/UpdateValidation.d.ts.map +1 -1
  240. package/dist/services/update/UpdateValidation.js +46 -14
  241. package/dist/services/update/UpdateValidation.js.map +1 -1
  242. package/dist/services/value-transformer/index.d.ts +57 -0
  243. package/dist/services/value-transformer/index.d.ts.map +1 -0
  244. package/dist/services/value-transformer/index.js +326 -0
  245. package/dist/services/value-transformer/index.js.map +1 -0
  246. package/dist/services/value-transformer/multi-select-transformer.d.ts +63 -0
  247. package/dist/services/value-transformer/multi-select-transformer.d.ts.map +1 -0
  248. package/dist/services/value-transformer/multi-select-transformer.js +144 -0
  249. package/dist/services/value-transformer/multi-select-transformer.js.map +1 -0
  250. package/dist/services/value-transformer/record-reference-transformer.d.ts +43 -0
  251. package/dist/services/value-transformer/record-reference-transformer.d.ts.map +1 -0
  252. package/dist/services/value-transformer/record-reference-transformer.js +245 -0
  253. package/dist/services/value-transformer/record-reference-transformer.js.map +1 -0
  254. package/dist/services/value-transformer/select-transformer.d.ts +48 -0
  255. package/dist/services/value-transformer/select-transformer.d.ts.map +1 -0
  256. package/dist/services/value-transformer/select-transformer.js +232 -0
  257. package/dist/services/value-transformer/select-transformer.js.map +1 -0
  258. package/dist/services/value-transformer/status-transformer.d.ts +32 -0
  259. package/dist/services/value-transformer/status-transformer.d.ts.map +1 -0
  260. package/dist/services/value-transformer/status-transformer.js +294 -0
  261. package/dist/services/value-transformer/status-transformer.js.map +1 -0
  262. package/dist/services/value-transformer/types.d.ts +100 -0
  263. package/dist/services/value-transformer/types.d.ts.map +1 -0
  264. package/dist/services/value-transformer/types.js +6 -0
  265. package/dist/services/value-transformer/types.js.map +1 -0
  266. package/dist/templates/skill/SKILL.template.md +78 -0
  267. package/dist/templates/skill/attribute-reference.template.md +126 -0
  268. package/dist/templates/skill/complex-types.template.md +255 -0
  269. package/dist/utils/client-resolver.d.ts.map +1 -1
  270. package/dist/utils/client-resolver.js +8 -16
  271. package/dist/utils/client-resolver.js.map +1 -1
  272. package/dist/utils/complex-type-validation.d.ts +16 -0
  273. package/dist/utils/complex-type-validation.d.ts.map +1 -0
  274. package/dist/utils/complex-type-validation.js +196 -0
  275. package/dist/utils/complex-type-validation.js.map +1 -0
  276. package/dist/utils/error-utilities.d.ts.map +1 -1
  277. package/dist/utils/error-utilities.js +16 -9
  278. package/dist/utils/error-utilities.js.map +1 -1
  279. package/dist/utils/location-normalizer.d.ts +26 -0
  280. package/dist/utils/location-normalizer.d.ts.map +1 -0
  281. package/dist/utils/location-normalizer.js +39 -0
  282. package/dist/utils/location-normalizer.js.map +1 -0
  283. package/dist/utils/metadata-utils.d.ts +27 -0
  284. package/dist/utils/metadata-utils.d.ts.map +1 -0
  285. package/dist/utils/metadata-utils.js +59 -0
  286. package/dist/utils/metadata-utils.js.map +1 -0
  287. package/dist/utils/personal-name-parser.d.ts.map +1 -1
  288. package/dist/utils/personal-name-parser.js +26 -17
  289. package/dist/utils/personal-name-parser.js.map +1 -1
  290. package/dist/validators/company/field_detector.d.ts.map +1 -1
  291. package/dist/validators/company/field_detector.js +5 -0
  292. package/dist/validators/company/field_detector.js.map +1 -1
  293. package/package.json +13 -11
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Service for writing formatted output to disk
3
+ *
4
+ * Handles file I/O operations including:
5
+ * - Creating directory structures
6
+ * - Writing files to disk
7
+ * - Creating ZIP archives
8
+ * - Path validation (security)
9
+ *
10
+ * @see Issue #983
11
+ */
12
+ import * as fs from 'fs/promises';
13
+ import * as path from 'path';
14
+ import { zipSync, strToU8 } from 'fflate';
15
+ /**
16
+ * Service for writing skill output to disk
17
+ */
18
+ export class OutputWriterService {
19
+ /**
20
+ * Writes formatted output to disk
21
+ *
22
+ * @param formatted - Formatted output from SchemaFormatterService
23
+ * @param config - Generation configuration
24
+ * @returns Information about written files
25
+ */
26
+ async write(formatted, config) {
27
+ const outputPath = this.resolveOutputPath(config);
28
+ // Create output directory
29
+ await fs.mkdir(outputPath, { recursive: true });
30
+ // Write all files
31
+ const writtenFiles = [];
32
+ for (const [relativePath, content] of Object.entries(formatted.files)) {
33
+ const fullPath = path.join(outputPath, relativePath);
34
+ const dir = path.dirname(fullPath);
35
+ // Ensure directory exists
36
+ await fs.mkdir(dir, { recursive: true });
37
+ // Write file
38
+ await fs.writeFile(fullPath, content, 'utf8');
39
+ writtenFiles.push(relativePath);
40
+ }
41
+ // Create ZIP if requested
42
+ if (config.zip) {
43
+ await this.createZip(outputPath, formatted.files);
44
+ writtenFiles.push(`${path.basename(outputPath)}.zip`);
45
+ }
46
+ return {
47
+ format: formatted.format,
48
+ path: outputPath,
49
+ files: writtenFiles,
50
+ };
51
+ }
52
+ /**
53
+ * Creates ZIP archive of output files
54
+ *
55
+ * @param basePath - Base directory path
56
+ * @param files - Map of relative paths to file contents
57
+ */
58
+ async createZip(basePath, files) {
59
+ // Convert files to fflate format (Uint8Array)
60
+ const fileMap = {};
61
+ for (const [relativePath, content] of Object.entries(files)) {
62
+ fileMap[relativePath] = strToU8(content);
63
+ }
64
+ // Create ZIP
65
+ const zipped = zipSync(fileMap, {
66
+ level: 6, // Compression level (0-9, 6 is default)
67
+ });
68
+ // Write ZIP file
69
+ const zipPath = `${basePath}.zip`;
70
+ await fs.writeFile(zipPath, zipped);
71
+ }
72
+ /**
73
+ * Resolves and validates output path
74
+ *
75
+ * @param config - Generation configuration
76
+ * @returns Absolute output path
77
+ * @throws Error if path validation fails (directory traversal attempt)
78
+ */
79
+ resolveOutputPath(config) {
80
+ // Determine base name based on format
81
+ const baseName = config.format === 'skill'
82
+ ? 'attio-workspace-skill'
83
+ : `attio-workspace-schema-${config.format}`;
84
+ // Resolve absolute paths
85
+ const outputDirResolved = path.resolve(config.outputDir);
86
+ const currentWorkingDir = process.cwd();
87
+ // Security: Prevent directory traversal attacks
88
+ // Check if outputDir attempts to escape the current working directory
89
+ const normalized = path.normalize(outputDirResolved);
90
+ // Only allow output within current working directory or subdirectories
91
+ if (!normalized.startsWith(currentWorkingDir)) {
92
+ throw new Error('Invalid output path: directory traversal detected. ' +
93
+ `Output directory must be within current working directory: ${currentWorkingDir}`);
94
+ }
95
+ // Construct final output path
96
+ const outputPath = path.join(outputDirResolved, baseName);
97
+ return outputPath;
98
+ }
99
+ }
100
+ //# sourceMappingURL=OutputWriterService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OutputWriterService.js","sourceRoot":"","sources":["../../../src/services/skill-generator/OutputWriterService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Service for formatting workspace schemas into various output formats
3
+ *
4
+ * Uses Handlebars templates to transform WorkspaceSchema objects into:
5
+ * - Claude Skills (SKILL.md + resources/)
6
+ * - Plain Markdown (single file)
7
+ * - JSON (machine-readable)
8
+ *
9
+ * @see Issue #983
10
+ */
11
+ import type { WorkspaceSchema, FormattedOutput } from './types.js';
12
+ /**
13
+ * Service for formatting workspace schemas into various output formats
14
+ */
15
+ export declare class SchemaFormatterService {
16
+ private templates;
17
+ private helpersRegistered;
18
+ constructor();
19
+ /**
20
+ * Formats schema to specified output format
21
+ *
22
+ * @param schema - Complete workspace schema
23
+ * @param format - Output format (skill, markdown, json)
24
+ * @returns Formatted output ready for writing
25
+ */
26
+ format(schema: WorkspaceSchema, format: 'skill' | 'markdown' | 'json'): Promise<FormattedOutput>;
27
+ /**
28
+ * Formats as Claude Skill with SKILL.md + resources/
29
+ *
30
+ * @param schema - Workspace schema
31
+ * @returns Skill files ready for writing
32
+ */
33
+ private formatAsSkill;
34
+ /**
35
+ * Formats as single markdown file (all-in-one)
36
+ *
37
+ * @param schema - Workspace schema
38
+ * @returns Single markdown file
39
+ */
40
+ private formatAsMarkdown;
41
+ /**
42
+ * Formats as JSON (machine-readable)
43
+ *
44
+ * @param schema - Workspace schema
45
+ * @returns JSON representation
46
+ */
47
+ private formatAsJSON;
48
+ /**
49
+ * Renders a template with the given data
50
+ *
51
+ * @param templateName - Template filename
52
+ * @param data - Data to pass to template
53
+ * @returns Rendered template string
54
+ */
55
+ private renderTemplate;
56
+ /**
57
+ * Registers custom Handlebars helpers
58
+ */
59
+ private registerHelpers;
60
+ }
61
+ //# sourceMappingURL=SchemaFormatterService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaFormatterService.d.ts","sourceRoot":"","sources":["../../../src/services/skill-generator/SchemaFormatterService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAMnE;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,SAAS,CAAsD;IACvE,OAAO,CAAC,iBAAiB,CAAS;;IAMlC;;;;;;OAMG;IACG,MAAM,CACV,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,GACpC,OAAO,CAAC,eAAe,CAAC;IAa3B;;;;;OAKG;YACW,aAAa;IAsD3B;;;;;OAKG;YACW,gBAAgB;IAyB9B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IASpB;;;;;;OAMG;YACW,cAAc;IA+B5B;;OAEG;IACH,OAAO,CAAC,eAAe;CAsBxB"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Service for formatting workspace schemas into various output formats
3
+ *
4
+ * Uses Handlebars templates to transform WorkspaceSchema objects into:
5
+ * - Claude Skills (SKILL.md + resources/)
6
+ * - Plain Markdown (single file)
7
+ * - JSON (machine-readable)
8
+ *
9
+ * @see Issue #983
10
+ */
11
+ import Handlebars from 'handlebars';
12
+ import * as fs from 'fs/promises';
13
+ import * as path from 'path';
14
+ import { fileURLToPath } from 'url';
15
+ // Get __dirname equivalent in ES modules
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+ /**
19
+ * Service for formatting workspace schemas into various output formats
20
+ */
21
+ export class SchemaFormatterService {
22
+ templates = new Map();
23
+ helpersRegistered = false;
24
+ constructor() {
25
+ this.registerHelpers();
26
+ }
27
+ /**
28
+ * Formats schema to specified output format
29
+ *
30
+ * @param schema - Complete workspace schema
31
+ * @param format - Output format (skill, markdown, json)
32
+ * @returns Formatted output ready for writing
33
+ */
34
+ async format(schema, format) {
35
+ switch (format) {
36
+ case 'skill':
37
+ return this.formatAsSkill(schema);
38
+ case 'markdown':
39
+ return this.formatAsMarkdown(schema);
40
+ case 'json':
41
+ return this.formatAsJSON(schema);
42
+ default:
43
+ throw new Error(`Unsupported format: ${format}`);
44
+ }
45
+ }
46
+ /**
47
+ * Formats as Claude Skill with SKILL.md + resources/
48
+ *
49
+ * @param schema - Workspace schema
50
+ * @returns Skill files ready for writing
51
+ */
52
+ async formatAsSkill(schema) {
53
+ const skillMd = await this.renderTemplate('SKILL.template.md', schema);
54
+ // Validate Claude Skill description length requirement (≤200 chars)
55
+ const descMatch = skillMd.match(/^description:\s*(.+)$/m);
56
+ if (descMatch && descMatch[1].length > 200) {
57
+ throw new Error(`Skill description exceeds 200 characters (${descMatch[1].length} chars). ` +
58
+ `Claude Skills require descriptions ≤200 chars. ` +
59
+ `Try reducing the number of objects or simplifying the description.`);
60
+ }
61
+ // Validate Claude Skill name length requirement (≤64 chars)
62
+ const nameMatch = skillMd.match(/^name:\s*(.+)$/m);
63
+ if (nameMatch && nameMatch[1].trim().length > 64) {
64
+ throw new Error(`Skill name exceeds 64 characters (${nameMatch[1].trim().length} chars). ` +
65
+ `Claude Skills require names ≤64 chars.`);
66
+ }
67
+ // Generate per-object attribute files for progressive disclosure
68
+ // This enables Claude to load only the object it's working with (~2k tokens)
69
+ // instead of the entire monolithic file (~10k tokens)
70
+ // @see Issue #1014
71
+ const attributeFiles = {};
72
+ for (const obj of schema.objects) {
73
+ const objectSchema = { ...schema, objects: [obj] };
74
+ const attrMd = await this.renderTemplate('attribute-reference.template.md', objectSchema);
75
+ attributeFiles[`resources/${obj.objectSlug}-attributes.md`] = attrMd;
76
+ }
77
+ const complexTypes = await this.renderTemplate('complex-types.template.md', schema);
78
+ return {
79
+ format: 'skill',
80
+ files: {
81
+ 'SKILL.md': skillMd,
82
+ ...attributeFiles,
83
+ 'resources/complex-types.md': complexTypes,
84
+ },
85
+ };
86
+ }
87
+ /**
88
+ * Formats as single markdown file (all-in-one)
89
+ *
90
+ * @param schema - Workspace schema
91
+ * @returns Single markdown file
92
+ */
93
+ async formatAsMarkdown(schema) {
94
+ // Render all templates and combine them
95
+ const skillMd = await this.renderTemplate('SKILL.template.md', schema);
96
+ const attrRef = await this.renderTemplate('attribute-reference.template.md', schema);
97
+ const complexTypes = await this.renderTemplate('complex-types.template.md', schema);
98
+ // Combine into single document
99
+ const combined = `${skillMd}\n\n---\n\n${attrRef}\n\n---\n\n${complexTypes}`;
100
+ return {
101
+ format: 'markdown',
102
+ files: {
103
+ 'attio-workspace-schema.md': combined,
104
+ },
105
+ };
106
+ }
107
+ /**
108
+ * Formats as JSON (machine-readable)
109
+ *
110
+ * @param schema - Workspace schema
111
+ * @returns JSON representation
112
+ */
113
+ formatAsJSON(schema) {
114
+ return {
115
+ format: 'json',
116
+ files: {
117
+ 'attio-workspace-schema.json': JSON.stringify(schema, null, 2),
118
+ },
119
+ };
120
+ }
121
+ /**
122
+ * Renders a template with the given data
123
+ *
124
+ * @param templateName - Template filename
125
+ * @param data - Data to pass to template
126
+ * @returns Rendered template string
127
+ */
128
+ async renderTemplate(templateName, data) {
129
+ // Check cache first
130
+ if (!this.templates.has(templateName)) {
131
+ // Load and compile template
132
+ const templatePath = path.join(__dirname, '../../templates/skill', templateName);
133
+ try {
134
+ const templateSource = await fs.readFile(templatePath, 'utf8');
135
+ const compiledTemplate = Handlebars.compile(templateSource);
136
+ this.templates.set(templateName, compiledTemplate);
137
+ }
138
+ catch (error) {
139
+ throw new Error(`Failed to load template ${templateName}: ${error instanceof Error ? error.message : String(error)}`);
140
+ }
141
+ }
142
+ // Render template
143
+ const template = this.templates.get(templateName);
144
+ return template(data);
145
+ }
146
+ /**
147
+ * Registers custom Handlebars helpers
148
+ */
149
+ registerHelpers() {
150
+ if (this.helpersRegistered) {
151
+ return;
152
+ }
153
+ // Helper: Display checkmark or X for boolean values
154
+ Handlebars.registerHelper('checkmark', (value) => {
155
+ return value ? '✓' : '✗';
156
+ });
157
+ // Helper: Subtract two numbers
158
+ Handlebars.registerHelper('subtract', (a, b) => {
159
+ return a - b;
160
+ });
161
+ // Helper: JSON stringify with formatting
162
+ Handlebars.registerHelper('json', (obj) => {
163
+ return JSON.stringify(obj, null, 2);
164
+ });
165
+ this.helpersRegistered = true;
166
+ }
167
+ }
168
+ //# sourceMappingURL=SchemaFormatterService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SchemaFormatterService.js","sourceRoot":"","sources":["../../../src/services/skill-generator/SchemaFormatterService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Service for fetching and aggregating Attio workspace schema data
3
+ *
4
+ * This service orchestrates calls to existing services to build a complete
5
+ * workspace schema including objects, attributes, select options, and metadata.
6
+ *
7
+ * @see Issue #983
8
+ */
9
+ import type { WorkspaceSchema, FetchSchemaOptions } from './types.js';
10
+ /**
11
+ * Service for fetching complete workspace schema data
12
+ *
13
+ * Note: API key flows through getLazyAttioClient() from environment/context,
14
+ * not through constructor dependency injection.
15
+ */
16
+ export declare class WorkspaceSchemaService {
17
+ /**
18
+ * Creates a new WorkspaceSchemaService
19
+ */
20
+ constructor();
21
+ /**
22
+ * Fetches the display title for an object from the Attio API
23
+ *
24
+ * @param objectSlug - Object API slug (e.g., 'companies', 'custom_prospecting_list')
25
+ * @returns The object title from Attio, or null if fetch fails
26
+ * @see Issue #1017
27
+ */
28
+ private fetchObjectTitle;
29
+ private getOptionFetchDelayMs;
30
+ /**
31
+ * Fetches complete workspace schema for specified objects
32
+ *
33
+ * This method implements graceful degradation:
34
+ * - If an object fails to fetch, it logs the error and continues with other objects
35
+ * - If an attribute's options fail to fetch, it includes the attribute without options
36
+ *
37
+ * @param objectSlugs - Array of object slugs to fetch (e.g., ['companies', 'people'])
38
+ * @param options - Fetching options (max options, include archived)
39
+ * @returns Complete workspace schema
40
+ */
41
+ fetchSchema(objectSlugs: string[], options: FetchSchemaOptions): Promise<WorkspaceSchema>;
42
+ /**
43
+ * Fetches schema for a single object
44
+ *
45
+ * @param objectSlug - Object slug (e.g., 'companies', 'people', 'deals')
46
+ * @param options - Fetching options
47
+ * @returns Object schema with all attributes and metadata
48
+ */
49
+ private fetchObjectSchema;
50
+ /**
51
+ * Checks if an attribute type supports options (select, status, multi-select)
52
+ *
53
+ * @param type - Attribute type from Attio API
54
+ * @returns True if attribute supports options
55
+ */
56
+ private isOptionBasedAttribute;
57
+ /**
58
+ * Checks if an attribute type is a complex type requiring structure documentation
59
+ *
60
+ * @param type - Attribute type from Attio API
61
+ * @returns True if attribute is a complex type
62
+ */
63
+ private isComplexType;
64
+ /**
65
+ * Gets the structure definition for complex attribute types
66
+ *
67
+ * @param type - Complex attribute type
68
+ * @returns Structure definition with field types
69
+ */
70
+ private getComplexTypeStructure;
71
+ /**
72
+ * Gets human-readable display name for an object slug
73
+ *
74
+ * Uses the fetched title from Attio API if available, otherwise falls back
75
+ * to hardcoded display names for Phase 1 objects or slug capitalization.
76
+ *
77
+ * @param objectSlug - Object API slug
78
+ * @param fetchedTitle - Title fetched from Attio API (optional)
79
+ * @returns Human-readable display name
80
+ * @see Issue #1017
81
+ */
82
+ private getDisplayName;
83
+ }
84
+ //# sourceMappingURL=WorkspaceSchemaService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkspaceSchemaService.d.ts","sourceRoot":"","sources":["../../../src/services/skill-generator/WorkspaceSchemaService.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,OAAO,KAAK,EACV,eAAe,EAGf,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAsCpB;;;;;GAKG;AACH,qBAAa,sBAAsB;IACjC;;OAEG;;IAKH;;;;;;OAMG;YACW,gBAAgB;IAgB9B,OAAO,CAAC,qBAAqB;IAa7B;;;;;;;;;;OAUG;IACG,WAAW,CACf,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,eAAe,CAAC;IA4B3B;;;;;;OAMG;YACW,iBAAiB;IA2G/B;;;;;OAKG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;;;;OAKG;IACH,OAAO,CAAC,aAAa;IASrB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IA0C/B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;CAyBvB"}