@bastani/atomic 0.8.4 → 0.8.5

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 (245) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +24 -23
  3. package/dist/builtin/intercom/README.md +5 -5
  4. package/dist/builtin/intercom/index.ts +1 -1
  5. package/dist/builtin/intercom/package.json +1 -1
  6. package/dist/builtin/intercom/ui/compose.ts +19 -1
  7. package/dist/builtin/intercom/ui/session-list.ts +19 -1
  8. package/dist/builtin/mcp/README.md +3 -3
  9. package/dist/builtin/mcp/commands.ts +1 -1
  10. package/dist/builtin/mcp/host-html-template.ts +1 -1
  11. package/dist/builtin/mcp/mcp-panel.ts +14 -14
  12. package/dist/builtin/mcp/mcp-setup-panel.ts +4 -4
  13. package/dist/builtin/mcp/package.json +1 -1
  14. package/dist/builtin/mcp/tool-result-renderer.ts +1 -1
  15. package/dist/builtin/subagents/README.md +3 -3
  16. package/dist/builtin/subagents/package.json +1 -1
  17. package/dist/builtin/subagents/src/tui/render.ts +1844 -1062
  18. package/dist/builtin/web-access/README.md +1 -1
  19. package/dist/builtin/web-access/curator-page.ts +2 -2
  20. package/dist/builtin/web-access/index.ts +1 -1
  21. package/dist/builtin/web-access/package.json +1 -1
  22. package/dist/builtin/workflows/README.md +34 -7
  23. package/dist/builtin/workflows/builtin/deep-research-codebase.ts +23 -4
  24. package/dist/builtin/workflows/builtin/ralph.ts +1 -1
  25. package/dist/builtin/workflows/package.json +1 -1
  26. package/dist/builtin/workflows/skills/workflow/SKILL.md +75 -16
  27. package/dist/builtin/workflows/skills/workflow/references/running-workflows.md +34 -11
  28. package/dist/builtin/workflows/skills/workflow/references/sdk-authoring.md +111 -20
  29. package/dist/builtin/workflows/src/extension/discovery.ts +32 -4
  30. package/dist/builtin/workflows/src/extension/index.ts +347 -63
  31. package/dist/builtin/workflows/src/extension/render-call.ts +3 -1
  32. package/dist/builtin/workflows/src/extension/render-result.ts +7 -0
  33. package/dist/builtin/workflows/src/extension/runtime.ts +4 -2
  34. package/dist/builtin/workflows/src/extension/wiring.ts +32 -8
  35. package/dist/builtin/workflows/src/extension/workflow-schema.ts +36 -14
  36. package/dist/builtin/workflows/src/runs/background/runner.ts +2 -2
  37. package/dist/builtin/workflows/src/runs/background/status.ts +89 -0
  38. package/dist/builtin/workflows/src/runs/foreground/executor.ts +338 -78
  39. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +2 -0
  40. package/dist/builtin/workflows/src/runs/foreground/stage-runner.ts +55 -7
  41. package/dist/builtin/workflows/src/runs/shared/workflow-runner.ts +146 -10
  42. package/dist/builtin/workflows/src/shared/store.ts +29 -0
  43. package/dist/builtin/workflows/src/shared/types.ts +25 -4
  44. package/dist/builtin/workflows/src/tui/graph-canvas.ts +69 -2
  45. package/dist/builtin/workflows/src/tui/graph-view.ts +97 -182
  46. package/dist/builtin/workflows/src/tui/header.ts +36 -20
  47. package/dist/builtin/workflows/src/tui/inline-form-card.ts +129 -46
  48. package/dist/builtin/workflows/src/tui/inline-form-editor.ts +111 -36
  49. package/dist/builtin/workflows/src/tui/inputs-picker.ts +311 -91
  50. package/dist/builtin/workflows/src/tui/layout.ts +1 -1
  51. package/dist/builtin/workflows/src/tui/node-card.ts +66 -37
  52. package/dist/builtin/workflows/src/tui/overlay-adapter.ts +20 -6
  53. package/dist/builtin/workflows/src/tui/prompt-card.ts +262 -85
  54. package/dist/builtin/workflows/src/tui/run-detail.ts +50 -31
  55. package/dist/builtin/workflows/src/tui/session-confirm.ts +21 -14
  56. package/dist/builtin/workflows/src/tui/session-picker.ts +35 -26
  57. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +531 -960
  58. package/dist/builtin/workflows/src/tui/status-helpers.ts +6 -0
  59. package/dist/builtin/workflows/src/tui/status-list.ts +8 -4
  60. package/dist/builtin/workflows/src/tui/store-widget-installer.ts +7 -2
  61. package/dist/builtin/workflows/src/tui/switcher.ts +55 -25
  62. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +33 -1
  63. package/dist/builtin/workflows/src/tui/workflow-list.ts +10 -6
  64. package/dist/cli/args.d.ts.map +1 -1
  65. package/dist/cli/args.js +1 -1
  66. package/dist/cli/args.js.map +1 -1
  67. package/dist/config.d.ts.map +1 -1
  68. package/dist/config.js +20 -6
  69. package/dist/config.js.map +1 -1
  70. package/dist/core/agent-session-services.d.ts +3 -3
  71. package/dist/core/agent-session-services.d.ts.map +1 -1
  72. package/dist/core/agent-session-services.js.map +1 -1
  73. package/dist/core/agent-session.d.ts +7 -7
  74. package/dist/core/agent-session.d.ts.map +1 -1
  75. package/dist/core/agent-session.js.map +1 -1
  76. package/dist/core/compaction/branch-summarization.d.ts +2 -2
  77. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  78. package/dist/core/compaction/branch-summarization.js.map +1 -1
  79. package/dist/core/compaction/compaction.d.ts +3 -3
  80. package/dist/core/compaction/compaction.d.ts.map +1 -1
  81. package/dist/core/compaction/compaction.js.map +1 -1
  82. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  83. package/dist/core/export-html/tool-renderer.js.map +1 -1
  84. package/dist/core/extensions/loader.d.ts +3 -2
  85. package/dist/core/extensions/loader.d.ts.map +1 -1
  86. package/dist/core/extensions/loader.js +24 -12
  87. package/dist/core/extensions/loader.js.map +1 -1
  88. package/dist/core/extensions/runner.d.ts.map +1 -1
  89. package/dist/core/extensions/runner.js +6 -0
  90. package/dist/core/extensions/runner.js.map +1 -1
  91. package/dist/core/extensions/types.d.ts +28 -17
  92. package/dist/core/extensions/types.d.ts.map +1 -1
  93. package/dist/core/extensions/types.js.map +1 -1
  94. package/dist/core/package-manager.d.ts +1 -0
  95. package/dist/core/package-manager.d.ts.map +1 -1
  96. package/dist/core/package-manager.js +65 -28
  97. package/dist/core/package-manager.js.map +1 -1
  98. package/dist/core/resource-loader.d.ts.map +1 -1
  99. package/dist/core/resource-loader.js +13 -5
  100. package/dist/core/resource-loader.js.map +1 -1
  101. package/dist/core/sdk.d.ts +3 -3
  102. package/dist/core/sdk.d.ts.map +1 -1
  103. package/dist/core/sdk.js.map +1 -1
  104. package/dist/core/session-manager.d.ts.map +1 -1
  105. package/dist/core/session-manager.js +1 -1
  106. package/dist/core/session-manager.js.map +1 -1
  107. package/dist/core/settings-manager.d.ts +2 -0
  108. package/dist/core/settings-manager.d.ts.map +1 -1
  109. package/dist/core/settings-manager.js.map +1 -1
  110. package/dist/core/slash-commands.d.ts.map +1 -1
  111. package/dist/core/slash-commands.js +1 -1
  112. package/dist/core/slash-commands.js.map +1 -1
  113. package/dist/core/system-prompt.d.ts.map +1 -1
  114. package/dist/core/system-prompt.js +5 -3
  115. package/dist/core/system-prompt.js.map +1 -1
  116. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts +1 -1
  117. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.d.ts.map +1 -1
  118. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js +1 -1
  119. package/dist/core/tools/ask-user-question/view/components/preview/preview-block-renderer.js.map +1 -1
  120. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts +8 -8
  121. package/dist/core/tools/ask-user-question/view/dialog-builder.d.ts.map +1 -1
  122. package/dist/core/tools/ask-user-question/view/dialog-builder.js +6 -6
  123. package/dist/core/tools/ask-user-question/view/dialog-builder.js.map +1 -1
  124. package/dist/core/tools/bash.d.ts.map +1 -1
  125. package/dist/core/tools/bash.js +1 -1
  126. package/dist/core/tools/bash.js.map +1 -1
  127. package/dist/core/tools/find.d.ts.map +1 -1
  128. package/dist/core/tools/find.js +1 -1
  129. package/dist/core/tools/find.js.map +1 -1
  130. package/dist/core/tools/grep.d.ts.map +1 -1
  131. package/dist/core/tools/grep.js +7 -4
  132. package/dist/core/tools/grep.js.map +1 -1
  133. package/dist/core/tools/index.d.ts +3 -2
  134. package/dist/core/tools/index.d.ts.map +1 -1
  135. package/dist/core/tools/index.js.map +1 -1
  136. package/dist/core/tools/ls.d.ts.map +1 -1
  137. package/dist/core/tools/ls.js +3 -2
  138. package/dist/core/tools/ls.js.map +1 -1
  139. package/dist/core/tools/read.d.ts.map +1 -1
  140. package/dist/core/tools/read.js +2 -2
  141. package/dist/core/tools/read.js.map +1 -1
  142. package/dist/core/tools/render-utils.d.ts +2 -1
  143. package/dist/core/tools/render-utils.d.ts.map +1 -1
  144. package/dist/core/tools/render-utils.js.map +1 -1
  145. package/dist/core/tools/todos.d.ts.map +1 -1
  146. package/dist/core/tools/todos.js +1 -1
  147. package/dist/core/tools/todos.js.map +1 -1
  148. package/dist/core/tools/tool-definition-wrapper.d.ts +4 -3
  149. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  150. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  151. package/dist/core/tools/write.d.ts.map +1 -1
  152. package/dist/core/tools/write.js +1 -1
  153. package/dist/core/tools/write.js.map +1 -1
  154. package/dist/index.d.ts +2 -1
  155. package/dist/index.d.ts.map +1 -1
  156. package/dist/index.js +2 -1
  157. package/dist/index.js.map +1 -1
  158. package/dist/main.d.ts.map +1 -1
  159. package/dist/main.js +2 -2
  160. package/dist/main.js.map +1 -1
  161. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  162. package/dist/modes/interactive/components/assistant-message.js +3 -3
  163. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  164. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  165. package/dist/modes/interactive/components/bash-execution.js +3 -3
  166. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  167. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  168. package/dist/modes/interactive/components/branch-summary-message.js +1 -1
  169. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  170. package/dist/modes/interactive/components/chat-message-renderer.d.ts +2 -1
  171. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  172. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  173. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  174. package/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  175. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  176. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  177. package/dist/modes/interactive/components/config-selector.js +1 -1
  178. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  179. package/dist/modes/interactive/components/custom-editor.d.ts +3 -0
  180. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/custom-editor.js +13 -3
  182. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  183. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  184. package/dist/modes/interactive/components/footer.js +1 -1
  185. package/dist/modes/interactive/components/footer.js.map +1 -1
  186. package/dist/modes/interactive/components/index.d.ts +2 -1
  187. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  188. package/dist/modes/interactive/components/index.js +2 -1
  189. package/dist/modes/interactive/components/index.js.map +1 -1
  190. package/dist/modes/interactive/components/keybinding-hints.d.ts +1 -0
  191. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  192. package/dist/modes/interactive/components/keybinding-hints.js +47 -5
  193. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  194. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  195. package/dist/modes/interactive/components/login-dialog.js +5 -5
  196. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  197. package/dist/modes/interactive/components/model-selector.d.ts +3 -3
  198. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  199. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  200. package/dist/modes/interactive/components/scoped-models-selector.d.ts +2 -2
  201. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  202. package/dist/modes/interactive/components/scoped-models-selector.js +7 -7
  203. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  204. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  205. package/dist/modes/interactive/components/session-selector.js +8 -8
  206. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  207. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  208. package/dist/modes/interactive/components/settings-selector.js +3 -3
  209. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  210. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  211. package/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  212. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  213. package/dist/modes/interactive/components/tool-execution.d.ts +10 -12
  214. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/tool-execution.js +3 -3
  216. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  217. package/dist/modes/interactive/components/working-status.d.ts +25 -0
  218. package/dist/modes/interactive/components/working-status.d.ts.map +1 -0
  219. package/dist/modes/interactive/components/working-status.js +28 -0
  220. package/dist/modes/interactive/components/working-status.js.map +1 -0
  221. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  222. package/dist/modes/interactive/interactive-mode.js +8 -7
  223. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  224. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  225. package/dist/modes/rpc/rpc-mode.js +8 -0
  226. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  227. package/dist/modes/rpc/rpc-types.d.ts +5 -5
  228. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  229. package/dist/modes/rpc/rpc-types.js.map +1 -1
  230. package/dist/utils/tools-manager.d.ts.map +1 -1
  231. package/dist/utils/tools-manager.js.map +1 -1
  232. package/docs/development.md +2 -2
  233. package/docs/extensions.md +7 -7
  234. package/docs/packages.md +11 -8
  235. package/docs/quickstart.md +2 -2
  236. package/docs/rpc.md +1 -1
  237. package/docs/sdk.md +14 -11
  238. package/docs/session-format.md +1 -1
  239. package/docs/sessions.md +10 -10
  240. package/docs/settings.md +1 -1
  241. package/docs/terminal-setup.md +9 -9
  242. package/docs/tmux.md +10 -10
  243. package/docs/tui.md +2 -2
  244. package/docs/usage.md +9 -9
  245. package/package.json +6 -1
