akm-cli 0.8.6 → 0.8.14

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 (324) hide show
  1. package/CHANGELOG.md +442 -0
  2. package/dist/assets/help/help-proposals.md +1 -2
  3. package/dist/assets/hints/cli-hints-full.md +34 -19
  4. package/dist/assets/hints/cli-hints-short.md +1 -1
  5. package/dist/assets/profiles/catchup.json +13 -0
  6. package/dist/assets/profiles/consolidate.json +13 -0
  7. package/dist/assets/profiles/frequent.json +13 -0
  8. package/dist/assets/tasks/core/backup.yml +4 -0
  9. package/dist/assets/tasks/core/extract.yml +4 -0
  10. package/dist/assets/tasks/core/improve.yml +4 -0
  11. package/dist/assets/tasks/core/index-refresh.yml +4 -0
  12. package/dist/assets/tasks/core/sync.yml +4 -0
  13. package/dist/assets/tasks/core/update-stashes.yml +4 -0
  14. package/dist/assets/tasks/core/version-check.yml +4 -0
  15. package/dist/assets/templates/html/default.html +78 -0
  16. package/dist/assets/templates/html/health.html +560 -0
  17. package/dist/assets/templates/html/vendor/echarts.min.js +45 -0
  18. package/dist/cli/config-migrate.js +6 -6
  19. package/dist/cli/config-validate.js +4 -4
  20. package/dist/cli/confirm.js +3 -3
  21. package/dist/cli/parse-args.js +1 -1
  22. package/dist/cli/shared.js +72 -19
  23. package/dist/cli-node.mjs +26 -0
  24. package/dist/cli.js +206 -3866
  25. package/dist/commands/{agent-dispatch.js → agent/agent-dispatch.js} +6 -6
  26. package/dist/commands/{agent-support.js → agent/agent-support.js} +2 -2
  27. package/dist/commands/agent/contribute-cli.js +200 -0
  28. package/dist/commands/completions.js +1 -1
  29. package/dist/commands/config-cli.js +230 -3
  30. package/dist/commands/db-cli.js +2 -2
  31. package/dist/commands/env/env-cli.js +529 -0
  32. package/dist/commands/env/env.js +410 -0
  33. package/dist/commands/env/secret-cli.js +259 -0
  34. package/dist/commands/{secret.js → env/secret.js} +6 -47
  35. package/dist/commands/events.js +4 -4
  36. package/dist/commands/feedback-cli.js +18 -34
  37. package/dist/commands/graph/graph-cli.js +132 -0
  38. package/dist/commands/{graph.js → graph/graph.js} +22 -16
  39. package/dist/commands/health/checks.js +279 -0
  40. package/dist/commands/health/html-report.js +448 -0
  41. package/dist/commands/health.js +189 -266
  42. package/dist/commands/{consolidate.js → improve/consolidate.js} +63 -38
  43. package/dist/commands/{distill-promotion-policy.js → improve/distill-promotion-policy.js} +3 -3
  44. package/dist/commands/{distill.js → improve/distill.js} +39 -18
  45. package/dist/commands/{eval-cases.js → improve/eval-cases.js} +1 -1
  46. package/dist/commands/{extract-cli.js → improve/extract-cli.js} +4 -4
  47. package/dist/commands/{extract-prompt.js → improve/extract-prompt.js} +2 -2
  48. package/dist/commands/{extract.js → improve/extract.js} +221 -26
  49. package/dist/commands/{improve-auto-accept.js → improve/improve-auto-accept.js} +30 -4
  50. package/dist/commands/{improve-cli.js → improve/improve-cli.js} +44 -22
  51. package/dist/commands/{improve-profiles.js → improve/improve-profiles.js} +13 -7
  52. package/dist/commands/{improve-result-file.js → improve/improve-result-file.js} +1 -1
  53. package/dist/commands/{improve.js → improve/improve.js} +672 -292
  54. package/dist/{core → commands/improve/memory}/memory-belief.js +2 -2
  55. package/dist/{core → commands/improve/memory}/memory-contradiction-detect.js +5 -5
  56. package/dist/{core → commands/improve/memory}/memory-improve.js +4 -4
  57. package/dist/commands/improve/reflect-noise.js +0 -0
  58. package/dist/commands/{reflect.js → improve/reflect.js} +58 -28
  59. package/dist/commands/improve/session-asset.js +248 -0
  60. package/dist/commands/lint/agent-linter.js +1 -1
  61. package/dist/commands/lint/base-linter.js +55 -37
  62. package/dist/commands/lint/command-linter.js +1 -1
  63. package/dist/commands/lint/default-linter.js +1 -1
  64. package/dist/commands/lint/env-key-rules.js +1 -1
  65. package/dist/commands/lint/index.js +19 -25
  66. package/dist/commands/lint/knowledge-linter.js +1 -1
  67. package/dist/commands/lint/memory-linter.js +1 -1
  68. package/dist/commands/lint/registry.js +8 -8
  69. package/dist/commands/lint/skill-linter.js +1 -1
  70. package/dist/commands/lint/task-linter.js +1 -1
  71. package/dist/commands/lint/workflow-linter.js +1 -1
  72. package/dist/commands/lint.js +1 -1
  73. package/dist/commands/observability-cli.js +244 -0
  74. package/dist/commands/proposal/drain-policies.js +3 -3
  75. package/dist/commands/proposal/drain.js +87 -15
  76. package/dist/commands/proposal/proposal-cli.js +490 -0
  77. package/dist/commands/{proposal.js → proposal/proposal.js} +17 -6
  78. package/dist/commands/{propose.js → proposal/propose.js} +11 -11
  79. package/dist/{core → commands/proposal/validators}/proposal-quality-validators.js +8 -3
  80. package/dist/{core → commands/proposal/validators}/proposal-validators.js +5 -5
  81. package/dist/{core → commands/proposal/validators}/proposals.js +374 -345
  82. package/dist/commands/{curate.js → read/curate.js} +7 -7
  83. package/dist/commands/{knowledge.js → read/knowledge.js} +22 -9
  84. package/dist/commands/{registry-search.js → read/registry-search.js} +5 -5
  85. package/dist/commands/{remember-cli.js → read/remember-cli.js} +15 -7
  86. package/dist/commands/read/search-cli.js +207 -0
  87. package/dist/commands/{search.js → read/search.js} +22 -27
  88. package/dist/commands/{show.js → read/show.js} +31 -45
  89. package/dist/commands/registry-cli.js +8 -8
  90. package/dist/commands/remember.js +14 -10
  91. package/dist/commands/sources/add-cli.js +293 -0
  92. package/dist/commands/{history.js → sources/history.js} +27 -25
  93. package/dist/commands/{info.js → sources/info.js} +6 -6
  94. package/dist/commands/{init.js → sources/init.js} +6 -6
  95. package/dist/commands/{installed-stashes.js → sources/installed-stashes.js} +12 -12
  96. package/dist/commands/{migration-help.js → sources/migration-help.js} +3 -2
  97. package/dist/commands/{schema-repair.js → sources/schema-repair.js} +8 -8
  98. package/dist/commands/{self-update.js → sources/self-update.js} +10 -9
  99. package/dist/commands/{source-add.js → sources/source-add.js} +10 -10
  100. package/dist/commands/{source-clone.js → sources/source-clone.js} +7 -7
  101. package/dist/commands/{source-manage.js → sources/source-manage.js} +4 -4
  102. package/dist/commands/sources/sources-cli.js +305 -0
  103. package/dist/commands/sources/stash-cli.js +219 -0
  104. package/dist/commands/{stash-skeleton.js → sources/stash-skeleton.js} +2 -1
  105. package/dist/commands/tasks/default-tasks.js +173 -0
  106. package/dist/commands/tasks/tasks-cli.js +210 -0
  107. package/dist/commands/{tasks.js → tasks/tasks.js} +14 -14
  108. package/dist/commands/wiki-cli.js +307 -0
  109. package/dist/commands/workflow-cli.js +329 -0
  110. package/dist/core/action-contributors.js +1 -1
  111. package/dist/core/assert.js +40 -0
  112. package/dist/core/asset/asset-create.js +54 -0
  113. package/dist/core/{asset-ref.js → asset/asset-ref.js} +21 -4
  114. package/dist/core/{asset-registry.js → asset/asset-registry.js} +3 -3
  115. package/dist/core/{asset-spec.js → asset/asset-spec.js} +17 -31
  116. package/dist/core/{markdown.js → asset/markdown.js} +1 -1
  117. package/dist/core/{stash-meta.js → asset/stash-meta.js} +1 -1
  118. package/dist/core/best-effort.js +64 -0
  119. package/dist/core/common.js +32 -18
  120. package/dist/core/{config-io.js → config/config-io.js} +29 -19
  121. package/dist/core/{config-migration.js → config/config-migration.js} +11 -9
  122. package/dist/core/{config-schema.js → config/config-schema.js} +50 -7
  123. package/dist/core/config/config-types.js +16 -0
  124. package/dist/core/{config-walker.js → config/config-walker.js} +2 -2
  125. package/dist/core/{config.js → config/config.js} +10 -8
  126. package/dist/core/env-secret-ref.js +90 -0
  127. package/dist/core/errors.js +13 -3
  128. package/dist/core/events.js +27 -4
  129. package/dist/core/file-lock.js +1 -1
  130. package/dist/core/improve-types.js +48 -0
  131. package/dist/core/lesson-lint.js +2 -2
  132. package/dist/core/logs-db.js +304 -0
  133. package/dist/core/paths.js +2 -2
  134. package/dist/core/ripgrep/install.js +2 -2
  135. package/dist/core/ripgrep/resolve.js +2 -2
  136. package/dist/core/state-db.js +195 -60
  137. package/dist/core/text-truncation.js +148 -0
  138. package/dist/core/time.js +1 -1
  139. package/dist/core/write-source.js +98 -85
  140. package/dist/indexer/{db-backup.js → db/db-backup.js} +9 -24
  141. package/dist/indexer/{db.js → db/db.js} +128 -118
  142. package/dist/indexer/{graph-db.js → db/graph-db.js} +9 -4
  143. package/dist/indexer/{llm-cache.js → db/llm-cache.js} +15 -12
  144. package/dist/indexer/ensure-index.js +4 -4
  145. package/dist/indexer/{graph-boost.js → graph/graph-boost.js} +1 -1
  146. package/dist/indexer/{graph-extraction.js → graph/graph-extraction.js} +55 -13
  147. package/dist/indexer/indexer.js +37 -30
  148. package/dist/indexer/init.js +54 -0
  149. package/dist/indexer/manifest.js +10 -10
  150. package/dist/indexer/{memory-inference.js → passes/memory-inference.js} +141 -33
  151. package/dist/indexer/{metadata-contributors.js → passes/metadata-contributors.js} +10 -8
  152. package/dist/indexer/{metadata.js → passes/metadata.js} +15 -19
  153. package/dist/indexer/{staleness-detect.js → passes/staleness-detect.js} +53 -12
  154. package/dist/indexer/{db-search.js → search/db-search.js} +28 -16
  155. package/dist/indexer/{ranking-contributors.js → search/ranking-contributors.js} +1 -1
  156. package/dist/indexer/{ranking.js → search/ranking.js} +2 -2
  157. package/dist/indexer/{search-hit-enrichers.js → search/search-hit-enrichers.js} +3 -3
  158. package/dist/indexer/{search-source.js → search/search-source.js} +8 -8
  159. package/dist/indexer/{semantic-status.js → search/semantic-status.js} +3 -3
  160. package/dist/indexer/usage/unmigrated-vaults-guard.js +94 -0
  161. package/dist/indexer/{usage-events.js → usage/usage-events.js} +32 -0
  162. package/dist/indexer/{file-context.js → walk/file-context.js} +10 -15
  163. package/dist/indexer/{matchers.js → walk/matchers.js} +13 -9
  164. package/dist/indexer/{path-resolver.js → walk/path-resolver.js} +6 -6
  165. package/dist/indexer/{project-context.js → walk/project-context.js} +1 -1
  166. package/dist/indexer/{walker.js → walk/walker.js} +4 -3
  167. package/dist/integrations/agent/builder-shared.js +39 -0
  168. package/dist/integrations/agent/builders.js +14 -81
  169. package/dist/integrations/agent/config.js +6 -4
  170. package/dist/integrations/agent/detect.js +1 -1
  171. package/dist/integrations/agent/index.js +23 -8
  172. package/dist/integrations/agent/prompts.js +2 -3
  173. package/dist/integrations/agent/runner.js +22 -3
  174. package/dist/integrations/agent/spawn.js +9 -10
  175. package/dist/integrations/harnesses/claude/agent-builder.js +48 -0
  176. package/dist/integrations/harnesses/claude/config-import.js +70 -0
  177. package/dist/integrations/harnesses/claude/index.js +64 -0
  178. package/dist/integrations/{session-logs/providers/claude-code.js → harnesses/claude/session-log.js} +32 -5
  179. package/dist/integrations/harnesses/index.js +144 -0
  180. package/dist/integrations/harnesses/opencode/agent-builder.js +43 -0
  181. package/dist/integrations/harnesses/opencode/config-import.js +82 -0
  182. package/dist/integrations/harnesses/opencode/index.js +59 -0
  183. package/dist/integrations/{session-logs/providers/opencode.js → harnesses/opencode/session-log.js} +1 -1
  184. package/dist/integrations/harnesses/opencode-sdk/index.js +49 -0
  185. package/dist/integrations/harnesses/opencode-sdk/sdk-runner.js +234 -0
  186. package/dist/integrations/harnesses/types.js +43 -0
  187. package/dist/integrations/lockfile.js +7 -16
  188. package/dist/integrations/session-logs/index.js +82 -9
  189. package/dist/llm/call-ai.js +4 -4
  190. package/dist/llm/client.js +146 -6
  191. package/dist/llm/embedder.js +6 -6
  192. package/dist/llm/embedders/local.js +9 -22
  193. package/dist/llm/embedders/remote.js +2 -2
  194. package/dist/llm/embedders/types.js +1 -1
  195. package/dist/llm/graph-extract.js +31 -12
  196. package/dist/llm/index-passes.js +1 -1
  197. package/dist/llm/memory-infer.js +12 -5
  198. package/dist/llm/metadata-enhance.js +2 -2
  199. package/dist/llm/usage-persist.js +77 -0
  200. package/dist/llm/usage-telemetry.js +103 -0
  201. package/dist/output/context.js +9 -46
  202. package/dist/output/html-render.js +73 -0
  203. package/dist/output/renderers.js +88 -58
  204. package/dist/output/shapes/curate.js +7 -3
  205. package/dist/output/shapes/distill.js +7 -3
  206. package/dist/output/shapes/env-list.js +18 -16
  207. package/dist/output/shapes/events.js +5 -4
  208. package/dist/output/shapes/helpers.js +19 -5
  209. package/dist/output/shapes/history.js +7 -3
  210. package/dist/output/shapes/passthrough.js +8 -11
  211. package/dist/output/shapes/{proposal-accept.js → proposal/accept.js} +7 -3
  212. package/dist/output/shapes/{proposal-diff.js → proposal/diff.js} +7 -3
  213. package/dist/output/shapes/{proposal-list.js → proposal/list.js} +7 -3
  214. package/dist/output/shapes/{proposal-producer.js → proposal/producer.js} +5 -4
  215. package/dist/output/shapes/{proposal-reject.js → proposal/reject.js} +7 -3
  216. package/dist/output/shapes/{proposal-show.js → proposal/show.js} +7 -3
  217. package/dist/output/shapes/registry-search.js +7 -3
  218. package/dist/output/shapes/registry.js +12 -0
  219. package/dist/output/shapes/search.js +7 -3
  220. package/dist/output/shapes/secret-list.js +18 -16
  221. package/dist/output/shapes/show.js +7 -3
  222. package/dist/output/shapes.js +55 -30
  223. package/dist/output/text/add.js +2 -3
  224. package/dist/output/text/clone.js +2 -3
  225. package/dist/output/text/config.js +2 -3
  226. package/dist/output/text/curate.js +4 -3
  227. package/dist/output/text/distill.js +2 -3
  228. package/dist/output/text/enable-disable.js +5 -4
  229. package/dist/output/text/env.js +13 -0
  230. package/dist/output/text/events.js +5 -4
  231. package/dist/output/text/feedback.js +4 -3
  232. package/dist/output/text/helpers.js +123 -40
  233. package/dist/output/text/history.js +2 -3
  234. package/dist/output/text/import.js +2 -3
  235. package/dist/output/text/index.js +2 -3
  236. package/dist/output/text/info.js +2 -3
  237. package/dist/output/text/init.js +2 -3
  238. package/dist/output/text/list.js +2 -3
  239. package/dist/output/text/proposal/producer.js +9 -0
  240. package/dist/output/text/proposal/proposal.js +13 -0
  241. package/dist/output/text/registry-commands.js +8 -7
  242. package/dist/output/text/registry.js +12 -0
  243. package/dist/output/text/remember.js +4 -3
  244. package/dist/output/text/remove.js +2 -3
  245. package/dist/output/text/save.js +2 -3
  246. package/dist/output/text/search.js +4 -3
  247. package/dist/output/text/show.js +4 -3
  248. package/dist/output/text/update.js +2 -3
  249. package/dist/output/text/upgrade.js +2 -3
  250. package/dist/output/text/wiki.js +12 -11
  251. package/dist/output/text/workflow.js +12 -10
  252. package/dist/output/text.js +66 -32
  253. package/dist/registry/build-index.js +11 -10
  254. package/dist/registry/factory.js +1 -1
  255. package/dist/registry/origin-resolve.js +1 -1
  256. package/dist/registry/providers/index.js +2 -2
  257. package/dist/registry/providers/skills-sh.js +91 -72
  258. package/dist/registry/providers/static-index.js +75 -52
  259. package/dist/registry/resolve.js +3 -3
  260. package/dist/runtime.js +242 -0
  261. package/dist/scripts/migrate-storage.js +1654 -683
  262. package/dist/scripts/migrations/import-fs-improve-runs-to-db.js +254 -168
  263. package/dist/setup/detect.js +311 -9
  264. package/dist/setup/harness-config-import.js +6 -120
  265. package/dist/setup/setup.js +454 -43
  266. package/dist/sources/include.js +1 -1
  267. package/dist/sources/provider-factory.js +2 -2
  268. package/dist/sources/providers/filesystem.js +3 -3
  269. package/dist/sources/providers/git.js +9 -9
  270. package/dist/sources/providers/index.js +4 -4
  271. package/dist/sources/providers/npm.js +6 -6
  272. package/dist/sources/providers/provider-utils.js +13 -20
  273. package/dist/sources/providers/sync-from-ref.js +5 -5
  274. package/dist/sources/providers/tar-utils.js +2 -2
  275. package/dist/sources/providers/website.js +2 -2
  276. package/dist/sources/resolve.js +5 -5
  277. package/dist/sources/website-ingest.js +5 -5
  278. package/dist/storage/database.js +102 -0
  279. package/dist/storage/engines/sqlite-migrations.js +42 -0
  280. package/dist/storage/locations.js +25 -0
  281. package/dist/storage/repositories/index-db.js +43 -0
  282. package/dist/storage/repositories/workflow-runs-repository.js +141 -0
  283. package/dist/tasks/backends/cron.js +4 -4
  284. package/dist/tasks/backends/exec-utils.js +32 -0
  285. package/dist/tasks/backends/index.js +3 -3
  286. package/dist/tasks/backends/launchd.js +7 -14
  287. package/dist/tasks/backends/schtasks.js +7 -16
  288. package/dist/tasks/embedded.js +71 -0
  289. package/dist/tasks/parser.js +2 -2
  290. package/dist/tasks/resolveAkmBin.js +1 -1
  291. package/dist/tasks/runner.js +127 -31
  292. package/dist/tasks/schedule.js +1 -1
  293. package/dist/tasks/validator.js +7 -7
  294. package/dist/text-import-hook.mjs +51 -0
  295. package/dist/version.js +2 -1
  296. package/dist/wiki/wiki.js +7 -7
  297. package/dist/workflows/{authoring.js → authoring/authoring.js} +6 -6
  298. package/dist/workflows/{scope-key.js → authoring/scope-key.js} +1 -1
  299. package/dist/workflows/cli.js +1 -1
  300. package/dist/workflows/db.js +54 -32
  301. package/dist/workflows/parser.js +4 -4
  302. package/dist/workflows/renderer.js +5 -5
  303. package/dist/workflows/runtime/agent-identity.js +56 -0
  304. package/dist/workflows/runtime/checkin.js +57 -0
  305. package/dist/workflows/{runs.js → runtime/runs.js} +197 -101
  306. package/dist/workflows/validate-summary.js +82 -0
  307. package/docs/README.md +1 -1
  308. package/docs/data-and-telemetry.md +6 -6
  309. package/package.json +17 -8
  310. package/dist/commands/add-cli.js +0 -279
  311. package/dist/commands/env.js +0 -213
  312. package/dist/integrations/agent/sdk-runner.js +0 -126
  313. package/dist/output/shapes/vault-list.js +0 -19
  314. package/dist/output/text/proposal-producer.js +0 -8
  315. package/dist/output/text/proposal.js +0 -12
  316. package/dist/output/text/vault.js +0 -16
  317. /package/dist/core/{asset-serialize.js → asset/asset-serialize.js} +0 -0
  318. /package/dist/core/{frontmatter.js → asset/frontmatter.js} +0 -0
  319. /package/dist/core/{config-sources.js → config/config-sources.js} +0 -0
  320. /package/dist/indexer/{graph-dedup.js → graph/graph-dedup.js} +0 -0
  321. /package/dist/{core/config-types.js → indexer/passes/pass-context.js} +0 -0
  322. /package/dist/indexer/{search-fields.js → search/search-fields.js} +0 -0
  323. /package/dist/indexer/{index-context.js → walk/index-context.js} +0 -0
  324. /package/dist/workflows/{document-cache.js → runtime/document-cache.js} +0 -0
