veryfront 0.1.76 → 0.1.78

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 (64) hide show
  1. package/esm/cli/commands/pull/command.js +2 -2
  2. package/esm/cli/commands/task/command.d.ts.map +1 -1
  3. package/esm/cli/commands/task/command.js +57 -51
  4. package/esm/cli/commands/workflow/command-help.d.ts +3 -0
  5. package/esm/cli/commands/workflow/command-help.d.ts.map +1 -0
  6. package/esm/cli/commands/workflow/command-help.js +19 -0
  7. package/esm/cli/commands/workflow/command.d.ts +5 -0
  8. package/esm/cli/commands/workflow/command.d.ts.map +1 -0
  9. package/esm/cli/commands/workflow/command.js +119 -0
  10. package/esm/cli/commands/workflow/handler.d.ts +28 -0
  11. package/esm/cli/commands/workflow/handler.d.ts.map +1 -0
  12. package/esm/cli/commands/workflow/handler.js +19 -0
  13. package/esm/cli/help/command-definitions.d.ts.map +1 -1
  14. package/esm/cli/help/command-definitions.js +2 -0
  15. package/esm/cli/router.d.ts.map +1 -1
  16. package/esm/cli/router.js +2 -0
  17. package/esm/cli/shared/project-source-context.d.ts +18 -0
  18. package/esm/cli/shared/project-source-context.d.ts.map +1 -0
  19. package/esm/cli/shared/project-source-context.js +52 -0
  20. package/esm/deno.d.ts +1 -0
  21. package/esm/deno.js +2 -1
  22. package/esm/src/discovery/module-import.d.ts +8 -0
  23. package/esm/src/discovery/module-import.d.ts.map +1 -0
  24. package/esm/src/discovery/module-import.js +24 -0
  25. package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts +3 -3
  26. package/esm/src/platform/adapters/veryfront-api-client/operations.d.ts.map +1 -1
  27. package/esm/src/platform/adapters/veryfront-api-client/operations.js +12 -10
  28. package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.d.ts +4 -4
  29. package/esm/src/platform/adapters/veryfront-api-client/schemas/api.schema.js +4 -4
  30. package/esm/src/platform/index.d.ts +1 -0
  31. package/esm/src/platform/index.d.ts.map +1 -1
  32. package/esm/src/platform/index.js +1 -0
  33. package/esm/src/server/runtime-handler/index.d.ts +1 -1
  34. package/esm/src/server/runtime-handler/index.d.ts.map +1 -1
  35. package/esm/src/server/runtime-handler/index.js +0 -3
  36. package/esm/src/task/discovery.d.ts.map +1 -1
  37. package/esm/src/task/discovery.js +5 -13
  38. package/esm/src/workflow/discovery/workflow-discovery.d.ts.map +1 -1
  39. package/esm/src/workflow/discovery/workflow-discovery.js +3 -8
  40. package/package.json +1 -1
  41. package/src/cli/commands/pull/command.ts +3 -3
  42. package/src/cli/commands/task/command.ts +66 -57
  43. package/src/cli/commands/workflow/command-help.ts +21 -0
  44. package/src/cli/commands/workflow/command.ts +152 -0
  45. package/src/cli/commands/workflow/handler.ts +25 -0
  46. package/src/cli/help/command-definitions.ts +2 -0
  47. package/src/cli/router.ts +2 -0
  48. package/src/cli/shared/project-source-context.ts +96 -0
  49. package/src/deno.js +2 -1
  50. package/src/src/discovery/module-import.ts +36 -0
  51. package/src/src/platform/adapters/veryfront-api-client/operations.ts +14 -14
  52. package/src/src/platform/adapters/veryfront-api-client/schemas/api.schema.ts +4 -4
  53. package/src/src/platform/index.ts +1 -0
  54. package/src/src/server/runtime-handler/index.ts +0 -3
  55. package/src/src/task/discovery.ts +7 -15
  56. package/src/src/workflow/discovery/workflow-discovery.ts +3 -9
  57. package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts +0 -11
  58. package/esm/src/server/handlers/request/internal-tasks-list.handler.d.ts.map +0 -1
  59. package/esm/src/server/handlers/request/internal-tasks-list.handler.js +0 -72
  60. package/esm/src/task/control-plane.d.ts +0 -105
  61. package/esm/src/task/control-plane.d.ts.map +0 -1
  62. package/esm/src/task/control-plane.js +0 -52
  63. package/src/src/server/handlers/request/internal-tasks-list.handler.ts +0 -103
  64. package/src/src/task/control-plane.ts +0 -76