@@ -25,7 +25,7 @@ import { basename, dirname, join, relative, resolve, sep } from "node:path";
25
25
  import { globSync } from "glob";
26
26
  import ignore from "ignore";
27
27
  import { minimatch } from "minimatch";
28
- import { CONFIG_DIR_NAME, ENV_OFFLINE, getAgentDir, getAgentDirs, getEnvValue, getProjectConfigDirs } from "../config.js";
28
+ import { APP_NAME, CONFIG_DIR_NAME, ENV_OFFLINE, getAgentDir, getAgentDirs, getEnvValue, getProjectConfigDirs } from "../config.js";
29
29
  import { shouldUseWindowsShell } from "../utils/child-process.js";
30
30
  import { parseGitUrl } from "../utils/git.js";
31
31
  import { canonicalizePath, isLocalPath } from "../utils/paths.js";
@@ -57,12 +57,13 @@ function resourcePrecedenceRank(m) {
57
57
  const scopeBase = m.scope === "project" ? 0 : 2;
58
58
  return scopeBase + (m.source === "local" ? 0 : 1);
59
59
  }
60
- const RESOURCE_TYPES = ["extensions", "skills", "prompts", "themes"];
60
+ const RESOURCE_TYPES = ["extensions", "skills", "prompts", "themes", "workflows"];
61
61
  const FILE_PATTERNS = {
62
62
  extensions: /\.(ts|js)$/,
63
63
  skills: /\.md$/,
64
64
  prompts: /\.md$/,
65
65
  themes: /\.json$/,
66
+ workflows: /\.(ts|js|mjs|cjs)$/,
66
67
  };
