aiwcli 0.10.2 → 0.11.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 (249) hide show
  1. package/bin/run.js +1 -1
  2. package/dist/commands/clear.d.ts +11 -6
  3. package/dist/commands/clear.js +229 -381
  4. package/dist/commands/init/index.d.ts +1 -17
  5. package/dist/commands/init/index.js +22 -107
  6. package/dist/lib/gitignore-manager.d.ts +32 -0
  7. package/dist/lib/gitignore-manager.js +141 -2
  8. package/dist/lib/template-installer.d.ts +7 -12
  9. package/dist/lib/template-installer.js +69 -193
  10. package/dist/lib/template-settings-reconstructor.d.ts +35 -0
  11. package/dist/lib/template-settings-reconstructor.js +130 -0
  12. package/dist/templates/CLAUDE.md +8 -8
  13. package/dist/templates/_shared/.claude/commands/handoff-resume.md +64 -0
  14. package/dist/templates/_shared/.claude/commands/handoff.md +16 -10
  15. package/dist/templates/_shared/.claude/settings.json +7 -7
  16. package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +2 -0
  17. package/dist/templates/_shared/hooks-ts/archive_plan.ts +159 -0
  18. package/dist/templates/_shared/hooks-ts/context_monitor.ts +147 -0
  19. package/dist/templates/_shared/hooks-ts/file-suggestion.ts +130 -0
  20. package/dist/templates/_shared/hooks-ts/pre_compact.ts +49 -0
  21. package/dist/templates/_shared/hooks-ts/session_end.ts +104 -0
  22. package/dist/templates/_shared/hooks-ts/session_start.ts +144 -0
  23. package/dist/templates/_shared/hooks-ts/task_create_capture.ts +48 -0
  24. package/dist/templates/_shared/hooks-ts/task_update_capture.ts +74 -0
  25. package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +83 -0
  26. package/dist/templates/_shared/lib-ts/CLAUDE.md +318 -0
  27. package/dist/templates/_shared/lib-ts/base/atomic-write.ts +138 -0
  28. package/dist/templates/_shared/lib-ts/base/constants.ts +306 -0
  29. package/dist/templates/_shared/lib-ts/base/git-state.ts +58 -0
  30. package/dist/templates/_shared/lib-ts/base/hook-utils.ts +439 -0
  31. package/dist/templates/_shared/lib-ts/base/inference.ts +252 -0
  32. package/dist/templates/_shared/lib-ts/base/logger.ts +250 -0
  33. package/dist/templates/_shared/lib-ts/base/state-io.ts +116 -0
  34. package/dist/templates/_shared/lib-ts/base/stop-words.ts +184 -0
  35. package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +162 -0
  36. package/dist/templates/_shared/lib-ts/base/utils.ts +184 -0
  37. package/dist/templates/_shared/lib-ts/context/context-formatter.ts +438 -0
  38. package/dist/templates/_shared/lib-ts/context/context-selector.ts +515 -0
  39. package/dist/templates/_shared/lib-ts/context/context-store.ts +707 -0
  40. package/dist/templates/_shared/lib-ts/context/plan-manager.ts +316 -0
  41. package/dist/templates/_shared/lib-ts/context/task-tracker.ts +185 -0
  42. package/dist/templates/_shared/lib-ts/handoff/document-generator.ts +216 -0
  43. package/dist/templates/_shared/lib-ts/handoff/handoff-reader.ts +159 -0
  44. package/dist/templates/_shared/lib-ts/package.json +21 -0
  45. package/dist/templates/_shared/lib-ts/templates/formatters.ts +104 -0
  46. package/dist/templates/_shared/{lib/templates/plan_context.py → lib-ts/templates/plan-context.ts} +14 -22
  47. package/dist/templates/_shared/lib-ts/tsconfig.json +13 -0
  48. package/dist/templates/_shared/lib-ts/types.ts +164 -0
  49. package/dist/templates/_shared/scripts/resolve_context.ts +24 -0
  50. package/dist/templates/_shared/scripts/resume_handoff.ts +321 -0
  51. package/dist/templates/_shared/scripts/save_handoff.ts +359 -0
  52. package/dist/templates/_shared/scripts/status_line.ts +733 -0
  53. package/dist/templates/cc-native/.claude/settings.json +175 -185
  54. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +15 -17
  55. package/dist/templates/cc-native/_cc-native/agents/ARCH-EVOLUTION.md +63 -0
  56. package/dist/templates/cc-native/_cc-native/agents/ARCH-PATTERNS.md +62 -0
  57. package/dist/templates/cc-native/_cc-native/agents/ARCH-STRUCTURE.md +63 -0
  58. package/dist/templates/cc-native/_cc-native/agents/{ASSUMPTION-CHAIN-TRACER.md → ASSUMPTION-TRACER.md} +6 -10
  59. package/dist/templates/cc-native/_cc-native/agents/CLARITY-AUDITOR.md +6 -10
  60. package/dist/templates/cc-native/_cc-native/agents/CLAUDE.md +74 -3
  61. package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-FEASIBILITY.md +67 -0
  62. package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-GAPS.md +71 -0
  63. package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-ORDERING.md +63 -0
  64. package/dist/templates/cc-native/_cc-native/agents/CONSTRAINT-VALIDATOR.md +73 -0
  65. package/dist/templates/cc-native/_cc-native/agents/DESIGN-ADR-VALIDATOR.md +62 -0
  66. package/dist/templates/cc-native/_cc-native/agents/DESIGN-SCALE-MATCHER.md +65 -0
  67. package/dist/templates/cc-native/_cc-native/agents/DEVILS-ADVOCATE.md +6 -9
  68. package/dist/templates/cc-native/_cc-native/agents/DOCUMENTATION-PHILOSOPHY.md +87 -0
  69. package/dist/templates/cc-native/_cc-native/agents/HANDOFF-READINESS.md +5 -9
  70. package/dist/templates/cc-native/_cc-native/agents/{HIDDEN-COMPLEXITY-DETECTOR.md → HIDDEN-COMPLEXITY.md} +6 -10
  71. package/dist/templates/cc-native/_cc-native/agents/INCREMENTAL-DELIVERY.md +67 -0
  72. package/dist/templates/cc-native/_cc-native/agents/PLAN-ORCHESTRATOR.md +91 -18
  73. package/dist/templates/cc-native/_cc-native/agents/RISK-DEPENDENCY.md +63 -0
  74. package/dist/templates/cc-native/_cc-native/agents/RISK-FMEA.md +67 -0
  75. package/dist/templates/cc-native/_cc-native/agents/RISK-PREMORTEM.md +72 -0
  76. package/dist/templates/cc-native/_cc-native/agents/RISK-REVERSIBILITY.md +75 -0
  77. package/dist/templates/cc-native/_cc-native/agents/SCOPE-BOUNDARY.md +78 -0
  78. package/dist/templates/cc-native/_cc-native/agents/SIMPLICITY-GUARDIAN.md +5 -9
  79. package/dist/templates/cc-native/_cc-native/agents/SKEPTIC.md +16 -12
  80. package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-BEHAVIOR-AUDITOR.md +62 -0
  81. package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-CHARACTERIZATION.md +72 -0
  82. package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-FIRST-VALIDATOR.md +62 -0
  83. package/dist/templates/cc-native/_cc-native/agents/TESTDRIVEN-PYRAMID-ANALYZER.md +62 -0
  84. package/dist/templates/cc-native/_cc-native/agents/TRADEOFF-COSTS.md +68 -0
  85. package/dist/templates/cc-native/_cc-native/agents/TRADEOFF-STAKEHOLDERS.md +66 -0
  86. package/dist/templates/cc-native/_cc-native/agents/VERIFY-COVERAGE.md +75 -0
  87. package/dist/templates/cc-native/_cc-native/agents/VERIFY-STRENGTH.md +70 -0
  88. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +109 -135
  89. package/dist/templates/cc-native/_cc-native/hooks/add_plan_context.ts +119 -0
  90. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +921 -0
  91. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +61 -0
  92. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +157 -0
  93. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +709 -0
  94. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +199 -0
  95. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +124 -0
  96. package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +57 -0
  97. package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +83 -0
  98. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +80 -0
  99. package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +119 -0
  100. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +162 -0
  101. package/dist/templates/cc-native/_cc-native/lib-ts/nul +3 -0
  102. package/dist/templates/cc-native/_cc-native/lib-ts/orchestrator.ts +249 -0
  103. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/agent.ts +155 -0
  104. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/codex.ts +130 -0
  105. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/gemini.ts +106 -0
  106. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/index.ts +10 -0
  107. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/types.ts +23 -0
  108. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +243 -0
  109. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +18 -0
  110. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +310 -0
  111. package/dist/templates/cc-native/_cc-native/lib-ts/verdict.ts +72 -0
  112. package/dist/templates/cc-native/_cc-native/plan-review.config.json +12 -16
  113. package/oclif.manifest.json +1 -1
  114. package/package.json +1 -1
  115. package/dist/lib/template-merger.d.ts +0 -47
  116. package/dist/lib/template-merger.js +0 -162
  117. package/dist/templates/_shared/hooks/__init__.py +0 -16
  118. package/dist/templates/_shared/hooks/__pycache__/__init__.cpython-313.pyc +0 -0
  119. package/dist/templates/_shared/hooks/__pycache__/archive_plan.cpython-313.pyc +0 -0
  120. package/dist/templates/_shared/hooks/__pycache__/context_enforcer.cpython-313.pyc +0 -0
  121. package/dist/templates/_shared/hooks/__pycache__/context_monitor.cpython-313.pyc +0 -0
  122. package/dist/templates/_shared/hooks/__pycache__/file-suggestion.cpython-313.pyc +0 -0
  123. package/dist/templates/_shared/hooks/__pycache__/pre_compact.cpython-313.pyc +0 -0
  124. package/dist/templates/_shared/hooks/__pycache__/session_end.cpython-313.pyc +0 -0
  125. package/dist/templates/_shared/hooks/__pycache__/session_start.cpython-313.pyc +0 -0
  126. package/dist/templates/_shared/hooks/__pycache__/task_create_atomicity.cpython-313.pyc +0 -0
  127. package/dist/templates/_shared/hooks/__pycache__/task_create_capture.cpython-313.pyc +0 -0
  128. package/dist/templates/_shared/hooks/__pycache__/task_update_capture.cpython-313.pyc +0 -0
  129. package/dist/templates/_shared/hooks/__pycache__/user_prompt_submit.cpython-313.pyc +0 -0
  130. package/dist/templates/_shared/hooks/archive_plan.py +0 -169
  131. package/dist/templates/_shared/hooks/context_monitor.py +0 -270
  132. package/dist/templates/_shared/hooks/file-suggestion.py +0 -215
  133. package/dist/templates/_shared/hooks/pre_compact.py +0 -104
  134. package/dist/templates/_shared/hooks/session_end.py +0 -173
  135. package/dist/templates/_shared/hooks/session_start.py +0 -206
  136. package/dist/templates/_shared/hooks/task_create_capture.py +0 -108
  137. package/dist/templates/_shared/hooks/task_update_capture.py +0 -145
  138. package/dist/templates/_shared/hooks/user_prompt_submit.py +0 -139
  139. package/dist/templates/_shared/lib/__init__.py +0 -1
  140. package/dist/templates/_shared/lib/__pycache__/__init__.cpython-313.pyc +0 -0
  141. package/dist/templates/_shared/lib/base/__init__.py +0 -65
  142. package/dist/templates/_shared/lib/base/__pycache__/__init__.cpython-313.pyc +0 -0
  143. package/dist/templates/_shared/lib/base/__pycache__/atomic_write.cpython-313.pyc +0 -0
  144. package/dist/templates/_shared/lib/base/__pycache__/constants.cpython-313.pyc +0 -0
  145. package/dist/templates/_shared/lib/base/__pycache__/hook_utils.cpython-313.pyc +0 -0
  146. package/dist/templates/_shared/lib/base/__pycache__/inference.cpython-313.pyc +0 -0
  147. package/dist/templates/_shared/lib/base/__pycache__/logger.cpython-313.pyc +0 -0
  148. package/dist/templates/_shared/lib/base/__pycache__/stop_words.cpython-313.pyc +0 -0
  149. package/dist/templates/_shared/lib/base/__pycache__/subprocess_utils.cpython-313.pyc +0 -0
  150. package/dist/templates/_shared/lib/base/__pycache__/utils.cpython-313.pyc +0 -0
  151. package/dist/templates/_shared/lib/base/atomic_write.py +0 -180
  152. package/dist/templates/_shared/lib/base/constants.py +0 -358
  153. package/dist/templates/_shared/lib/base/hook_utils.py +0 -341
  154. package/dist/templates/_shared/lib/base/inference.py +0 -318
  155. package/dist/templates/_shared/lib/base/logger.py +0 -291
  156. package/dist/templates/_shared/lib/base/stop_words.py +0 -213
  157. package/dist/templates/_shared/lib/base/subprocess_utils.py +0 -46
  158. package/dist/templates/_shared/lib/base/utils.py +0 -242
  159. package/dist/templates/_shared/lib/context/__init__.py +0 -102
  160. package/dist/templates/_shared/lib/context/__pycache__/__init__.cpython-313.pyc +0 -0
  161. package/dist/templates/_shared/lib/context/__pycache__/cache.cpython-313.pyc +0 -0
  162. package/dist/templates/_shared/lib/context/__pycache__/context_extractor.cpython-313.pyc +0 -0
  163. package/dist/templates/_shared/lib/context/__pycache__/context_formatter.cpython-313.pyc +0 -0
  164. package/dist/templates/_shared/lib/context/__pycache__/context_manager.cpython-313.pyc +0 -0
  165. package/dist/templates/_shared/lib/context/__pycache__/context_selector.cpython-313.pyc +0 -0
  166. package/dist/templates/_shared/lib/context/__pycache__/context_store.cpython-313.pyc +0 -0
  167. package/dist/templates/_shared/lib/context/__pycache__/discovery.cpython-313.pyc +0 -0
  168. package/dist/templates/_shared/lib/context/__pycache__/event_log.cpython-313.pyc +0 -0
  169. package/dist/templates/_shared/lib/context/__pycache__/plan_archive.cpython-313.pyc +0 -0
  170. package/dist/templates/_shared/lib/context/__pycache__/plan_manager.cpython-313.pyc +0 -0
  171. package/dist/templates/_shared/lib/context/__pycache__/task_sync.cpython-313.pyc +0 -0
  172. package/dist/templates/_shared/lib/context/__pycache__/task_tracker.cpython-313.pyc +0 -0
  173. package/dist/templates/_shared/lib/context/context_formatter.py +0 -317
  174. package/dist/templates/_shared/lib/context/context_selector.py +0 -508
  175. package/dist/templates/_shared/lib/context/context_store.py +0 -653
  176. package/dist/templates/_shared/lib/context/plan_manager.py +0 -204
  177. package/dist/templates/_shared/lib/context/task_tracker.py +0 -188
  178. package/dist/templates/_shared/lib/handoff/__init__.py +0 -22
  179. package/dist/templates/_shared/lib/handoff/__pycache__/__init__.cpython-313.pyc +0 -0
  180. package/dist/templates/_shared/lib/handoff/__pycache__/document_generator.cpython-313.pyc +0 -0
  181. package/dist/templates/_shared/lib/handoff/document_generator.py +0 -278
  182. package/dist/templates/_shared/lib/templates/README.md +0 -206
  183. package/dist/templates/_shared/lib/templates/__init__.py +0 -36
  184. package/dist/templates/_shared/lib/templates/__pycache__/__init__.cpython-313.pyc +0 -0
  185. package/dist/templates/_shared/lib/templates/__pycache__/formatters.cpython-313.pyc +0 -0
  186. package/dist/templates/_shared/lib/templates/__pycache__/persona_questions.cpython-313.pyc +0 -0
  187. package/dist/templates/_shared/lib/templates/__pycache__/plan_context.cpython-313.pyc +0 -0
  188. package/dist/templates/_shared/lib/templates/formatters.py +0 -146
  189. package/dist/templates/_shared/scripts/__pycache__/save_handoff.cpython-313.pyc +0 -0
  190. package/dist/templates/_shared/scripts/__pycache__/status_line.cpython-313.pyc +0 -0
  191. package/dist/templates/_shared/scripts/save_handoff.py +0 -357
  192. package/dist/templates/_shared/scripts/status_line.py +0 -701
  193. package/dist/templates/cc-native/.claude/commands/cc-native/fresh-perspective.md +0 -8
  194. package/dist/templates/cc-native/.windsurf/workflows/cc-native/fresh-perspective.md +0 -8
  195. package/dist/templates/cc-native/MIGRATION.md +0 -86
  196. package/dist/templates/cc-native/_cc-native/agents/ACCESSIBILITY-TESTER.md +0 -79
  197. package/dist/templates/cc-native/_cc-native/agents/ARCHITECT-REVIEWER.md +0 -48
  198. package/dist/templates/cc-native/_cc-native/agents/CODE-REVIEWER.md +0 -70
  199. package/dist/templates/cc-native/_cc-native/agents/COMPLETENESS-CHECKER.md +0 -59
  200. package/dist/templates/cc-native/_cc-native/agents/CONTEXT-EXTRACTOR.md +0 -92
  201. package/dist/templates/cc-native/_cc-native/agents/DOCUMENTATION-REVIEWER.md +0 -51
  202. package/dist/templates/cc-native/_cc-native/agents/FEASIBILITY-ANALYST.md +0 -57
  203. package/dist/templates/cc-native/_cc-native/agents/FRESH-PERSPECTIVE.md +0 -54
  204. package/dist/templates/cc-native/_cc-native/agents/INCENTIVE-MAPPER.md +0 -61
  205. package/dist/templates/cc-native/_cc-native/agents/PENETRATION-TESTER.md +0 -79
  206. package/dist/templates/cc-native/_cc-native/agents/PERFORMANCE-ENGINEER.md +0 -75
  207. package/dist/templates/cc-native/_cc-native/agents/PRECEDENT-FINDER.md +0 -70
  208. package/dist/templates/cc-native/_cc-native/agents/REVERSIBILITY-ANALYST.md +0 -61
  209. package/dist/templates/cc-native/_cc-native/agents/RISK-ASSESSOR.md +0 -58
  210. package/dist/templates/cc-native/_cc-native/agents/SECOND-ORDER-ANALYST.md +0 -61
  211. package/dist/templates/cc-native/_cc-native/agents/STAKEHOLDER-ADVOCATE.md +0 -55
  212. package/dist/templates/cc-native/_cc-native/agents/TRADE-OFF-ILLUMINATOR.md +0 -204
  213. package/dist/templates/cc-native/_cc-native/hooks/__pycache__/add_plan_context.cpython-313.pyc +0 -0
  214. package/dist/templates/cc-native/_cc-native/hooks/__pycache__/cc-native-plan-review.cpython-313.pyc +0 -0
  215. package/dist/templates/cc-native/_cc-native/hooks/__pycache__/mark_questions_asked.cpython-313.pyc +0 -0
  216. package/dist/templates/cc-native/_cc-native/hooks/__pycache__/plan_accepted.cpython-313.pyc +0 -0
  217. package/dist/templates/cc-native/_cc-native/hooks/__pycache__/plan_questions_early.cpython-313.pyc +0 -0
  218. package/dist/templates/cc-native/_cc-native/hooks/__pycache__/suggest-fresh-perspective.cpython-313.pyc +0 -0
  219. package/dist/templates/cc-native/_cc-native/hooks/add_plan_context.py +0 -130
  220. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.py +0 -869
  221. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.py +0 -81
  222. package/dist/templates/cc-native/_cc-native/hooks/suggest-fresh-perspective.py +0 -340
  223. package/dist/templates/cc-native/_cc-native/lib/CLAUDE.md +0 -265
  224. package/dist/templates/cc-native/_cc-native/lib/__init__.py +0 -53
  225. package/dist/templates/cc-native/_cc-native/lib/__pycache__/__init__.cpython-313.pyc +0 -0
  226. package/dist/templates/cc-native/_cc-native/lib/__pycache__/atomic_write.cpython-313.pyc +0 -0
  227. package/dist/templates/cc-native/_cc-native/lib/__pycache__/constants.cpython-313.pyc +0 -0
  228. package/dist/templates/cc-native/_cc-native/lib/__pycache__/debug.cpython-313.pyc +0 -0
  229. package/dist/templates/cc-native/_cc-native/lib/__pycache__/orchestrator.cpython-313.pyc +0 -0
  230. package/dist/templates/cc-native/_cc-native/lib/__pycache__/state.cpython-313.pyc +0 -0
  231. package/dist/templates/cc-native/_cc-native/lib/__pycache__/utils.cpython-313.pyc +0 -0
  232. package/dist/templates/cc-native/_cc-native/lib/constants.py +0 -45
  233. package/dist/templates/cc-native/_cc-native/lib/debug.py +0 -139
  234. package/dist/templates/cc-native/_cc-native/lib/orchestrator.py +0 -362
  235. package/dist/templates/cc-native/_cc-native/lib/reviewers/__init__.py +0 -28
  236. package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/__init__.cpython-313.pyc +0 -0
  237. package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/agent.cpython-313.pyc +0 -0
  238. package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/base.cpython-313.pyc +0 -0
  239. package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/codex.cpython-313.pyc +0 -0
  240. package/dist/templates/cc-native/_cc-native/lib/reviewers/__pycache__/gemini.cpython-313.pyc +0 -0
  241. package/dist/templates/cc-native/_cc-native/lib/reviewers/agent.py +0 -215
  242. package/dist/templates/cc-native/_cc-native/lib/reviewers/base.py +0 -88
  243. package/dist/templates/cc-native/_cc-native/lib/reviewers/codex.py +0 -124
  244. package/dist/templates/cc-native/_cc-native/lib/reviewers/gemini.py +0 -108
  245. package/dist/templates/cc-native/_cc-native/lib/state.py +0 -268
  246. package/dist/templates/cc-native/_cc-native/lib/utils.py +0 -1027
  247. package/dist/templates/cc-native/_cc-native/scripts/__pycache__/aggregate_agents.cpython-313.pyc +0 -0
  248. package/dist/templates/cc-native/_cc-native/scripts/aggregate_agents.py +0 -168
  249. package/dist/templates/cc-native/_cc-native/workflows/fresh-perspective.md +0 -134
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Save a handoff document with folder-based sharding.
4
+ *
5
+ * Usage:
6
+ * bun .aiwcli/_shared/scripts/save_handoff.ts <context_id> <<'EOF'
7
+ * # Your handoff markdown content here (with <!-- SECTION: name --> markers)
8
+ * EOF
9
+ *
10
+ * Or with a file:
11
+ * bun .aiwcli/_shared/scripts/save_handoff.ts <context_id> < handoff.md
12
+ *
13
+ * This script:
14
+ * 1. Parses sections from incoming markdown using <!-- SECTION: name --> markers
15
+ * 2. Creates a timestamped folder at _output/contexts/{context_id}/handoffs/{YYYY-MM-DD-HHMM}/
16
+ * 3. Writes sharded files:
17
+ * - index.md (main entry point with navigation)
18
+ * - completed-work.md, dead-ends.md, decisions.md, pending.md, context.md
19
+ * - plan.md (copy of original plan if it exists)
20
+ * 4. Sets handoff_path and handoff_consumed=false in state.json
21
+ */
22
+ import * as fs from "node:fs";
23
+ import * as path from "node:path";
24
+
25
+ import { atomicWrite } from "../lib-ts/base/atomic-write.js";
26
+ import { getHandoffFolderPath, getProjectRoot } from "../lib-ts/base/constants.js";
27
+ import { getGitStatusShort } from "../lib-ts/base/git-state.js";
28
+ import { logError, logInfo, logWarn } from "../lib-ts/base/logger.js";
29
+ import { eprint } from "../lib-ts/base/utils.js";
30
+ import { getContext, saveState } from "../lib-ts/context/context-store.js";
31
+
32
+ // ---------------------------------------------------------------------------
33
+ // Parsing helpers
34
+ // ---------------------------------------------------------------------------
35
+
36
+ function parseFrontmatter(content: string): [Record<string, string>, string] {
37
+ const frontmatter: Record<string, string> = {};
38
+ let remaining = content;
39
+
40
+ if (content.startsWith("---")) {
41
+ const parts = content.split("---", 3);
42
+ if (parts.length >= 3) {
43
+ for (const line of parts[1]!.trim().split("\n")) {
44
+ const colonIdx = line.indexOf(":");
45
+ if (colonIdx !== -1) {
46
+ const key = line.slice(0, colonIdx).trim();
47
+ const value = line.slice(colonIdx + 1).trim();
48
+ frontmatter[key] = value;
49
+ }
50
+ }
51
+
52
+ remaining = parts[2]!.trim();
53
+ }
54
+ }
55
+
56
+ return [frontmatter, remaining];
57
+ }
58
+
59
+ function parseHandoffSections(content: string): Record<string, string> {
60
+ const sections: Record<string, string> = {};
61
+ let currentSection: null | string = null;
62
+ const currentContent: string[] = [];
63
+
64
+ for (const line of content.split("\n")) {
65
+ const marker = line.trim().match(/<!-- SECTION:\s*(\S+)\s*-->/);
66
+ if (marker) {
67
+ if (currentSection) {
68
+ sections[currentSection] = currentContent.join("\n").trim();
69
+ }
70
+
71
+ currentSection = marker[1]!;
72
+ currentContent.length = 0;
73
+ } else if (currentSection) {
74
+ currentContent.push(line);
75
+ }
76
+ }
77
+
78
+ if (currentSection) {
79
+ sections[currentSection] = currentContent.join("\n").trim();
80
+ }
81
+
82
+ return sections;
83
+ }
84
+
85
+ // ---------------------------------------------------------------------------
86
+ // Plan helper
87
+ // ---------------------------------------------------------------------------
88
+
89
+ function getPlanPathFromContext(contextId: string, projectRoot: string): null | string {
90
+ const context = getContext(contextId, projectRoot);
91
+ if (!context?.plan_path) return null;
92
+ try {
93
+ if (fs.existsSync(context.plan_path)) return context.plan_path;
94
+ } catch { /* ignore */ }
95
+
96
+ return null;
97
+ }
98
+
99
+ // ---------------------------------------------------------------------------
100
+ // File generation
101
+ // ---------------------------------------------------------------------------
102
+
103
+ function generateIndex(
104
+ frontmatter: Record<string, string>,
105
+ sections: Record<string, string>,
106
+ gitStatus: string,
107
+ hasPlan: boolean,
108
+ ): string {
109
+ const now = new Date();
110
+ const isoStr = now.toISOString();
111
+ const dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}-${String(now.getDate()).padStart(2, "0")} ${String(now.getHours()).padStart(2, "0")}:${String(now.getMinutes()).padStart(2, "0")}`;
112
+
113
+ const lines: string[] = [
114
+ "---",
115
+ "type: handoff",
116
+ `context_id: ${frontmatter["context_id"] ?? "unknown"}`,
117
+ `created_at: ${isoStr}`,
118
+ `session_id: ${frontmatter["session_id"] ?? "unknown"}`,
119
+ `project: ${frontmatter["project"] ?? "unknown"}`,
120
+ `plan_path: ${frontmatter["plan_document"] ?? "none"}`,
121
+ "---",
122
+ "",
123
+ `# Session Handoff - ${dateStr}`,
124
+ "",
125
+ ];
126
+
127
+ // Summary
128
+ const summary = (sections["summary"] ?? "").trim();
129
+ if (summary) {
130
+ const summaryText = summary
131
+ .split("\n")
132
+ .filter(l => !l.trim().startsWith("##"))
133
+ .join("\n")
134
+ .trim();
135
+ lines.push("## Summary", summaryText, "");
136
+ }
137
+
138
+ // Navigation
139
+ lines.push(
140
+ "## Quick Navigation",
141
+ "",
142
+ "| Document | Purpose | Priority |",
143
+ "|----------|---------|----------|",
144
+ "| [Dead Ends](./dead-ends.md) | Failed approaches - DO NOT RETRY | Read First |",
145
+ "| [Pending](./pending.md) | Next steps and blockers | Action Items |",
146
+ "| [Completed Work](./completed-work.md) | Tasks finished this session | Reference |",
147
+ "| [Decisions](./decisions.md) | Technical choices and rationale | Reference |",
148
+ );
149
+
150
+ if (hasPlan) {
151
+ lines.push("| [Plan](./plan.md) | Original plan being implemented | Reference |");
152
+ }
153
+
154
+ lines.push(
155
+ "| [Context](./context.md) | External requirements and notes | Reference |",
156
+ "",
157
+ "## Continuation Instructions",
158
+ "",
159
+ "To continue this work in a new session:",
160
+ "1. This index document provides the overview",
161
+ "2. **Read [Dead Ends](./dead-ends.md) first** to avoid repeating failed approaches",
162
+ "3. Check [Pending](./pending.md) for immediate next steps",
163
+ "4. Reference other documents as needed",
164
+ "",
165
+ "## Git Status at Handoff",
166
+ "```",
167
+ gitStatus,
168
+ "```",
169
+ "",
170
+ );
171
+
172
+ return lines.join("\n");
173
+ }
174
+
175
+ function writeSectionFile(folder: string, filename: string, title: string, content: string): boolean {
176
+ const text = `# ${title}\n\n${content || "(No content for this section)"}\n`;
177
+ const filePath = path.join(folder, filename);
178
+ const [success, error] = atomicWrite(filePath, text);
179
+ if (!success) {
180
+ logWarn("save_handoff", `Failed to write ${filename}: ${error}`);
181
+ return false;
182
+ }
183
+
184
+ return true;
185
+ }
186
+
187
+ // ---------------------------------------------------------------------------
188
+ // Main
189
+ // ---------------------------------------------------------------------------
190
+
191
+ function main(): void {
192
+ if (process.argv.length < 3) {
193
+ eprint(
194
+ "Usage: bun save_handoff.ts <context_id> < content.md\n" +
195
+ " bun save_handoff.ts <context_id> <<'EOF'\n" +
196
+ " ... markdown content with <!-- SECTION: name --> markers ...\n" +
197
+ " EOF",
198
+ );
199
+ process.exit(1);
200
+ }
201
+
202
+ const contextId = process.argv[2]!;
203
+
204
+ // Read content from stdin
205
+ let content: string;
206
+ try {
207
+ content = fs.readFileSync(0, "utf8");
208
+ } catch {
209
+ logError("save_handoff", "Failed to read from stdin");
210
+ process.exit(1);
211
+ return; // unreachable but makes TS happy
212
+ }
213
+
214
+ if (!content.trim()) {
215
+ logError("save_handoff", "No content provided via stdin");
216
+ process.exit(1);
217
+ }
218
+
219
+ // Project root via shared utility (checks CLAUDE_PROJECT_DIR, falls back to cwd)
220
+ const projectRoot = getProjectRoot(process.cwd());
221
+
222
+ // Verify context exists
223
+ const context = getContext(contextId, projectRoot);
224
+ if (!context) {
225
+ logError("save_handoff", `Context not found: ${contextId}`);
226
+ process.exit(1);
227
+ }
228
+
229
+ // Parse frontmatter and sections
230
+ const [frontmatter, body] = parseFrontmatter(content);
231
+ const sections = parseHandoffSections(body);
232
+
233
+ logInfo("save_handoff", `Parsed ${Object.keys(sections).length} sections: ${Object.keys(sections).join(", ")}`);
234
+
235
+ // Create handoff folder
236
+ const handoffFolder = getHandoffFolderPath(contextId, projectRoot);
237
+ fs.mkdirSync(handoffFolder, { recursive: true });
238
+ logInfo("save_handoff", `Created folder: ${handoffFolder}`);
239
+
240
+ // Git status
241
+ const gitStatus = getGitStatusShort(projectRoot);
242
+
243
+ // Check for plan
244
+ const planPath = getPlanPathFromContext(contextId, projectRoot);
245
+ const hasPlan = planPath !== null;
246
+
247
+ // Copy plan if exists
248
+ if (planPath) {
249
+ try {
250
+ const planContent = fs.readFileSync(planPath, "utf8");
251
+ const [success, error] = atomicWrite(path.join(handoffFolder, "plan.md"), planContent);
252
+ if (success) {
253
+ logInfo("save_handoff", `Copied plan from ${planPath}`);
254
+ } else {
255
+ logWarn("save_handoff", `Failed to copy plan: ${error}`);
256
+ }
257
+ } catch (error) {
258
+ logWarn("save_handoff", `Failed to read plan: ${error}`);
259
+ }
260
+ }
261
+
262
+ // Write index.md
263
+ const indexContent = generateIndex(frontmatter, sections, gitStatus, hasPlan);
264
+ const indexPath = path.join(handoffFolder, "index.md");
265
+ {
266
+ const [success, error] = atomicWrite(indexPath, indexContent);
267
+ if (!success) {
268
+ logError("save_handoff", `Failed to write index.md: ${error}`);
269
+ process.exit(1);
270
+ }
271
+ }
272
+
273
+ // Write section files
274
+ const sectionMapping: Record<string, [string, null | string]> = {
275
+ completed: ["completed-work.md", "Work Completed"],
276
+ "dead-ends": ["dead-ends.md", "Dead Ends - Do Not Retry"],
277
+ decisions: ["decisions.md", "Key Decisions"],
278
+ pending: ["pending.md", "Pending Issues"],
279
+ "next-steps": ["pending.md", null], // Append to pending.md
280
+ files: ["completed-work.md", null], // Append to completed-work.md
281
+ context: ["context.md", "Context for Future Sessions"],
282
+ };
283
+
284
+ // Track accumulated content per file
285
+ const fileContents: Record<string, string[]> = {};
286
+
287
+ for (const [sectionName, [filename, title]] of Object.entries(sectionMapping)) {
288
+ const sectionContent = sections[sectionName];
289
+ if (!sectionContent) continue;
290
+
291
+ if (title === null) {
292
+ // Append mode
293
+ if (!fileContents[filename]) fileContents[filename] = [];
294
+ fileContents[filename]!.push(sectionContent);
295
+ } else {
296
+ // Write mode with title
297
+ fileContents[filename] = fileContents[filename] ? [`# ${title}`, "", ...fileContents[filename]!, "", sectionContent] : [`# ${title}`, "", sectionContent];
298
+ }
299
+ }
300
+
301
+ // Write all accumulated content
302
+ for (const [filename, parts] of Object.entries(fileContents)) {
303
+ const filePath = path.join(handoffFolder, filename);
304
+ const [success, error] = atomicWrite(filePath, parts.join("\n") + "\n");
305
+ if (!success) {
306
+ logWarn("save_handoff", `Failed to write ${filename}: ${error}`);
307
+ }
308
+ }
309
+
310
+ // Ensure all expected files exist (even if empty)
311
+ const expectedFiles: Record<string, string> = {
312
+ "completed-work.md": "Work Completed",
313
+ "dead-ends.md": "Dead Ends - Do Not Retry",
314
+ "decisions.md": "Key Decisions",
315
+ "pending.md": "Pending Issues & Next Steps",
316
+ "context.md": "Context for Future Sessions",
317
+ };
318
+
319
+ for (const [filename, title] of Object.entries(expectedFiles)) {
320
+ const filePath = path.join(handoffFolder, filename);
321
+ if (!fs.existsSync(filePath)) {
322
+ writeSectionFile(handoffFolder, filename, title, "");
323
+ }
324
+ }
325
+
326
+ // Set handoff_path and handoff_consumed=false in state.json
327
+ try {
328
+ const indexPathStr = path.join(handoffFolder, "index.md");
329
+ const state = getContext(contextId, projectRoot);
330
+ if (state) {
331
+ state.handoff_path = indexPathStr;
332
+ state.handoff_consumed = false;
333
+ const [ok, err] = saveState(contextId, state, projectRoot);
334
+ if (ok) {
335
+ logInfo("save_handoff", `Set handoff_path: ${indexPathStr}`);
336
+ } else {
337
+ logWarn("save_handoff", `Failed to save state: ${err}`);
338
+ }
339
+ } else {
340
+ logWarn("save_handoff", `Could not load context state for ${contextId}`);
341
+ }
342
+ } catch (error) {
343
+ logWarn("save_handoff", `Handoff saved but auto-resume won't work (context update failed): ${error}`);
344
+ }
345
+
346
+ // Output success message
347
+ console.log(`[OK] Created handoff folder: ${handoffFolder}`);
348
+ console.log(" - index.md (entry point with navigation)");
349
+
350
+ const filesCreated = fs.readdirSync(handoffFolder)
351
+ .filter(f => f !== "index.md" && fs.statSync(path.join(handoffFolder, f)).isFile())
352
+ .sort();
353
+ console.log(` - ${filesCreated.join(", ")}`);
354
+
355
+ console.log("");
356
+ console.log("Handoff document saved. Use this folder for context in the next session.");
357
+ }
358
+
359
+ main();