crewly 1.8.9 → 1.8.12

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/config/constants.d.ts.map +1 -0
  2. package/config/index.d.ts.map +1 -0
  3. package/config/roles/_common/memory-instructions.md +6 -5
  4. package/config/roles/_common/wiki-instructions.md +49 -0
  5. package/config/roles/architect/prompt.md +2 -2
  6. package/config/roles/backend-developer/prompt.md +2 -2
  7. package/config/roles/designer/prompt.md +2 -2
  8. package/config/roles/developer/prompt.md +2 -2
  9. package/config/roles/frontend-developer/prompt.md +2 -2
  10. package/config/roles/fullstack-dev/prompt.md +2 -2
  11. package/config/roles/generalist/prompt.md +2 -2
  12. package/config/roles/ops/prompt.md +2 -2
  13. package/config/roles/orchestrator/prompt.md +135 -11
  14. package/config/roles/product-manager/prompt.md +2 -2
  15. package/config/roles/qa/prompt.md +2 -2
  16. package/config/roles/qa-engineer/prompt.md +2 -2
  17. package/config/roles/researcher/prompt.md +15 -6
  18. package/config/roles/sales/prompt.md +2 -2
  19. package/config/roles/support/prompt.md +2 -2
  20. package/config/roles/team-leader/prompt.md +17 -2
  21. package/config/roles/tpm/prompt.md +2 -2
  22. package/config/roles/ux-designer/prompt.md +2 -2
  23. package/config/skills/orchestrator/wiki-cleanup/SKILL.md +89 -0
  24. package/config/skills/orchestrator/wiki-cleanup/execute.sh +139 -0
  25. package/config/skills/orchestrator/wiki-lint/SKILL.md +75 -0
  26. package/config/skills/orchestrator/wiki-lint/execute.sh +66 -0
  27. package/config/skills/orchestrator/wiki-migrate/SKILL.md +103 -0
  28. package/config/skills/orchestrator/wiki-migrate/execute.sh +82 -0
  29. package/config/skills/orchestrator/wiki-process-queue/SKILL.md +9 -1
  30. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +169 -0
  31. package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +1 -0
  32. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +1779 -0
  33. package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +1 -0
  34. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +18 -0
  35. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
  36. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +63 -0
  37. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  38. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.d.ts.map +1 -1
  39. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js +5 -1
  40. package/dist/backend/backend/src/controllers/task-pool/task-pool.routes.js.map +1 -1
  41. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts +109 -0
  42. package/dist/backend/backend/src/controllers/wiki/wiki.controller.d.ts.map +1 -1
  43. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js +419 -4
  44. package/dist/backend/backend/src/controllers/wiki/wiki.controller.js.map +1 -1
  45. package/dist/backend/backend/src/controllers/wiki/wiki.routes.d.ts.map +1 -1
  46. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js +11 -1
  47. package/dist/backend/backend/src/controllers/wiki/wiki.routes.js.map +1 -1
  48. package/dist/backend/backend/src/index.d.ts.map +1 -1
  49. package/dist/backend/backend/src/index.js +78 -3
  50. package/dist/backend/backend/src/index.js.map +1 -1
  51. package/dist/backend/backend/src/index.js.orc-bak-20260529 +3130 -0
  52. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +513 -0
  53. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +1 -0
  54. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +1568 -0
  55. package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +1 -0
  56. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +86 -0
  57. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +1 -0
  58. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +147 -0
  59. package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +1 -0
  60. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +68 -0
  61. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +1 -0
  62. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +131 -0
  63. package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +1 -0
  64. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +130 -0
  65. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +1 -0
  66. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +263 -0
  67. package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +1 -0
  68. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +74 -0
  69. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +1 -0
  70. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +140 -0
  71. package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +1 -0
  72. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +29 -0
  73. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +1 -0
  74. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +279 -0
  75. package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +1 -0
  76. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +340 -0
  77. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +1 -0
  78. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +1176 -0
  79. package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +1 -0
  80. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +79 -0
  81. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +1 -0
  82. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +145 -0
  83. package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +1 -0
  84. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +79 -0
  85. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +1 -0
  86. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +218 -0
  87. package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +1 -0
  88. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +16 -0
  89. package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +1 -0
  90. package/dist/backend/backend/src/services/agent/crewly-agent/index.js +16 -0
  91. package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +1 -0
  92. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +135 -0
  93. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +1 -0
  94. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +185 -0
  95. package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +1 -0
  96. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +141 -0
  97. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +1 -0
  98. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +310 -0
  99. package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +1 -0
  100. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +91 -0
  101. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +1 -0
  102. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +143 -0
  103. package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +1 -0
  104. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +103 -0
  105. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +1 -0
  106. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +256 -0
  107. package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +1 -0
  108. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +143 -0
  109. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +1 -0
  110. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +264 -0
  111. package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +1 -0
  112. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +13 -0
  113. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +1 -0
  114. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +91 -0
  115. package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +1 -0
  116. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +135 -0
  117. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +1 -0
  118. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +1937 -0
  119. package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +1 -0
  120. package/dist/backend/backend/src/services/ai/prompt-builder.service.js +1 -1
  121. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +429 -0
  122. package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +1 -0
  123. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +852 -0
  124. package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +1 -0
  125. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +171 -0
  126. package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
  127. package/dist/backend/backend/src/services/project/task-tracking.service.js +725 -0
  128. package/dist/backend/backend/src/services/project/task-tracking.service.js.map +1 -0
  129. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
  130. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +50 -0
  131. package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
  132. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  133. package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  134. package/dist/backend/backend/src/services/task-pool/task-pool.service.js +45 -0
  135. package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  136. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.d.ts.map +1 -1
  137. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js +34 -1
  138. package/dist/backend/backend/src/services/v3/agent-auto-claim.service.js.map +1 -1
  139. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +118 -0
  140. package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +1 -0
  141. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +326 -0
  142. package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +1 -0
  143. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts +72 -0
  144. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.d.ts.map +1 -0
  145. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js +186 -0
  146. package/dist/backend/backend/src/services/wiki/wiki-backlinks.service.js.map +1 -0
  147. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +27 -4
  148. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
  149. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +133 -10
  150. package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
  151. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts +18 -1
  152. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.d.ts.map +1 -1
  153. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js +15 -4
  154. package/dist/backend/backend/src/services/wiki/wiki-bookkeep.service.js.map +1 -1
  155. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +74 -0
  156. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +1 -0
  157. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +154 -0
  158. package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +1 -0
  159. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts +160 -0
  160. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.d.ts.map +1 -0
  161. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js +399 -0
  162. package/dist/backend/backend/src/services/wiki/wiki-cleanup.service.js.map +1 -0
  163. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts +182 -0
  164. package/dist/backend/backend/src/services/wiki/wiki-lint.service.d.ts.map +1 -0
  165. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js +505 -0
  166. package/dist/backend/backend/src/services/wiki/wiki-lint.service.js.map +1 -0
  167. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts +232 -0
  168. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.d.ts.map +1 -0
  169. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js +1416 -0
  170. package/dist/backend/backend/src/services/wiki/wiki-migrate.service.js.map +1 -0
  171. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts +51 -0
  172. package/dist/backend/backend/src/services/wiki/wiki-recent.service.d.ts.map +1 -0
  173. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js +102 -0
  174. package/dist/backend/backend/src/services/wiki/wiki-recent.service.js.map +1 -0
  175. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +104 -0
  176. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -0
  177. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +229 -0
  178. package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -0
  179. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts +90 -0
  180. package/dist/backend/backend/src/services/wiki/wiki-search.service.d.ts.map +1 -0
  181. package/dist/backend/backend/src/services/wiki/wiki-search.service.js +190 -0
  182. package/dist/backend/backend/src/services/wiki/wiki-search.service.js.map +1 -0
  183. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +164 -0
  184. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -0
  185. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +675 -0
  186. package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -0
  187. package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
  188. package/dist/backend/backend/src/services/workflow/cron-task.service.js +65 -0
  189. package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
  190. package/dist/backend/backend/src/types/auto-assign.types.d.ts +271 -0
  191. package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +1 -0
  192. package/dist/backend/backend/src/types/auto-assign.types.js +136 -0
  193. package/dist/backend/backend/src/types/auto-assign.types.js.map +1 -0
  194. package/dist/backend/backend/src/types/cron-task.types.d.ts +16 -1
  195. package/dist/backend/backend/src/types/cron-task.types.d.ts.map +1 -1
  196. package/dist/backend/backend/src/utils/esm-require.utils.d.ts +111 -0
  197. package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +1 -0
  198. package/dist/backend/backend/src/utils/esm-require.utils.js +124 -0
  199. package/dist/backend/backend/src/utils/esm-require.utils.js.map +1 -0
  200. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +220 -0
  201. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -0
  202. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js +37 -0
  203. package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -0
  204. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +56 -0
  205. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +1 -0
  206. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +91 -0
  207. package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +1 -0
  208. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +159 -0
  209. package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +1 -0
  210. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +304 -0
  211. package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +1 -0
  212. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +115 -0
  213. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +1 -0
  214. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +215 -0
  215. package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +1 -0
  216. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +78 -0
  217. package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +1 -0
  218. package/dist/cli/backend/src/services/memory/embedding-provider.js +179 -0
  219. package/dist/cli/backend/src/services/memory/embedding-provider.js.map +1 -0
  220. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +331 -0
  221. package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +1 -0
  222. package/dist/cli/backend/src/services/memory/vector-store.service.js +814 -0
  223. package/dist/cli/backend/src/services/memory/vector-store.service.js.map +1 -0
  224. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +171 -0
  225. package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +1 -0
  226. package/dist/cli/backend/src/services/project/task-tracking.service.js +725 -0
  227. package/dist/cli/backend/src/services/project/task-tracking.service.js.map +1 -0
  228. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +19 -0
  229. package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
  230. package/dist/cli/backend/src/services/task-pool/task-pool.service.js +45 -0
  231. package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
  232. package/dist/cli/backend/src/types/auto-assign.types.d.ts +271 -0
  233. package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +1 -0
  234. package/dist/cli/backend/src/types/auto-assign.types.js +136 -0
  235. package/dist/cli/backend/src/types/auto-assign.types.js.map +1 -0
  236. package/dist/cli/cli/src/index.js +0 -0
  237. package/frontend/dist/assets/{index-db3f5041.css → index-068bb4f6.css} +10 -1
  238. package/frontend/dist/assets/index-c24ceb15.js +4960 -0
  239. package/frontend/dist/index.html +2 -2
  240. package/package.json +1 -1
  241. package/config/skills/agent/core/query-knowledge/SKILL.md +0 -87
  242. package/config/skills/agent/core/query-knowledge/execute.sh +0 -30
  243. package/config/skills/orchestrator/query-knowledge/SKILL.md +0 -75
  244. package/config/skills/orchestrator/query-knowledge/execute.sh +0 -30
  245. package/frontend/dist/assets/index-cc115bb4.js +0 -4926