@@ -25,11 +25,11 @@ import fs from "node:fs";
25
25
  import os from "node:os";
26
26
  import path from "node:path";
27
27
  import launchdTemplate from "../../assets/backends/launchd-template.xml" with { type: "text" };
28
- import { ConfigError } from "../../core/errors";
29
- import { getTaskLogDir } from "../../core/paths";
30
- import { resolveAkmInvocation } from "../resolveAkmBin";
31
- import { parseSchedule, translateToLaunchd } from "../schedule";
32
- import { escapeXml, spawnCommand } from "./exec-utils";
28
+ import { ConfigError } from "../../core/errors.js";
29
+ import { getTaskLogDir } from "../../core/paths.js";
30
+ import { resolveAkmInvocation } from "../resolveAkmBin.js";
31
+ import { parseSchedule, translateToLaunchd } from "../schedule.js";
32
+ import { escapeXml, nodeExec, nodeFs } from "./exec-utils.js";
33
33
  export const LAUNCHD_LABEL_PREFIX = "com.akm.task.";
34
34
  export function LAUNCHD_BACKEND(options = {}) {
35
35
  const exec = options.exec ?? defaultLaunchdExec();
@@ -152,9 +152,7 @@ function defaultAgentsDir() {
152
152
  }
153
153
  function defaultLaunchdExec() {
154
154
  return {
155
- run(args) {
156
- return spawnCommand(args);
157
- },
155
+ ...nodeExec(),
158
156
  uid() {
159
157
  const fn = process.getuid;
160
158
  return typeof fn === "function" ? fn.call(process) : 0;
@@ -163,15 +161,10 @@ function defaultLaunchdExec() {
163
161
  }
164
162
  function defaultLaunchdFs() {
165
163
  return {
166
- writeFile(file, content) {
167
- fs.writeFileSync(file, content, { encoding: "utf8" });
168
- },
164
+ ...nodeFs(),
169
165
  removeFile(file) {
170
166
  fs.rmSync(file, { force: true });
171
167
  },
172
- ensureDir(dir) {
173
- fs.mkdirSync(dir, { recursive: true });
174
- },
175
168
  list(dir) {
176
169
  try {
177
170
  return fs.readdirSync(dir);
@@ -33,11 +33,11 @@ import fs from "node:fs";
33
33
  import os from "node:os";
34
34
  import path from "node:path";
35
35
  import schtasksTemplate from "../../assets/backends/schtasks-template.xml" with { type: "text" };
36
- import { ConfigError } from "../../core/errors";
37
- import { getTaskLogDir } from "../../core/paths";
38
- import { resolveAkmInvocation } from "../resolveAkmBin";
39
- import { parseSchedule, translateToSchtasks } from "../schedule";
40
- import { escapeXml, spawnCommand } from "./exec-utils";
36
+ import { ConfigError } from "../../core/errors.js";
37
+ import { getTaskLogDir } from "../../core/paths.js";
38
+ import { resolveAkmInvocation } from "../resolveAkmBin.js";
39
+ import { parseSchedule, translateToSchtasks } from "../schedule.js";
40
+ import { escapeXml, nodeExec, nodeFs } from "./exec-utils.js";
41
41
  export const DEFAULT_FOLDER_PREFIX = "\\akm\\";
42
42
  export function SCHTASKS_BACKEND(options = {}) {
43
43
  const exec = options.exec ?? defaultSchtasksExec();
@@ -186,17 +186,11 @@ function quoteArg(s) {
186
186
  return `"${s.replace(/"/g, '\\"')}"`;
187
187
  }
188
188
  function defaultSchtasksExec() {
189
- return {
190
- run(args) {
191
- return spawnCommand(args);
192
- },
193
- };
189
+ return nodeExec();
194
190
  }
195
191
  function defaultSchtasksFs() {
196
192
  return {
197
- writeFile(file, content) {
198
- fs.writeFileSync(file, content, { encoding: "utf8" });
199
- },
193
+ ...nodeFs(),
200
194
  removeFile(file) {
201
195
  try {
202
196
  fs.rmSync(file, { force: true });
@@ -205,9 +199,6 @@ function defaultSchtasksFs() {
205
199
  /* ignore */
206
200
  }
207
201
  },
208
- ensureDir(dir) {
209
- fs.mkdirSync(dir, { recursive: true });
210
- },
211
202
  tmpdir() {
212
203
  return os.tmpdir();
213
204
  },
@@ -0,0 +1,71 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+ /**
5
+ * Embedded core task templates.
6
+ *
7
+ * A curated set of read-only YAML task templates ships inside the akm binary
8
+ * under `src/assets/tasks/core/`. They are resolved at runtime via
9
+ * `import.meta.dir` (mirroring `SKELETON_DIR` in
10
+ * src/commands/stash-skeleton.ts) and are NOT written to any stash at
11
+ * install/init time — the `akm setup` wizard copies a template into the
12
+ * primary stash only when the user opts in (copy-on-enable).
13
+ *
14
+ * Each entry exposes the parsed `command`, `schedule`, and `description`
15
+ * alongside the raw `yaml`, so the wizard can both render a choice and write
16
+ * the file verbatim (with an optional schedule edit applied).
17
+ */
18
+ import fs from "node:fs";
19
+ import path from "node:path";
20
+ import { parse as yamlParse } from "yaml";
21
+ import { getDirname } from "../runtime.js";
22
+ /** Directory holding the bundled core task templates. */
23
+ const CORE_TASKS_DIR = path.join(getDirname(import.meta.url), "../assets/tasks/core");
24
+ /**
25
+ * Enumerate the embedded core task templates from the bundled assets
26
+ * directory. Sorted by id for deterministic ordering. Returns an empty array
27
+ * if the directory is missing (defensive — a build without assets should not
28
+ * crash the wizard).
29
+ */
30
+ export function listEmbeddedTasks() {
31
+ let entries;
32
+ try {
33
+ entries = fs.readdirSync(CORE_TASKS_DIR);
34
+ }
35
+ catch {
36
+ return [];
37
+ }
38
+ const tasks = [];
39
+ for (const entry of entries.sort()) {
40
+ if (!entry.endsWith(".yml"))
41
+ continue;
42
+ const id = entry.slice(0, -4);
43
+ const filePath = path.join(CORE_TASKS_DIR, entry);
44
+ let yaml;
45
+ try {
46
+ yaml = fs.readFileSync(filePath, "utf8");
47
+ }
48
+ catch {
49
+ continue;
50
+ }
51
+ let doc;
52
+ try {
53
+ doc = yamlParse(yaml) ?? {};
54
+ }
55
+ catch {
56
+ continue;
57
+ }
58
+ const command = typeof doc.command === "string" ? doc.command : "";
59
+ const schedule = typeof doc.schedule === "string" ? doc.schedule : "";
60
+ const description = typeof doc.description === "string" ? doc.description : "";
61
+ tasks.push({
62
+ id,
63
+ label: `core/${id}`,
64
+ command,
65
+ schedule,
66
+ description,
67
+ yaml,
68
+ });
69
+ }
70
+ return tasks;
71
+ }
@@ -35,8 +35,8 @@
35
35
  */
36
36
  import path from "node:path";
37
37
  import { parse as parseYaml } from "yaml";
38
- import { UsageError } from "../core/errors";
39
- import { TASK_SCHEMA_VERSION } from "./schema";
38
+ import { UsageError } from "../core/errors.js";
39
+ import { TASK_SCHEMA_VERSION } from "./schema.js";
40
40
  export function parseTaskDocument(input) {
41
41
  const { yaml, filePath, id } = input;
42
42
  let data;
@@ -24,7 +24,7 @@ import { spawnSync } from "node:child_process";
24
24
  import fs from "node:fs";
25
25
  import path from "node:path";
26
26
  import { fileURLToPath } from "node:url";
27
- import { ConfigError } from "../core/errors";
27
+ import { ConfigError } from "../core/errors.js";
28
28
  export function resolveAkmInvocation(options = {}) {
29
29
  const env = options.env ?? process.env;
30
30
  const override = env.AKM_BIN?.trim();
@@ -16,7 +16,9 @@
16
16
  * 4. Dispatch by target kind:
17
17
  * • workflow → `startWorkflowRun(ref, params)`
18
18
  * • prompt → `runAgent(profile, prompt, { stdio: "captured" })`
19
- * 5. Capture stdout / stderr to `<cacheDir>/tasks/logs/<id>/<ts>.log`.
19
+ * 5. Capture stdout / stderr as structured rows in logs.db (task_logs) and,
20
+ * transitionally, as a flat text tail at `<cacheDir>/tasks/logs/<id>/<ts>.log`
21
+ * (see docs/technical/logs-audit.md).
20
22
  * 6. Write a history row to state.db task_history table.
21
23
  *
22
24
  * Returns a structured result so the CLI handler can shape it for `output()`
@@ -24,19 +26,22 @@
24
26
  */
25
27
  import fs from "node:fs";
26
28
  import path from "node:path";
27
- import { parseAssetRef } from "../core/asset-ref";
28
- import { resolveStashDir } from "../core/common";
29
- import { loadConfig } from "../core/config";
30
- import { NotFoundError, rethrowIfTestIsolationError } from "../core/errors";
31
- import { getTaskLogDir } from "../core/paths";
32
- import { getTaskHistory, openStateDatabase, queryTaskHistory, upsertTaskHistory } from "../core/state-db";
33
- import { error } from "../core/warn";
34
- import { requireAgentProfile, runAgent } from "../integrations/agent";
35
- import { resolveProcessAgentProfile } from "../integrations/agent/config";
36
- import { resolveRunner } from "../integrations/agent/runner";
37
- import { resolveAssetPath } from "../sources/resolve";
38
- import { startWorkflowRun } from "../workflows/runs";
39
- import { parseTaskDocument } from "./parser";
29
+ import { assertNever } from "../core/assert.js";
30
+ import { parseAssetRef } from "../core/asset/asset-ref.js";
31
+ import { resolveStashDir } from "../core/common.js";
32
+ import { loadConfig } from "../core/config/config.js";
33
+ import { NotFoundError, rethrowIfTestIsolationError } from "../core/errors.js";
34
+ import { buildTaskRunId, insertTaskLogLines, openLogsDatabase, } from "../core/logs-db.js";
35
+ import { getTaskLogDir } from "../core/paths.js";
36
+ import { getTaskHistory, openStateDatabase, queryTaskHistory, upsertTaskHistory } from "../core/state-db.js";
37
+ import { error } from "../core/warn.js";
38
+ import { requireAgentProfile, runAgent } from "../integrations/agent/index.js";
39
+ import { resolveProcessAgentProfile } from "../integrations/agent/config.js";
40
+ import { resolveRunner } from "../integrations/agent/runner.js";
41
+ import { spawn } from "../runtime.js";
42
+ import { resolveAssetPath } from "../sources/resolve.js";
43
+ import { startWorkflowRun } from "../workflows/runtime/runs.js";
44
+ import { parseTaskDocument } from "./parser.js";
40
45
  export async function runTask(id, options = {}) {
41
46
  const stashDir = options.stashDir ?? resolveStashDir();
42
47
  const runAgentImpl = options.runAgentImpl ?? runAgent;
@@ -68,7 +73,15 @@ export async function runTask(id, options = {}) {
68
73
  log: logPath,
69
74
  target: disabledTarget,
70
75
  };
71
- fs.writeFileSync(logPath, `[akm tasks] task "${id}" is disabled — skipping run.\n`);
76
+ const disabledLine = `[akm tasks] task "${id}" is disabled — skipping run.`;
77
+ persistRunLog({
78
+ taskId: id,
79
+ startedAtIso: startedIso,
80
+ finishedAtIso: result.finishedAt,
81
+ logPath,
82
+ fileText: `${disabledLine}\n`,
83
+ dbLines: [{ line: disabledLine }],
84
+ });
72
85
  appendHistory(result);
73
86
  return result;
74
87
  }
@@ -106,12 +119,14 @@ async function runCommandTask(input) {
106
119
  throw new Error("invariant: command target");
107
120
  const { cmd } = task.target;
108
121
  const timeoutMs = task.timeoutMs !== undefined ? task.timeoutMs : null;
109
- const logLines = [`[akm tasks] task=${task.id} kind=command cmd=${cmd.join(" ")}`];
122
+ const header = `[akm tasks] task=${task.id} kind=command cmd=${cmd.join(" ")}`;
123
+ const logLines = [header];
124
+ const dbLines = [{ line: header }];
110
125
  let stdout = "";
111
126
  let stderr = "";
112
127
  let exitCode = null;
113
128
  try {
114
- const proc = Bun.spawn(cmd, {
129
+ const proc = spawn(cmd, {
115
130
  stdin: "ignore",
116
131
  stdout: "pipe",
117
132
  stderr: "pipe",
@@ -142,24 +157,36 @@ async function runCommandTask(input) {
142
157
  exitCode = proc.exitCode ?? (timedOut ? 143 : 1);
143
158
  if (timedOut) {
144
159
  logLines.push(`timed_out=true timeout_ms=${timeoutMs}`);
160
+ dbLines.push({ level: "error", line: `timed_out=true timeout_ms=${timeoutMs}` });
145
161
  }
146
162
  logLines.push(`exit_code=${exitCode}`);
163
+ dbLines.push({ level: exitCode === 0 ? "info" : "error", line: `exit_code=${exitCode}` });
147
164
  if (stdout) {
148
165
  logLines.push("--- stdout ---");
149
166
  logLines.push(stdout);
167
+ dbLines.push(...streamLines(stdout, "stdout", "info"));
150
168
  }
151
169
  if (stderr) {
152
170
  logLines.push("--- stderr ---");
153
171
  logLines.push(stderr);
172
+ dbLines.push(...streamLines(stderr, "stderr", "error"));
154
173
  }
155
174
  }
156
175
  catch (e) {
157
176
  const msg = e instanceof Error ? e.message : String(e);
158
177
  logLines.push(`spawn_error=${msg}`);
178
+ dbLines.push({ level: "error", line: `spawn_error=${msg}` });
159
179
  exitCode = 1;
160
180
  }
161
- fs.writeFileSync(logPath, `${logLines.join("\n")}\n`);
162
181
  const finishedAt = now();
182
+ persistRunLog({
183
+ taskId: task.id,
184
+ startedAtIso: startedAt.toISOString(),
185
+ finishedAtIso: finishedAt.toISOString(),
186
+ logPath,
187
+ fileText: `${logLines.join("\n")}\n`,
188
+ dbLines,
189
+ });
163
190
  const status = exitCode === 0 ? "completed" : "failed";
164
191
  const result = {
165
192
  id: task.id,
@@ -194,7 +221,14 @@ async function runWorkflowTask(input) {
194
221
  const finishedAt = now();
195
222
  const status = error ? "failed" : mapWorkflowStatus(detail?.run.status);
196
223
  const log = renderWorkflowLog({ task, detail, error });
197
- fs.writeFileSync(logPath, log);
224
+ persistRunLog({
225
+ taskId: task.id,
226
+ startedAtIso: startedAt.toISOString(),
227
+ finishedAtIso: finishedAt.toISOString(),
228
+ logPath,
229
+ fileText: log.fileText,
230
+ dbLines: log.dbLines,
231
+ });
198
232
  const result = {
199
233
  id: task.id,
200
234
  status,
@@ -222,8 +256,19 @@ async function runWorkflowTask(input) {
222
256
  * returns (multi-step workflows pause for user input); recording them as
223
257
  * "completed" would be misleading. We preserve "active" as a first-class
224
258
  * task status with exit code 0 — the OS scheduler treats it as success.
259
+ *
260
+ * The parameter is typed as the runtime's `WorkflowRunStatus` union (plus the
261
+ * `undefined` that `detail?.run.status` can produce when no detail is present).
262
+ * Every union member is handled explicitly and the `default` arm calls
263
+ * `assertNever`, so adding a new `WorkflowRunStatus` variant without mapping it
264
+ * here is a *compile* error rather than silently collapsing to "completed".
265
+ * The previous silent `default: "completed"` is preserved only for the
266
+ * `undefined` (no-detail) case, which is handled up front.
225
267
  */
226
268
  function mapWorkflowStatus(status) {
269
+ // No run detail → treat as completed (unchanged from the prior silent default).
270
+ if (status === undefined)
271
+ return "completed";
227
272
  switch (status) {
228
273
  case "completed":
229
274
  case "blocked":
@@ -231,20 +276,21 @@ function mapWorkflowStatus(status) {
231
276
  case "active":
232
277
  return status;
233
278
  default:
234
- return "completed";
279
+ return assertNever(status, "mapWorkflowStatus");
235
280
  }
236
281
  }
237
282
  function renderWorkflowLog(input) {
238
- const lines = [];
239
- lines.push(`[akm tasks] task=${input.task.id} kind=workflow ref=${input.task.target.ref}`);
283
+ const dbLines = [
284
+ { line: `[akm tasks] task=${input.task.id} kind=workflow ref=${input.task.target.ref}` },
285
+ ];
240
286
  if (input.detail) {
241
- lines.push(`run_id=${input.detail.run.id} status=${input.detail.run.status}`);
242
- lines.push(`workflow_title=${input.detail.run.workflowTitle}`);
287
+ dbLines.push({ line: `run_id=${input.detail.run.id} status=${input.detail.run.status}` });
288
+ dbLines.push({ line: `workflow_title=${input.detail.run.workflowTitle}` });
243
289
  }
244
290
  if (input.error) {
245
- lines.push(`error=${input.error.message}`);
291
+ dbLines.push({ level: "error", line: `error=${input.error.message}` });
246
292
  }
247
- return `${lines.join("\n")}\n`;
293
+ return { fileText: `${dbLines.map((entry) => entry.line).join("\n")}\n`, dbLines };
248
294
  }
249
295
  // ── prompt target ───────────────────────────────────────────────────────────
250
296
  async function runPromptTask(input) {
@@ -308,7 +354,14 @@ async function runPromptTask(input) {
308
354
  });
309
355
  const finishedAt = now();
310
356
  const log = renderPromptLog({ task, profileName: profile.name, result });
311
- fs.writeFileSync(logPath, log);
357
+ persistRunLog({
358
+ taskId: task.id,
359
+ startedAtIso: startedAt.toISOString(),
360
+ finishedAtIso: finishedAt.toISOString(),
361
+ logPath,
362
+ fileText: log.fileText,
363
+ dbLines: log.dbLines,
364
+ });
312
365
  const status = result.ok ? "completed" : "failed";
313
366
  const out = {
314
367
  id: task.id,
@@ -346,20 +399,63 @@ async function resolvePromptText(task, stashDir) {
346
399
  }
347
400
  function renderPromptLog(input) {
348
401
  const lines = [];
349
- lines.push(`[akm tasks] task=${input.task.id} kind=prompt profile=${input.profileName}`);
350
- lines.push(`ok=${input.result.ok} exit_code=${input.result.exitCode ?? "null"} duration_ms=${input.result.durationMs}`);
402
+ const dbLines = [];
403
+ const header = `[akm tasks] task=${input.task.id} kind=prompt profile=${input.profileName}`;
404
+ const summary = `ok=${input.result.ok} exit_code=${input.result.exitCode ?? "null"} duration_ms=${input.result.durationMs}`;
405
+ lines.push(header, summary);
406
+ dbLines.push({ line: header }, { level: input.result.ok ? "info" : "error", line: summary });
351
407
  if (!input.result.ok) {
352
- lines.push(`reason=${input.result.reason ?? ""} error=${input.result.error ?? ""}`);
408
+ const failure = `reason=${input.result.reason ?? ""} error=${input.result.error ?? ""}`;
409
+ lines.push(failure);
410
+ dbLines.push({ level: "error", line: failure });
353
411
  }
354
412
  if (input.result.stdout) {
355
413
  lines.push("--- agent stdout ---");
356
414
  lines.push(input.result.stdout);
415
+ dbLines.push(...streamLines(input.result.stdout, "stdout", "info"));
357
416
  }
358
417
  if (input.result.stderr) {
359
418
  lines.push("--- agent stderr ---");
360
419
  lines.push(input.result.stderr);
420
+ dbLines.push(...streamLines(input.result.stderr, "stderr", "error"));
421
+ }
422
+ return { fileText: `${lines.join("\n")}\n`, dbLines };
423
+ }
424
+ /** Split captured pipe output into per-line logs.db rows (blank lines dropped). */
425
+ function streamLines(text, stream, level) {
426
+ return text
427
+ .split("\n")
428
+ .filter((line) => line.length > 0)
429
+ .map((line) => ({ stream, level, line }));
430
+ }
431
+ /**
432
+ * Persist a finished run's log: the flat text file (so `log_path` in
433
+ * task_history keeps resolving for humans and older consumers) plus
434
+ * structured rows in logs.db keyed by `buildTaskRunId(taskId, startedAt)`.
435
+ *
436
+ * The DB write is best-effort, mirroring {@link appendHistory}: an unwritable
437
+ * logs.db must never fail a task run.
438
+ */
439
+ function persistRunLog(input) {
440
+ fs.writeFileSync(input.logPath, input.fileText);
441
+ try {
442
+ const db = openLogsDatabase();
443
+ try {
444
+ insertTaskLogLines(db, {
445
+ taskId: input.taskId,
446
+ runId: buildTaskRunId(input.taskId, input.startedAtIso),
447
+ ts: input.finishedAtIso,
448
+ lines: input.dbLines,
449
+ });
450
+ }
451
+ finally {
452
+ db.close();
453
+ }
454
+ }
455
+ catch (err) {
456
+ rethrowIfTestIsolationError(err);
457
+ error(`[akm] task log DB write failed: ${String(err)}`);
361
458
  }
362
- return `${lines.join("\n")}\n`;
363
459
  }
364
460
  // ── history ─────────────────────────────────────────────────────────────────
365
461
  function appendHistory(result) {
@@ -26,7 +26,7 @@
26
26
  * Linux may fail to translate when copied to macOS/Windows. `tasks sync`
27
27
  * re-validates against the local backend and surfaces any incompatibility.
28
28
  */
29
- import { UsageError } from "../core/errors";
29
+ import { UsageError } from "../core/errors.js";
30
30
  const ALIAS_TO_CRON = {
31
31
  "@hourly": "0 * * * *",
32
32
  "@daily": "0 0 * * *",
@@ -16,13 +16,13 @@
16
16
  */
17
17
  import fs from "node:fs";
18
18
  import path from "node:path";
19
- import { parseAssetRef } from "../core/asset-ref";
20
- import { resolveStashDir } from "../core/common";
21
- import { loadConfig } from "../core/config";
22
- import { NotFoundError } from "../core/errors";
23
- import { requireAgentProfile } from "../integrations/agent";
24
- import { resolveAssetPath } from "../sources/resolve";
25
- import { parseSchedule } from "./schedule";
19
+ import { parseAssetRef } from "../core/asset/asset-ref.js";
20
+ import { resolveStashDir } from "../core/common.js";
21
+ import { loadConfig } from "../core/config/config.js";
22
+ import { NotFoundError } from "../core/errors.js";
23
+ import { requireAgentProfile } from "../integrations/agent/index.js";
24
+ import { resolveAssetPath } from "../sources/resolve.js";
25
+ import { parseSchedule } from "./schedule.js";
26
26
  export async function validateTaskDocument(task, options) {
27
27
  // Schedule must parse and translate.
28
28
  parseSchedule(task.schedule, options.backend);
@@ -0,0 +1,51 @@
1
+ // This Source Code Form is subject to the terms of the Mozilla Public
2
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
+
5
+ // Node ESM loader hook: support `import x from "./foo.md" with { type: "text" }`.
6
+ //
7
+ // Bun has a built-in text loader; Node does not (it only understands
8
+ // `type: "json"`). akm embeds prompt/template assets via `with { type: "text" }`
9
+ // imports that are statically hoisted into the module graph, so Node fails at
10
+ // load time with ERR_UNKNOWN_FILE_EXTENSION / unsupported import attribute
11
+ // before any command runs. This hook makes Node treat those imports as a module
12
+ // whose default export is the file's UTF-8 contents — byte-identical to Bun's
13
+ // text loader. It is ONLY registered on the Node entry path (see cli-node.mjs);
14
+ // Bun never loads it, so the Bun runtime is untouched.
15
+
16
+ import { readFile } from "node:fs/promises";
17
+ import { fileURLToPath } from "node:url";
18
+
19
+ const TEXT_EXTENSIONS = new Set([".md", ".xml", ".txt", ".sql"]);
20
+
21
+ function isTextImport(url, importAttributes) {
22
+ if (importAttributes && importAttributes.type === "text") return true;
23
+ const i = url.lastIndexOf(".");
24
+ if (i === -1) return false;
25
+ return TEXT_EXTENSIONS.has(url.slice(i).toLowerCase().split("?")[0]);
26
+ }
27
+
28
+ export async function load(url, context, nextLoad) {
29
+ if (url.startsWith("file:") && isTextImport(url, context.importAttributes)) {
30
+ const text = await readFile(fileURLToPath(url), "utf8");
31
+ return {
32
+ format: "module",
33
+ shortCircuit: true,
34
+ source: `export default ${JSON.stringify(text)};`,
35
+ };
36
+ }
37
+ return nextLoad(url, context);
38
+ }
39
+
40
+ // Node validates import attributes against the resolved format and rejects an
41
+ // unknown `type: "text"` during resolution. Strip the attribute here so our
42
+ // `load` hook (above) can take over; the assertion has already served its
43
+ // purpose of routing to text handling.
44
+ export async function resolve(specifier, context, nextResolve) {
45
+ const result = await nextResolve(specifier, context);
46
+ if (result.importAttributes && result.importAttributes.type === "text") {
47
+ const { type, ...rest } = result.importAttributes;
48
+ return { ...result, importAttributes: rest };
49
+ }
50
+ return result;
51
+ }
package/dist/version.js CHANGED
@@ -3,13 +3,14 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
+ import { getDirname } from "./runtime.js";
6
7
  // Version: prefer compile-time define, then package.json, then fallback
7
8
  export const pkgVersion = (() => {
8
9
  // Injected at compile time via `bun build --define`
9
10
  if (typeof AKM_VERSION !== "undefined")
10
11
  return AKM_VERSION;
11
12
  try {
12
- const pkgPath = path.resolve(import.meta.dir ?? __dirname, "../package.json");
13
+ const pkgPath = path.resolve(getDirname(import.meta.url), "../package.json");
13
14
  if (fs.existsSync(pkgPath)) {
14
15
  const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
15
16
  if (typeof pkg.version === "string")
package/dist/wiki/wiki.js CHANGED
@@ -45,13 +45,13 @@ import fs from "node:fs";
45
45
  import path from "node:path";
46
46
  import { parse as yamlParse } from "yaml";
47
47
  import ingestWorkflowTemplate from "../assets/wiki/ingest-workflow-template.md" with { type: "text" };
48
- import { akmSearch } from "../commands/search";
49
- import { isWithin, todayIso } from "../core/common";
50
- import { getSources, loadUserConfig, saveConfig } from "../core/config";
51
- import { NotFoundError, UsageError } from "../core/errors";
52
- import { parseFrontmatter, parseFrontmatterBlock } from "../core/frontmatter";
53
- import { resolveSourceEntries } from "../indexer/search-source";
54
- import { buildIndexMd, buildLogMd, buildSchemaMd } from "./wiki-templates";
48
+ import { akmSearch } from "../commands/read/search.js";
49
+ import { parseFrontmatter, parseFrontmatterBlock } from "../core/asset/frontmatter.js";
50
+ import { isWithin, todayIso } from "../core/common.js";
51
+ import { getSources, loadUserConfig, saveConfig } from "../core/config/config.js";
52
+ import { NotFoundError, UsageError } from "../core/errors.js";
53
+ import { resolveSourceEntries } from "../indexer/search/search-source.js";
54
+ import { buildIndexMd, buildLogMd, buildSchemaMd } from "./wiki-templates.js";
55
55
  // ── Constants ───────────────────────────────────────────────────────────────
56
56
  export const WIKIS_SUBDIR = "wikis";
57
57
  export const SCHEMA_MD = "schema.md";
@@ -3,12 +3,12 @@
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
4
  import fs from "node:fs";
5
5
  import path from "node:path";
6
- import workflowTemplate from "../assets/workflows/workflow-template.md" with { type: "text" };
7
- import { resolveAssetPathFromName } from "../core/asset-spec";
8
- import { isWithin, resolveStashDir } from "../core/common";
9
- import { UsageError } from "../core/errors";
10
- import { warn } from "../core/warn";
11
- import { parseWorkflow } from "./parser";
6
+ import workflowTemplate from "../../assets/workflows/workflow-template.md" with { type: "text" };
7
+ import { resolveAssetPathFromName } from "../../core/asset/asset-spec.js";
8
+ import { isWithin, resolveStashDir } from "../../core/common.js";
9
+ import { UsageError } from "../../core/errors.js";
10
+ import { warn } from "../../core/warn.js";
11
+ import { parseWorkflow } from "../parser.js";
12
12
  const DEFAULT_WORKFLOW_TEMPLATE = renderWorkflowTemplate({
13
13
  title: "Example Workflow",
14
14
  firstStepTitle: "First Step",
@@ -4,7 +4,7 @@
4
4
  import { createHash } from "node:crypto";
5
5
  import fs from "node:fs";
6
6
  import path from "node:path";
7
- import { isWithin, resolveStashDir, safeRealpath, toPosix } from "../core/common";
7
+ import { isWithin, resolveStashDir, safeRealpath, toPosix } from "../../core/common.js";
8
8
  const PROJECT_CONFIG_RELATIVE_PATH = path.join(".akm", "config.json");
9
9
  export function getCurrentWorkflowScopeKey() {
10
10
  const anchor = resolveWorkflowScopeAnchor(process.cwd());
@@ -1,7 +1,7 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- import { UsageError } from "../core/errors";
4
+ import { UsageError } from "../core/errors.js";
5
5
  export const WORKFLOW_STEP_STATES = [
6
6
  "completed",
7
7
  "blocked",