67
68
  const IGNORE_FILE_NAMES = [".gitignore", ".ignore", ".fdignore"];
68
69
  function toPosixPath(p) {
@@ -348,11 +349,22 @@ function collectAutoThemeEntries(dir) {
348
349
  }
349
350
  return entries;
350
351
  }
352
+ function getManifestFromPackageJson(pkg) {
353
+ const appManifest = pkg[APP_NAME];
354
+ if (appManifest && typeof appManifest === "object" && !Array.isArray(appManifest)) {
355
+ return appManifest;
356
+ }
357
+ const legacyManifest = pkg.pi;
358
+ if (legacyManifest && typeof legacyManifest === "object" && !Array.isArray(legacyManifest)) {
359
+ return legacyManifest;
360
+ }
361
+ return null;
362
+ }
351
363
  function readPiManifestFile(packageJsonPath) {
352
364
  try {
353
365
  const content = readFileSync(packageJsonPath, "utf-8");
354
366
  const pkg = JSON.parse(content);
355
- return pkg.pi ?? null;
367
+ return getManifestFromPackageJson(pkg);
356
368
  }
357
369
  catch {
358
370
  return null;
@@ -450,6 +462,19 @@ function collectResourceFiles(dir, resourceType) {
450
462
  }
451
463
  return collectFiles(dir, FILE_PATTERNS[resourceType]);
452
464
  }
465
+ function conventionDirsForResource(packageRoot, resourceType) {
466
+ if (resourceType === "workflows") {
467
+ return [join(packageRoot, "workflows"), join(packageRoot, "workflow")];
468
+ }
469
+ return [join(packageRoot, resourceType)];
470
+ }
471
+ function manifestEntriesForResource(manifest, resourceType) {
472
+ if (!manifest)
473
+ return undefined;
474
+ if (resourceType === "workflows")
475
+ return manifest.workflows ?? manifest.workflow;
476
+ return manifest[resourceType];
477
+ }
453
478
  function matchesAnyPattern(filePath, patterns, baseDir) {
454
479
  const rel = toPosixPath(relative(baseDir, filePath));
455
480
  const name = basename(filePath);
@@ -1534,7 +1559,7 @@ export class DefaultPackageManager {
1534
1559
  this.ensureGitIgnore(installRoot);
1535
1560
  const packageJsonPath = join(installRoot, "package.json");
1536
1561
  if (!existsSync(packageJsonPath)) {
1537
- const pkgJson = { name: "pi-extensions", private: true };
1562
+ const pkgJson = { name: `${APP_NAME}-extensions`, private: true };
1538
1563
  writeFileSync(packageJsonPath, JSON.stringify(pkgJson, null, 2), "utf-8");
1539
1564
  }
1540
1565
  }
@@ -1656,38 +1681,46 @@ export class DefaultPackageManager {
1656
1681
  const manifest = this.readPiManifest(packageRoot);
1657
1682
  if (manifest) {
1658
1683
  for (const resourceType of RESOURCE_TYPES) {
1659
- const entries = manifest[resourceType];
1660
- this.addManifestEntries(entries, packageRoot, resourceType, this.getTargetMap(accumulator, resourceType), metadata);
1684
+ const entries = manifestEntriesForResource(manifest, resourceType);
1685
+ if (entries !== undefined) {
1686
+ this.addManifestEntries(entries, packageRoot, resourceType, this.getTargetMap(accumulator, resourceType), metadata);
1687
+ continue;
1688
+ }
1689
+ if (resourceType === "workflows") {
1690
+ this.collectDefaultResources(packageRoot, resourceType, this.getTargetMap(accumulator, resourceType), metadata);
1691
+ }
1661
1692
  }
1662
1693
  return true;
1663
1694
  }
1664
1695
  let hasAnyDir = false;
1665
1696
  for (const resourceType of RESOURCE_TYPES) {
1666
- const dir = join(packageRoot, resourceType);
1667
- if (existsSync(dir)) {
1668
- // Collect all files from the directory (all enabled by default)
1669
- const files = collectResourceFiles(dir, resourceType);
1670
- for (const f of files) {
1671
- this.addResource(this.getTargetMap(accumulator, resourceType), f, metadata, true);
1697
+ for (const dir of conventionDirsForResource(packageRoot, resourceType)) {
1698
+ if (existsSync(dir)) {
1699
+ // Collect all files from the directory (all enabled by default)
1700
+ const files = collectResourceFiles(dir, resourceType);
1701
+ for (const f of files) {
1702
+ this.addResource(this.getTargetMap(accumulator, resourceType), f, metadata, true);
1703
+ }
1704
+ hasAnyDir = true;
1672
1705
  }
1673
- hasAnyDir = true;
1674
1706
  }
1675
1707
  }
1676
1708
  return hasAnyDir;
1677
1709
  }
1678
1710
  collectDefaultResources(packageRoot, resourceType, target, metadata) {
1679
1711
  const manifest = this.readPiManifest(packageRoot);
1680
- const entries = manifest?.[resourceType];
1681
- if (entries) {
1712
+ const entries = manifestEntriesForResource(manifest, resourceType);
1713
+ if (entries !== undefined) {
1682
1714
  this.addManifestEntries(entries, packageRoot, resourceType, target, metadata);
1683
1715
  return;
1684
1716
  }
1685
- const dir = join(packageRoot, resourceType);
1686
- if (existsSync(dir)) {
1687
- // Collect all files from the directory (all enabled by default)
1688
- const files = collectResourceFiles(dir, resourceType);
1689
- for (const f of files) {
1690
- this.addResource(target, f, metadata, true);
1717
+ for (const dir of conventionDirsForResource(packageRoot, resourceType)) {
1718
+ if (existsSync(dir)) {
1719
+ // Collect all files from the directory (all enabled by default)
1720
+ const files = collectResourceFiles(dir, resourceType);
1721
+ for (const f of files) {
1722
+ this.addResource(target, f, metadata, true);
1723
+ }
1691
1724
  }
1692
1725
  }
1693
1726
  }
@@ -1714,18 +1747,14 @@ export class DefaultPackageManager {
1714
1747
  */
1715
1748
  collectManifestFiles(packageRoot, resourceType) {
1716
1749
  const manifest = this.readPiManifest(packageRoot);
1717
- const entries = manifest?.[resourceType];
1750
+ const entries = manifestEntriesForResource(manifest, resourceType);
1718
1751
  if (entries && entries.length > 0) {
1719
1752
  const allFiles = this.collectFilesFromManifestEntries(entries, packageRoot, resourceType);
1720
1753
  const manifestPatterns = entries.filter(isOverridePattern);
1721
1754
  const enabledByManifest = manifestPatterns.length > 0 ? applyPatterns(allFiles, manifestPatterns, packageRoot) : new Set(allFiles);
1722
1755
  return { allFiles: Array.from(enabledByManifest), enabledByManifest };
1723
1756
  }
1724
- const conventionDir = join(packageRoot, resourceType);
1725
- if (!existsSync(conventionDir)) {
1726
- return { allFiles: [], enabledByManifest: new Set() };
1727
- }
1728
- const allFiles = collectResourceFiles(conventionDir, resourceType);
1757
+ const allFiles = conventionDirsForResource(packageRoot, resourceType).flatMap((dir) => existsSync(dir) ? collectResourceFiles(dir, resourceType) : []);
1729
1758
  return { allFiles, enabledByManifest: new Set(allFiles) };
1730
1759
  }
1731
1760
  readPiManifest(packageRoot) {
@@ -1736,7 +1765,7 @@ export class DefaultPackageManager {
1736
1765
  try {
1737
1766
  const content = readFileSync(packageJsonPath, "utf-8");
1738
1767
  const pkg = JSON.parse(content);
1739
- return pkg.pi ?? null;
1768
+ return getManifestFromPackageJson(pkg);
1740
1769
  }
1741
1770
  catch {
1742
1771
  return null;
@@ -1801,12 +1830,14 @@ export class DefaultPackageManager {
1801
1830
  skills: (globalSettings.skills ?? []),
1802
1831
  prompts: (globalSettings.prompts ?? []),
1803
1832
  themes: (globalSettings.themes ?? []),
1833
+ workflows: (globalSettings.workflows ?? []),
1804
1834
  };
1805
1835
  const projectOverrides = {
1806
1836
  extensions: (projectSettings.extensions ?? []),
1807
1837
  skills: (projectSettings.skills ?? []),
1808
1838
  prompts: (projectSettings.prompts ?? []),
1809
1839
  themes: (projectSettings.themes ?? []),
1840
+ workflows: (projectSettings.workflows ?? []),
1810
1841
  };
1811
1842
  const userConfigDirs = this.getBaseDirsForScope("user");
1812
1843
  const projectConfigDirs = this.getBaseDirsForScope("project");
@@ -1825,6 +1856,7 @@ export class DefaultPackageManager {
1825
1856
  addResources("skills", collectAutoSkillEntries(join(configDir, "skills"), "pi"), metadata, projectOverrides.skills, configDir);
1826
1857
  addResources("prompts", collectAutoPromptEntries(join(configDir, "prompts")), metadata, projectOverrides.prompts, configDir);
1827
1858
  addResources("themes", collectAutoThemeEntries(join(configDir, "themes")), metadata, projectOverrides.themes, configDir);
1859
+ addResources("workflows", collectResourceFiles(join(configDir, "workflows"), "workflows"), metadata, projectOverrides.workflows, configDir);
1828
1860
  }
1829
1861
  // Project skills from .agents/ (each with its own baseDir)
1830
1862
  for (const agentsSkillsDir of projectAgentsSkillDirs) {
@@ -1841,6 +1873,7 @@ export class DefaultPackageManager {
1841
1873
  addResources("skills", collectAutoSkillEntries(join(configDir, "skills"), "pi"), metadata, userOverrides.skills, configDir);
1842
1874
  addResources("prompts", collectAutoPromptEntries(join(configDir, "prompts")), metadata, userOverrides.prompts, configDir);
1843
1875
  addResources("themes", collectAutoThemeEntries(join(configDir, "themes")), metadata, userOverrides.themes, configDir);
1876
+ addResources("workflows", collectResourceFiles(join(configDir, "workflows"), "workflows"), metadata, userOverrides.workflows, configDir);
1844
1877
  }
1845
1878
  // User skills from ~/.agents/ (with its own baseDir)
1846
1879
  const userAgentsBaseDir = dirname(userAgentsSkillsDir);
@@ -1880,6 +1913,8 @@ export class DefaultPackageManager {
1880
1913
  return accumulator.prompts;
1881
1914
  case "themes":
1882
1915
  return accumulator.themes;
1916
+ case "workflows":
1917
+ return accumulator.workflows;
1883
1918
  default:
1884
1919
  throw new Error(`Unknown resource type: ${resourceType}`);
1885
1920
  }
@@ -1897,6 +1932,7 @@ export class DefaultPackageManager {
1897
1932
  skills: new Map(),
1898
1933
  prompts: new Map(),
1899
1934
  themes: new Map(),
1935
+ workflows: new Map(),
1900
1936
  };
1901
1937
  }
1902
1938
  toResolvedPaths(accumulator) {
@@ -1921,6 +1957,7 @@ export class DefaultPackageManager {
1921
1957
  skills: mapToResolved(accumulator.skills),
1922
1958
  prompts: mapToResolved(accumulator.prompts),
1923
1959
  themes: mapToResolved(accumulator.themes),
1960
+ workflows: mapToResolved(accumulator.workflows),
1924
1961
  };
1925
1962
  }
1926
1963
  spawnCommand(command, args, options) {