prd.json 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. {
  2. "name": "New Workflow Automation Nodes",
  3. "branchName": "feature/new-workflow-automation-nodes",
  4. "userStories": [
  5. {
  6. "id": "US-001",
  7. "title": "MySQL Node - Connection & Schema Introspection",
  8. "description": "As a workflow designer, I want to configure a MySQL node that connects using stored credentials and auto-detects tables and columns so that I can quickly build database queries without memorizing schema details.",
  9. "acceptanceCriteria": [
  10. "MySQL node definition created in nodes/ following existing node module interface",
  11. "Node config UI allows selecting credentials from the existing credential management system",
  12. "Connection fields: host, port, username, password, database (stored via credential system)",
  13. "Live schema introspection fetches available tables when the node is configured in the editor",
  14. "After selecting a table, columns are fetched and displayed for selection",
  15. "Introspection works in real-time (requires active DB connection at design time)",
  16. "Node appears in the workflow editor node palette under a Database category"
  17. ],
  18. "priority": 1,
  19. "passes": true,
  20. "dependsOn": [],
  21. "labels": [
  22. "database",
  23. "mysql",
  24. "backend",
  25. "frontend"
  26. ],
  27. "completionNotes": "Completed by agent"
  28. },
  29. {
  30. "id": "US-002",
  31. "title": "MySQL Node - CRUD Operations",
  32. "description": "As a workflow designer, I want to perform Select, Insert, Update, Delete, Upsert, and Bulk Insert operations on MySQL tables using a dropdown selector so that I can manipulate data without writing SQL.",
  33. "acceptanceCriteria": [
  34. "Operation selector dropdown with options: Select, Insert, Update, Delete, Upsert, Bulk Insert, Custom SQL",
  35. "Select: allows choosing columns, adding WHERE conditions, LIMIT, ORDER BY",
  36. "Insert: allows mapping input fields to table columns",
  37. "Update: allows mapping fields to columns with WHERE conditions",
  38. "Delete: allows specifying WHERE conditions",
  39. "Upsert: allows specifying the conflict key and update fields",
  40. "Bulk Insert: accepts an array of objects and inserts multiple rows",
  41. "Custom SQL: free-text SQL input with parameterized query support",
  42. "Output format: array of objects (each row as JSON with column-name keys) plus metadata (affected rows count, last insert ID for write operations)",
  43. "Parameterized queries used for all operations to prevent SQL injection"
  44. ],
  45. "priority": 1,
  46. "passes": true,
  47. "dependsOn": [
  48. "US-001"
  49. ],
  50. "labels": [
  51. "database",
  52. "mysql",
  53. "backend"
  54. ],
  55. "completionNotes": "Completed by agent"
  56. },
  57. {
  58. "id": "US-003",
  59. "title": "PostgreSQL Node - Connection & Schema Introspection",
  60. "description": "As a workflow designer, I want to configure a PostgreSQL node with the same UX as the MySQL node so that I have a consistent experience across database types.",
  61. "acceptanceCriteria": [
  62. "PostgreSQL node definition created in nodes/ following existing node module interface",
  63. "Node config UI allows selecting credentials from the existing credential management system",
  64. "Connection fields: host, port, username, password, database (stored via credential system)",
  65. "Live schema introspection fetches available tables when configured in the editor",
  66. "After selecting a table, columns are fetched and displayed for selection",
  67. "Node appears in the workflow editor node palette under a Database category"
  68. ],
  69. "priority": 1,
  70. "passes": true,
  71. "dependsOn": [],
  72. "labels": [
  73. "database",
  74. "postgresql",
  75. "backend",
  76. "frontend"
  77. ],
  78. "completionNotes": "Completed by agent"
  79. },
  80. {
  81. "id": "US-004",
  82. "title": "PostgreSQL Node - CRUD Operations",
  83. "description": "As a workflow designer, I want the same CRUD, Upsert, Bulk Insert, and Custom SQL operations on PostgreSQL as on MySQL so that I can work with PostgreSQL data the same way.",
  84. "acceptanceCriteria": [
  85. "Operation selector dropdown with options: Select, Insert, Update, Delete, Upsert, Bulk Insert, Custom SQL",
  86. "Select: column selection, WHERE conditions, LIMIT, ORDER BY",
  87. "Insert: map input fields to table columns",
  88. "Update: map fields to columns with WHERE conditions",
  89. "Delete: specify WHERE conditions",
  90. "Upsert: uses PostgreSQL ON CONFLICT syntax, allows specifying conflict key and update fields",
  91. "Bulk Insert: accepts array of objects, inserts multiple rows",
  92. "Custom SQL: free-text SQL with parameterized query support",
  93. "Output format: array of objects plus metadata (affected rows count, last insert ID for write operations)",
  94. "Parameterized queries used for all operations to prevent SQL injection"
  95. ],
  96. "priority": 1,
  97. "passes": true,
  98. "dependsOn": [
  99. "US-003"
  100. ],
  101. "labels": [
  102. "database",
  103. "postgresql",
  104. "backend"
  105. ],
  106. "completionNotes": "Completed by agent"
  107. },
  108. {
  109. "id": "US-005",
  110. "title": "RSS Reader Node - Feed Parsing & Filtering",
  111. "description": "As a workflow designer, I want to read and parse RSS/Atom feeds with optional filtering so that I can integrate external content sources into workflows.",
  112. "acceptanceCriteria": [
  113. "RSS Reader node definition created in nodes/ following existing node module interface",
  114. "Config accepts a feed URL as input",
  115. "Parses both RSS 2.0 and Atom feed formats",
  116. "Outputs an array of feed items with fields: title, link, description, pubDate, author, categories, guid",
  117. "Supports filtering by keyword (matches against title and description)",
  118. "Supports filtering by date range (items newer than a specified date)",
  119. "Supports limiting the number of returned items (count limit)",
  120. "Node appears in the workflow editor node palette"
  121. ],
  122. "priority": 2,
  123. "passes": true,
  124. "dependsOn": [],
  125. "labels": [
  126. "data",
  127. "rss",
  128. "backend"
  129. ],
  130. "completionNotes": "Completed by agent"
  131. },
  132. {
  133. "id": "US-006",
  134. "title": "RSS Reader Node - Stateful New Item Detection",
  135. "description": "As a workflow designer, I want to optionally track which RSS items have already been seen so that my workflow only processes new items on each execution.",
  136. "acceptanceCriteria": [
  137. "Optional 'Detect new items' toggle in node configuration",
  138. "When enabled, user must select a collection from the database service for state storage",
  139. "The selected collection must be configured as a read-write (RW) collection on the workflow before it can be selected in the node",
  140. "On each execution, the node compares feed items against stored item GUIDs/links",
  141. "Only new (unseen) items are output",
  142. "Seen item identifiers are persisted to the selected collection after successful execution",
  143. "When disabled, the node outputs all items matching filter criteria (stateless mode)"
  144. ],
  145. "priority": 2,
  146. "passes": true,
  147. "dependsOn": [
  148. "US-005"
  149. ],
  150. "labels": [
  151. "data",
  152. "rss",
  153. "backend"
  154. ],
  155. "completionNotes": "Completed by agent"
  156. },
  157. {
  158. "id": "US-007",
  159. "title": "Crypto Node - Hashing & HMAC",
  160. "description": "As a workflow designer, I want to hash data and generate HMACs so that I can verify data integrity and authenticate messages in workflows.",
  161. "acceptanceCriteria": [
  162. "Crypto node definition created in nodes/ following existing node module interface",
  163. "Operation selector with categories: Hash, HMAC, Random Generation, Encrypt, Decrypt",
  164. "Hash operation supports: MD5, SHA-1, SHA-256, SHA-384, SHA-512",
  165. "Hash input accepts string or binary data",
  166. "Hash output format configurable: hex, base64",
  167. "HMAC operation supports the same algorithms with a secret key input",
  168. "Node appears in the workflow editor node palette"
  169. ],
  170. "priority": 2,
  171. "passes": false,
  172. "dependsOn": [],
  173. "labels": [
  174. "security",
  175. "crypto",
  176. "backend"
  177. ]
  178. },
  179. {
  180. "id": "US-008",
  181. "title": "Crypto Node - Random Generation",
  182. "description": "As a workflow designer, I want to generate random values (UUIDs, tokens, passwords) so that I can create unique identifiers and secure credentials in workflows.",
  183. "acceptanceCriteria": [
  184. "Random Generation sub-operation in the Crypto node",
  185. "Supports generating: UUID v4, random hex token (configurable length), random alphanumeric string, secure password (configurable length, character sets)",
  186. "Output is a string value passed to subsequent nodes"
  187. ],
  188. "priority": 2,
  189. "passes": false,
  190. "dependsOn": [
  191. "US-007"
  192. ],
  193. "labels": [
  194. "security",
  195. "crypto",
  196. "backend"
  197. ]
  198. },
  199. {
  200. "id": "US-009",
  201. "title": "Crypto Node - Encrypt & Decrypt",
  202. "description": "As a workflow designer, I want to encrypt and decrypt data using AES and RSA so that I can protect sensitive information in workflows.",
  203. "acceptanceCriteria": [
  204. "Encrypt operation supports AES-256-CBC, AES-256-GCM, and RSA",
  205. "AES requires: key (or passphrase-derived key), IV (auto-generated if not provided)",
  206. "RSA requires: public key (PEM format) for encryption",
  207. "Decrypt operation supports the same algorithms",
  208. "RSA decrypt requires: private key (PEM format)",
  209. "Input/output supports both string and base64-encoded binary data",
  210. "Error output provides clear messages for invalid keys or corrupted data"
  211. ],
  212. "priority": 2,
  213. "passes": false,
  214. "dependsOn": [
  215. "US-007"
  216. ],
  217. "labels": [
  218. "security",
  219. "crypto",
  220. "backend"
  221. ]
  222. },
  223. {
  224. "id": "US-010",
  225. "title": "Image Node - Information & Metadata",
  226. "description": "As a workflow designer, I want to extract image information and metadata so that I can make workflow decisions based on image properties.",
  227. "acceptanceCriteria": [
  228. "Image node definition created in nodes/ following existing node module interface",
  229. "Operation selector with categories: Info, Resize, Crop, Rotate, Filter, Convert Format",
  230. "Info operation outputs: width, height, format, color space, file size, DPI",
  231. "EXIF metadata extraction (camera, date taken, GPS coordinates, orientation, etc.)",
  232. "Input accepts base64-encoded images, file paths on the runner filesystem, and URLs (auto-downloaded)",
  233. "Uses the existing binary storage logic for passing image data between nodes",
  234. "Uses ImageMagick for image processing",
  235. "Node appears in the workflow editor node palette"
  236. ],
  237. "priority": 3,
  238. "passes": false,
  239. "dependsOn": [],
  240. "labels": [
  241. "media",
  242. "image",
  243. "backend"
  244. ]
  245. },
  246. {
  247. "id": "US-011",
  248. "title": "Image Node - Manipulation (Resize, Crop, Rotate)",
  249. "description": "As a workflow designer, I want to resize, crop, and rotate images so that I can transform images as part of automated workflows.",
  250. "acceptanceCriteria": [
  251. "Resize operation: accepts target width and/or height, maintains aspect ratio option, supports percentage-based scaling",
  252. "Crop operation: accepts x, y, width, height parameters for the crop region",
  253. "Rotate operation: accepts angle in degrees (90, 180, 270, or arbitrary), optional background fill color",
  254. "All operations output the result using the existing binary storage mechanism",
  255. "Output format configurable (JPEG, PNG, WebP, GIF)",
  256. "Quality setting available for lossy formats"
  257. ],
  258. "priority": 3,
  259. "passes": false,
  260. "dependsOn": [
  261. "US-010"
  262. ],
  263. "labels": [
  264. "media",
  265. "image",
  266. "backend"
  267. ]
  268. },
  269. {
  270. "id": "US-012",
  271. "title": "Image Node - Filters & Watermark",
  272. "description": "As a workflow designer, I want to apply filters and watermarks to images so that I can process images for various output requirements.",
  273. "acceptanceCriteria": [
  274. "Filter operations: blur (configurable radius), sharpen, grayscale, sepia, brightness adjustment, contrast adjustment",
  275. "Watermark operation: overlay text or image watermark, configurable position (center, corners), configurable opacity",
  276. "Filters can be chained (apply multiple in sequence)",
  277. "All operations use ImageMagick and output via existing binary storage"
  278. ],
  279. "priority": 3,
  280. "passes": false,
  281. "dependsOn": [
  282. "US-010"
  283. ],
  284. "labels": [
  285. "media",
  286. "image",
  287. "backend"
  288. ]
  289. },
  290. {
  291. "id": "US-013",
  292. "title": "Code Node - JavaScript Execution",
  293. "description": "As a workflow designer, I want to write custom JavaScript code in a node so that I can implement custom logic that isn't covered by built-in nodes.",
  294. "acceptanceCriteria": [
  295. "Code node definition created in nodes/ following existing node module interface",
  296. "Node config provides a code editor textarea in the workflow editor for writing JavaScript",
  297. "User's code has access to input (the node's input data) and context (workflow execution context)",
  298. "User's code returns a value that becomes the node's output",
  299. "Built-in helper utilities available: lodash-like collection/string/object helpers, date formatting utilities",
  300. "Code executes in the existing QuickJS sandbox on the Runner service",
  301. "Execution timeout configurable (default: 30 seconds)",
  302. "Runtime errors are caught and reported as node execution failures with the error message and line number",
  303. "Node appears in the workflow editor node palette"
  304. ],
  305. "priority": 2,
  306. "passes": false,
  307. "dependsOn": [],
  308. "labels": [
  309. "developer",
  310. "code",
  311. "backend",
  312. "frontend"
  313. ]
  314. },
  315. {
  316. "id": "US-014",
  317. "title": "Node Registration & Editor Integration",
  318. "description": "As a workflow designer, I want all new nodes to appear in the workflow editor with proper icons, categories, and configuration panels so that I can easily discover and configure them.",
  319. "acceptanceCriteria": [
  320. "All six nodes (MySQL, PostgreSQL, RSS Reader, Crypto, Image, Code) are registered in the node system",
  321. "Each node has a distinct icon in the editor palette",
  322. "Nodes are categorized: Database (MySQL, PostgreSQL), Data (RSS Reader), Security (Crypto), Media (Image), Developer (Code)",
  323. "Each node's configuration panel renders all relevant fields based on the selected operation",
  324. "Dynamic form updates: selecting an operation shows/hides relevant fields",
  325. "All nodes can be migrated to the database using the existing POST /api/v1/nodes/migrate endpoint"
  326. ],
  327. "priority": 1,
  328. "passes": false,
  329. "dependsOn": [
  330. "US-001",
  331. "US-003",
  332. "US-005",
  333. "US-007",
  334. "US-010",
  335. "US-013"
  336. ],
  337. "labels": [
  338. "frontend",
  339. "integration"
  340. ]
  341. }
  342. ],
  343. "metadata": {
  344. "updatedAt": "2026-01-28T15:40:52.405Z"
  345. }
  346. }