codika 3.0.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 (403) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +68 -0
  3. package/dist/cli/commands/completion.d.ts +15 -0
  4. package/dist/cli/commands/completion.d.ts.map +1 -0
  5. package/dist/cli/commands/completion.js +810 -0
  6. package/dist/cli/commands/completion.js.map +1 -0
  7. package/dist/cli/commands/config/clear.d.ts +12 -0
  8. package/dist/cli/commands/config/clear.d.ts.map +1 -0
  9. package/dist/cli/commands/config/clear.js +35 -0
  10. package/dist/cli/commands/config/clear.js.map +1 -0
  11. package/dist/cli/commands/config/index.d.ts +15 -0
  12. package/dist/cli/commands/config/index.d.ts.map +1 -0
  13. package/dist/cli/commands/config/index.js +21 -0
  14. package/dist/cli/commands/config/index.js.map +1 -0
  15. package/dist/cli/commands/config/set.d.ts +41 -0
  16. package/dist/cli/commands/config/set.d.ts.map +1 -0
  17. package/dist/cli/commands/config/set.js +185 -0
  18. package/dist/cli/commands/config/set.js.map +1 -0
  19. package/dist/cli/commands/config/show.d.ts +12 -0
  20. package/dist/cli/commands/config/show.d.ts.map +1 -0
  21. package/dist/cli/commands/config/show.js +45 -0
  22. package/dist/cli/commands/config/show.js.map +1 -0
  23. package/dist/cli/commands/deploy/documents.d.ts +12 -0
  24. package/dist/cli/commands/deploy/documents.d.ts.map +1 -0
  25. package/dist/cli/commands/deploy/documents.js +217 -0
  26. package/dist/cli/commands/deploy/documents.js.map +1 -0
  27. package/dist/cli/commands/deploy/index.d.ts +14 -0
  28. package/dist/cli/commands/deploy/index.d.ts.map +1 -0
  29. package/dist/cli/commands/deploy/index.js +21 -0
  30. package/dist/cli/commands/deploy/index.js.map +1 -0
  31. package/dist/cli/commands/deploy/process-data-ingestion.d.ts +13 -0
  32. package/dist/cli/commands/deploy/process-data-ingestion.d.ts.map +1 -0
  33. package/dist/cli/commands/deploy/process-data-ingestion.js +226 -0
  34. package/dist/cli/commands/deploy/process-data-ingestion.js.map +1 -0
  35. package/dist/cli/commands/deploy/use-case.d.ts +9 -0
  36. package/dist/cli/commands/deploy/use-case.d.ts.map +1 -0
  37. package/dist/cli/commands/deploy/use-case.js +212 -0
  38. package/dist/cli/commands/deploy/use-case.js.map +1 -0
  39. package/dist/cli/commands/get/execution.d.ts +9 -0
  40. package/dist/cli/commands/get/execution.d.ts.map +1 -0
  41. package/dist/cli/commands/get/execution.js +159 -0
  42. package/dist/cli/commands/get/execution.js.map +1 -0
  43. package/dist/cli/commands/get/index.d.ts +13 -0
  44. package/dist/cli/commands/get/index.d.ts.map +1 -0
  45. package/dist/cli/commands/get/index.js +20 -0
  46. package/dist/cli/commands/get/index.js.map +1 -0
  47. package/dist/cli/commands/get/skills.d.ts +15 -0
  48. package/dist/cli/commands/get/skills.d.ts.map +1 -0
  49. package/dist/cli/commands/get/skills.js +135 -0
  50. package/dist/cli/commands/get/skills.js.map +1 -0
  51. package/dist/cli/commands/get/use-case.d.ts +9 -0
  52. package/dist/cli/commands/get/use-case.d.ts.map +1 -0
  53. package/dist/cli/commands/get/use-case.js +186 -0
  54. package/dist/cli/commands/get/use-case.js.map +1 -0
  55. package/dist/cli/commands/init.d.ts +14 -0
  56. package/dist/cli/commands/init.d.ts.map +1 -0
  57. package/dist/cli/commands/init.js +347 -0
  58. package/dist/cli/commands/init.js.map +1 -0
  59. package/dist/cli/commands/integration/delete.d.ts +13 -0
  60. package/dist/cli/commands/integration/delete.d.ts.map +1 -0
  61. package/dist/cli/commands/integration/delete.js +140 -0
  62. package/dist/cli/commands/integration/delete.js.map +1 -0
  63. package/dist/cli/commands/integration/index.d.ts +13 -0
  64. package/dist/cli/commands/integration/index.d.ts.map +1 -0
  65. package/dist/cli/commands/integration/index.js +20 -0
  66. package/dist/cli/commands/integration/index.js.map +1 -0
  67. package/dist/cli/commands/integration/list.d.ts +13 -0
  68. package/dist/cli/commands/integration/list.d.ts.map +1 -0
  69. package/dist/cli/commands/integration/list.js +129 -0
  70. package/dist/cli/commands/integration/list.js.map +1 -0
  71. package/dist/cli/commands/integration/set.d.ts +13 -0
  72. package/dist/cli/commands/integration/set.d.ts.map +1 -0
  73. package/dist/cli/commands/integration/set.js +253 -0
  74. package/dist/cli/commands/integration/set.js.map +1 -0
  75. package/dist/cli/commands/list/executions.d.ts +12 -0
  76. package/dist/cli/commands/list/executions.d.ts.map +1 -0
  77. package/dist/cli/commands/list/executions.js +168 -0
  78. package/dist/cli/commands/list/executions.js.map +1 -0
  79. package/dist/cli/commands/list/index.d.ts +11 -0
  80. package/dist/cli/commands/list/index.d.ts.map +1 -0
  81. package/dist/cli/commands/list/index.js +14 -0
  82. package/dist/cli/commands/list/index.js.map +1 -0
  83. package/dist/cli/commands/logout.d.ts +12 -0
  84. package/dist/cli/commands/logout.d.ts.map +1 -0
  85. package/dist/cli/commands/logout.js +58 -0
  86. package/dist/cli/commands/logout.js.map +1 -0
  87. package/dist/cli/commands/project/create.d.ts +8 -0
  88. package/dist/cli/commands/project/create.d.ts.map +1 -0
  89. package/dist/cli/commands/project/create.js +109 -0
  90. package/dist/cli/commands/project/create.js.map +1 -0
  91. package/dist/cli/commands/project/index.d.ts +12 -0
  92. package/dist/cli/commands/project/index.d.ts.map +1 -0
  93. package/dist/cli/commands/project/index.js +15 -0
  94. package/dist/cli/commands/project/index.js.map +1 -0
  95. package/dist/cli/commands/publish.d.ts +12 -0
  96. package/dist/cli/commands/publish.d.ts.map +1 -0
  97. package/dist/cli/commands/publish.js +152 -0
  98. package/dist/cli/commands/publish.js.map +1 -0
  99. package/dist/cli/commands/redeploy.d.ts +11 -0
  100. package/dist/cli/commands/redeploy.d.ts.map +1 -0
  101. package/dist/cli/commands/redeploy.js +166 -0
  102. package/dist/cli/commands/redeploy.js.map +1 -0
  103. package/dist/cli/commands/status.d.ts +63 -0
  104. package/dist/cli/commands/status.d.ts.map +1 -0
  105. package/dist/cli/commands/status.js +290 -0
  106. package/dist/cli/commands/status.js.map +1 -0
  107. package/dist/cli/commands/trigger.d.ts +8 -0
  108. package/dist/cli/commands/trigger.d.ts.map +1 -0
  109. package/dist/cli/commands/trigger.js +247 -0
  110. package/dist/cli/commands/trigger.js.map +1 -0
  111. package/dist/cli/commands/use.d.ts +13 -0
  112. package/dist/cli/commands/use.d.ts.map +1 -0
  113. package/dist/cli/commands/use.js +92 -0
  114. package/dist/cli/commands/use.js.map +1 -0
  115. package/dist/cli/commands/verify/index.d.ts +13 -0
  116. package/dist/cli/commands/verify/index.d.ts.map +1 -0
  117. package/dist/cli/commands/verify/index.js +18 -0
  118. package/dist/cli/commands/verify/index.js.map +1 -0
  119. package/dist/cli/commands/verify/use-case.d.ts +23 -0
  120. package/dist/cli/commands/verify/use-case.d.ts.map +1 -0
  121. package/dist/cli/commands/verify/use-case.js +94 -0
  122. package/dist/cli/commands/verify/use-case.js.map +1 -0
  123. package/dist/cli/commands/verify/workflow.d.ts +22 -0
  124. package/dist/cli/commands/verify/workflow.d.ts.map +1 -0
  125. package/dist/cli/commands/verify/workflow.js +82 -0
  126. package/dist/cli/commands/verify/workflow.js.map +1 -0
  127. package/dist/cli/commands/whoami.d.ts +13 -0
  128. package/dist/cli/commands/whoami.d.ts.map +1 -0
  129. package/dist/cli/commands/whoami.js +126 -0
  130. package/dist/cli/commands/whoami.js.map +1 -0
  131. package/dist/cli/index.d.ts +24 -0
  132. package/dist/cli/index.d.ts.map +1 -0
  133. package/dist/cli/index.js +90 -0
  134. package/dist/cli/index.js.map +1 -0
  135. package/dist/cli/templates/claude-md-template.d.ts +12 -0
  136. package/dist/cli/templates/claude-md-template.d.ts.map +1 -0
  137. package/dist/cli/templates/claude-md-template.js +162 -0
  138. package/dist/cli/templates/claude-md-template.js.map +1 -0
  139. package/dist/cli/templates/config-template.d.ts +18 -0
  140. package/dist/cli/templates/config-template.d.ts.map +1 -0
  141. package/dist/cli/templates/config-template.js +350 -0
  142. package/dist/cli/templates/config-template.js.map +1 -0
  143. package/dist/cli/templates/skill-templates.d.ts +24 -0
  144. package/dist/cli/templates/skill-templates.d.ts.map +1 -0
  145. package/dist/cli/templates/skill-templates.js +117 -0
  146. package/dist/cli/templates/skill-templates.js.map +1 -0
  147. package/dist/cli/templates/slug.d.ts +9 -0
  148. package/dist/cli/templates/slug.d.ts.map +1 -0
  149. package/dist/cli/templates/slug.js +17 -0
  150. package/dist/cli/templates/slug.js.map +1 -0
  151. package/dist/cli/templates/workflow-templates.d.ts +693 -0
  152. package/dist/cli/templates/workflow-templates.d.ts.map +1 -0
  153. package/dist/cli/templates/workflow-templates.js +516 -0
  154. package/dist/cli/templates/workflow-templates.js.map +1 -0
  155. package/dist/cli/utils/output.d.ts +65 -0
  156. package/dist/cli/utils/output.d.ts.map +1 -0
  157. package/dist/cli/utils/output.js +188 -0
  158. package/dist/cli/utils/output.js.map +1 -0
  159. package/dist/cli/utils/validation-output.d.ts +21 -0
  160. package/dist/cli/utils/validation-output.d.ts.map +1 -0
  161. package/dist/cli/utils/validation-output.js +204 -0
  162. package/dist/cli/utils/validation-output.js.map +1 -0
  163. package/dist/data/integration-fields.d.ts +27 -0
  164. package/dist/data/integration-fields.d.ts.map +1 -0
  165. package/dist/data/integration-fields.js +361 -0
  166. package/dist/data/integration-fields.js.map +1 -0
  167. package/dist/index.d.ts +25 -0
  168. package/dist/index.d.ts.map +1 -0
  169. package/dist/index.js +39 -0
  170. package/dist/index.js.map +1 -0
  171. package/dist/types/process-types.d.ts +740 -0
  172. package/dist/types/process-types.d.ts.map +1 -0
  173. package/dist/types/process-types.js +22 -0
  174. package/dist/types/process-types.js.map +1 -0
  175. package/dist/utils/config.d.ts +127 -0
  176. package/dist/utils/config.d.ts.map +1 -0
  177. package/dist/utils/config.js +315 -0
  178. package/dist/utils/config.js.map +1 -0
  179. package/dist/utils/data-ingestion-deploy-client.d.ts +53 -0
  180. package/dist/utils/data-ingestion-deploy-client.d.ts.map +1 -0
  181. package/dist/utils/data-ingestion-deploy-client.js +63 -0
  182. package/dist/utils/data-ingestion-deploy-client.js.map +1 -0
  183. package/dist/utils/data-ingestion-deployer.d.ts +78 -0
  184. package/dist/utils/data-ingestion-deployer.d.ts.map +1 -0
  185. package/dist/utils/data-ingestion-deployer.js +119 -0
  186. package/dist/utils/data-ingestion-deployer.js.map +1 -0
  187. package/dist/utils/deploy-client.d.ts +55 -0
  188. package/dist/utils/deploy-client.d.ts.map +1 -0
  189. package/dist/utils/deploy-client.js +73 -0
  190. package/dist/utils/deploy-client.js.map +1 -0
  191. package/dist/utils/deployment-archiver.d.ts +110 -0
  192. package/dist/utils/deployment-archiver.d.ts.map +1 -0
  193. package/dist/utils/deployment-archiver.js +158 -0
  194. package/dist/utils/deployment-archiver.js.map +1 -0
  195. package/dist/utils/document-deploy-client.d.ts +41 -0
  196. package/dist/utils/document-deploy-client.d.ts.map +1 -0
  197. package/dist/utils/document-deploy-client.js +46 -0
  198. package/dist/utils/document-deploy-client.js.map +1 -0
  199. package/dist/utils/encryption.d.ts +85 -0
  200. package/dist/utils/encryption.d.ts.map +1 -0
  201. package/dist/utils/encryption.js +162 -0
  202. package/dist/utils/encryption.js.map +1 -0
  203. package/dist/utils/execution-client.d.ts +71 -0
  204. package/dist/utils/execution-client.d.ts.map +1 -0
  205. package/dist/utils/execution-client.js +56 -0
  206. package/dist/utils/execution-client.js.map +1 -0
  207. package/dist/utils/integration-client.d.ts +134 -0
  208. package/dist/utils/integration-client.d.ts.map +1 -0
  209. package/dist/utils/integration-client.js +109 -0
  210. package/dist/utils/integration-client.js.map +1 -0
  211. package/dist/utils/list-executions-client.d.ts +47 -0
  212. package/dist/utils/list-executions-client.d.ts.map +1 -0
  213. package/dist/utils/list-executions-client.js +50 -0
  214. package/dist/utils/list-executions-client.js.map +1 -0
  215. package/dist/utils/metadata-client.d.ts +90 -0
  216. package/dist/utils/metadata-client.d.ts.map +1 -0
  217. package/dist/utils/metadata-client.js +66 -0
  218. package/dist/utils/metadata-client.js.map +1 -0
  219. package/dist/utils/project-client.d.ts +70 -0
  220. package/dist/utils/project-client.d.ts.map +1 -0
  221. package/dist/utils/project-client.js +63 -0
  222. package/dist/utils/project-client.js.map +1 -0
  223. package/dist/utils/project-json.d.ts +71 -0
  224. package/dist/utils/project-json.d.ts.map +1 -0
  225. package/dist/utils/project-json.js +129 -0
  226. package/dist/utils/project-json.js.map +1 -0
  227. package/dist/utils/publish-client.d.ts +53 -0
  228. package/dist/utils/publish-client.d.ts.map +1 -0
  229. package/dist/utils/publish-client.js +64 -0
  230. package/dist/utils/publish-client.js.map +1 -0
  231. package/dist/utils/redeploy-client.d.ts +39 -0
  232. package/dist/utils/redeploy-client.d.ts.map +1 -0
  233. package/dist/utils/redeploy-client.js +51 -0
  234. package/dist/utils/redeploy-client.js.map +1 -0
  235. package/dist/utils/skill-parser.d.ts +52 -0
  236. package/dist/utils/skill-parser.d.ts.map +1 -0
  237. package/dist/utils/skill-parser.js +127 -0
  238. package/dist/utils/skill-parser.js.map +1 -0
  239. package/dist/utils/skills-client.d.ts +39 -0
  240. package/dist/utils/skills-client.d.ts.map +1 -0
  241. package/dist/utils/skills-client.js +32 -0
  242. package/dist/utils/skills-client.js.map +1 -0
  243. package/dist/utils/trigger-client.d.ts +78 -0
  244. package/dist/utils/trigger-client.d.ts.map +1 -0
  245. package/dist/utils/trigger-client.js +81 -0
  246. package/dist/utils/trigger-client.js.map +1 -0
  247. package/dist/utils/use-case-deployer.d.ts +93 -0
  248. package/dist/utils/use-case-deployer.d.ts.map +1 -0
  249. package/dist/utils/use-case-deployer.js +270 -0
  250. package/dist/utils/use-case-deployer.js.map +1 -0
  251. package/dist/utils/version-manager.d.ts +63 -0
  252. package/dist/utils/version-manager.d.ts.map +1 -0
  253. package/dist/utils/version-manager.js +91 -0
  254. package/dist/utils/version-manager.js.map +1 -0
  255. package/dist/utils/workflow-encoding.d.ts +26 -0
  256. package/dist/utils/workflow-encoding.d.ts.map +1 -0
  257. package/dist/utils/workflow-encoding.js +41 -0
  258. package/dist/utils/workflow-encoding.js.map +1 -0
  259. package/dist/validation/fixer.d.ts +56 -0
  260. package/dist/validation/fixer.d.ts.map +1 -0
  261. package/dist/validation/fixer.js +168 -0
  262. package/dist/validation/fixer.js.map +1 -0
  263. package/dist/validation/rules/codika-init-required.d.ts +18 -0
  264. package/dist/validation/rules/codika-init-required.d.ts.map +1 -0
  265. package/dist/validation/rules/codika-init-required.js +70 -0
  266. package/dist/validation/rules/codika-init-required.js.map +1 -0
  267. package/dist/validation/rules/codika-submit-result.d.ts +22 -0
  268. package/dist/validation/rules/codika-submit-result.d.ts.map +1 -0
  269. package/dist/validation/rules/codika-submit-result.js +144 -0
  270. package/dist/validation/rules/codika-submit-result.js.map +1 -0
  271. package/dist/validation/rules/error-branch-required.d.ts +24 -0
  272. package/dist/validation/rules/error-branch-required.d.ts.map +1 -0
  273. package/dist/validation/rules/error-branch-required.js +103 -0
  274. package/dist/validation/rules/error-branch-required.js.map +1 -0
  275. package/dist/validation/rules/index.d.ts +18 -0
  276. package/dist/validation/rules/index.d.ts.map +1 -0
  277. package/dist/validation/rules/index.js +28 -0
  278. package/dist/validation/rules/index.js.map +1 -0
  279. package/dist/validation/rules/schedule-webhook-convergence.d.ts +24 -0
  280. package/dist/validation/rules/schedule-webhook-convergence.d.ts.map +1 -0
  281. package/dist/validation/rules/schedule-webhook-convergence.js +129 -0
  282. package/dist/validation/rules/schedule-webhook-convergence.js.map +1 -0
  283. package/dist/validation/rules/subworkflow-min-params.d.ts +21 -0
  284. package/dist/validation/rules/subworkflow-min-params.d.ts.map +1 -0
  285. package/dist/validation/rules/subworkflow-min-params.js +84 -0
  286. package/dist/validation/rules/subworkflow-min-params.js.map +1 -0
  287. package/dist/validation/runner.d.ts +43 -0
  288. package/dist/validation/runner.d.ts.map +1 -0
  289. package/dist/validation/runner.js +335 -0
  290. package/dist/validation/runner.js.map +1 -0
  291. package/dist/validation/types.d.ts +155 -0
  292. package/dist/validation/types.d.ts.map +1 -0
  293. package/dist/validation/types.js +8 -0
  294. package/dist/validation/types.js.map +1 -0
  295. package/dist/validation/use-case-scripts/calledby-consistency.d.ts +23 -0
  296. package/dist/validation/use-case-scripts/calledby-consistency.d.ts.map +1 -0
  297. package/dist/validation/use-case-scripts/calledby-consistency.js +236 -0
  298. package/dist/validation/use-case-scripts/calledby-consistency.js.map +1 -0
  299. package/dist/validation/use-case-scripts/config-exports.d.ts +17 -0
  300. package/dist/validation/use-case-scripts/config-exports.d.ts.map +1 -0
  301. package/dist/validation/use-case-scripts/config-exports.js +93 -0
  302. package/dist/validation/use-case-scripts/config-exports.js.map +1 -0
  303. package/dist/validation/use-case-scripts/custom-integration-schema.d.ts +21 -0
  304. package/dist/validation/use-case-scripts/custom-integration-schema.d.ts.map +1 -0
  305. package/dist/validation/use-case-scripts/custom-integration-schema.js +378 -0
  306. package/dist/validation/use-case-scripts/custom-integration-schema.js.map +1 -0
  307. package/dist/validation/use-case-scripts/index.d.ts +27 -0
  308. package/dist/validation/use-case-scripts/index.d.ts.map +1 -0
  309. package/dist/validation/use-case-scripts/index.js +52 -0
  310. package/dist/validation/use-case-scripts/index.js.map +1 -0
  311. package/dist/validation/use-case-scripts/integration-inheritance.d.ts +35 -0
  312. package/dist/validation/use-case-scripts/integration-inheritance.d.ts.map +1 -0
  313. package/dist/validation/use-case-scripts/integration-inheritance.js +348 -0
  314. package/dist/validation/use-case-scripts/integration-inheritance.js.map +1 -0
  315. package/dist/validation/use-case-scripts/schema-types.d.ts +21 -0
  316. package/dist/validation/use-case-scripts/schema-types.d.ts.map +1 -0
  317. package/dist/validation/use-case-scripts/schema-types.js +134 -0
  318. package/dist/validation/use-case-scripts/schema-types.js.map +1 -0
  319. package/dist/validation/use-case-scripts/skill-consistency.d.ts +21 -0
  320. package/dist/validation/use-case-scripts/skill-consistency.d.ts.map +1 -0
  321. package/dist/validation/use-case-scripts/skill-consistency.js +180 -0
  322. package/dist/validation/use-case-scripts/skill-consistency.js.map +1 -0
  323. package/dist/validation/use-case-scripts/subworkflow-references.d.ts +22 -0
  324. package/dist/validation/use-case-scripts/subworkflow-references.d.ts.map +1 -0
  325. package/dist/validation/use-case-scripts/subworkflow-references.js +139 -0
  326. package/dist/validation/use-case-scripts/subworkflow-references.js.map +1 -0
  327. package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts +25 -0
  328. package/dist/validation/use-case-scripts/trigger-type-consistency.d.ts.map +1 -0
  329. package/dist/validation/use-case-scripts/trigger-type-consistency.js +265 -0
  330. package/dist/validation/use-case-scripts/trigger-type-consistency.js.map +1 -0
  331. package/dist/validation/use-case-scripts/trigger-types.d.ts +20 -0
  332. package/dist/validation/use-case-scripts/trigger-types.d.ts.map +1 -0
  333. package/dist/validation/use-case-scripts/trigger-types.js +177 -0
  334. package/dist/validation/use-case-scripts/trigger-types.js.map +1 -0
  335. package/dist/validation/use-case-scripts/triggers-required.d.ts +23 -0
  336. package/dist/validation/use-case-scripts/triggers-required.d.ts.map +1 -0
  337. package/dist/validation/use-case-scripts/triggers-required.js +111 -0
  338. package/dist/validation/use-case-scripts/triggers-required.js.map +1 -0
  339. package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts +28 -0
  340. package/dist/validation/use-case-scripts/webhook-path-consistency.d.ts.map +1 -0
  341. package/dist/validation/use-case-scripts/webhook-path-consistency.js +288 -0
  342. package/dist/validation/use-case-scripts/webhook-path-consistency.js.map +1 -0
  343. package/dist/validation/use-case-scripts/workflow-imports.d.ts +16 -0
  344. package/dist/validation/use-case-scripts/workflow-imports.d.ts.map +1 -0
  345. package/dist/validation/use-case-scripts/workflow-imports.js +206 -0
  346. package/dist/validation/use-case-scripts/workflow-imports.js.map +1 -0
  347. package/dist/validation/workflow-scripts/credential-placeholders.d.ts +21 -0
  348. package/dist/validation/workflow-scripts/credential-placeholders.d.ts.map +1 -0
  349. package/dist/validation/workflow-scripts/credential-placeholders.js +278 -0
  350. package/dist/validation/workflow-scripts/credential-placeholders.js.map +1 -0
  351. package/dist/validation/workflow-scripts/db-always-output.d.ts +16 -0
  352. package/dist/validation/workflow-scripts/db-always-output.d.ts.map +1 -0
  353. package/dist/validation/workflow-scripts/db-always-output.js +95 -0
  354. package/dist/validation/workflow-scripts/db-always-output.js.map +1 -0
  355. package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts +15 -0
  356. package/dist/validation/workflow-scripts/exec-workflow-wait.d.ts.map +1 -0
  357. package/dist/validation/workflow-scripts/exec-workflow-wait.js +85 -0
  358. package/dist/validation/workflow-scripts/exec-workflow-wait.js.map +1 -0
  359. package/dist/validation/workflow-scripts/index.d.ts +31 -0
  360. package/dist/validation/workflow-scripts/index.d.ts.map +1 -0
  361. package/dist/validation/workflow-scripts/index.js +58 -0
  362. package/dist/validation/workflow-scripts/index.js.map +1 -0
  363. package/dist/validation/workflow-scripts/instparm-quoting.d.ts +21 -0
  364. package/dist/validation/workflow-scripts/instparm-quoting.d.ts.map +1 -0
  365. package/dist/validation/workflow-scripts/instparm-quoting.js +59 -0
  366. package/dist/validation/workflow-scripts/instparm-quoting.js.map +1 -0
  367. package/dist/validation/workflow-scripts/llm-model-id.d.ts +17 -0
  368. package/dist/validation/workflow-scripts/llm-model-id.d.ts.map +1 -0
  369. package/dist/validation/workflow-scripts/llm-model-id.js +171 -0
  370. package/dist/validation/workflow-scripts/llm-model-id.js.map +1 -0
  371. package/dist/validation/workflow-scripts/llm-output-access.d.ts +23 -0
  372. package/dist/validation/workflow-scripts/llm-output-access.d.ts.map +1 -0
  373. package/dist/validation/workflow-scripts/llm-output-access.js +274 -0
  374. package/dist/validation/workflow-scripts/llm-output-access.js.map +1 -0
  375. package/dist/validation/workflow-scripts/merge-before-terminal.d.ts +20 -0
  376. package/dist/validation/workflow-scripts/merge-before-terminal.d.ts.map +1 -0
  377. package/dist/validation/workflow-scripts/merge-before-terminal.js +87 -0
  378. package/dist/validation/workflow-scripts/merge-before-terminal.js.map +1 -0
  379. package/dist/validation/workflow-scripts/placeholder-syntax.d.ts +29 -0
  380. package/dist/validation/workflow-scripts/placeholder-syntax.d.ts.map +1 -0
  381. package/dist/validation/workflow-scripts/placeholder-syntax.js +154 -0
  382. package/dist/validation/workflow-scripts/placeholder-syntax.js.map +1 -0
  383. package/dist/validation/workflow-scripts/retry-backoff.d.ts +16 -0
  384. package/dist/validation/workflow-scripts/retry-backoff.d.ts.map +1 -0
  385. package/dist/validation/workflow-scripts/retry-backoff.js +197 -0
  386. package/dist/validation/workflow-scripts/retry-backoff.js.map +1 -0
  387. package/dist/validation/workflow-scripts/webhook-id.d.ts +17 -0
  388. package/dist/validation/workflow-scripts/webhook-id.d.ts.map +1 -0
  389. package/dist/validation/workflow-scripts/webhook-id.js +79 -0
  390. package/dist/validation/workflow-scripts/webhook-id.js.map +1 -0
  391. package/dist/validation/workflow-scripts/workflow-format.d.ts +16 -0
  392. package/dist/validation/workflow-scripts/workflow-format.d.ts.map +1 -0
  393. package/dist/validation/workflow-scripts/workflow-format.js +51 -0
  394. package/dist/validation/workflow-scripts/workflow-format.js.map +1 -0
  395. package/dist/validation/workflow-scripts/workflow-sanitization.d.ts +21 -0
  396. package/dist/validation/workflow-scripts/workflow-sanitization.d.ts.map +1 -0
  397. package/dist/validation/workflow-scripts/workflow-sanitization.js +78 -0
  398. package/dist/validation/workflow-scripts/workflow-sanitization.js.map +1 -0
  399. package/dist/validation/workflow-scripts/workflow-settings.d.ts +19 -0
  400. package/dist/validation/workflow-scripts/workflow-settings.d.ts.map +1 -0
  401. package/dist/validation/workflow-scripts/workflow-settings.js +131 -0
  402. package/dist/validation/workflow-scripts/workflow-settings.js.map +1 -0
  403. package/package.json +64 -0
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Script: MERGE-BEFORE-TERMINAL
3
+ *
4
+ * Validates that Merge nodes are never directly connected to terminal
5
+ * Codika nodes (Submit Result / Report Error / Ingestion Callback).
6
+ *
7
+ * A Merge node immediately before a terminal Codika node causes the
8
+ * workflow to hang indefinitely: the Merge waits for ALL inputs, but
9
+ * typically only one conditional branch executes.
10
+ *
11
+ * Merge → Code → Submit Result is fine (indirect).
12
+ * Merge → Submit Result is a MUST-fix violation (direct).
13
+ */
14
+ export const metadata = {
15
+ id: 'MERGE-BEFORE-TERMINAL',
16
+ name: 'merge_before_terminal',
17
+ severity: 'must',
18
+ description: 'Merge nodes must not connect directly to terminal Codika nodes',
19
+ details: 'A Merge node immediately before Codika Submit Result or Report Error ' +
20
+ 'causes the workflow to hang because the Merge waits for all inputs. ' +
21
+ 'Insert a processing node (e.g., Code or Set) between the Merge and the terminal node, ' +
22
+ 'or duplicate the terminal node on each branch.',
23
+ category: 'structure',
24
+ };
25
+ const CODIKA_NODE_TYPE = 'n8n-nodes-codika.codika';
26
+ const MERGE_NODE_TYPE = 'n8n-nodes-base.merge';
27
+ const TERMINAL_OPERATIONS = new Set(['submitResult', 'reportError', 'ingestionCallback']);
28
+ /**
29
+ * Check for Merge nodes directly connected to terminal Codika nodes
30
+ */
31
+ export function checkMergeBeforeTerminal(content, path) {
32
+ const findings = [];
33
+ let parsed;
34
+ try {
35
+ parsed = JSON.parse(content);
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ const nodes = parsed.nodes || [];
41
+ const connections = parsed.connections || {};
42
+ if (nodes.length === 0)
43
+ return [];
44
+ // Build node lookup by name
45
+ const nodeByName = new Map();
46
+ for (const node of nodes) {
47
+ nodeByName.set(node.name, node);
48
+ }
49
+ // Find all Merge nodes
50
+ const mergeNodes = nodes.filter(n => n.type === MERGE_NODE_TYPE);
51
+ for (const mergeNode of mergeNodes) {
52
+ const mergeConnections = connections[mergeNode.name];
53
+ if (!mergeConnections?.main)
54
+ continue;
55
+ // Check all output indices
56
+ for (const outputGroup of mergeConnections.main) {
57
+ if (!Array.isArray(outputGroup))
58
+ continue;
59
+ for (const conn of outputGroup) {
60
+ const targetNode = nodeByName.get(conn.node);
61
+ if (!targetNode)
62
+ continue;
63
+ // Check if target is a terminal Codika node
64
+ if (targetNode.type === CODIKA_NODE_TYPE &&
65
+ TERMINAL_OPERATIONS.has(targetNode.parameters?.operation)) {
66
+ findings.push({
67
+ rule: metadata.id,
68
+ severity: metadata.severity,
69
+ path,
70
+ message: `Merge node "${mergeNode.name}" connects directly to terminal node "${targetNode.name}" — this will cause the workflow to hang`,
71
+ raw_details: 'The Merge node waits for ALL inputs before passing data downstream, but ' +
72
+ 'typically only one conditional branch runs. This causes an infinite wait. ' +
73
+ 'Insert a processing node between the Merge and the terminal Codika node, ' +
74
+ 'or duplicate the terminal node on each branch feeding into the Merge.',
75
+ nodeId: mergeNode.id,
76
+ guideRef: {
77
+ path: 'specific/codika-nodes.md',
78
+ section: 'Critical Workflow Rules',
79
+ },
80
+ });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ return findings;
86
+ }
87
+ //# sourceMappingURL=merge-before-terminal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-before-terminal.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/merge-before-terminal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Script: PLACEHOLDER-SYNTAX
3
+ *
4
+ * Validates Codika placeholder patterns in workflow files.
5
+ *
6
+ * This validator has TWO responsibilities:
7
+ * 1. Validate known placeholders have correct suffixes (MUST severity - errors)
8
+ * 2. Detect unknown/unrecognized placeholders (SHOULD severity - warnings)
9
+ *
10
+ * Known placeholder patterns and their required suffixes:
11
+ * - ORGSECRET_*_TERCESORG (organization secrets)
12
+ * - PROCDATA_*_ATADCORP (process data)
13
+ * - USERDATA_*_ATADRESU (user data)
14
+ * - MEMSECRT_*_TRCESMEM (member secrets)
15
+ * - FLEXCRED_*_DERCXELF (flexible credentials)
16
+ * - USERCRED_*_DERCRESU (user credentials)
17
+ * - ORGCRED_*_DERCGRO (organization credentials)
18
+ * - INSTCRED_*_DERCTSNI (instance credentials)
19
+ * - SUBWKFL_*_LFKWBUS (subworkflow references)
20
+ * - INSTPARM_*_MRAPTSNI (instance parameters)
21
+ */
22
+ import type { Finding } from '../types.js';
23
+ import type { RuleMetadata } from '../types.js';
24
+ export declare const metadata: RuleMetadata;
25
+ /**
26
+ * Check for placeholders with incorrect suffixes and unknown placeholders
27
+ */
28
+ export declare function checkPlaceholderSyntax(content: string, path: string): Finding[];
29
+ //# sourceMappingURL=placeholder-syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder-syntax.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/placeholder-syntax.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,QAAQ,EAAE,YAQtB,CAAC;AAgEF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAgF/E"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Script: PLACEHOLDER-SYNTAX
3
+ *
4
+ * Validates Codika placeholder patterns in workflow files.
5
+ *
6
+ * This validator has TWO responsibilities:
7
+ * 1. Validate known placeholders have correct suffixes (MUST severity - errors)
8
+ * 2. Detect unknown/unrecognized placeholders (SHOULD severity - warnings)
9
+ *
10
+ * Known placeholder patterns and their required suffixes:
11
+ * - ORGSECRET_*_TERCESORG (organization secrets)
12
+ * - PROCDATA_*_ATADCORP (process data)
13
+ * - USERDATA_*_ATADRESU (user data)
14
+ * - MEMSECRT_*_TRCESMEM (member secrets)
15
+ * - FLEXCRED_*_DERCXELF (flexible credentials)
16
+ * - USERCRED_*_DERCRESU (user credentials)
17
+ * - ORGCRED_*_DERCGRO (organization credentials)
18
+ * - INSTCRED_*_DERCTSNI (instance credentials)
19
+ * - SUBWKFL_*_LFKWBUS (subworkflow references)
20
+ * - INSTPARM_*_MRAPTSNI (instance parameters)
21
+ */
22
+ export const metadata = {
23
+ id: 'PLACEHOLDER-SYNTAX',
24
+ name: 'placeholder_syntax',
25
+ severity: 'must',
26
+ description: 'Placeholders must use correct suffix format',
27
+ details: 'Each placeholder type has a specific required suffix. Check the placeholder documentation for correct formats.',
28
+ fixable: true,
29
+ category: 'placeholder',
30
+ };
31
+ // Placeholder prefix to expected suffix mapping
32
+ const PLACEHOLDER_SUFFIXES = {
33
+ 'ORGSECRET': 'TERCESORG',
34
+ 'PROCDATA': 'ATADCORP',
35
+ 'USERDATA': 'ATADRESU',
36
+ 'MEMSECRT': 'TRCESMEM',
37
+ 'FLEXCRED': 'DERCXELF',
38
+ 'USERCRED': 'DERCRESU',
39
+ 'ORGCRED': 'DERCGRO',
40
+ 'INSTCRED': 'DERCTSNI',
41
+ 'SUBWKFL': 'LFKWBUS',
42
+ 'INSTPARM': 'MRAPTSNI',
43
+ };
44
+ // All valid prefixes
45
+ const VALID_PREFIXES = Object.keys(PLACEHOLDER_SUFFIXES);
46
+ // Regex to find ALL potential Codika-style placeholders
47
+ // Matches: {{UPPERCASE_WITH_UNDERSCORES}} (no spaces, no special chars, no lowercase)
48
+ // This catches EVERYTHING that looks like a Codika placeholder
49
+ const ALL_UPPERCASE_PLACEHOLDERS = /\{\{([A-Z][A-Z0-9_]*)\}\}/g;
50
+ // Regex to find known placeholders with their structure
51
+ // Matches: {{PREFIX_NAME_SUFFIX}} where PREFIX is one of our known prefixes
52
+ const KNOWN_PLACEHOLDER_REGEX = /\{\{(ORGSECRET|PROCDATA|USERDATA|MEMSECRT|FLEXCRED|USERCRED|ORGCRED|INSTCRED|SUBWKFL|INSTPARM)_([A-Z0-9_]+)_([A-Z]+)\}\}/g;
53
+ /**
54
+ * Check if a placeholder matches a known valid pattern
55
+ */
56
+ function matchesKnownPattern(placeholder) {
57
+ for (const [prefix, expectedSuffix] of Object.entries(PLACEHOLDER_SUFFIXES)) {
58
+ // Check if it starts with this prefix followed by underscore
59
+ if (placeholder.startsWith(prefix + '_')) {
60
+ // Try to extract the structure: PREFIX_NAME_SUFFIX
61
+ const afterPrefix = placeholder.slice(prefix.length + 1);
62
+ const lastUnderscoreIndex = afterPrefix.lastIndexOf('_');
63
+ if (lastUnderscoreIndex > 0) {
64
+ const name = afterPrefix.slice(0, lastUnderscoreIndex);
65
+ const suffix = afterPrefix.slice(lastUnderscoreIndex + 1);
66
+ return {
67
+ isKnown: true,
68
+ prefix,
69
+ name,
70
+ suffix,
71
+ expectedSuffix,
72
+ };
73
+ }
74
+ }
75
+ }
76
+ return { isKnown: false };
77
+ }
78
+ /**
79
+ * Calculate line number from content and match index
80
+ */
81
+ function getLineNumber(content, index) {
82
+ return content.substring(0, index).split('\n').length;
83
+ }
84
+ /**
85
+ * Check for placeholders with incorrect suffixes and unknown placeholders
86
+ */
87
+ export function checkPlaceholderSyntax(content, path) {
88
+ const findings = [];
89
+ // Track which positions we've already processed (to avoid duplicates)
90
+ const processedPositions = new Set();
91
+ // First pass: Check known placeholders with wrong suffixes (MUST severity)
92
+ KNOWN_PLACEHOLDER_REGEX.lastIndex = 0;
93
+ let match;
94
+ while ((match = KNOWN_PLACEHOLDER_REGEX.exec(content)) !== null) {
95
+ const fullMatch = match[0];
96
+ const prefix = match[1];
97
+ const name = match[2];
98
+ const actualSuffix = match[3];
99
+ const expectedSuffix = PLACEHOLDER_SUFFIXES[prefix];
100
+ // Mark this position as processed
101
+ processedPositions.add(match.index);
102
+ if (actualSuffix !== expectedSuffix) {
103
+ const lineNumber = getLineNumber(content, match.index);
104
+ const correctPlaceholder = `{{${prefix}_${name}_${expectedSuffix}}}`;
105
+ findings.push({
106
+ rule: metadata.id,
107
+ severity: 'must',
108
+ path,
109
+ message: `Invalid placeholder suffix: ${fullMatch} should end with _${expectedSuffix}`,
110
+ raw_details: `Replace ${fullMatch} with ${correctPlaceholder}`,
111
+ line: lineNumber,
112
+ fixable: true,
113
+ fix: {
114
+ description: `Fix suffix: ${fullMatch} -> ${correctPlaceholder}`,
115
+ apply: (fileContent) => {
116
+ return fileContent.replace(fullMatch, correctPlaceholder);
117
+ },
118
+ },
119
+ });
120
+ }
121
+ }
122
+ // Second pass: Find ALL uppercase placeholders and check for unknown ones
123
+ ALL_UPPERCASE_PLACEHOLDERS.lastIndex = 0;
124
+ while ((match = ALL_UPPERCASE_PLACEHOLDERS.exec(content)) !== null) {
125
+ // Skip if we already processed this position (known placeholder with valid/invalid suffix)
126
+ if (processedPositions.has(match.index)) {
127
+ continue;
128
+ }
129
+ const fullMatch = match[0];
130
+ const placeholder = match[1]; // The content inside {{ }}
131
+ // Check if this matches a known pattern
132
+ const result = matchesKnownPattern(placeholder);
133
+ if (result.isKnown) {
134
+ // It's a known prefix - we already handled it in first pass if suffix was wrong
135
+ // But if it got here, the suffix is correct, so skip
136
+ continue;
137
+ }
138
+ // This is an UNKNOWN placeholder - report as warning (not error)
139
+ // It might be intentional or a typo in the prefix — flag it but don't block
140
+ const lineNumber = getLineNumber(content, match.index);
141
+ findings.push({
142
+ rule: metadata.id,
143
+ severity: 'should',
144
+ path,
145
+ message: `Unknown placeholder pattern: ${fullMatch}`,
146
+ raw_details: `This doesn't match any known Codika placeholder pattern. Valid prefixes are: ${VALID_PREFIXES.join(', ')}. Each placeholder must follow the pattern: {{PREFIX_NAME_SUFFIX}} with the correct suffix for each prefix.`,
147
+ line: lineNumber,
148
+ fixable: false,
149
+ // No fix for unknown placeholders - we don't know what they should be
150
+ });
151
+ }
152
+ return findings;
153
+ }
154
+ //# sourceMappingURL=placeholder-syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placeholder-syntax.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/placeholder-syntax.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Script: RETRY-BACKOFF
3
+ *
4
+ * Validates that API/HTTP nodes have retry configuration enabled.
5
+ * Replaces flowlint-core R1 with better node type detection and auto-fix.
6
+ *
7
+ * Flagged node types: HTTP Request, Google, Facebook, Slack, Twilio,
8
+ * and other external API integrations.
9
+ *
10
+ * Excluded: Internal nodes (Code, IF, Set, Merge, triggers, Codika nodes,
11
+ * sub-workflow calls, etc.)
12
+ */
13
+ import type { Finding, RuleMetadata } from '../types.js';
14
+ export declare const metadata: RuleMetadata;
15
+ export declare function checkRetryBackoff(content: string, path: string): Finding[];
16
+ //# sourceMappingURL=retry-backoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-backoff.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/retry-backoff.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,QAAQ,EAAE,YAQtB,CAAC;AA8JF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAkD1E"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Script: RETRY-BACKOFF
3
+ *
4
+ * Validates that API/HTTP nodes have retry configuration enabled.
5
+ * Replaces flowlint-core R1 with better node type detection and auto-fix.
6
+ *
7
+ * Flagged node types: HTTP Request, Google, Facebook, Slack, Twilio,
8
+ * and other external API integrations.
9
+ *
10
+ * Excluded: Internal nodes (Code, IF, Set, Merge, triggers, Codika nodes,
11
+ * sub-workflow calls, etc.)
12
+ */
13
+ export const metadata = {
14
+ id: 'RETRY-BACKOFF',
15
+ name: 'retry_backoff',
16
+ severity: 'should',
17
+ description: 'API/HTTP nodes should have retry configuration enabled',
18
+ details: 'Enable "Retry on Fail" in node settings to handle transient API failures gracefully',
19
+ fixable: true,
20
+ category: 'resilience',
21
+ };
22
+ // Default retry configuration for auto-fix
23
+ const DEFAULT_MAX_TRIES = 3;
24
+ const DEFAULT_WAIT_BETWEEN_TRIES = 1000;
25
+ // ---------------------------------------------------------------------------
26
+ // Node type classification
27
+ // ---------------------------------------------------------------------------
28
+ /**
29
+ * Node types that are internal / control-flow and should NOT be flagged.
30
+ * Checked by exact match on the last segment of the type.
31
+ */
32
+ const INTERNAL_NODE_NAMES = new Set([
33
+ 'code',
34
+ 'function',
35
+ 'functionItem',
36
+ 'if',
37
+ 'switch',
38
+ 'set',
39
+ 'merge',
40
+ 'noOp',
41
+ 'stickyNote',
42
+ 'splitInBatches',
43
+ 'itemLists',
44
+ 'dateTime',
45
+ 'crypto',
46
+ 'xml',
47
+ 'html',
48
+ 'markdown',
49
+ 'compression',
50
+ 'renameKeys',
51
+ 'splitOut',
52
+ 'aggregate',
53
+ 'removeDuplicates',
54
+ 'limit',
55
+ 'sort',
56
+ 'filter',
57
+ 'respondToWebhook',
58
+ 'wait',
59
+ 'executeWorkflow',
60
+ 'executeWorkflowTrigger',
61
+ 'webhook',
62
+ 'scheduleTrigger',
63
+ 'manualTrigger',
64
+ 'errorTrigger',
65
+ 'workflowTrigger',
66
+ 'emailReadImap',
67
+ 'codika',
68
+ 'localFileTrigger',
69
+ 'readBinaryFiles',
70
+ 'writeBinaryFile',
71
+ 'readPdf',
72
+ 'convertToFile',
73
+ 'extractFromFile',
74
+ // Database / data-store nodes (reliable internal connections)
75
+ 'supabase',
76
+ 'postgres',
77
+ 'mySql',
78
+ 'mongoDb',
79
+ 'redis',
80
+ 'elasticsearch',
81
+ ]);
82
+ /**
83
+ * Determine if a node type represents an external API call that should have retry.
84
+ */
85
+ function isApiNode(type) {
86
+ // Extract the node name (last segment after the last dot)
87
+ const segments = type.split('.');
88
+ const nodeName = segments[segments.length - 1];
89
+ // Skip internal/control-flow nodes
90
+ if (INTERNAL_NODE_NAMES.has(nodeName)) {
91
+ return false;
92
+ }
93
+ // Skip Codika custom nodes
94
+ if (type.includes('codika')) {
95
+ return false;
96
+ }
97
+ // Skip LangChain nodes (AI chain internals, not direct API calls)
98
+ if (type.includes('langchain')) {
99
+ return false;
100
+ }
101
+ // Skip trigger nodes (they receive, not send)
102
+ if (nodeName.toLowerCase().endsWith('trigger')) {
103
+ return false;
104
+ }
105
+ // Flag known external API / SaaS integration patterns
106
+ // Excludes databases (supabase, postgres, mysql, mongodb, redis, elasticsearch)
107
+ // which are typically on internal networks with reliable connections
108
+ const apiPatterns = /http|request|google|gmail|facebook|slack|telegram|twilio|notion|airtable|hubspot|stripe|microsoft|outlook|teams|discord|github|gitlab|jira|asana|trello|shopify|mailchimp|sendgrid|aws|azure|s3/i;
109
+ if (apiPatterns.test(type)) {
110
+ return true;
111
+ }
112
+ // Flag httpRequest explicitly
113
+ if (nodeName === 'httpRequest') {
114
+ return true;
115
+ }
116
+ // For other node types, check if they're likely API integrations
117
+ // (nodes from n8n-nodes-base that aren't in the internal list are usually integrations)
118
+ if (type.startsWith('n8n-nodes-base.') && !INTERNAL_NODE_NAMES.has(nodeName)) {
119
+ // Only flag if the name suggests an external service
120
+ // (conservative: don't flag unknown nodes)
121
+ return false;
122
+ }
123
+ return false;
124
+ }
125
+ /**
126
+ * Check if a node has retry configuration enabled.
127
+ * Checks three locations (same as flowlint R1):
128
+ * 1. node.parameters.options.retryOnFail
129
+ * 2. node.parameters.retryOnFail
130
+ * 3. node.retryOnFail (top-level)
131
+ */
132
+ function hasRetryEnabled(node) {
133
+ // Check top-level
134
+ if (node.retryOnFail === true)
135
+ return true;
136
+ // Check parameters
137
+ const params = node.parameters || {};
138
+ if (params.retryOnFail === true)
139
+ return true;
140
+ // Check parameters.options
141
+ const options = params.options;
142
+ if (options?.retryOnFail === true)
143
+ return true;
144
+ return false;
145
+ }
146
+ // ---------------------------------------------------------------------------
147
+ // Main validation function
148
+ // ---------------------------------------------------------------------------
149
+ export function checkRetryBackoff(content, path) {
150
+ const findings = [];
151
+ let workflow;
152
+ try {
153
+ workflow = JSON.parse(content);
154
+ }
155
+ catch {
156
+ return findings;
157
+ }
158
+ if (!workflow.nodes || !Array.isArray(workflow.nodes)) {
159
+ return findings;
160
+ }
161
+ for (const node of workflow.nodes) {
162
+ if (!isApiNode(node.type))
163
+ continue;
164
+ if (hasRetryEnabled(node))
165
+ continue;
166
+ findings.push({
167
+ rule: metadata.id,
168
+ severity: metadata.severity,
169
+ path,
170
+ message: `Node "${node.name}" is missing retry/backoff configuration`,
171
+ raw_details: 'Enable "Retry on Fail" in the node settings. This helps handle transient API ' +
172
+ 'failures (timeouts, rate limits, 5xx errors) gracefully.',
173
+ nodeId: node.id,
174
+ fixable: true,
175
+ fix: {
176
+ description: `Enable retry on "${node.name}" (3 retries, 1s wait)`,
177
+ apply: (fileContent) => {
178
+ const parsed = JSON.parse(fileContent);
179
+ const target = parsed.nodes.find((n) => n.id === node.id);
180
+ if (target) {
181
+ target.retryOnFail = true;
182
+ // Only set defaults if not already configured
183
+ if (target.maxTries === undefined) {
184
+ target.maxTries = DEFAULT_MAX_TRIES;
185
+ }
186
+ if (target.waitBetweenTries === undefined) {
187
+ target.waitBetweenTries = DEFAULT_WAIT_BETWEEN_TRIES;
188
+ }
189
+ }
190
+ return JSON.stringify(parsed, null, 2);
191
+ },
192
+ },
193
+ });
194
+ }
195
+ return findings;
196
+ }
197
+ //# sourceMappingURL=retry-backoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-backoff.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/retry-backoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Script: WEBHOOK-ID
3
+ *
4
+ * Validates that every n8n-nodes-base.webhook node has a `webhookId`
5
+ * property at the node level (sibling to name, type, parameters).
6
+ *
7
+ * Without webhookId, the webhook path is never registered in production
8
+ * even when the workflow is active, causing 404 errors at runtime.
9
+ */
10
+ import type { Finding } from '../types.js';
11
+ import type { RuleMetadata } from '../types.js';
12
+ export declare const metadata: RuleMetadata;
13
+ /**
14
+ * Check that all webhook nodes have a webhookId property.
15
+ */
16
+ export declare function checkWebhookId(content: string, path: string): Finding[];
17
+ //# sourceMappingURL=webhook-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-id.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/webhook-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,eAAO,MAAM,QAAQ,EAAE,YAQtB,CAAC;AAeF;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CAmDvE"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Script: WEBHOOK-ID
3
+ *
4
+ * Validates that every n8n-nodes-base.webhook node has a `webhookId`
5
+ * property at the node level (sibling to name, type, parameters).
6
+ *
7
+ * Without webhookId, the webhook path is never registered in production
8
+ * even when the workflow is active, causing 404 errors at runtime.
9
+ */
10
+ export const metadata = {
11
+ id: 'WEBHOOK-ID',
12
+ name: 'webhook_id',
13
+ severity: 'must',
14
+ description: 'Webhook nodes must have a webhookId property for production registration',
15
+ details: 'Add a "webhookId" string property to each webhook node (sibling to name/type/parameters)',
16
+ fixable: true,
17
+ category: 'webhook',
18
+ };
19
+ /**
20
+ * Generate a webhookId by slugifying the node name.
21
+ * Lowercases, replaces spaces and non-alphanumeric chars with hyphens,
22
+ * collapses consecutive hyphens, and trims leading/trailing hyphens.
23
+ */
24
+ function slugify(name) {
25
+ return name
26
+ .toLowerCase()
27
+ .replace(/[^a-z0-9]+/g, '-')
28
+ .replace(/-+/g, '-')
29
+ .replace(/^-|-$/g, '');
30
+ }
31
+ /**
32
+ * Check that all webhook nodes have a webhookId property.
33
+ */
34
+ export function checkWebhookId(content, path) {
35
+ const findings = [];
36
+ let parsed;
37
+ try {
38
+ parsed = JSON.parse(content);
39
+ }
40
+ catch {
41
+ return [];
42
+ }
43
+ const nodes = parsed.nodes;
44
+ if (!Array.isArray(nodes)) {
45
+ return [];
46
+ }
47
+ for (const node of nodes) {
48
+ if (node.type !== 'n8n-nodes-base.webhook') {
49
+ continue;
50
+ }
51
+ if (!node.webhookId || typeof node.webhookId !== 'string') {
52
+ const generatedId = slugify(node.name || 'webhook');
53
+ findings.push({
54
+ rule: metadata.id,
55
+ severity: metadata.severity,
56
+ path,
57
+ message: `Webhook node "${node.name}" is missing webhookId property`,
58
+ raw_details: `Add "webhookId": "${generatedId}" to the node object (sibling to name/type/parameters)`,
59
+ fixable: true,
60
+ fix: {
61
+ description: `Add webhookId "${generatedId}" to webhook node "${node.name}"`,
62
+ apply: (fileContent) => {
63
+ const data = JSON.parse(fileContent);
64
+ for (const n of data.nodes) {
65
+ if (n.type === 'n8n-nodes-base.webhook' &&
66
+ n.name === node.name &&
67
+ (!n.webhookId || typeof n.webhookId !== 'string')) {
68
+ n.webhookId = slugify(n.name || 'webhook');
69
+ }
70
+ }
71
+ return JSON.stringify(data, null, 2);
72
+ },
73
+ },
74
+ });
75
+ }
76
+ }
77
+ return findings;
78
+ }
79
+ //# sourceMappingURL=webhook-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-id.js","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/webhook-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,MAAM,CAAC,MAAM,QAAQ,GAAiB;IACpC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,0EAA0E;IACvF,OAAO,EAAE,0FAA0F;IACnG,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,SAAS;CACpB,CAAC;AAEF;;;;GAIG;AACH,SAAS,OAAO,CAAC,IAAY;IAC3B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAY;IAC1D,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAU,MAAM,CAAC,KAAK,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;YAEpD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ,CAAC,EAAE;gBACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,IAAI;gBACJ,OAAO,EAAE,iBAAiB,IAAI,CAAC,IAAI,iCAAiC;gBACpE,WAAW,EAAE,qBAAqB,WAAW,wDAAwD;gBACrG,OAAO,EAAE,IAAI;gBACb,GAAG,EAAE;oBACH,WAAW,EAAE,kBAAkB,WAAW,sBAAsB,IAAI,CAAC,IAAI,GAAG;oBAC5E,KAAK,EAAE,CAAC,WAAmB,EAAE,EAAE;wBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;wBACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BAC3B,IACE,CAAC,CAAC,IAAI,KAAK,wBAAwB;gCACnC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;gCACpB,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,EACjD,CAAC;gCACD,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;4BAC7C,CAAC;wBACH,CAAC;wBACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvC,CAAC;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Script: WORKFLOW-FORMAT
3
+ *
4
+ * Validates that workflow JSON files use canonical formatting:
5
+ * JSON.stringify(parsed, null, 2) + '\n'
6
+ *
7
+ * This must be the LAST script in the workflowScripts array so that
8
+ * its fix normalizes formatting after all other fixes have run.
9
+ */
10
+ import type { Finding, RuleMetadata } from '../types.js';
11
+ export declare const metadata: RuleMetadata;
12
+ /**
13
+ * Check that workflow JSON uses canonical formatting
14
+ */
15
+ export declare function checkWorkflowFormat(content: string, path: string): Finding[];
16
+ //# sourceMappingURL=workflow-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-format.d.ts","sourceRoot":"","sources":["../../../src/validation/workflow-scripts/workflow-format.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,QAAQ,EAAE,YAUtB,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,CA8B5E"}