@@ -0,0 +1,505 @@
1
+ /**
2
+ * WikiLintService — deterministic validation pass over a vault.
3
+ *
4
+ * Per v2.1 spec §3, the third Phase 1 skill (alongside `wiki-ingest` and
5
+ * `wiki-query`). Unlike `wiki-bookkeep` (vault HEALTH metrics — counts,
6
+ * recent activity, duplicate clusters), lint focuses on CORRECTNESS:
7
+ *
8
+ * - **frozenPathRespected** — no markdown content in folders flagged
9
+ * `frozen: true` in SCHEMA.md (other than the SCHEMA.md itself /
10
+ * legitimate frozen content). Lint refuses to alter frozen paths.
11
+ * - **missingEntities** — `[[wikilinks]]` that don't resolve to any
12
+ * page in the vault. Either the target was renamed, deleted, or the
13
+ * wikilink was made up. The lint flags them; the agent decides.
14
+ * - **orphanPages** — pages with zero incoming wikilinks, excluding
15
+ * seed pages (log.md, index.md, README*). These are candidates for
16
+ * either deletion or new linking.
17
+ * - **staleClaims** — files un-touched for `staleDays` (default 90).
18
+ * - **restructureProposals** — heuristics for llm-curated/ only: large
19
+ * un-indexed folders, near-duplicate filenames.
20
+ *
21
+ * The service never writes. The agent's LLM reads the report and decides
22
+ * whether to ingest a consolidation, archive stale pages, etc.
23
+ *
24
+ * @module services/wiki/wiki-lint.service
25
+ */
26
+ import * as path from 'path';
27
+ import * as fs from 'fs/promises';
28
+ import { existsSync } from 'fs';
29
+ import { LoggerService } from '../core/logger.service.js';
30
+ import { SchemaLoaderService } from './schema-loader.service.js';
31
+ /** Default age threshold (days) for marking a page stale. */
32
+ export const WIKI_LINT_DEFAULT_STALE_DAYS = 90;
33
+ /** Folder size threshold above which lint proposes an `index.md` rollup. */
34
+ export const WIKI_LINT_ROLLUP_THRESHOLD = 20;
35
+ /** Max number of pages walked per lint pass. */
36
+ export const WIKI_LINT_MAX_PAGES = 1000;
37
+ /** Cap per category to keep the payload bounded. */
38
+ export const WIKI_LINT_MAX_ROWS_PER_SECTION = 50;
39
+ /** Pages with these basenames never count as "orphans". */
40
+ export const WIKI_LINT_SEED_BASENAMES = new Set([
41
+ 'log.md',
42
+ 'index.md',
43
+ 'readme.md',
44
+ 'schema.md',
45
+ ]);
46
+ /**
47
+ * A `[[wikilink]]` target is "concept-shaped" (vs a dangling typo) when
48
+ * it appears at least this many times across the vault. Below this, the
49
+ * unresolved target is just noise; at or above this, the concept is
50
+ * load-bearing and deserves its own page.
51
+ */
52
+ export const WIKI_LINT_MISSING_CONCEPT_THRESHOLD = 3;
53
+ /** `[[target]]` or `[[target|alias]]`. */
54
+ const WIKILINK_RE = /\[\[([^\]|]+?)(?:\|[^\]]+?)?\]\]/g;
55
+ /**
56
+ * Singleton lint service. Stateless — pattern mirrors the other wiki
57
+ * services so the controller wiring is uniform.
58
+ */
59
+ export class WikiLintService {
60
+ static instance = null;
61
+ logger;
62
+ schemaLoader;
63
+ constructor() {
64
+ this.logger = LoggerService.getInstance().createComponentLogger('WikiLintService');
65
+ this.schemaLoader = new SchemaLoaderService();
66
+ }
67
+ static getInstance() {
68
+ if (!this.instance)
69
+ this.instance = new WikiLintService();
70
+ return this.instance;
71
+ }
72
+ static resetInstance() {
73
+ this.instance = null;
74
+ }
75
+ /**
76
+ * Generate a lint report for the given vault.
77
+ */
78
+ async generate(input) {
79
+ const { vaultPath } = input;
80
+ const staleDays = input.staleDays ?? WIKI_LINT_DEFAULT_STALE_DAYS;
81
+ if (!vaultPath || !path.isAbsolute(vaultPath)) {
82
+ return {
83
+ ok: false,
84
+ reason: 'invalid_input',
85
+ message: 'vaultPath must be an absolute path',
86
+ };
87
+ }
88
+ if (staleDays <= 0) {
89
+ return {
90
+ ok: false,
91
+ reason: 'invalid_input',
92
+ message: 'staleDays must be positive',
93
+ };
94
+ }
95
+ if (!existsSync(vaultPath)) {
96
+ return { ok: false, reason: 'vault_missing', message: `vault not found: ${vaultPath}` };
97
+ }
98
+ if (!existsSync(path.join(vaultPath, 'SCHEMA.md'))) {
99
+ return {
100
+ ok: false,
101
+ reason: 'schema_missing',
102
+ message: `SCHEMA.md not found inside ${vaultPath}`,
103
+ };
104
+ }
105
+ let schema;
106
+ try {
107
+ schema = await this.schemaLoader.load(vaultPath);
108
+ }
109
+ catch (err) {
110
+ this.logger.warn('WikiLintService: schema load failed', {
111
+ vault: vaultPath,
112
+ error: err.message,
113
+ });
114
+ return {
115
+ ok: false,
116
+ reason: 'schema_missing',
117
+ message: `SCHEMA.md unparseable: ${err.message}`,
118
+ };
119
+ }
120
+ const frozenFolders = this.schemaLoader
121
+ .getFrozenPaths(schema)
122
+ .map((p) => p.replace(/[/\\]+$/, ''));
123
+ const allFiles = [];
124
+ await this.collectFiles(vaultPath, vaultPath, allFiles);
125
+ const truncated = allFiles.length >= WIKI_LINT_MAX_PAGES;
126
+ const files = allFiles.slice(0, WIKI_LINT_MAX_PAGES);
127
+ const frozenViolations = this.detectFrozenViolations(files, frozenFolders);
128
+ const { missingEntities, incomingMap, unresolvedFrequency } = await this.scanWikilinks(vaultPath, files);
129
+ const orphanPages = this.detectOrphans(files, incomingMap);
130
+ const staleClaims = this.detectStale(files, staleDays);
131
+ const restructureProposals = this.proposeRestructures(files);
132
+ const missingConcepts = this.detectMissingConcepts(unresolvedFrequency);
133
+ const report = {
134
+ vault: {
135
+ scope: schema.vault_scope,
136
+ id: schema.vault_id,
137
+ path: vaultPath,
138
+ },
139
+ generatedAt: new Date().toISOString(),
140
+ staleDays,
141
+ frozenPathRespected: frozenViolations.length === 0,
142
+ frozenViolations: frozenViolations.slice(0, WIKI_LINT_MAX_ROWS_PER_SECTION),
143
+ missingEntities: missingEntities.slice(0, WIKI_LINT_MAX_ROWS_PER_SECTION),
144
+ missingConcepts: missingConcepts.slice(0, WIKI_LINT_MAX_ROWS_PER_SECTION),
145
+ orphanPages: orphanPages.slice(0, WIKI_LINT_MAX_ROWS_PER_SECTION),
146
+ staleClaims: staleClaims.slice(0, WIKI_LINT_MAX_ROWS_PER_SECTION),
147
+ restructureProposals: restructureProposals.slice(0, WIKI_LINT_MAX_ROWS_PER_SECTION),
148
+ truncated,
149
+ };
150
+ return { ok: true, report };
151
+ }
152
+ // ---------------------------------------------------------------------------
153
+ // Internals
154
+ // ---------------------------------------------------------------------------
155
+ /**
156
+ * Recursive walk collecting `.md` files. Honors `WIKI_LINT_MAX_PAGES`.
157
+ */
158
+ async collectFiles(rootDir, dir, acc) {
159
+ if (acc.length >= WIKI_LINT_MAX_PAGES)
160
+ return;
161
+ let entries;
162
+ try {
163
+ entries = await fs.readdir(dir, { withFileTypes: true });
164
+ }
165
+ catch {
166
+ return;
167
+ }
168
+ for (const entry of entries) {
169
+ if (acc.length >= WIKI_LINT_MAX_PAGES)
170
+ return;
171
+ if (entry.name.startsWith('.'))
172
+ continue;
173
+ const abs = path.join(dir, entry.name);
174
+ if (entry.isDirectory()) {
175
+ await this.collectFiles(rootDir, abs, acc);
176
+ }
177
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
178
+ const rel = path.relative(rootDir, abs).replace(/\\/g, '/');
179
+ try {
180
+ const stat = await fs.stat(abs);
181
+ // Peek at the first few hundred bytes only to extract a possible
182
+ // `original_date:` field from a YAML frontmatter block. We avoid
183
+ // reading the whole file in this pass — scanWikilinks() does the
184
+ // full read separately.
185
+ const originalDateMs = await peekOriginalDate(abs);
186
+ acc.push({
187
+ relativePath: rel,
188
+ basename: entry.name,
189
+ modifiedMs: stat.mtimeMs,
190
+ originalDateMs,
191
+ });
192
+ }
193
+ catch {
194
+ // unreadable file — skip
195
+ }
196
+ }
197
+ }
198
+ }
199
+ /**
200
+ * Find `.md` files that live inside any frozen folder. SCHEMA.md and
201
+ * legitimate sibling files inside frozen dirs (e.g. `sop/<role>.md`)
202
+ * are excluded — frozen folders ARE allowed to contain content; what's
203
+ * NOT allowed is `wiki-ingest` writing INTO them. That's a runtime
204
+ * check elsewhere. Lint surfaces files only when they look like they
205
+ * were created by ingest patterns (timestamp-prefixed slugs).
206
+ */
207
+ detectFrozenViolations(files, frozenFolders) {
208
+ const out = [];
209
+ if (frozenFolders.length === 0)
210
+ return out;
211
+ const ingestNamePattern = /^\d{4}-\d{2}-\d{2}-/;
212
+ for (const f of files) {
213
+ // Match if the file lives strictly inside a frozen folder.
214
+ for (const folder of frozenFolders) {
215
+ if (!folder)
216
+ continue;
217
+ if (f.relativePath === `${folder}/${f.basename}` ||
218
+ f.relativePath.startsWith(`${folder}/`)) {
219
+ // Only flag ingest-shaped names (date-prefixed) — preexisting
220
+ // frozen content is fine.
221
+ if (ingestNamePattern.test(f.basename) || f.basename === 'log.md') {
222
+ out.push({ path: f.relativePath, frozenFolder: folder });
223
+ }
224
+ break;
225
+ }
226
+ }
227
+ }
228
+ return out;
229
+ }
230
+ /**
231
+ * One read pass per file: pulls `[[wikilink]]` references, builds the
232
+ * inverse "incoming" map for orphan detection, and emits missing-entity
233
+ * rows for any link that resolves to nothing.
234
+ */
235
+ async scanWikilinks(vaultPath, files) {
236
+ const incomingMap = new Map();
237
+ const missingEntities = [];
238
+ const unresolvedFrequency = new Map();
239
+ // Normalize the page set for fast resolution.
240
+ const allPaths = files.map((f) => f.relativePath.toLowerCase());
241
+ for (const file of files) {
242
+ let content;
243
+ try {
244
+ content = await fs.readFile(path.join(vaultPath, file.relativePath), 'utf8');
245
+ }
246
+ catch {
247
+ continue;
248
+ }
249
+ if (!content.includes('[['))
250
+ continue;
251
+ const lines = content.split(/\r?\n/);
252
+ for (let i = 0; i < lines.length; i++) {
253
+ const line = lines[i];
254
+ if (!line.includes('[['))
255
+ continue;
256
+ WIKILINK_RE.lastIndex = 0;
257
+ let m;
258
+ while ((m = WIKILINK_RE.exec(line)) !== null) {
259
+ const rawTarget = m[1]?.trim();
260
+ if (!rawTarget)
261
+ continue;
262
+ const resolved = resolveAgainstFiles(rawTarget, allPaths, files);
263
+ if (!resolved) {
264
+ missingEntities.push({
265
+ sourcePath: file.relativePath,
266
+ target: rawTarget,
267
+ lineNumber: i + 1,
268
+ });
269
+ // Accumulate frequency for missing-concepts detection.
270
+ const key = rawTarget.toLowerCase();
271
+ const slot = unresolvedFrequency.get(key) ?? {
272
+ count: 0,
273
+ sources: new Set(),
274
+ };
275
+ slot.count++;
276
+ slot.sources.add(file.relativePath);
277
+ unresolvedFrequency.set(key, slot);
278
+ }
279
+ else {
280
+ const arr = incomingMap.get(resolved) ?? [];
281
+ if (!arr.includes(file.relativePath))
282
+ arr.push(file.relativePath);
283
+ incomingMap.set(resolved, arr);
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return { missingEntities, incomingMap, unresolvedFrequency };
289
+ }
290
+ /**
291
+ * A page is an orphan when no other page wikilinks to it AND it is
292
+ * not a seed page (log.md / index.md / README.md / SCHEMA.md).
293
+ */
294
+ detectOrphans(files, incomingMap) {
295
+ const out = [];
296
+ for (const f of files) {
297
+ if (WIKI_LINT_SEED_BASENAMES.has(f.basename.toLowerCase()))
298
+ continue;
299
+ const incoming = incomingMap.get(f.relativePath) ?? [];
300
+ if (incoming.length === 0)
301
+ out.push(f.relativePath);
302
+ }
303
+ return out;
304
+ }
305
+ /**
306
+ * Find load-bearing concepts referenced repeatedly across the vault
307
+ * but lacking a dedicated page. Karpathy's lint contract names this:
308
+ * *"important concepts mentioned but lacking their own page."*
309
+ *
310
+ * Frequency-filtered (`WIKI_LINT_MISSING_CONCEPT_THRESHOLD`, default 3)
311
+ * so we ignore typos and inline-code-style `[[X]]` brackets that aren't
312
+ * meant as wikilinks. Distinct from `missingEntities`, which flags every
313
+ * dangling ref individually.
314
+ *
315
+ * Results sort by referenceCount desc — highest-leverage concepts first.
316
+ */
317
+ detectMissingConcepts(unresolvedFrequency) {
318
+ const out = [];
319
+ for (const [target, { count, sources }] of unresolvedFrequency) {
320
+ if (count < WIKI_LINT_MISSING_CONCEPT_THRESHOLD)
321
+ continue;
322
+ out.push({
323
+ target,
324
+ referenceCount: count,
325
+ // Cap sources at 10 to keep payload bounded; full list lives in
326
+ // `missingEntities` (which lists every individual occurrence).
327
+ sources: [...sources].slice(0, 10),
328
+ });
329
+ }
330
+ out.sort((a, b) => b.referenceCount - a.referenceCount);
331
+ return out;
332
+ }
333
+ /**
334
+ * Files whose content is older than `staleDays`.
335
+ *
336
+ * Migrated pages may have an `original_date` frontmatter field
337
+ * (e.g. the legacy decision was made 2026-02-01 but we wrote the
338
+ * markdown TODAY). Stale detection should respect the original date
339
+ * when present — otherwise every freshly-migrated old page would look
340
+ * "new" by mtime alone. Falls back to mtime when frontmatter is absent.
341
+ */
342
+ detectStale(files, staleDays) {
343
+ const cutoff = Date.now() - staleDays * 24 * 60 * 60 * 1000;
344
+ return files
345
+ .filter((f) => {
346
+ const ageMarker = f.originalDateMs ?? f.modifiedMs;
347
+ return ageMarker < cutoff;
348
+ })
349
+ .map((f) => f.relativePath);
350
+ }
351
+ /**
352
+ * Heuristic restructure proposals — only for `llm-curated/` since
353
+ * frozen folders cannot be restructured.
354
+ *
355
+ * (1) A subfolder with > WIKI_LINT_ROLLUP_THRESHOLD pages and NO `index.md`
356
+ * gets an "add an index.md rollup" proposal.
357
+ * (2) Near-duplicate filename prefixes (e.g. `pricing-v1.md`, `pricing-v2.md`)
358
+ * get a "consider merging" proposal.
359
+ */
360
+ proposeRestructures(files) {
361
+ const proposals = [];
362
+ // (1) Index proposals.
363
+ const folderToFiles = new Map();
364
+ for (const f of files) {
365
+ if (!f.relativePath.startsWith('llm-curated/'))
366
+ continue;
367
+ const parts = f.relativePath.split('/');
368
+ if (parts.length < 3)
369
+ continue; // top-level llm-curated/page.md — skip
370
+ const folder = parts.slice(0, -1).join('/');
371
+ const arr = folderToFiles.get(folder) ?? [];
372
+ arr.push(f);
373
+ folderToFiles.set(folder, arr);
374
+ }
375
+ for (const [folder, fs2] of folderToFiles) {
376
+ if (fs2.length < WIKI_LINT_ROLLUP_THRESHOLD)
377
+ continue;
378
+ const hasIndex = fs2.some((f) => f.basename.toLowerCase() === 'index.md');
379
+ if (hasIndex)
380
+ continue;
381
+ proposals.push({
382
+ description: `${folder}/ has ${fs2.length} pages and no index.md — propose adding ${folder}/index.md to summarize + link.`,
383
+ path: folder,
384
+ });
385
+ }
386
+ // (2) Near-duplicate filename prefixes (8+ chars shared, llm-curated only).
387
+ //
388
+ // IMPORTANT: strip the `YYYY-MM-DD-` date prefix before clustering.
389
+ // Migrated pages all start with their `original_date` (e.g.
390
+ // `2026-05-04-...`), so clustering on raw filename would dump every
391
+ // file from that month into one bogus "near-duplicate" cluster.
392
+ // What we actually want is to cluster on the CONTENT slug after the
393
+ // date — that's where real near-duplicates live (`pricing-v1`,
394
+ // `pricing-v2`, etc.).
395
+ const grouped = new Map();
396
+ const prefixLen = 8;
397
+ for (const f of files) {
398
+ if (!f.relativePath.startsWith('llm-curated/'))
399
+ continue;
400
+ const baseNoMd = f.basename.replace(/\.md$/i, '').toLowerCase();
401
+ // Some migrated memory entries have NESTED date prefixes (the
402
+ // original content body started with its own date, which got
403
+ // slugified, then the migrator prepended the entry's createdAt
404
+ // date in front). Strip date prefixes REPEATEDLY until none remain.
405
+ let contentSlug = baseNoMd;
406
+ while (DATE_PREFIX_RE.test(contentSlug)) {
407
+ contentSlug = contentSlug.replace(DATE_PREFIX_RE, '');
408
+ }
409
+ if (contentSlug.length < prefixLen)
410
+ continue;
411
+ const key = path.dirname(f.relativePath) + '/' + contentSlug.slice(0, prefixLen);
412
+ const arr = grouped.get(key) ?? [];
413
+ arr.push(f);
414
+ grouped.set(key, arr);
415
+ }
416
+ for (const [key, group] of grouped) {
417
+ if (group.length < 2)
418
+ continue;
419
+ proposals.push({
420
+ description: `${group.length} pages share the prefix "${path.basename(key)}" — consider merging into one canonical page.`,
421
+ path: group.map((g) => g.relativePath).join(' | '),
422
+ });
423
+ }
424
+ return proposals;
425
+ }
426
+ }
427
+ /**
428
+ * Read the first ~1KB of a markdown file and look for an
429
+ * `original_date: "<iso>"` field inside a YAML frontmatter block at the
430
+ * very top. Returns the parsed timestamp in ms, or undefined when the
431
+ * file lacks a parseable frontmatter date.
432
+ *
433
+ * Tolerant of unquoted, single-quoted, and double-quoted values.
434
+ */
435
+ async function peekOriginalDate(absPath) {
436
+ let head;
437
+ try {
438
+ // Open the file directly so we can read at most ~1KB without slurping the whole thing.
439
+ const fh = await fs.open(absPath, 'r');
440
+ try {
441
+ const buf = Buffer.alloc(1024);
442
+ const { bytesRead } = await fh.read(buf, 0, buf.length, 0);
443
+ head = buf.subarray(0, bytesRead).toString('utf8');
444
+ }
445
+ finally {
446
+ await fh.close();
447
+ }
448
+ }
449
+ catch {
450
+ return undefined;
451
+ }
452
+ if (!head.startsWith('---'))
453
+ return undefined;
454
+ // Frontmatter ends at the next `---` line.
455
+ const end = head.indexOf('\n---', 3);
456
+ const block = end === -1 ? head.slice(3) : head.slice(3, end);
457
+ const m = block.match(/^\s*original_date:\s*["']?([^"'\n]+)["']?\s*$/m);
458
+ if (!m)
459
+ return undefined;
460
+ const ts = Date.parse(m[1].trim());
461
+ return Number.isFinite(ts) ? ts : undefined;
462
+ }
463
+ /**
464
+ * Matches a leading date prefix at the start of a basename (no `.md`).
465
+ *
466
+ * Handles both plain-date `YYYY-MM-DD-` AND ISO-timestamp-as-slug
467
+ * `YYYY-MM-DDtHH-MMz` / `YYYY-MM-DDtHHz-` forms (legacy agent memory
468
+ * often embedded full ISO timestamps as content prefixes; the slugifier
469
+ * replaced the `:` colons with `-` hyphens).
470
+ */
471
+ const DATE_PREFIX_RE = /^\d{4}-\d{2}-\d{2}(?:t\d{2}(?:-\d{2})?z?)?-?/;
472
+ /**
473
+ * Mirror of the frontend's wikilink resolver — used during lint to find
474
+ * the canonical page a `[[target]]` resolves to. Returns the relativePath
475
+ * of the matching page (case preserved), or null when nothing matches.
476
+ */
477
+ function resolveAgainstFiles(target, allPathsLower, files) {
478
+ const t = target.trim().toLowerCase();
479
+ if (!t)
480
+ return null;
481
+ const tWithMd = t.endsWith('.md') ? t : `${t}.md`;
482
+ const tNoMd = t.endsWith('.md') ? t.slice(0, -3) : t;
483
+ let suffixIdx = -1;
484
+ let basenameIdx = -1;
485
+ for (let i = 0; i < allPathsLower.length; i++) {
486
+ const p = allPathsLower[i];
487
+ if (p === tWithMd || p === t)
488
+ return files[i].relativePath;
489
+ if (suffixIdx === -1 && (p.endsWith(`/${tWithMd}`) || p.endsWith(`/${t}`))) {
490
+ suffixIdx = i;
491
+ }
492
+ if (basenameIdx === -1) {
493
+ const base = p.split('/').pop() ?? '';
494
+ const baseNoMd = base.endsWith('.md') ? base.slice(0, -3) : base;
495
+ if (baseNoMd === tNoMd)
496
+ basenameIdx = i;
497
+ }
498
+ }
499
+ if (suffixIdx !== -1)
500
+ return files[suffixIdx].relativePath;
501
+ if (basenameIdx !== -1)
502
+ return files[basenameIdx].relativePath;
503
+ return null;
504
+ }
505
+ //# sourceMappingURL=wiki-lint.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-lint.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/wiki/wiki-lint.service.ts"],"names":[],"mappings":"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"}