dreamcontext 0.17.1 → 0.18.0

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 (181) hide show
  1. package/README.md +321 -565
  2. package/agents/sleep-product.md +21 -2
  3. package/agents/sleep-state.md +24 -0
  4. package/agents/sleep-tasks.md +16 -0
  5. package/dist/agents/sleep-product.md +21 -2
  6. package/dist/agents/sleep-state.md +24 -0
  7. package/dist/agents/sleep-tasks.md +16 -0
  8. package/dist/dashboard/announcements/dashboard-highlights-0-17-0-18.excalidraw.md +1531 -0
  9. package/dist/dashboard/announcements/goal-skill-v2.excalidraw.md +1490 -0
  10. package/dist/dashboard/announcements/task-manager.excalidraw.md +1217 -0
  11. package/dist/dashboard/announcements/visual-announcements.excalidraw.md +1373 -0
  12. package/dist/dashboard/announcements.json +38 -0
  13. package/dist/dashboard/assets/{BrainCanvas3D-DyF_3yYD.js → BrainCanvas3D-D9G3dOLf.js} +1 -1
  14. package/dist/dashboard/assets/{_baseUniq-Do8VMBA0.js → _baseUniq-Cyshlz4Y.js} +1 -1
  15. package/dist/dashboard/assets/{ar-SA-G6X2FPQ2-DmbXDb2R.js → ar-SA-G6X2FPQ2-qj-2Cbgo.js} +1 -1
  16. package/dist/dashboard/assets/{arc-CwtUBQfU.js → arc-0OnX5WDs.js} +1 -1
  17. package/dist/dashboard/assets/{architectureDiagram-Q4EWVU46-O9bOog_f.js → architectureDiagram-Q4EWVU46-Cx3c0nUi.js} +1 -1
  18. package/dist/dashboard/assets/{az-AZ-76LH7QW2-c9Zk10vG.js → az-AZ-76LH7QW2-CBuoh6M3.js} +1 -1
  19. package/dist/dashboard/assets/{bg-BG-XCXSNQG7-uMTg84lX.js → bg-BG-XCXSNQG7-X5QYyZWx.js} +1 -1
  20. package/dist/dashboard/assets/{blockDiagram-DXYQGD6D-BTENXCSO.js → blockDiagram-DXYQGD6D-BwESAg1j.js} +1 -1
  21. package/dist/dashboard/assets/{bn-BD-2XOGV67Q-DUFKHcua.js → bn-BD-2XOGV67Q-DlodQLNR.js} +1 -1
  22. package/dist/dashboard/assets/{c4Diagram-AHTNJAMY-DMXPWRiQ.js → c4Diagram-AHTNJAMY-CopL0lbP.js} +1 -1
  23. package/dist/dashboard/assets/{ca-ES-6MX7JW3Y-BuYX1q89.js → ca-ES-6MX7JW3Y-DfqF6Yhy.js} +1 -1
  24. package/dist/dashboard/assets/channel-BLisRbYb.js +1 -0
  25. package/dist/dashboard/assets/{chunk-4BX2VUAB-DgefvnWS.js → chunk-4BX2VUAB-CRwifLK3.js} +1 -1
  26. package/dist/dashboard/assets/{chunk-4TB4RGXK-BnFO5G1t.js → chunk-4TB4RGXK-uxJYY_64.js} +1 -1
  27. package/dist/dashboard/assets/{chunk-55IACEB6-COm2TYEM.js → chunk-55IACEB6-DhYIp7Oc.js} +1 -1
  28. package/dist/dashboard/assets/{chunk-EDXVE4YY-CtsGCwZp.js → chunk-EDXVE4YY-CCxfcirt.js} +1 -1
  29. package/dist/dashboard/assets/{chunk-FMBD7UC4-cfSvx35j.js → chunk-FMBD7UC4-D7OC8QFC.js} +1 -1
  30. package/dist/dashboard/assets/{chunk-OYMX7WX6-DAhDKteL.js → chunk-OYMX7WX6-CwHgaUQo.js} +1 -1
  31. package/dist/dashboard/assets/{chunk-QZHKN3VN-B5h4qML3.js → chunk-QZHKN3VN-7Idpf6YJ.js} +1 -1
  32. package/dist/dashboard/assets/{chunk-YZCP3GAM-CGp_NiRg.js → chunk-YZCP3GAM-D4Lh0fgr.js} +1 -1
  33. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-CgqeQiHi.js +1 -0
  34. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-CgqeQiHi.js +1 -0
  35. package/dist/dashboard/assets/clone-CQXNMCV5.js +1 -0
  36. package/dist/dashboard/assets/{cose-bilkent-S5V4N54A-Dk7CMFA4.js → cose-bilkent-S5V4N54A-BYcMtJTF.js} +1 -1
  37. package/dist/dashboard/assets/{cs-CZ-2BRQDIVT-zfUTiS_d.js → cs-CZ-2BRQDIVT-rnrpKdSJ.js} +1 -1
  38. package/dist/dashboard/assets/{da-DK-5WZEPLOC-CU14f8NA.js → da-DK-5WZEPLOC-D5OGAvk7.js} +1 -1
  39. package/dist/dashboard/assets/{dagre-KV5264BT-BiMVxC4Q.js → dagre-KV5264BT-V0f1_b4R.js} +1 -1
  40. package/dist/dashboard/assets/{de-DE-XR44H4JA-CDOHAJGo.js → de-DE-XR44H4JA-CDyb8YfL.js} +1 -1
  41. package/dist/dashboard/assets/{diagram-5BDNPKRD-DfJEsVTA.js → diagram-5BDNPKRD-BmpizoaS.js} +1 -1
  42. package/dist/dashboard/assets/{diagram-G4DWMVQ6-CztLHIcY.js → diagram-G4DWMVQ6-ClQg-LTu.js} +1 -1
  43. package/dist/dashboard/assets/{diagram-MMDJMWI5-DqoQLlWK.js → diagram-MMDJMWI5-BkXcDMIV.js} +1 -1
  44. package/dist/dashboard/assets/{diagram-TYMM5635-DvyvQBCc.js → diagram-TYMM5635-BbFiiCM2.js} +1 -1
  45. package/dist/dashboard/assets/{el-GR-BZB4AONW-ChUphbcv.js → el-GR-BZB4AONW-Y1YnKZL0.js} +1 -1
  46. package/dist/dashboard/assets/{erDiagram-SMLLAGMA-D_uSs2_2.js → erDiagram-SMLLAGMA-Dzdv7_l5.js} +1 -1
  47. package/dist/dashboard/assets/{es-ES-U4NZUMDT-BNalBEhb.js → es-ES-U4NZUMDT-D0T536hs.js} +1 -1
  48. package/dist/dashboard/assets/{eu-ES-A7QVB2H4-BMiQyA2y.js → eu-ES-A7QVB2H4-Bfrya0et.js} +1 -1
  49. package/dist/dashboard/assets/{fa-IR-HGAKTJCU-Bd6ZnTSo.js → fa-IR-HGAKTJCU-pYE_hG-L.js} +1 -1
  50. package/dist/dashboard/assets/{fi-FI-Z5N7JZ37-BWAfJadC.js → fi-FI-Z5N7JZ37-D3C-fNyk.js} +1 -1
  51. package/dist/dashboard/assets/{flowDiagram-DWJPFMVM-Bmsp6kyU.js → flowDiagram-DWJPFMVM-CFhyjwKY.js} +1 -1
  52. package/dist/dashboard/assets/{fr-FR-RHASNOE6-CspbYzOW.js → fr-FR-RHASNOE6-CgwnG5JW.js} +1 -1
  53. package/dist/dashboard/assets/{ganttDiagram-T4ZO3ILL-wEdysXo_.js → ganttDiagram-T4ZO3ILL-BRKRiSzf.js} +1 -1
  54. package/dist/dashboard/assets/{gitGraphDiagram-UUTBAWPF-BEiGpPBj.js → gitGraphDiagram-UUTBAWPF-CTqCK49d.js} +1 -1
  55. package/dist/dashboard/assets/{gl-ES-HMX3MZ6V-CV76vsWr.js → gl-ES-HMX3MZ6V-DjJTqTm3.js} +1 -1
  56. package/dist/dashboard/assets/{graph-CZFIeNHZ.js → graph-D429kSbY.js} +1 -1
  57. package/dist/dashboard/assets/{he-IL-6SHJWFNN-Y1VoXJ_H.js → he-IL-6SHJWFNN-C84FlH6r.js} +1 -1
  58. package/dist/dashboard/assets/{hi-IN-IWLTKZ5I-Crh5S49o.js → hi-IN-IWLTKZ5I-Blhkfum2.js} +1 -1
  59. package/dist/dashboard/assets/{hu-HU-A5ZG7DT2-D4I3gCbp.js → hu-HU-A5ZG7DT2-DLC1JfN-.js} +1 -1
  60. package/dist/dashboard/assets/{id-ID-SAP4L64H-Chvzkuvi.js → id-ID-SAP4L64H-C3pB_IWB.js} +1 -1
  61. package/dist/dashboard/assets/image-FgR93jdt.js +1 -0
  62. package/dist/dashboard/assets/index-2m8ueOUn.js +1 -0
  63. package/dist/dashboard/assets/index-CWwjuihq.css +32 -0
  64. package/dist/dashboard/assets/{index-C7Bo5AQH.js → index-CbOXCDms.js} +1 -1
  65. package/dist/dashboard/assets/index-SJ64pf-4.js +551 -0
  66. package/dist/dashboard/assets/{infoDiagram-42DDH7IO-BzfuDHl4.js → infoDiagram-42DDH7IO-CIzDShDw.js} +1 -1
  67. package/dist/dashboard/assets/{ishikawaDiagram-UXIWVN3A-BVoNJ9VS.js → ishikawaDiagram-UXIWVN3A-CuasYzdX.js} +1 -1
  68. package/dist/dashboard/assets/{it-IT-JPQ66NNP-BH_gN5es.js → it-IT-JPQ66NNP-DGGEoNPu.js} +1 -1
  69. package/dist/dashboard/assets/{ja-JP-DBVTYXUO-DU_WmLVa.js → ja-JP-DBVTYXUO-CEqP9aps.js} +1 -1
  70. package/dist/dashboard/assets/{journeyDiagram-VCZTEJTY-DbwICa_a.js → journeyDiagram-VCZTEJTY-DHiq2OTQ.js} +1 -1
  71. package/dist/dashboard/assets/{kaa-6HZHGXH3-KYU9qowM.js → kaa-6HZHGXH3-GOFmTAXq.js} +1 -1
  72. package/dist/dashboard/assets/{kab-KAB-ZGHBKWFO-bjhyiUq5.js → kab-KAB-ZGHBKWFO-B865Wwzu.js} +1 -1
  73. package/dist/dashboard/assets/{kanban-definition-6JOO6SKY-D9XucLs4.js → kanban-definition-6JOO6SKY-BhlTKFbL.js} +1 -1
  74. package/dist/dashboard/assets/{kk-KZ-P5N5QNE5-CYTx_dAZ.js → kk-KZ-P5N5QNE5-CNfuE6b6.js} +1 -1
  75. package/dist/dashboard/assets/{km-KH-HSX4SM5Z-DqsuY4Lf.js → km-KH-HSX4SM5Z-CsmgRWxu.js} +1 -1
  76. package/dist/dashboard/assets/{ko-KR-MTYHY66A-BZe7NywF.js → ko-KR-MTYHY66A-B_02RgEz.js} +1 -1
  77. package/dist/dashboard/assets/{ku-TR-6OUDTVRD-F5d6HFWt.js → ku-TR-6OUDTVRD-JfQA5u05.js} +1 -1
  78. package/dist/dashboard/assets/{layout-CotqU0S9.js → layout-DvrQSvOI.js} +1 -1
  79. package/dist/dashboard/assets/{linear-Dqv87Scf.js → linear-6r0qttLs.js} +1 -1
  80. package/dist/dashboard/assets/{lt-LT-XHIRWOB4-BCCuaPbS.js → lt-LT-XHIRWOB4-DWFUXEdf.js} +1 -1
  81. package/dist/dashboard/assets/{lv-LV-5QDEKY6T-NLGi-vJ6.js → lv-LV-5QDEKY6T-C5yAd0n_.js} +1 -1
  82. package/dist/dashboard/assets/{min-BbJdnc3h.js → min-D_EP9dBf.js} +1 -1
  83. package/dist/dashboard/assets/{mindmap-definition-QFDTVHPH-Dk4QySu7.js → mindmap-definition-QFDTVHPH-Col3ao9B.js} +1 -1
  84. package/dist/dashboard/assets/{mr-IN-CRQNXWMA-BnGDIgVN.js → mr-IN-CRQNXWMA-Dwjz0Xdm.js} +1 -1
  85. package/dist/dashboard/assets/{my-MM-5M5IBNSE-CspgYE9_.js → my-MM-5M5IBNSE-EXJDNyjA.js} +1 -1
  86. package/dist/dashboard/assets/{nb-NO-T6EIAALU-BeRPw3hu.js → nb-NO-T6EIAALU-BWm2bgLd.js} +1 -1
  87. package/dist/dashboard/assets/{nl-NL-IS3SIHDZ-C-G-bljM.js → nl-NL-IS3SIHDZ-f8nP-yp-.js} +1 -1
  88. package/dist/dashboard/assets/{nn-NO-6E72VCQL-Ct7VZY8D.js → nn-NO-6E72VCQL-B0c_gCNR.js} +1 -1
  89. package/dist/dashboard/assets/{oc-FR-POXYY2M6-Cv5-C4Qq.js → oc-FR-POXYY2M6-C40PSwAh.js} +1 -1
  90. package/dist/dashboard/assets/{pa-IN-N4M65BXN-DAgkIThL.js → pa-IN-N4M65BXN-DDcgXFkB.js} +1 -1
  91. package/dist/dashboard/assets/{percentages-BXMCSKIN-vidRYabK.js → percentages-BXMCSKIN-MHBQP8nI.js} +7 -7
  92. package/dist/dashboard/assets/{pica-Cy-Xl-mi.js → pica-C5CFA09W.js} +1 -1
  93. package/dist/dashboard/assets/{pieDiagram-DEJITSTG-BnP4-zwd.js → pieDiagram-DEJITSTG-DFHmB0fL.js} +1 -1
  94. package/dist/dashboard/assets/{pl-PL-T2D74RX3-BuJQ3HD-.js → pl-PL-T2D74RX3-yFTBt0Xu.js} +1 -1
  95. package/dist/dashboard/assets/{pt-BR-5N22H2LF-BbAqsvD6.js → pt-BR-5N22H2LF-ilAW3Fdv.js} +1 -1
  96. package/dist/dashboard/assets/{pt-PT-UZXXM6DQ-DzFJedU3.js → pt-PT-UZXXM6DQ-CXHFN95K.js} +1 -1
  97. package/dist/dashboard/assets/{quadrantDiagram-34T5L4WZ-BXN88cHy.js → quadrantDiagram-34T5L4WZ-CR732_oP.js} +1 -1
  98. package/dist/dashboard/assets/{requirementDiagram-MS252O5E-D34hL42a.js → requirementDiagram-MS252O5E-mKoVG52Z.js} +1 -1
  99. package/dist/dashboard/assets/{ro-RO-JPDTUUEW-BV2-sOiv.js → ro-RO-JPDTUUEW-BKlWpyF4.js} +1 -1
  100. package/dist/dashboard/assets/{ru-RU-B4JR7IUQ-BCL4N9Ej.js → ru-RU-B4JR7IUQ-BGoxlhJm.js} +1 -1
  101. package/dist/dashboard/assets/{sankeyDiagram-XADWPNL6-0mFeok-3.js → sankeyDiagram-XADWPNL6-DXipts7M.js} +1 -1
  102. package/dist/dashboard/assets/{sequenceDiagram-FGHM5R23-C-5nW5j6.js → sequenceDiagram-FGHM5R23-DFQhU8q7.js} +1 -1
  103. package/dist/dashboard/assets/{si-LK-N5RQ5JYF-CNhaw4jx.js → si-LK-N5RQ5JYF-yDbJWFTH.js} +1 -1
  104. package/dist/dashboard/assets/{sk-SK-C5VTKIMK-mHCphOXu.js → sk-SK-C5VTKIMK-DglyhbNB.js} +1 -1
  105. package/dist/dashboard/assets/{sl-SI-NN7IZMDC--lzgHthQ.js → sl-SI-NN7IZMDC-DPfq0s4I.js} +1 -1
  106. package/dist/dashboard/assets/{stateDiagram-FHFEXIEX-C50iDFqe.js → stateDiagram-FHFEXIEX-Dm50jiEh.js} +1 -1
  107. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-CoSm11sD.js +1 -0
  108. package/dist/dashboard/assets/{subset-shared.chunk-DNsjL37s.js → subset-shared.chunk-OHz6M6ct.js} +1 -1
  109. package/dist/dashboard/assets/{subset-worker.chunk-BaV3r-bl.js → subset-worker.chunk-BzwrOBtO.js} +1 -1
  110. package/dist/dashboard/assets/{sv-SE-XGPEYMSR-ckw8jfGN.js → sv-SE-XGPEYMSR-BLHNwr4k.js} +1 -1
  111. package/dist/dashboard/assets/{ta-IN-2NMHFXQM-CSeNmVhS.js → ta-IN-2NMHFXQM-Dw-6hUpN.js} +1 -1
  112. package/dist/dashboard/assets/{th-TH-HPSO5L25-Cvn1sg_3.js → th-TH-HPSO5L25-DPkcM_k9.js} +1 -1
  113. package/dist/dashboard/assets/{timeline-definition-GMOUNBTQ-DRYfuqHT.js → timeline-definition-GMOUNBTQ-BKFNQ_7e.js} +1 -1
  114. package/dist/dashboard/assets/{tr-TR-DEFEU3FU-CyhY22TB.js → tr-TR-DEFEU3FU-rBVsY5RS.js} +1 -1
  115. package/dist/dashboard/assets/{uk-UA-QMV73CPH-BvvAEO6U.js → uk-UA-QMV73CPH-CV6_yTZs.js} +1 -1
  116. package/dist/dashboard/assets/{vennDiagram-DHZGUBPP-Crril7Cj.js → vennDiagram-DHZGUBPP-BZb_r5tY.js} +1 -1
  117. package/dist/dashboard/assets/{vi-VN-M7AON7JQ-c7AwSUZ8.js → vi-VN-M7AON7JQ-CJMgSsLz.js} +1 -1
  118. package/dist/dashboard/assets/{wardley-RL74JXVD-Da5AhSWU.js → wardley-RL74JXVD-DgqjmWyN.js} +1 -1
  119. package/dist/dashboard/assets/{wardleyDiagram-NUSXRM2D-C4GeB_Df.js → wardleyDiagram-NUSXRM2D-BDpniS9m.js} +1 -1
  120. package/dist/dashboard/assets/webviewWindow-Bwv2421L.js +1 -0
  121. package/dist/dashboard/assets/window-BObcHN8e.js +1 -0
  122. package/dist/dashboard/assets/{xychartDiagram-5P7HB3ND-BPCFKXqR.js → xychartDiagram-5P7HB3ND-CCyPcx2A.js} +1 -1
  123. package/dist/dashboard/assets/{zh-CN-LNUGB5OW-BvNiZwKU.js → zh-CN-LNUGB5OW-9LJLF_AC.js} +1 -1
  124. package/dist/dashboard/assets/{zh-HK-E62DVLB3-CCFtoCWb.js → zh-HK-E62DVLB3-IefAiePp.js} +1 -1
  125. package/dist/dashboard/assets/{zh-TW-RAJ6MFWO-bYBr-stu.js → zh-TW-RAJ6MFWO-CHeY9rNZ.js} +1 -1
  126. package/dist/dashboard/index.html +2 -2
  127. package/dist/index.js +4099 -1538
  128. package/dist/skill-packs/agents/goal-implementer.md +42 -1
  129. package/dist/skill-packs/agents/goal-plan-reviewer.md +7 -0
  130. package/dist/skill-packs/agents/goal-planner.md +34 -0
  131. package/dist/skill-packs/catalog.json +31 -21
  132. package/dist/skill-packs/excalidraw/SKILL.md +244 -13
  133. package/dist/skill-packs/excalidraw/examples/Chart Kit.excalidraw.md +15740 -0
  134. package/dist/skill-packs/excalidraw/examples/Wireframe Kit.excalidraw.md +16860 -0
  135. package/dist/skill-packs/excalidraw/examples/atomic_check.js +99 -0
  136. package/dist/skill-packs/excalidraw/examples/chart.spec.json +122 -0
  137. package/dist/skill-packs/excalidraw/examples/chart_board.js +173 -0
  138. package/dist/skill-packs/excalidraw/examples/hello.spec.json +79 -9
  139. package/dist/skill-packs/excalidraw/examples/visual_board.js +82 -0
  140. package/dist/skill-packs/excalidraw/examples/wireframe_board.js +161 -0
  141. package/dist/skill-packs/excalidraw/scripts/build_excalidraw.js +292 -27
  142. package/dist/skill-packs/excalidraw/scripts/lib/charts.js +771 -0
  143. package/dist/skill-packs/excalidraw/scripts/lib/style.js +369 -35
  144. package/dist/skill-packs/excalidraw/scripts/lib/wireframe.js +406 -0
  145. package/dist/skill-packs/goal-skill/SKILL.md +369 -100
  146. package/dist/skill-packs/goal-skill/assets/goal-skill-demo.cjs +51 -0
  147. package/dist/skill-packs/goal-skill/assets/goal-skill-viewer.cjs +181 -0
  148. package/package.json +2 -1
  149. package/skill/references/integrations.md +54 -0
  150. package/skill/references/knowledge-and-recall.md +3 -1
  151. package/skill/references/sleep.md +4 -4
  152. package/skill-packs/agents/goal-implementer.md +42 -1
  153. package/skill-packs/agents/goal-plan-reviewer.md +7 -0
  154. package/skill-packs/agents/goal-planner.md +34 -0
  155. package/skill-packs/catalog.json +31 -21
  156. package/skill-packs/excalidraw/SKILL.md +244 -13
  157. package/skill-packs/excalidraw/examples/Chart Kit.excalidraw.md +15740 -0
  158. package/skill-packs/excalidraw/examples/Wireframe Kit.excalidraw.md +16860 -0
  159. package/skill-packs/excalidraw/examples/atomic_check.js +99 -0
  160. package/skill-packs/excalidraw/examples/chart.spec.json +122 -0
  161. package/skill-packs/excalidraw/examples/chart_board.js +173 -0
  162. package/skill-packs/excalidraw/examples/hello.spec.json +79 -9
  163. package/skill-packs/excalidraw/examples/visual_board.js +82 -0
  164. package/skill-packs/excalidraw/examples/wireframe_board.js +161 -0
  165. package/skill-packs/excalidraw/scripts/build_excalidraw.js +292 -27
  166. package/skill-packs/excalidraw/scripts/lib/charts.js +771 -0
  167. package/skill-packs/excalidraw/scripts/lib/style.js +369 -35
  168. package/skill-packs/excalidraw/scripts/lib/wireframe.js +406 -0
  169. package/skill-packs/goal-skill/SKILL.md +369 -100
  170. package/skill-packs/goal-skill/assets/goal-skill-demo.cjs +51 -0
  171. package/skill-packs/goal-skill/assets/goal-skill-viewer.cjs +181 -0
  172. package/skill-task-manager/SKILL.md +93 -0
  173. package/dist/dashboard/assets/channel-2YfRjala.js +0 -1
  174. package/dist/dashboard/assets/classDiagram-6PBFFD2Q-DB_UnN1h.js +0 -1
  175. package/dist/dashboard/assets/classDiagram-v2-HSJHXN6E-DB_UnN1h.js +0 -1
  176. package/dist/dashboard/assets/clone-DaDvB3N6.js +0 -1
  177. package/dist/dashboard/assets/index-BIfrbaFS.js +0 -516
  178. package/dist/dashboard/assets/index-BdZ3tppu.css +0 -32
  179. package/dist/dashboard/assets/stateDiagram-v2-QKLJ7IA2-eW9-s0Sm.js +0 -1
  180. package/dist/dashboard/assets/webviewWindow-BbG9Cr7f.js +0 -1
  181. package/dist/dashboard/assets/window-DmNpeJAL.js +0 -1
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ // Dummy goal-skill run: drives the live state file through every phase so the
3
+ // viewer (localhost:4747) can be watched end-to-end. No real agents are spawned.
4
+ // node .claude/goal-skill-demo.cjs
5
+ const fs = require('fs');
6
+ const path = require('path');
7
+ const FILE = path.join(process.cwd(), '_dream_context', 'tmp', '.goal-skill-live.json');
8
+ fs.mkdirSync(path.dirname(FILE), { recursive: true });
9
+ const started = new Date().toISOString();
10
+ const F = (s) => ({ s });
11
+
12
+ // [seconds-to-hold, phase, iters, impl]
13
+ const BEATS = [
14
+ [8, 'plan', { plan: 1 }, null],
15
+ [8, 'review', { plan: 1, review: 1 }, null],
16
+ [7, 'plan', { plan: 2, review: 1 }, null],
17
+ [7, 'review', { plan: 2, review: 2 }, null],
18
+ [6, 'plan', { plan: 3, review: 2 }, null],
19
+ [6, 'review', { plan: 3, review: 3 }, null],
20
+ [5, 'task', { plan: 3, review: 3 }, null],
21
+ [8, 'impl', { plan: 3, review: 3 }, { wave: 1, waves: 3, forks: [F('run'), F('run'), F('run')] }],
22
+ [5, 'impl', { plan: 3, review: 3 }, { wave: 1, waves: 3, forks: [F('done'), F('run'), F('run')] }],
23
+ [8, 'impl', { plan: 3, review: 3 }, { wave: 2, waves: 3, forks: [F('done'), F('done'), F('done'), F('run'), F('run')] }],
24
+ [6, 'impl', { plan: 3, review: 3 }, { wave: 2, waves: 3, forks: [F('done'), F('done'), F('done'), F('run'), F('fail')] }],
25
+ [6, 'impl', { plan: 3, review: 3 }, { wave: 2, waves: 3, forks: [F('done'), F('done'), F('done'), F('done'), F('run')] }],
26
+ [8, 'impl', { plan: 3, review: 3 }, { wave: 3, waves: 3, forks: [F('done'), F('done'), F('done'), F('done'), F('done'), F('run')] }],
27
+ [7, 'codereview', { plan: 3, review: 3, codereview: 1 }, { wave: 3, waves: 3, forks: Array(6).fill(F('done')) }],
28
+ [6, 'impl', { plan: 3, review: 3, codereview: 2 }, { wave: 3, waves: 3, forks: [...Array(5).fill(F('done')), F('run')] }],
29
+ [6, 'codereview', { plan: 3, review: 3, codereview: 2 }, { wave: 3, waves: 3, forks: Array(6).fill(F('done')) }],
30
+ [7, 'validate', { plan: 3, review: 3, codereview: 2, validate: 1 }, { wave: 3, waves: 3, forks: Array(6).fill(F('done')) }],
31
+ [90, 'done', { plan: 3, review: 3, codereview: 2, validate: 1 }, { wave: 3, waves: 3, forks: Array(6).fill(F('done')) }],
32
+ ];
33
+
34
+ let i = 0;
35
+ function step() {
36
+ if (i >= BEATS.length) {
37
+ fs.rmSync(FILE, { force: true });
38
+ console.log('demo finished — state cleared');
39
+ return;
40
+ }
41
+ const [hold, phase, iters, impl] = BEATS[i];
42
+ const st = { goal: 'demo-dummy-goal', started, updated: new Date().toISOString(), phase, iters };
43
+ // Scope the demo run to the launching session (if any) — same contract as a real run.
44
+ if (process.env.CLAUDE_CODE_SESSION_ID) st.session = process.env.CLAUDE_CODE_SESSION_ID;
45
+ if (impl) st.impl = impl;
46
+ fs.writeFileSync(FILE, JSON.stringify(st));
47
+ console.log(`beat ${i + 1}/${BEATS.length}: ${phase}` + (impl ? ` wave ${impl.wave}/${impl.waves}` : ''));
48
+ i++;
49
+ setTimeout(step, hold * 1000);
50
+ }
51
+ step();
@@ -0,0 +1,181 @@
1
+ #!/usr/bin/env node
2
+ // Live Excalidraw-style viewer for a goal-skill v2 run.
3
+ // Serves a hand-drawn animated graph of _dream_context/tmp/.goal-skill-live.json
4
+ // (the same state file the app's live panel reads — single writer: the orchestrator).
5
+ // node .claude/goal-skill-viewer.cjs [port] default port 4747
6
+ const http = require('http');
7
+ const fs = require('fs');
8
+ const path = require('path');
9
+ const { exec } = require('child_process');
10
+
11
+ const PORT = Number(process.argv[2]) || 4747;
12
+ const STATE = path.join(process.cwd(), '_dream_context', 'tmp', '.goal-skill-live.json');
13
+
14
+ const HTML = `<!doctype html><html><head><meta charset="utf-8"><title>goal-skill live</title>
15
+ <style>
16
+ :root { color-scheme: dark; }
17
+ body { margin:0; background:#121217; color:#e8e8ec; font-family:'Chalkboard SE','Comic Sans MS','Segoe Print',cursive;
18
+ display:flex; flex-direction:column; align-items:center; min-height:100vh; }
19
+ header { display:flex; gap:14px; align-items:baseline; padding:18px 0 0; }
20
+ header .mark { color:#b197fc; font-size:22px; font-weight:700; }
21
+ header .goal { color:#aaa; font-size:17px; }
22
+ header .clock { color:#666; font-size:15px; }
23
+ #wrap { width:min(96vw,1400px); }
24
+ svg { width:100%; height:auto; }
25
+ .node rect { stroke-width:2.4px; }
26
+ .node text { font-family:inherit; font-size:17px; font-weight:700; }
27
+ .node .sub { font-size:12.5px; font-weight:400; }
28
+ .pending rect { fill:#1d1d24; stroke:#4a4a55; stroke-dasharray:7 5; }
29
+ .pending text { fill:#666; }
30
+ .done rect { fill:#b2f2bb; stroke:#2f9e44; }
31
+ .done text { fill:#0b2e13; }
32
+ .active text { fill:#101014; }
33
+ .active rect { animation:pulse 1.4s ease-in-out infinite; }
34
+ @keyframes pulse { 0%,100%{ filter:drop-shadow(0 0 3px var(--glow,#4dabf7)); }
35
+ 50%{ filter:drop-shadow(0 0 16px var(--glow,#4dabf7)); } }
36
+ .arrow { stroke:#8a8a95; stroke-width:2.2; fill:none; marker-end:url(#arr); }
37
+ .arrow.dim { stroke:#3a3a44; }
38
+ .loop { stroke-width:2; fill:none; stroke-dasharray:8 6; marker-end:url(#arr); opacity:.35; }
39
+ .loop.hot { opacity:1; animation:flow 1s linear infinite; }
40
+ @keyframes flow { to { stroke-dashoffset:-14; } }
41
+ .heat { font-size:19px; font-weight:800; }
42
+ .sat { stroke:#101014; stroke-width:1.4; }
43
+ .sat.run { animation:blink 1s ease-in-out infinite; }
44
+ @keyframes blink { 50%{ opacity:.35; } }
45
+ .wave { fill:#66d9e8; font-size:14px; }
46
+ #idle { color:#555; font-size:18px; margin-top:8px; display:none; }
47
+ .rough { filter:url(#rough); }
48
+ #donebanner { fill:#2f9e44; font-size:30px; font-weight:800; display:none; }
49
+ </style></head><body>
50
+ <header><span class="mark">&#9068; goal-skill live</span><span class="goal" id="goal"></span><span class="clock" id="clock"></span></header>
51
+ <div id="idle">no active goal-skill run &mdash; waiting&hellip;</div>
52
+ <div id="wrap"><svg viewBox="0 0 1400 430">
53
+ <defs>
54
+ <marker id="arr" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7.5" markerHeight="7.5" orient="auto-start-reverse">
55
+ <path d="M0,0 L10,5 L0,10 z" fill="#8a8a95"/></marker>
56
+ <filter id="rough"><feTurbulence type="fractalNoise" baseFrequency="0.035" numOctaves="2" seed="7" result="n"/>
57
+ <feDisplacementMap in="SourceGraphic" in2="n" scale="2.6"/></filter>
58
+ </defs>
59
+ <g class="rough" id="scene"></g>
60
+ </svg></div>
61
+ <script>
62
+ const PAL = { blue:['#a5d8ff','#1971c2'], yellow:['#ffec99','#f08c00'], mint:['#96f2d7','#087f5b'] };
63
+ const NODES = [
64
+ { id:'plan', label:'PLAN', sub:'planner fork', color:'blue', x:40 },
65
+ { id:'review', label:'REVIEW', sub:'clean judges', color:'yellow', x:262 },
66
+ { id:'task', label:'TASK DOC', sub:'map + registry', color:'mint', x:484 },
67
+ { id:'impl', label:'IMPL', sub:'wave forks', color:'blue', x:706 },
68
+ { id:'codereview', label:'CODE-REV', sub:'clean', color:'yellow', x:928 },
69
+ { id:'validate', label:'VALIDATE', sub:'evidence', color:'yellow', x:1150 },
70
+ ];
71
+ const NY=180, NW=170, NH=74;
72
+ const svgNS='http://www.w3.org/2000/svg';
73
+ const scene=document.getElementById('scene');
74
+ function el(t,a){const e=document.createElementNS(svgNS,t);for(const k in a)e.setAttribute(k,a[k]);return e;}
75
+
76
+ // static skeleton
77
+ NODES.forEach((n,i)=>{
78
+ const g=el('g',{class:'node pending',id:'n-'+n.id});
79
+ g.appendChild(el('rect',{x:n.x,y:NY,width:NW,height:NH,rx:14}));
80
+ const t=el('text',{x:n.x+NW/2,y:NY+32,'text-anchor':'middle'}); t.id='t-'+n.id; g.appendChild(t);
81
+ const s=el('text',{x:n.x+NW/2,y:NY+54,'text-anchor':'middle',class:'sub'}); s.id='s-'+n.id; s.textContent=n.sub; g.appendChild(s);
82
+ scene.appendChild(g);
83
+ if(i<NODES.length-1) scene.appendChild(el('path',{class:'arrow dim',id:'a-'+i,
84
+ d:'M'+(n.x+NW+4)+','+(NY+NH/2)+' L'+(NODES[i+1].x-8)+','+(NY+NH/2)}));
85
+ });
86
+ // loop arcs: review->plan (top), codereview->impl & validate->impl (bottom)
87
+ function arc(id,x1,x2,y,cy){ scene.appendChild(el('path',{class:'loop',id,stroke:'#ffd43b',
88
+ d:'M'+x1+','+y+' Q'+((x1+x2)/2)+','+cy+' '+x2+','+y})); }
89
+ arc('l-review', NODES[1].x+60, NODES[0].x+110, NY-6, NY-120);
90
+ arc('l-codereview', NODES[4].x+60, NODES[3].x+120, NY+NH+6, NY+NH+96);
91
+ arc('l-validate', NODES[5].x+60, NODES[3].x+50, NY+NH+6, NY+NH+150);
92
+ // arc → which iter count it visualizes: the review→plan arc glows with PLAN's revision rounds
93
+ const heats={review:['l-review','plan',(NODES[0].x+110+NODES[1].x+60)/2,NY-70],
94
+ codereview:['l-codereview','codereview',(NODES[3].x+120+NODES[4].x+60)/2,NY+NH+64],
95
+ validate:['l-validate','validate',(NODES[3].x+50+NODES[5].x+60)/2,NY+NH+118]};
96
+ for(const k in heats){const h=el('text',{x:heats[k][2],y:heats[k][3],'text-anchor':'middle',class:'heat'});h.id='h-'+k;scene.appendChild(h);}
97
+ const satg=el('g',{id:'sats'}); scene.appendChild(satg);
98
+ const doneT=el('text',{x:NODES[5].x+NW/2,y:NY-40,'text-anchor':'middle',id:'donebanner'}); doneT.textContent='\\u2714 DONE'; scene.appendChild(doneT);
99
+
100
+ const ORDER=NODES.map(n=>n.id);
101
+ function heatColor(n){ return n>=4?'#ff6b6b':n===3?'#ffa94d':'#ffd43b'; }
102
+
103
+ function render(st){
104
+ const idle=document.getElementById('idle');
105
+ if(!st){ idle.style.display='block'; document.getElementById('goal').textContent='';
106
+ document.getElementById('clock').textContent='';
107
+ NODES.forEach(n=>{document.getElementById('n-'+n.id).setAttribute('class','node pending');
108
+ document.getElementById('t-'+n.id).textContent=n.label;});
109
+ doneT.style.display='none'; satg.innerHTML=''; waveT.textContent='';
110
+ for(const k in heats){document.getElementById('h-'+k).textContent='';
111
+ document.getElementById(heats[k][0]).setAttribute('class','loop');}
112
+ return; }
113
+ idle.style.display='none';
114
+ document.getElementById('goal').textContent=st.goal||'';
115
+ const mins=st.started?Math.max(0,Math.round((Date.now()-Date.parse(st.started))/60000)):null;
116
+ document.getElementById('clock').textContent=(mins!=null?mins+' min':'');
117
+ const cur=st.phase==='done'?ORDER.length:Math.max(0,ORDER.indexOf(st.phase));
118
+ NODES.forEach((n,i)=>{
119
+ const g=document.getElementById('n-'+n.id), t=document.getElementById('t-'+n.id);
120
+ const it=(st.iters||{})[n.id]||0;
121
+ if(st.phase==='done'||i<cur){ g.setAttribute('class','node done'); t.textContent='\\u2714 '+n.label; }
122
+ else if(i===cur){ g.setAttribute('class','node active');
123
+ const [f,s]=PAL[n.color]; const r=g.querySelector('rect');
124
+ r.style.fill=f; r.style.stroke=s; g.style.setProperty('--glow',s); t.textContent='\\u25B6 '+n.label; }
125
+ else { g.setAttribute('class','node pending'); const r=g.querySelector('rect');
126
+ r.style.fill=''; r.style.stroke=''; t.textContent=n.label; }
127
+ if(it>1){ const ts=document.createElementNS(svgNS,'tspan');
128
+ ts.textContent=' \\u00D7'+it; ts.style.fill=heatColor(it); t.appendChild(ts); }
129
+ if(i<NODES.length-1) document.getElementById('a-'+i).setAttribute('class','arrow'+(i<cur?'':' dim'));
130
+ });
131
+ for(const k in heats){
132
+ const n=(st.iters||{})[k]||0; const h=document.getElementById('h-'+k); const l=document.getElementById(heats[k][0]);
133
+ if(n>=2){ h.textContent='\\u00D7'+n; h.style.fill=heatColor(n); l.setAttribute('class','loop hot'); l.style.stroke=heatColor(n); }
134
+ else { h.textContent=''; l.setAttribute('class','loop'); l.style.stroke='#ffd43b'; }
135
+ }
136
+ satg.innerHTML='';
137
+ const forks=(st.impl&&st.impl.forks)||[];
138
+ const cx=NODES[3].x+NW/2, cy=NY+NH/2, RX=112, RY=62;
139
+ forks.forEach((f,i)=>{
140
+ const a=-Math.PI/2+i*(2*Math.PI/Math.max(forks.length,1));
141
+ const col=f.s==='done'?'#69db7c':f.s==='run'?'#ffd43b':f.s==='fail'?'#ff6b6b':'#555';
142
+ satg.appendChild(el('circle',{cx:cx+RX*Math.cos(a),cy:cy+RY*Math.sin(a),r:9,fill:col,
143
+ class:'sat'+(f.s==='run'?' run':'')}));
144
+ });
145
+ document.getElementById('s-impl').textContent=(st.impl&&st.impl.waves)
146
+ ?('wave '+(st.impl.wave||1)+' / '+st.impl.waves):'wave forks';
147
+ doneT.style.display=st.phase==='done'?'block':'none';
148
+ }
149
+ async function tick(){ try{ const r=await fetch('/state',{cache:'no-store'});
150
+ render(r.ok?await r.json():null); }catch(e){ render(null); } }
151
+ tick(); setInterval(tick,800);
152
+ </script></body></html>`;
153
+
154
+ const server = http.createServer((req, res) => {
155
+ if (req.url.startsWith('/state')) {
156
+ try {
157
+ const raw = fs.readFileSync(STATE, 'utf8');
158
+ const st = JSON.parse(raw);
159
+ const upd = Date.parse(st.updated || st.started || 0);
160
+ if (!upd || Date.now() - upd > 3 * 3600 * 1000) throw new Error('stale');
161
+ res.writeHead(200, { 'content-type': 'application/json' });
162
+ return res.end(raw);
163
+ } catch {
164
+ res.writeHead(404); return res.end();
165
+ }
166
+ }
167
+ res.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
168
+ res.end(HTML);
169
+ });
170
+ server.on('error', (e) => {
171
+ if (e.code === 'EADDRINUSE') {
172
+ console.error('port ' + PORT + ' is already in use — a viewer is probably running: http://localhost:' + PORT);
173
+ process.exit(1);
174
+ }
175
+ throw e;
176
+ });
177
+ server.listen(PORT, '127.0.0.1', () => {
178
+ const url = 'http://localhost:' + PORT;
179
+ console.log('goal-skill live viewer: ' + url);
180
+ if (process.platform === 'darwin' && !process.env.NO_OPEN) exec('open ' + url);
181
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dreamcontext",
3
- "version": "0.17.1",
3
+ "version": "0.18.0",
4
4
  "description": "dreamcontext — the persistent brain for your AI agents. Remembers what you built, knows how your project works.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,6 +13,7 @@
13
13
  "skill-curator",
14
14
  "skill-deep-research",
15
15
  "skill-sync",
16
+ "skill-task-manager",
16
17
  "skill-packs",
17
18
  "agents",
18
19
  "README.md",
@@ -55,6 +55,8 @@ dreamcontext config task-backend local
55
55
  dreamcontext tasks sync [push|pull|both] # default: both; no-op on the local backend
56
56
  dreamcontext tasks sync --hook # best-effort mode for git hooks (never fails, exit 0)
57
57
  dreamcontext tasks sync --json # machine-readable sync report
58
+ dreamcontext tasks sync pull --reconcile # heal assignees + version that sit BELOW the watermark
59
+ dreamcontext tasks sync --refresh-meta # force-refresh cached statuses/members/fields (skip the hourly throttle)
58
60
  dreamcontext tasks members [--json] # people with access to the remote list (assignee candidates)
59
61
  dreamcontext tasks provision # create recommended + override-declared custom fields (reuses existing ones by name)
60
62
  dreamcontext tasks sync-hooks install|uninstall # manage the git sync triggers
@@ -66,6 +68,58 @@ dreamcontext config show # shows task backend, ClickUp token presence (ma
66
68
  ```
67
69
  The mirror, sync ledger, and conflict files are derived and gitignored — never commit them, never hand-edit them.
68
70
 
71
+ #### Gotchas (#184 — learned the hard way)
72
+
73
+ **Prefer one list per project — but a shared list is now survivable (#177).** A ClickUp
74
+ list shared by two dreamcontext projects pulls the other's tasks into your brain. A
75
+ foreign `completed` task then reads as proof that THIS project has the capability when
76
+ the work actually landed in a sibling repo — a sleep specialist once read one and
77
+ concluded "already done", nearly dropping a whole work group. Three layers now guard
78
+ against it:
79
+
80
+ - **Provenance stamp.** Every pushed row is stamped with an invisible `dcproject:<id>`
81
+ tag identifying the owning project. On pull, a row whose stamp names *another* project
82
+ is recorded with a `source_project:` frontmatter field and shown `⚠ FOREIGN` in the
83
+ SessionStart snapshot and `⚠ foreign:<id>` in `tasks list`, so it is visibly foreign.
84
+ The id is derived from `projectId` in `.config.json`, else the first `linkedRepos` URL,
85
+ else the project folder name; unstamped rows (created in the ClickUp UI, or pushed
86
+ before this shipped) are always treated as native, so there are no false positives.
87
+ - **Scope filter.** Set `clickup.scope: "project"` in `.config.json` to *skip importing*
88
+ foreign rows entirely (unstamped rows are still pulled — we never silently drop a row
89
+ we can't prove is foreign). Default `"all"` keeps every row (marked, not dropped).
90
+ - **`dreamcontext doctor`** warns when two registered projects point at the same list.
91
+
92
+ The fix is still ideally one list per project; the above makes a shared list safe when
93
+ that isn't possible.
94
+
95
+ **Set the list's statuses in the ClickUp UI BEFORE the first sync to a new list.**
96
+ ClickUp API v2 cannot write folder/list statuses (`PUT /folder/{id}` with
97
+ `override_statuses` returns `override_statuses:false`), so dreamcontext cannot create
98
+ them for you. If a dreamcontext status (`todo`/`in_progress`/`in_review`) has no name
99
+ match on the list, the push omits the field and ClickUp stamps the list's first open
100
+ status — every task landing in e.g. `backlog`. The sync warns when this is about to
101
+ happen; heal it by adding the status in the UI, then:
102
+ ```bash
103
+ dreamcontext tasks sync --refresh-meta # bypass the hourly meta cache
104
+ ```
105
+
106
+ **Changing the sync target invalidates the cached list meta automatically.** The
107
+ cached statuses/members/field-defs and the pull watermark are stamped with the list
108
+ they describe, so repointing `clickup-list` — via `--migrate`, `--keep`, the dashboard,
109
+ or a hand-edited config — drops them and re-reads the new list in full. You should
110
+ never need to hand-edit `state/.tasks-sync.json`; if you think you do, that is a bug.
111
+
112
+ **ClickUp lowercases tag names**, and `version` rides the tags as `version:<v>`. A
113
+ sprint pushed as `S5 (Jul 13 - Jul 17)` comes back as `s5 (jul 13 - jul 17)`. The pull
114
+ restores the canonical spelling by folding against `RELEASES.json` + the active
115
+ sprint, so register a sprint before syncing tasks into it — an *unregistered* version
116
+ cannot be canonicalized and will not match a sprint bucket on the board. A version tag
117
+ added in ClickUp after import lands below the sync watermark and needs:
118
+ ```bash
119
+ dreamcontext tasks sync pull --reconcile # heals assignees + version below the watermark
120
+ dreamcontext tasks version <task> "S5 (Jul 13 - Jul 17)" # or set it directly
121
+ ```
122
+
69
123
  ### GitHub Issues
70
124
 
71
125
  The same backend interface, talking **plain GitHub Issues over REST** (no GraphQL). Tasks map ~1:1 onto issues — the **issue body is the task markdown** — and the four-state status is carried by issue `state`/`state_reason` plus `dc:*` labels.
@@ -41,6 +41,8 @@ dreamcontext knowledge move <slug> <folder> # knowledge/<slug>.md → knowledg
41
41
 
42
42
  It moves the file **and** rewrites every inbound `[[wikilink]]` in one atomic step (target token only; `|alias` and `#anchor` are preserved), keeps the file first-class in index/recall/snapshot/dashboard, and migrates its `knowledge_access` decay key. Folder names are free-form — nothing is reserved; nested folders are allowed; path traversal and clobbering an existing destination are rejected. Context grouping is normally done by `sleep-product` during consolidation — its "Organize" pass groups files that share a clear topic and calls this same command. During active work, just create knowledge with `dreamcontext knowledge create` and let sleep organize, or run `knowledge move` yourself — but never `mv` + hand-edit links by hand. When creating a brand-new doc you may place it directly in its context folder.
43
43
 
44
+ **Moving a whole board directory.** The **same command** relocates an Excalidraw board's `<title>/` wrapper folder as one unit — pass the **directory** slug instead of a file slug (`dreamcontext knowledge move diagrams/recall system` → `knowledge/system/recall/`). When `<slug>` resolves to a directory (and no `<slug>.md` exists) that contains a `*.excalidraw.md`, the command carries the board **and its dark tooling siblings** (`.board.cjs`, spec `.json`, helper `.md`) together, rewrites the path-based inbound `[[wikilinks]]` for every indexed `.md` inside (board + any co-located teardown), and migrates each file's decay key — so a board is never split from its generator across two folders. This is the sanctioned way to conform a legacy `knowledge/diagrams/<title>/` board (or any already-foldered board) to the **board-inside-its-context-folder** convention; you no longer need `mv`. A directory with no board inside is rejected (move plain knowledge with a file slug); so are traversal, self-nesting, and clobbering an existing destination.
45
+
44
46
  ---
45
47
 
46
48
  ## Memory functions — what they are and how to use them
@@ -167,4 +169,4 @@ Rules:
167
169
 
168
170
  Decision rule: *"Will a future session need this? → its context folder under `knowledge/`. Throwaway? → `inbox/` or `workspace/`."*
169
171
 
170
- > **Legacy note:** older projects kept all boards under a single top-level `knowledge/diagrams/` tree, and `dreamcontext migrations apply-diagrams` still maintains flat boards there (folds them into per-title folders + rewrites `[[wikilinks]]` atomically — never hand-edit links). That layout still indexes and renders, but new boards should go in their **context folder**, and `sleep-product` keeps the store organized over time.
172
+ > **Legacy note:** older projects kept all boards under a single top-level `knowledge/diagrams/` tree. `dreamcontext migrations apply-diagrams` still *folds flat boards there into per-title folders* (in place, rewriting `[[wikilinks]]` atomically — never hand-edit links). To then **relocate a foldered board into its real context folder** — e.g. `knowledge/diagrams/recall/` → `knowledge/system/recall/` — run `dreamcontext knowledge move diagrams/recall system` (directory move; see "Moving a whole board directory" above), which carries the board + its tooling siblings as one unit. That legacy layout still indexes and renders, but new boards should go in their **context folder**, and `sleep-product` keeps the store organized over time.
@@ -56,8 +56,8 @@ For non-file-change work (architecture discussion, a decision with no edits): `d
56
56
  **Insight-fed objectives:** if `_dream_context/lab/insights/` is non-empty, also run `dreamcontext lab list` — an objective fed by a bound insight (`binding.objective` in the manifest) has a *measured* KR `current` owned by `lab sync`; no specialist hand-writes it. Surface any bound insight whose cache is stale or errored ("KR for `<objective>` is fed by insight `<slug>`, last synced `<date>` — suggest `dreamcontext lab sync <slug>`"). **Sleep NEVER runs `lab sync`** — credentials, latency, non-determinism; refreshing is always an explicit user/agent action outside sleep.
57
57
  8. **Marketing pass** if `_dream_context/marketing/` exists: `dreamcontext mk rem-sleep`.
58
58
  9. **Council promote check:** `dreamcontext council list --unpromoted` — promote if the user engaged positively.
59
- 10. **`dreamcontext sleep done "<one-paragraph summary stitched from specialist reports>"`** — clears pre-epoch state, resets debt, writes a history entry. (If a remote backend — ClickUp or GitHub — is active and any task pushes failed, this auto-retries once, then errors loudly with the failed slugs.) **Brain sync also fires here:** if a shared brain repo is active (`brainRepo.autoSync`), `sleep done` runs a foreground `brain sync` (fetch→merge→commit→push). Sync failure never fails sleep — but on a prose conflict it pauses with `awaiting-agent` and prints the `/dream-sync` prompt; run that skill, then `brain sync --continue`. Full model → [brain-sync.md](brain-sync.md).
60
- 11. **Report** the consolidated summary to the user.
59
+ 10. **`dreamcontext sleep done "<summary>" [--flag <key>::<label>[::<task-slug>]]...`** — clears pre-epoch state, resets debt, writes a history entry. Before running it, collect every recidivism flag the specialists reported (sleep-state's Recidivism flags block, sleep-tasks' grooming (e)) and pass each as its own `--flag` — repeatable, ONE `--flag` per flag, never comma-separated (e.g. `--flag recurring-task:fix-x::"fix-x recurred"::fix-x --flag ceiling-blocked:2.memory.md::"blocked again"`). At 3 consecutive cycles on the same `key`, `sleep done` itself surfaces an escalation ask and bumps the linked task's priority — you relay what specialists reported, you don't compute the streak. (If a remote backend — ClickUp or GitHub — is active and any task pushes failed, this auto-retries once, then errors loudly with the failed slugs.) **Brain sync also fires here:** if a shared brain repo is active (`brainRepo.autoSync`), `sleep done` runs a foreground `brain sync` (fetch→merge→commit→push). Sync failure never fails sleep — but on a prose conflict it pauses with `awaiting-agent` and prints the `/dream-sync` prompt; run that skill, then `brain sync --continue`. Full model → [brain-sync.md](brain-sync.md).
60
+ 11. **Report** the consolidated summary to the user — include the semantic dedup digest line `sleep done` printed (`Semantic dedup since epoch: X merge / Y review / Z create (N decisions).`, when non-zero) and any recidivism escalation asks or curator-task creation it surfaced.
61
61
 
62
62
  ---
63
63
 
@@ -66,8 +66,8 @@ For non-file-change work (architecture discussion, a decision with no edits): `d
66
66
  | Specialist | Owns | Notes |
67
67
  |---|---|---|
68
68
  | `sleep-tasks` | Task files (`state/*.md`) | Reconciles task bodies to truth, bumps statuses, creates tasks for untracked work, attaches to the planning version, sets the start/due range, and keeps declared custom fields current (never fabricating `ask` fields in the no-user sleep context). When objectives exist, proposes `objectives:` links for tasks with an EMPTY/absent list (multiple slugs when a task serves several outcomes) — **never overwrites a non-empty list** (that's a PO decision). May refresh a KR's observed `current` via `roadmap objective metric` — EXCEPT objectives fed by a bound Lab insight (measured by `lab sync`; hands-off, staleness surfaced instead). |
69
- | `sleep-state` | Core identity (soul, user, memory, core 3–6), CHANGELOG, RELEASES | Records patterns/decisions/preferences, writes a changelog entry per meaningful change since the epoch, surfaces release readiness, enforces anti-bloat ceilings, flags stale knowledge for `sleep-product`. |
70
- | `sleep-product` | Knowledge files + feature PRDs | Creates/reconciles `knowledge/*.md` and `knowledge/features/*.md` (typed knowledge, `type: feature`), processes staleness flags, maintains the knowledge index + taxonomy. |
69
+ | `sleep-state` | Core identity (soul, user, memory, core 3–6), CHANGELOG, RELEASES | Records patterns/decisions/preferences, writes a changelog entry per meaningful change since the epoch, surfaces release readiness, enforces anti-bloat ceilings, flags stale knowledge for `sleep-product`. Rare standing exception: when a ceiling and a genuinely-warranted promotion collide, may archive the oldest blocked Decision to `knowledge/archive/<core>-<period>.md` (archive-before-delete: write, verify, then replace). Reports recurring problems as recidivism flags (see step 10). |
70
+ | `sleep-product` | Knowledge files + feature PRDs | Creates/reconciles `knowledge/*.md` and `knowledge/features/*.md` (typed knowledge, `type: feature`), processes staleness flags, maintains the knowledge index + taxonomy. Never touches `knowledge/archive/` — that's `sleep-state`'s escalation output. |
71
71
  | `sleep-migration` | Structure only | Moves/renames folders, normalizes frontmatter, wraps fences. Never alters body prose. |
72
72
 
73
73
  **Consolidation discipline (remind specialists in the brief):** prefer *updating/extending* an existing entity over creating a new one. `sleep-tasks` folds a smaller slice into the task that already covers it (broaden its title + insert sub-items) rather than forking a duplicate. `sleep-product` keeps similar verticals/topics in the fewest knowledge files, splitting only on a sharp topical boundary. Duplicate tasks and fragmented near-duplicate knowledge are the top failure modes — but genuinely separate concerns still get their own task/file.
@@ -31,17 +31,36 @@ skills:
31
31
  - dreamcontext
32
32
  ---
33
33
 
34
+ ## Forked from the planner — role re-binding (v2)
35
+
36
+ You were **forked from the planner session** and inherit its full context — the goal,
37
+ the codebase reads, the converged plan, the dependency-map table. That inheritance is
38
+ free context, not a promotion. **You are NO LONGER the planner** — you are the
39
+ **implementer for exactly ONE task/lane** in the dependency map.
40
+
41
+ - Build **only the files your lane owns** (the `files owned` cell for your task in the
42
+ map). Never touch a file another lane owns, even if it looks related or convenient —
43
+ same-file-touching tasks are supposed to be the same lane; if you find yourself needing
44
+ to edit a file outside your lane, that's the plan being wrong (see Hard limits below),
45
+ not a reason to reach across lanes.
46
+ - Treat every `depends on` lane's output as a **frozen, pinned contract** — exact
47
+ signatures/types as the plan stated them. Build against the contract, don't renegotiate it.
48
+ - You may have full session context, but your **actions** are scoped to your one task.
49
+
34
50
  ## Skills always loaded
35
51
 
36
52
  - **engineering** — the implementation standard (security, error handling at
37
53
  boundaries, testing, idempotency, naming). Code that ignores it fails Phase 5 review.
54
+ This is **non-negotiable**: every implementer, on every lane, loads and follows it —
55
+ there is no fast path that skips it.
38
56
  - **dreamcontext** — the task at `_dream_context/state/<slug>.md` is your spec and
39
57
  source of truth; log progress with `dreamcontext tasks log <slug> "..."`.
40
58
 
41
59
  If the task touches a domain skill (`firebase-firestore`, `firebase-cloud-functions`,
42
60
  `claude-api`, etc.), load it before writing code.
43
61
 
44
- You are the **Goal Implementer**.
62
+ You are the **Goal Implementer**. You think at **high** effort — enough to get your one
63
+ lane right without the overhead the planner's xhigh pass already spent on the map.
45
64
 
46
65
  ## Mandate
47
66
 
@@ -56,10 +75,32 @@ Build **exactly** what the task's acceptance criteria require — no more, no le
56
75
  - On a re-implement after a FAIL, fix the **specific** failure reported by the
57
76
  reviewer/validator; don't churn unrelated code.
58
77
 
78
+ ## Wave/lane discipline
79
+
80
+ - Honor your task's `files owned` and `depends on` cells in the dependency-map table —
81
+ they are the safety contract that makes parallel waves safe. Don't assume an
82
+ upstream lane's file is done until the wave's build+test gate has passed.
83
+ - **Report back to the orchestrator; do not edit the dependency-map table yourself.**
84
+ The orchestrator is the map's **single writer** — implementers report progress and
85
+ findings, they don't write concurrent updates into the task doc's map.
86
+ - Log your session id and progress via `dreamcontext tasks log <slug> "..."` so the
87
+ orchestrator can append you to the task's session registry — see "Session registry" in the goal-skill SKILL.md for the exact block shape; **do not write that block
88
+ yourself**, and do not reproduce it inline — cite it, let the orchestrator record it.
89
+
90
+ ## Running as a CLI builder session (v2)
91
+
92
+ You are a **CLI builder session** (`claude -p`), forked from the planner via
93
+ `--resume <plannerId> --fork-session`. A re-implement after a review/validation FAIL
94
+ **resumes this same session** (`claude -p --resume <yourSessionId>`) — you already have
95
+ full context, so fix only the **specific** reported failure; don't re-read files you
96
+ already read or re-derive decisions already settled in this session.
97
+
59
98
  ## Hard limits
60
99
 
61
100
  - **Do not expand scope.** A nice-to-have you noticed is not in the criteria — note it,
62
101
  don't build it.
102
+ - **Do not touch another lane's files.** If your task genuinely requires it, that's a
103
+ broken plan, not a judgment call — stop and report (below).
63
104
  - **If you discover the plan is wrong or impossible, STOP and report back to the
64
105
  orchestrator.** Do not silently redesign — the orchestrator may need to reopen Phase 1/2.
65
106
  - **Do not weaken a test to make it pass.** A failing test is signal, not an obstacle.
@@ -38,6 +38,13 @@ skills:
38
38
 
39
39
  You are a **Goal Plan Reviewer**. You review a **plan**, before code exists.
40
40
 
41
+ You are dispatched **clean and fresh every round**, fed only the plan text from the task
42
+ doc — you never inherit the planner's session. That independence is what keeps your
43
+ verdict trustworthy.
44
+
45
+ Under the **critic** lens, you may also sanity-check the dependency-map table: are
46
+ contracts pinned, are same-file tasks kept out of the same wave, are the waves acyclic?
47
+
41
48
  ## Your lens
42
49
 
43
50
  The orchestrator passes you ONE lens in the dispatch prompt. Review primarily through it:
@@ -47,6 +47,22 @@ shape the plan.
47
47
 
48
48
  You are the **Goal Planner**. Your output is a plan, not code.
49
49
 
50
+ ## Running as a CLI builder session (v2)
51
+
52
+ You are spawned as a CLI session (`claude -p`), not a one-shot Agent-tool call.
53
+ The orchestrator captures your `session_id` from the JSON output and records it in the task doc's session registry — see "Session registry" in the goal-skill SKILL.md. Every revision round after Phase 2 plan review **resumes
54
+ this same session** (`--resume <your-session-id>`) with only the delta (the
55
+ reviewers' new findings) — it does not re-send the whole goal. **Build on your
56
+ prior turns; do not re-explore what you already read.** Each implementer forked
57
+ from you in Phase 4 inherits your full context at cache-read price — keep your
58
+ own exploration lean so their fork isn't taxed by dead ends.
59
+
60
+ The orchestrator picks your model per tier via `--model` (opus for Large
61
+ goals, sonnet for Medium/Small) when it spawns you; the `opus` in this file's
62
+ frontmatter is only the fallback used if you're ever dispatched as a plain
63
+ Agent-tool subagent instead of a CLI session. You think at **xhigh** — the
64
+ dependency map must be right, since implementers build against it in parallel.
65
+
50
66
  ## Mandate
51
67
 
52
68
  Produce a plan an enthusiastic mid-level engineer could execute without guessing.
@@ -73,3 +89,21 @@ A structured markdown plan: Overview · File-by-file steps (CREATE/EDIT) · Acce
73
89
  criteria · Test plan · Risks & open questions · Out-of-scope. Honest and concrete. If a
74
90
  requirement is genuinely impossible or contradictory, say so plainly instead of
75
91
  inventing a path around it.
92
+
93
+ For **Medium and Large** goals (the tier router decides), also include a
94
+ **dependency-map table** with exactly these columns: `task | files owned |
95
+ depends on | wave | contract`. Waves are computed from file ownership:
96
+
97
+ - **Same file → same lane.** Two tasks that touch the same file are
98
+ auto-dependent — never place them in the same wave.
99
+ - **Pin contracts.** For every dependency edge, state the exact signature/type
100
+ the upstream task freezes, so parallel tasks in later waves cannot diverge
101
+ from what they were promised.
102
+ - The map is what lets the orchestrator dispatch implementers for a wave in
103
+ parallel (fork+resume) instead of serially — an imprecise map produces file
104
+ collisions or broken contracts downstream, so verify ownership against the
105
+ real files before finalizing it.
106
+ - Small goals skip the map entirely; go straight to file-by-file steps.
107
+
108
+ Do not write the session-registry block yourself — that literal template lives in
109
+ the goal-skill SKILL.md and the orchestrator populates it as builders are spawned.