@@ -3379,13 +3379,13 @@ export declare const API_ENDPOINTS: {
3379
3379
  };
3380
3380
  readonly listBranchFiles: {
3381
3381
  readonly method: "GET";
3382
- readonly path: "/projects/{projectRef}/branches/{branchName}/files";
3383
- readonly description: "List files in a branch (draft/working copy)";
3382
+ readonly path: "/projects/{projectRef}/files?branch={branchRef}";
3383
+ readonly description: "List files for a branch ref or name (omit branch for main branch)";
3384
3384
  };
3385
3385
  readonly getBranchFile: {
3386
3386
  readonly method: "GET";
3387
- readonly path: "/projects/{projectRef}/branches/{branchName}/files/{pathOrId}";
3388
- readonly description: "Get file from a branch by path or UUID";
3387
+ readonly path: "/projects/{projectRef}/files/{pathOrId}?branch={branchRef}";
3388
+ readonly description: "Get file from a branch ref or name by path or UUID";
3389
3389
  };
3390
3390
  readonly listEnvironmentFiles: {
3391
3391
  readonly method: "GET";
@@ -135,13 +135,13 @@ export const API_ENDPOINTS = {
135
135
  },
136
136
  listBranchFiles: {
137
137
  method: "GET",
138
- path: "/projects/{projectRef}/branches/{branchName}/files",
139
- description: "List files in a branch (draft/working copy)",
138
+ path: "/projects/{projectRef}/files?branch={branchRef}",
139
+ description: "List files for a branch ref or name (omit branch for main branch)",
140
140
  },
141
141
  getBranchFile: {
142
142
  method: "GET",
143
- path: "/projects/{projectRef}/branches/{branchName}/files/{pathOrId}",
144
- description: "Get file from a branch by path or UUID",
143
+ path: "/projects/{projectRef}/files/{pathOrId}?branch={branchRef}",
144
+ description: "Get file from a branch ref or name by path or UUID",
145
145
  },
146
146
  listEnvironmentFiles: {
147
147
  method: "GET",
@@ -15,5 +15,6 @@ export { lookup as lookupMimeType } from "./compat/media-types.js";
15
15
  export { createKVStore, MemoryKv } from "./compat/kv/index.js";
16
16
  export { isDeno } from "./compat/runtime.js";
17
17
  export { createFSAdapter, VeryfrontFSAdapter } from "./adapters/fs/index.js";
18
+ export { enhanceAdapterWithFS, isExtendedFSAdapter } from "./adapters/fs/index.js";
18
19
  export { VeryfrontApiClient } from "./adapters/veryfront-api-client/index.js";
19
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/platform/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EACL,KAAK,EACL,GAAG,EACH,GAAG,EACH,IAAI,EACJ,OAAO,EACP,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,MAAM,EACN,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,KAAK,UAAU,EACf,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/platform/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EACL,KAAK,EACL,GAAG,EACH,GAAG,EACH,IAAI,EACJ,OAAO,EACP,MAAM,EACN,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,EACb,WAAW,EACX,aAAa,EACb,QAAQ,EACR,UAAU,EACV,iBAAiB,EACjB,UAAU,EACV,MAAM,EACN,WAAW,EACX,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,gBAAgB,EAChB,MAAM,EACN,KAAK,UAAU,EACf,KAAK,EACL,OAAO,EACP,YAAY,EACZ,MAAM,EACN,aAAa,GACd,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,UAAU,EACV,KAAK,WAAW,GACjB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAGnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC"}
@@ -22,5 +22,6 @@ export { createKVStore, MemoryKv } from "./compat/kv/index.js";
22
22
  export { isDeno } from "./compat/runtime.js";
23
23
  // Adapters: filesystem
24
24
  export { createFSAdapter, VeryfrontFSAdapter } from "./adapters/fs/index.js";
25
+ export { enhanceAdapterWithFS, isExtendedFSAdapter } from "./adapters/fs/index.js";
25
26
  // Adapters: API client
26
27
  export { VeryfrontApiClient } from "./adapters/veryfront-api-client/index.js";
@@ -14,7 +14,7 @@ import type { Handler } from "../../types/index.js";
14
14
  import { ApiHandlerWrapper } from "../handlers/request/api/index.js";
15
15
  export { parseProxyEnvironment, type ProxyEnvironment } from "./proxy-environment.js";
16
16
  /** Handler names in registration order. */
17
- export declare const HANDLER_NAMES: readonly ["AuthHandler", "CsrfHandler", "HMRHandler", "CorsHandler", "HealthHandler", "MetricsHandler", "MemoryDebugHandler", "ClientLogHandler", "DevEndpointsHandler", "StylesCSSHandler", "DebugContextHandler", "OpenAPIHandler", "OpenAPIDocsHandler", "InternalAgentsListHandler", "InternalTasksListHandler", "AgentStreamHandler", "AgentRunResumeHandler", "AgentRunCancelHandler", "ChannelInvokeHandler", "DevDashboardHandler", "ProjectsHandler", "StudioBridgeModulesHandler", "CSSHandler", "DevFileHandler", "SnippetHandler", "StaticHandler", "LibModulesHandler", "RSCHandler", "ModuleHandler", "ApiHandlerWrapper", "MarkdownPreviewHandler", "SSRHandler", "NotFoundHandler"];
17
+ export declare const HANDLER_NAMES: readonly ["AuthHandler", "CsrfHandler", "HMRHandler", "CorsHandler", "HealthHandler", "MetricsHandler", "MemoryDebugHandler", "ClientLogHandler", "DevEndpointsHandler", "StylesCSSHandler", "DebugContextHandler", "OpenAPIHandler", "OpenAPIDocsHandler", "InternalAgentsListHandler", "AgentStreamHandler", "AgentRunResumeHandler", "AgentRunCancelHandler", "ChannelInvokeHandler", "DevDashboardHandler", "ProjectsHandler", "StudioBridgeModulesHandler", "CSSHandler", "DevFileHandler", "SnippetHandler", "StaticHandler", "LibModulesHandler", "RSCHandler", "ModuleHandler", "ApiHandlerWrapper", "MarkdownPreviewHandler", "SSRHandler", "NotFoundHandler"];
18
18
  /** Union of all registered handler names. */
19
19
  export type HandlerName = (typeof HANDLER_NAMES)[number];
20
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAQlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA0BpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA+DrE,OAAO,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAMtF,2CAA2C;AAC3C,eAAO,MAAM,aAAa,qqBAkChB,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,mBAAwB,GAC7B;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAuB5D;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CAC/C;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,qBAAsC,GAC3C,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAsYnF;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/server/runtime-handler/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,OAAO,MAAM,wBAAwB,CAAC;AAQlD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AA0BpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AA8DrE,OAAO,EAAE,qBAAqB,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAMtF,2CAA2C;AAC3C,eAAO,MAAM,aAAa,yoBAiChB,CAAC;AAEX,6CAA6C;AAC7C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,mDAAmD;IACnD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAyCD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,mBAAwB,GAC7B;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,iBAAiB,CAAA;CAAE,CAuB5D;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wEAAwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,sFAAsF;IACtF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,uGAAuG;IACvG,kBAAkB,CAAC,EAAE,SAAS,GAAG,YAAY,CAAC;CAC/C;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,cAAc,EACvB,IAAI,GAAE,qBAAsC,GAC3C,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAsYnF;AAGD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC"}
@@ -43,7 +43,6 @@ import { MarkdownPreviewHandler } from "../handlers/preview/markdown-preview.han
43
43
  import { OpenAPIHandler } from "../handlers/request/openapi.handler.js";
44
44
  import { OpenAPIDocsHandler } from "../handlers/request/openapi-docs.handler.js";
45
45
  import { InternalAgentsListHandler } from "../handlers/request/internal-agents-list.handler.js";
46
- import { InternalTasksListHandler } from "../handlers/request/internal-tasks-list.handler.js";
47
46
  import { AgentStreamHandler } from "../handlers/request/agent-stream.handler.js";
48
47
  import { AgentRunResumeHandler } from "../handlers/request/agent-run-resume.handler.js";
49
48
  import { AgentRunCancelHandler } from "../handlers/request/agent-run-cancel.handler.js";
@@ -84,7 +83,6 @@ export const HANDLER_NAMES = [
84
83
  "OpenAPIHandler",
85
84
  "OpenAPIDocsHandler",
86
85
  "InternalAgentsListHandler",
87
- "InternalTasksListHandler",
88
86
  "AgentStreamHandler",
89
87
  "AgentRunResumeHandler",
90
88
  "AgentRunCancelHandler",
@@ -120,7 +118,6 @@ const handlerFactories = {
120
118
  OpenAPIHandler: () => new OpenAPIHandler(),
121
119
  OpenAPIDocsHandler: () => new OpenAPIDocsHandler(),
122
120
  InternalAgentsListHandler: () => new InternalAgentsListHandler(),
123
- InternalTasksListHandler: () => new InternalTasksListHandler(),
124
121
  AgentStreamHandler: () => new AgentStreamHandler(),
125
122
  AgentRunResumeHandler: () => new AgentRunResumeHandler(),
126
123
  AgentRunCancelHandler: () => new AgentRunCancelHandler(),
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/src/task/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IAEX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IAEb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,gDAAgD;IAChD,OAAO,EAAE,cAAc,CAAC;IAExB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IAExB,0CAA0C;IAC1C,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA6G9B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAiFhC"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../../src/src/task/discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKjD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iFAAiF;IACjF,EAAE,EAAE,MAAM,CAAC;IAEX,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IAEb,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,0BAA0B;IAC1B,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,gDAAgD;IAChD,OAAO,EAAE,cAAc,CAAC;IAExB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,KAAK,EAAE,cAAc,EAAE,CAAC;IAExB,0CAA0C;IAC1C,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CASvE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAyG9B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CA6EhC"}
@@ -22,7 +22,7 @@
22
22
  import { join } from "../../deps/jsr.io/@std/path/1.1.4/mod.js";
23
23
  import { logger as baseLogger } from "../utils/index.js";
24
24
  import { collectFiles } from "../utils/file-discovery.js";
25
- import { loadHandlerModule } from "../routing/api/module-loader/loader.js";
25
+ import { importDiscoveryModule } from "../discovery/module-import.js";
26
26
  import { isTaskDefinition } from "./types.js";
27
27
  const logger = baseLogger.component("task-discovery");
28
28
  /**
@@ -71,14 +71,10 @@ export async function discoverTasks(options) {
71
71
  }
72
72
  for (const file of files) {
73
73
  try {
74
- const module = await loadHandlerModule({
75
- projectDir,
76
- modulePath: file.path,
74
+ const module = await importDiscoveryModule(file.path, {
77
75
  adapter,
78
- config,
76
+ projectDir,
79
77
  });
80
- if (!module)
81
- continue;
82
78
  // Prefer default export (aligned with discovery-engine behaviour)
83
79
  const defaultExport = module.default;
84
80
  if (isTaskDefinition(defaultExport)) {
@@ -160,14 +156,10 @@ export async function findTaskById(taskId, options) {
160
156
  if (id !== taskId)
161
157
  continue;
162
158
  try {
163
- const module = await loadHandlerModule({
164
- projectDir,
165
- modulePath: file.path,
159
+ const module = await importDiscoveryModule(file.path, {
166
160
  adapter,
167
- config,
161
+ projectDir,
168
162
  });
169
- if (!module)
170
- continue;
171
163
  const defaultExport = module.default;
172
164
  if (isTaskDefinition(defaultExport)) {
173
165
  if (debug) {
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-discovery.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/discovery/workflow-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IAEX,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,gDAAgD;IAChD,OAAO,EAAE,cAAc,CAAC;IAExB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,+BAA+B;IAC/B,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAEhC,0CAA0C;IAC1C,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAqCD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CAiGlC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAGpC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,kBAAkB,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAMjC"}
1
+ {"version":3,"file":"workflow-discovery.d.ts","sourceRoot":"","sources":["../../../../src/src/workflow/discovery/workflow-discovery.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IAEX,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IAEjB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IAEnB,8BAA8B;IAC9B,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,gDAAgD;IAChD,OAAO,EAAE,cAAc,CAAC;IAExB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB,8DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,2BAA2B;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,+BAA+B;IAC/B,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAEhC,0CAA0C;IAC1C,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAqCD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,uBAAuB,CAAC,CA2FlC;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAGpC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,kBAAkB,EAAE,GAC9B,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAMjC"}
@@ -24,7 +24,7 @@
24
24
  import { join } from "../../../deps/jsr.io/@std/path/1.1.4/mod.js";
25
25
  import { logger as baseLogger } from "../../utils/index.js";
26
26
  import { collectFiles } from "../../utils/file-discovery.js";
27
- import { loadHandlerModule } from "../../routing/api/module-loader/loader.js";
27
+ import { importDiscoveryModule } from "../../discovery/module-import.js";
28
28
  const logger = baseLogger.component("workflow-discovery");
29
29
  /**
30
30
  * Check if a value looks like a workflow definition
@@ -95,15 +95,10 @@ export async function discoverWorkflows(options) {
95
95
  // Load and extract workflows from each file
96
96
  for (const file of files) {
97
97
  try {
98
- const module = await loadHandlerModule({
99
- projectDir,
100
- modulePath: file.path,
98
+ const module = await importDiscoveryModule(file.path, {
101
99
  adapter,
102
- config,
100
+ projectDir,
103
101
  });
104
- if (!module) {
105
- continue;
106
- }
107
102
  // Extract workflows from module exports
108
103
  for (const [exportName, value] of Object.entries(module)) {
109
104
  const definition = extractWorkflowDefinition(value);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "veryfront",
3
- "version": "0.1.76",
3
+ "version": "0.1.78",
4
4
  "description": "The simplest way to build AI-powered apps",
5
5
  "keywords": [
6
6
  "react",
@@ -159,7 +159,7 @@ export function buildFilesListUrl(projectSlug: string, source: PullSource): stri
159
159
  case "release":
160
160
  return `/projects/${projectSlug}/releases/${encodeURIComponent(source.version)}/files`;
161
161
  case "branch":
162
- return `/projects/${projectSlug}/branches/${encodeURIComponent(source.name)}/files`;
162
+ return `/projects/${projectSlug}/files?branch=${encodeURIComponent(source.name)}`;
163
163
  case "main":
164
164
  return `/projects/${projectSlug}/files`;
165
165
  }
@@ -211,9 +211,9 @@ export function buildFileContentUrl(projectSlug: string, path: string, source: P
211
211
  encodeURIComponent(source.version)
212
212
  }/files/${encodedPath}`;
213
213
  case "branch":
214
- return `/projects/${projectSlug}/branches/${
214
+ return `/projects/${projectSlug}/files/${encodedPath}?branch=${
215
215
  encodeURIComponent(source.name)
216
- }/files/${encodedPath}`;
216
+ }`;
217
217
  case "main":
218
218
  return `/projects/${projectSlug}/files/${encodedPath}`;
219
219
  }
@@ -9,14 +9,12 @@ import * as dntShim from "../../../_dnt.shims.js";
9
9
 
10
10
  import { cliLogger } from "../../utils/index.js";
11
11
  import { exitProcess } from "../../utils/index.js";
12
+ import { withProjectSourceContext } from "../../shared/project-source-context.js";
12
13
  import type { TaskArgs } from "./handler.js";
13
14
 
14
15
  export interface TaskOptions extends TaskArgs {}
15
16
 
16
17
  export async function taskCommand(options: TaskOptions): Promise<void> {
17
- const { getAdapter } = await import(
18
- "../../../src/platform/adapters/detect.js"
19
- );
20
18
  const { discoverTasks } = await import(
21
19
  "../../../src/task/discovery.js"
22
20
  );
@@ -32,67 +30,78 @@ export async function taskCommand(options: TaskOptions): Promise<void> {
32
30
  }
33
31
 
34
32
  const projectDir = dntShim.Deno.cwd();
35
- const adapter = await getAdapter();
33
+ await withProjectSourceContext(
34
+ projectDir,
35
+ async ({ adapter, config, projectId, proxyContext }) => {
36
+ const sourceLabel = proxyContext?.branchRef
37
+ ? `branch ${proxyContext.branchRef}`
38
+ : proxyContext
39
+ ? "main"
40
+ : `${projectDir}/tasks/...`;
36
41
 
37
- cliLogger.info(`Discovering tasks in ${projectDir}/tasks/...`);
42
+ cliLogger.info(`Discovering tasks in ${sourceLabel}`);
38
43
 
39
- const { tasks, errors } = await discoverTasks({
40
- projectDir,
41
- adapter,
42
- debug: options.debug,
43
- });
44
+ const { tasks, errors } = await discoverTasks({
45
+ projectDir,
46
+ adapter,
47
+ config,
48
+ debug: options.debug,
49
+ });
44
50
 
45
- if (errors.length > 0 && options.debug) {
46
- for (const err of errors) {
47
- cliLogger.warn(` Warning: ${err.filePath}: ${err.error}`);
48
- }
49
- }
51
+ if (errors.length > 0 && options.debug) {
52
+ for (const err of errors) {
53
+ cliLogger.warn(` Warning: ${err.filePath}: ${err.error}`);
54
+ }
55
+ }
50
56
 
51
- const task = tasks.find((t) => t.id === taskName);
52
- if (!task) {
53
- cliLogger.error(`Task "${taskName}" not found.`);
54
- if (tasks.length > 0) {
55
- cliLogger.info("Available tasks:");
56
- for (const t of tasks) {
57
- cliLogger.info(` - ${t.id}${t.name !== t.id ? ` (${t.name})` : ""}`);
57
+ const task = tasks.find((t) => t.id === taskName);
58
+ if (!task) {
59
+ cliLogger.error(`Task "${taskName}" not found.`);
60
+ if (tasks.length > 0) {
61
+ cliLogger.info("Available tasks:");
62
+ for (const t of tasks) {
63
+ cliLogger.info(` - ${t.id}${t.name !== t.id ? ` (${t.name})` : ""}`);
64
+ }
65
+ } else {
66
+ cliLogger.info("No tasks found. Create a task file in tasks/ directory:");
67
+ cliLogger.info(" tasks/my-task.ts");
68
+ }
69
+ exitProcess(1);
70
+ return;
58
71
  }
59
- } else {
60
- cliLogger.info("No tasks found. Create a task file in tasks/ directory:");
61
- cliLogger.info(" tasks/my-task.ts");
62
- }
63
- exitProcess(1);
64
- return;
65
- }
66
72
 
67
- // Parse config JSON if provided
68
- let config: Record<string, unknown> = {};
69
- if (options.config) {
70
- try {
71
- config = JSON.parse(options.config);
72
- } catch {
73
- cliLogger.error("Invalid --config JSON");
74
- exitProcess(1);
75
- return;
76
- }
77
- }
73
+ let taskConfig: Record<string, unknown> = {};
74
+ if (options.config) {
75
+ try {
76
+ taskConfig = JSON.parse(options.config);
77
+ } catch {
78
+ cliLogger.error("Invalid --config JSON");
79
+ exitProcess(1);
80
+ return;
81
+ }
82
+ }
78
83
 
79
- cliLogger.info(`Running task: ${task.name} (${task.id})`);
80
- cliLogger.info("");
84
+ cliLogger.info(`Running task: ${task.name} (${task.id})`);
85
+ cliLogger.info("");
81
86
 
82
- const result = await runTask({
83
- task,
84
- config,
85
- debug: options.debug,
86
- });
87
+ const result = await runTask({
88
+ task,
89
+ config: taskConfig,
90
+ projectId,
91
+ debug: options.debug,
92
+ });
87
93
 
88
- cliLogger.info("");
89
- if (result.success) {
90
- cliLogger.info(`Task completed in ${result.durationMs}ms`);
91
- if (result.result !== undefined) {
92
- cliLogger.info(`Result: ${JSON.stringify(result.result, null, 2)}`);
93
- }
94
- } else {
95
- cliLogger.error(`Task failed after ${result.durationMs}ms: ${result.error}`);
96
- exitProcess(1);
97
- }
94
+ cliLogger.info("");
95
+ if (result.success) {
96
+ cliLogger.info(`Task completed in ${result.durationMs}ms`);
97
+ if (result.result !== undefined) {
98
+ cliLogger.info(`Result: ${JSON.stringify(result.result, null, 2)}`);
99
+ }
100
+ return;
101
+ }
102
+
103
+ cliLogger.error(`Task failed after ${result.durationMs}ms: ${result.error}`);
104
+ exitProcess(1);
105
+ },
106
+ );
98
107
  }
@@ -0,0 +1,21 @@
1
+ import type { CommandHelp } from "../../help/types.js";
2
+
3
+ export const workflowHelp: CommandHelp = {
4
+ name: "workflow",
5
+ description: "Run a workflow from the app/workflows directory",
6
+ usage: "veryfront workflow run <id> [options]",
7
+ options: [
8
+ {
9
+ flag: "--input <json>",
10
+ description: "JSON input to pass to the workflow",
11
+ },
12
+ {
13
+ flag: "--debug",
14
+ description: "Enable debug logging",
15
+ },
16
+ ],
17
+ examples: [
18
+ "veryfront workflow run publish-site",
19
+ 'veryfront workflow run content-pipeline --input \'{"topic":"AI"}\'',
20
+ ],
21
+ };
@@ -0,0 +1,152 @@
1
+ import * as dntShim from "../../../_dnt.shims.js";
2
+ import { cliLogger } from "../../utils/index.js";
3
+ import { exitProcess } from "../../utils/index.js";
4
+ import { withProjectSourceContext } from "../../shared/project-source-context.js";
5
+ import { getEnv } from "../../../src/platform/index.js";
6
+ import type { WorkflowArgs } from "./handler.js";
7
+
8
+ const WORKFLOW_STATUS_POLL_INTERVAL_MS = 1_000;
9
+
10
+ export interface WorkflowOptions extends WorkflowArgs {}
11
+
12
+ async function createWorkflowClient(debug: boolean) {
13
+ const { createWorkflowClient } = await import(
14
+ "../../../src/workflow/api/workflow-client.js"
15
+ );
16
+
17
+ const redisUrl = getEnv("REDIS_URL")?.trim();
18
+ if (!redisUrl) {
19
+ return createWorkflowClient({ debug });
20
+ }
21
+
22
+ const { RedisBackend } = await import(
23
+ "../../../src/workflow/backends/redis.js"
24
+ );
25
+
26
+ const backend = new RedisBackend({ url: redisUrl, debug });
27
+ if (backend.initialize) {
28
+ await backend.initialize();
29
+ }
30
+
31
+ return createWorkflowClient({ backend, debug });
32
+ }
33
+
34
+ async function waitForWorkflowExit(
35
+ client: Awaited<ReturnType<typeof createWorkflowClient>>,
36
+ runId: string,
37
+ ): Promise<void> {
38
+ while (true) {
39
+ const run = await client.getRun(runId);
40
+ if (!run) {
41
+ throw new Error(`Workflow run not found: ${runId}`);
42
+ }
43
+
44
+ if (run.status === "completed") {
45
+ cliLogger.info(`Workflow completed: ${runId}`);
46
+ if (run.output !== undefined) {
47
+ cliLogger.info(`Result: ${JSON.stringify(run.output, null, 2)}`);
48
+ }
49
+ return;
50
+ }
51
+
52
+ if (run.status === "waiting") {
53
+ cliLogger.info(`Workflow is waiting: ${runId}`);
54
+ return;
55
+ }
56
+
57
+ if (run.status === "failed") {
58
+ throw new Error(run.error?.message || `Workflow failed: ${runId}`);
59
+ }
60
+
61
+ if (run.status === "cancelled") {
62
+ throw new Error(`Workflow was cancelled: ${runId}`);
63
+ }
64
+
65
+ await new Promise((resolve) => dntShim.setTimeout(resolve, WORKFLOW_STATUS_POLL_INTERVAL_MS));
66
+ }
67
+ }
68
+
69
+ export async function workflowCommand(options: WorkflowOptions): Promise<void> {
70
+ if (options.action !== "run") {
71
+ cliLogger.error(`Unknown workflow action: ${options.action}`);
72
+ exitProcess(1);
73
+ return;
74
+ }
75
+
76
+ const workflowId = options.name;
77
+ if (!workflowId) {
78
+ cliLogger.error("Workflow ID is required. Usage: veryfront workflow run <id>");
79
+ exitProcess(1);
80
+ return;
81
+ }
82
+
83
+ let input: Record<string, unknown> = {};
84
+ if (options.input) {
85
+ try {
86
+ input = JSON.parse(options.input);
87
+ } catch {
88
+ cliLogger.error("Invalid --input JSON");
89
+ exitProcess(1);
90
+ return;
91
+ }
92
+ }
93
+
94
+ const { discoverWorkflows } = await import(
95
+ "../../../src/workflow/discovery/index.js"
96
+ );
97
+
98
+ await withProjectSourceContext(dntShim.Deno.cwd(), async ({ adapter, config, proxyContext }) => {
99
+ const sourceLabel = proxyContext?.branchRef
100
+ ? `branch ${proxyContext.branchRef}`
101
+ : proxyContext
102
+ ? "main"
103
+ : `${dntShim.Deno.cwd()}/app/workflows/...`;
104
+
105
+ cliLogger.info(`Discovering workflows in ${sourceLabel}`);
106
+
107
+ const discovery = await discoverWorkflows({
108
+ projectDir: dntShim.Deno.cwd(),
109
+ adapter,
110
+ config,
111
+ debug: options.debug,
112
+ });
113
+
114
+ if (discovery.errors.length > 0 && options.debug) {
115
+ for (const err of discovery.errors) {
116
+ cliLogger.warn(` Warning: ${err.filePath}: ${err.error}`);
117
+ }
118
+ }
119
+
120
+ const workflow = discovery.workflows.find((candidate) => candidate.id === workflowId);
121
+ if (!workflow) {
122
+ cliLogger.error(`Workflow "${workflowId}" not found.`);
123
+ if (discovery.workflows.length > 0) {
124
+ cliLogger.info("Available workflows:");
125
+ for (const candidate of discovery.workflows) {
126
+ cliLogger.info(` - ${candidate.id}`);
127
+ }
128
+ } else {
129
+ cliLogger.info("No workflows found. Create a workflow file in app/workflows/.");
130
+ }
131
+ exitProcess(1);
132
+ return;
133
+ }
134
+
135
+ const client = await createWorkflowClient(options.debug);
136
+
137
+ try {
138
+ client.register(workflow.definition);
139
+ cliLogger.info(`Running workflow: ${workflow.id}`);
140
+ cliLogger.info("");
141
+
142
+ const handle = await client.start(workflow.id, input);
143
+ await waitForWorkflowExit(client, handle.runId);
144
+ } finally {
145
+ await client.destroy();
146
+ }
147
+ }).catch((error: unknown) => {
148
+ const message = error instanceof Error ? error.message : String(error);
149
+ cliLogger.error(message);
150
+ exitProcess(1);
151
+ });
152
+ }
@@ -0,0 +1,25 @@
1
+ import { z } from "zod";
2
+ import { createArgParser, parseArgsOrThrow } from "../../shared/args.js";
3
+ import type { ParsedArgs } from "../../shared/types.js";
4
+
5
+ const WorkflowArgsSchema = z.object({
6
+ action: z.enum(["run"]),
7
+ name: z.string(),
8
+ input: z.string().optional(),
9
+ debug: z.boolean().default(false),
10
+ });
11
+
12
+ export type WorkflowArgs = z.infer<typeof WorkflowArgsSchema>;
13
+
14
+ export const parseWorkflowArgs = createArgParser(WorkflowArgsSchema, {
15
+ action: { keys: ["action"], type: "string", positional: 0 },
16
+ name: { keys: ["name"], type: "string", positional: 1 },
17
+ input: { keys: ["input"], type: "string" },
18
+ debug: { keys: ["debug"], type: "boolean" },
19
+ });
20
+
21
+ export async function handleWorkflowCommand(args: ParsedArgs): Promise<void> {
22
+ const opts = parseArgsOrThrow(parseWorkflowArgs, "workflow", args);
23
+ const { workflowCommand } = await import("./command.js");
24
+ await workflowCommand(opts);
25
+ }
@@ -36,6 +36,7 @@ import { mcpHelp } from "../commands/mcp/command-help.js";
36
36
  import { issuesHelp } from "../commands/issues/command-help.js";
37
37
  import { startHelp } from "../commands/start/command-help.js";
38
38
  import { taskHelp } from "../commands/task/command-help.js";
39
+ import { workflowHelp } from "../commands/workflow/command-help.js";
39
40
 
40
41
  /**
41
42
  * Central registry of all command help definitions.
@@ -71,4 +72,5 @@ export const COMMANDS: CommandRegistry = {
71
72
  issues: issuesHelp,
72
73
  start: startHelp,
73
74
  task: taskHelp,
75
+ workflow: workflowHelp,
74
76
  };
package/src/cli/router.ts CHANGED
@@ -31,6 +31,7 @@ import { handleStartCommand } from "./commands/start/handler.js";
31
31
  import { handleStudioCommand } from "./commands/studio/handler.js";
32
32
  import { handleUpCommand } from "./commands/up/index.js";
33
33
  import { handleTaskCommand } from "./commands/task/handler.js";
34
+ import { handleWorkflowCommand } from "./commands/workflow/handler.js";
34
35
  import { handleWorkerCommand } from "./commands/worker/handler.js";
35
36
  import { login, logout, whoami } from "./auth/index.js";
36
37
  import { parseLoginMethod } from "./auth/utils.js";
@@ -81,6 +82,7 @@ const commands: Record<string, (args: ParsedArgs) => Promise<void>> = {
81
82
  "issues": handleIssuesCommand,
82
83
  "start": handleStartCommand,
83
84
  "task": handleTaskCommand,
85
+ "workflow": handleWorkflowCommand,
84
86
  "worker": handleWorkerCommand,
85
87
  };
86
88