@selvakumaresra/specship 0.1.3 → 0.3.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 (694) hide show
  1. package/README.md +2 -2
  2. package/commands/ss-design-implement.md +79 -0
  3. package/commands/{cg-drifted.md → ss-drifted.md} +2 -2
  4. package/commands/{cg-fix.md → ss-fix.md} +1 -1
  5. package/commands/{cg-implement.md → ss-implement.md} +1 -1
  6. package/commands/ss-spec-author.md +43 -0
  7. package/commands/ss-spec-review.md +48 -0
  8. package/dist/bin/node-version-check.d.ts +37 -0
  9. package/dist/bin/node-version-check.d.ts.map +1 -0
  10. package/dist/bin/node-version-check.js +79 -0
  11. package/dist/bin/node-version-check.js.map +1 -0
  12. package/dist/bin/specship.d.ts +25 -0
  13. package/dist/bin/specship.d.ts.map +1 -0
  14. package/dist/bin/specship.js +2019 -0
  15. package/dist/bin/specship.js.map +1 -0
  16. package/dist/bin/uninstall.d.ts +13 -0
  17. package/dist/bin/uninstall.d.ts.map +1 -0
  18. package/dist/bin/uninstall.js +35 -0
  19. package/dist/bin/uninstall.js.map +1 -0
  20. package/dist/context/formatter.d.ts +30 -0
  21. package/dist/context/formatter.d.ts.map +1 -0
  22. package/dist/context/formatter.js +263 -0
  23. package/dist/context/formatter.js.map +1 -0
  24. package/dist/context/index.d.ts +119 -0
  25. package/dist/context/index.d.ts.map +1 -0
  26. package/dist/context/index.js +1289 -0
  27. package/dist/context/index.js.map +1 -0
  28. package/dist/context/markers.d.ts +19 -0
  29. package/dist/context/markers.d.ts.map +1 -0
  30. package/dist/context/markers.js +22 -0
  31. package/dist/context/markers.js.map +1 -0
  32. package/dist/db/index.d.ts +103 -0
  33. package/dist/db/index.d.ts.map +1 -0
  34. package/dist/db/index.js +279 -0
  35. package/dist/db/index.js.map +1 -0
  36. package/dist/db/migrations.d.ts +44 -0
  37. package/dist/db/migrations.d.ts.map +1 -0
  38. package/dist/db/migrations.js +462 -0
  39. package/dist/db/migrations.js.map +1 -0
  40. package/dist/db/queries.d.ts +357 -0
  41. package/dist/db/queries.d.ts.map +1 -0
  42. package/dist/db/queries.js +1504 -0
  43. package/dist/db/queries.js.map +1 -0
  44. package/dist/db/schema.sql +419 -0
  45. package/dist/db/spec-queries.d.ts +101 -0
  46. package/dist/db/spec-queries.d.ts.map +1 -0
  47. package/dist/db/spec-queries.js +675 -0
  48. package/dist/db/spec-queries.js.map +1 -0
  49. package/dist/db/sqlite-adapter.d.ts +65 -0
  50. package/dist/db/sqlite-adapter.d.ts.map +1 -0
  51. package/dist/db/sqlite-adapter.js +214 -0
  52. package/dist/db/sqlite-adapter.js.map +1 -0
  53. package/dist/directory.d.ts +67 -0
  54. package/dist/directory.d.ts.map +1 -0
  55. package/dist/directory.js +267 -0
  56. package/dist/directory.js.map +1 -0
  57. package/dist/errors.d.ts +136 -0
  58. package/dist/errors.d.ts.map +1 -0
  59. package/dist/errors.js +219 -0
  60. package/dist/errors.js.map +1 -0
  61. package/dist/extraction/dfm-extractor.d.ts +31 -0
  62. package/dist/extraction/dfm-extractor.d.ts.map +1 -0
  63. package/dist/extraction/dfm-extractor.js +151 -0
  64. package/dist/extraction/dfm-extractor.js.map +1 -0
  65. package/dist/extraction/generated-detection.d.ts +30 -0
  66. package/dist/extraction/generated-detection.d.ts.map +1 -0
  67. package/dist/extraction/generated-detection.js +80 -0
  68. package/dist/extraction/generated-detection.js.map +1 -0
  69. package/dist/extraction/grammars.d.ts +100 -0
  70. package/dist/extraction/grammars.d.ts.map +1 -0
  71. package/dist/extraction/grammars.js +426 -0
  72. package/dist/extraction/grammars.js.map +1 -0
  73. package/dist/extraction/index.d.ts +138 -0
  74. package/dist/extraction/index.d.ts.map +1 -0
  75. package/dist/extraction/index.js +1394 -0
  76. package/dist/extraction/index.js.map +1 -0
  77. package/dist/extraction/languages/c-cpp.d.ts +4 -0
  78. package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
  79. package/dist/extraction/languages/c-cpp.js +171 -0
  80. package/dist/extraction/languages/c-cpp.js.map +1 -0
  81. package/dist/extraction/languages/csharp.d.ts +3 -0
  82. package/dist/extraction/languages/csharp.d.ts.map +1 -0
  83. package/dist/extraction/languages/csharp.js +73 -0
  84. package/dist/extraction/languages/csharp.js.map +1 -0
  85. package/dist/extraction/languages/dart.d.ts +3 -0
  86. package/dist/extraction/languages/dart.d.ts.map +1 -0
  87. package/dist/extraction/languages/dart.js +192 -0
  88. package/dist/extraction/languages/dart.js.map +1 -0
  89. package/dist/extraction/languages/go.d.ts +3 -0
  90. package/dist/extraction/languages/go.d.ts.map +1 -0
  91. package/dist/extraction/languages/go.js +74 -0
  92. package/dist/extraction/languages/go.js.map +1 -0
  93. package/dist/extraction/languages/index.d.ts +10 -0
  94. package/dist/extraction/languages/index.d.ts.map +1 -0
  95. package/dist/extraction/languages/index.js +51 -0
  96. package/dist/extraction/languages/index.js.map +1 -0
  97. package/dist/extraction/languages/java.d.ts +3 -0
  98. package/dist/extraction/languages/java.d.ts.map +1 -0
  99. package/dist/extraction/languages/java.js +70 -0
  100. package/dist/extraction/languages/java.js.map +1 -0
  101. package/dist/extraction/languages/javascript.d.ts +3 -0
  102. package/dist/extraction/languages/javascript.d.ts.map +1 -0
  103. package/dist/extraction/languages/javascript.js +90 -0
  104. package/dist/extraction/languages/javascript.js.map +1 -0
  105. package/dist/extraction/languages/kotlin.d.ts +3 -0
  106. package/dist/extraction/languages/kotlin.d.ts.map +1 -0
  107. package/dist/extraction/languages/kotlin.js +259 -0
  108. package/dist/extraction/languages/kotlin.js.map +1 -0
  109. package/dist/extraction/languages/lua.d.ts +3 -0
  110. package/dist/extraction/languages/lua.d.ts.map +1 -0
  111. package/dist/extraction/languages/lua.js +150 -0
  112. package/dist/extraction/languages/lua.js.map +1 -0
  113. package/dist/extraction/languages/luau.d.ts +3 -0
  114. package/dist/extraction/languages/luau.d.ts.map +1 -0
  115. package/dist/extraction/languages/luau.js +37 -0
  116. package/dist/extraction/languages/luau.js.map +1 -0
  117. package/dist/extraction/languages/objc.d.ts +3 -0
  118. package/dist/extraction/languages/objc.d.ts.map +1 -0
  119. package/dist/extraction/languages/objc.js +133 -0
  120. package/dist/extraction/languages/objc.js.map +1 -0
  121. package/dist/extraction/languages/pascal.d.ts +3 -0
  122. package/dist/extraction/languages/pascal.d.ts.map +1 -0
  123. package/dist/extraction/languages/pascal.js +66 -0
  124. package/dist/extraction/languages/pascal.js.map +1 -0
  125. package/dist/extraction/languages/php.d.ts +3 -0
  126. package/dist/extraction/languages/php.d.ts.map +1 -0
  127. package/dist/extraction/languages/php.js +107 -0
  128. package/dist/extraction/languages/php.js.map +1 -0
  129. package/dist/extraction/languages/python.d.ts +3 -0
  130. package/dist/extraction/languages/python.d.ts.map +1 -0
  131. package/dist/extraction/languages/python.js +56 -0
  132. package/dist/extraction/languages/python.js.map +1 -0
  133. package/dist/extraction/languages/ruby.d.ts +3 -0
  134. package/dist/extraction/languages/ruby.d.ts.map +1 -0
  135. package/dist/extraction/languages/ruby.js +114 -0
  136. package/dist/extraction/languages/ruby.js.map +1 -0
  137. package/dist/extraction/languages/rust.d.ts +3 -0
  138. package/dist/extraction/languages/rust.d.ts.map +1 -0
  139. package/dist/extraction/languages/rust.js +109 -0
  140. package/dist/extraction/languages/rust.js.map +1 -0
  141. package/dist/extraction/languages/scala.d.ts +3 -0
  142. package/dist/extraction/languages/scala.d.ts.map +1 -0
  143. package/dist/extraction/languages/scala.js +139 -0
  144. package/dist/extraction/languages/scala.js.map +1 -0
  145. package/dist/extraction/languages/swift.d.ts +3 -0
  146. package/dist/extraction/languages/swift.d.ts.map +1 -0
  147. package/dist/extraction/languages/swift.js +91 -0
  148. package/dist/extraction/languages/swift.js.map +1 -0
  149. package/dist/extraction/languages/typescript.d.ts +3 -0
  150. package/dist/extraction/languages/typescript.d.ts.map +1 -0
  151. package/dist/extraction/languages/typescript.js +129 -0
  152. package/dist/extraction/languages/typescript.js.map +1 -0
  153. package/dist/extraction/liquid-extractor.d.ts +52 -0
  154. package/dist/extraction/liquid-extractor.d.ts.map +1 -0
  155. package/dist/extraction/liquid-extractor.js +313 -0
  156. package/dist/extraction/liquid-extractor.js.map +1 -0
  157. package/dist/extraction/mybatis-extractor.d.ts +48 -0
  158. package/dist/extraction/mybatis-extractor.d.ts.map +1 -0
  159. package/dist/extraction/mybatis-extractor.js +198 -0
  160. package/dist/extraction/mybatis-extractor.js.map +1 -0
  161. package/dist/extraction/parse-worker.d.ts +8 -0
  162. package/dist/extraction/parse-worker.d.ts.map +1 -0
  163. package/dist/extraction/parse-worker.js +94 -0
  164. package/dist/extraction/parse-worker.js.map +1 -0
  165. package/dist/extraction/specs/markdown-spec-extractor.d.ts +59 -0
  166. package/dist/extraction/specs/markdown-spec-extractor.d.ts.map +1 -0
  167. package/dist/extraction/specs/markdown-spec-extractor.js +327 -0
  168. package/dist/extraction/specs/markdown-spec-extractor.js.map +1 -0
  169. package/dist/extraction/specs/types.d.ts +39 -0
  170. package/dist/extraction/specs/types.d.ts.map +1 -0
  171. package/dist/extraction/specs/types.js +8 -0
  172. package/dist/extraction/specs/types.js.map +1 -0
  173. package/dist/extraction/svelte-extractor.d.ts +56 -0
  174. package/dist/extraction/svelte-extractor.d.ts.map +1 -0
  175. package/dist/extraction/svelte-extractor.js +272 -0
  176. package/dist/extraction/svelte-extractor.js.map +1 -0
  177. package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
  178. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
  179. package/dist/extraction/tree-sitter-helpers.js +103 -0
  180. package/dist/extraction/tree-sitter-helpers.js.map +1 -0
  181. package/dist/extraction/tree-sitter-types.d.ts +193 -0
  182. package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
  183. package/dist/extraction/tree-sitter-types.js +10 -0
  184. package/dist/extraction/tree-sitter-types.js.map +1 -0
  185. package/dist/extraction/tree-sitter.d.ts +317 -0
  186. package/dist/extraction/tree-sitter.d.ts.map +1 -0
  187. package/dist/extraction/tree-sitter.js +3092 -0
  188. package/dist/extraction/tree-sitter.js.map +1 -0
  189. package/dist/extraction/vue-extractor.d.ts +51 -0
  190. package/dist/extraction/vue-extractor.d.ts.map +1 -0
  191. package/dist/extraction/vue-extractor.js +251 -0
  192. package/dist/extraction/vue-extractor.js.map +1 -0
  193. package/dist/extraction/wasm/tree-sitter-lua.wasm +0 -0
  194. package/dist/extraction/wasm/tree-sitter-luau.wasm +0 -0
  195. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  196. package/dist/extraction/wasm/tree-sitter-scala.wasm +0 -0
  197. package/dist/extraction/wasm-runtime-flags.d.ts +38 -0
  198. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -0
  199. package/dist/extraction/wasm-runtime-flags.js +106 -0
  200. package/dist/extraction/wasm-runtime-flags.js.map +1 -0
  201. package/dist/graph/index.d.ts +8 -0
  202. package/dist/graph/index.d.ts.map +1 -0
  203. package/dist/graph/index.js +13 -0
  204. package/dist/graph/index.js.map +1 -0
  205. package/dist/graph/queries.d.ts +106 -0
  206. package/dist/graph/queries.d.ts.map +1 -0
  207. package/dist/graph/queries.js +366 -0
  208. package/dist/graph/queries.js.map +1 -0
  209. package/dist/graph/traversal.d.ts +127 -0
  210. package/dist/graph/traversal.d.ts.map +1 -0
  211. package/dist/graph/traversal.js +531 -0
  212. package/dist/graph/traversal.js.map +1 -0
  213. package/dist/index.d.ts +551 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +1165 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/installer/config-writer.d.ts +28 -0
  218. package/dist/installer/config-writer.d.ts.map +1 -0
  219. package/dist/installer/config-writer.js +91 -0
  220. package/dist/installer/config-writer.js.map +1 -0
  221. package/dist/installer/index.d.ts +87 -0
  222. package/dist/installer/index.d.ts.map +1 -0
  223. package/dist/installer/index.js +415 -0
  224. package/dist/installer/index.js.map +1 -0
  225. package/dist/installer/instructions-template.d.ts +18 -0
  226. package/dist/installer/instructions-template.d.ts.map +1 -0
  227. package/dist/installer/instructions-template.js +21 -0
  228. package/dist/installer/instructions-template.js.map +1 -0
  229. package/dist/installer/targets/claude.d.ts +98 -0
  230. package/dist/installer/targets/claude.d.ts.map +1 -0
  231. package/dist/installer/targets/claude.js +639 -0
  232. package/dist/installer/targets/claude.js.map +1 -0
  233. package/dist/installer/targets/registry.d.ts +19 -0
  234. package/dist/installer/targets/registry.d.ts.map +1 -0
  235. package/dist/installer/targets/registry.js +31 -0
  236. package/dist/installer/targets/registry.js.map +1 -0
  237. package/dist/installer/targets/shared.d.ts +62 -0
  238. package/dist/installer/targets/shared.d.ts.map +1 -0
  239. package/dist/installer/targets/shared.js +207 -0
  240. package/dist/installer/targets/shared.js.map +1 -0
  241. package/dist/installer/targets/types.d.ts +76 -0
  242. package/dist/installer/targets/types.d.ts.map +1 -0
  243. package/dist/installer/targets/types.js +12 -0
  244. package/dist/installer/targets/types.js.map +1 -0
  245. package/dist/isolation/worktree.d.ts +65 -0
  246. package/dist/isolation/worktree.d.ts.map +1 -0
  247. package/dist/isolation/worktree.js +231 -0
  248. package/dist/isolation/worktree.js.map +1 -0
  249. package/dist/mcp/daemon-paths.d.ts +46 -0
  250. package/dist/mcp/daemon-paths.d.ts.map +1 -0
  251. package/dist/mcp/daemon-paths.js +125 -0
  252. package/dist/mcp/daemon-paths.js.map +1 -0
  253. package/dist/mcp/daemon.d.ts +161 -0
  254. package/dist/mcp/daemon.d.ts.map +1 -0
  255. package/dist/mcp/daemon.js +403 -0
  256. package/dist/mcp/daemon.js.map +1 -0
  257. package/dist/mcp/engine.d.ts +105 -0
  258. package/dist/mcp/engine.d.ts.map +1 -0
  259. package/dist/mcp/engine.js +270 -0
  260. package/dist/mcp/engine.js.map +1 -0
  261. package/dist/mcp/index.d.ts +112 -0
  262. package/dist/mcp/index.d.ts.map +1 -0
  263. package/dist/mcp/index.js +477 -0
  264. package/dist/mcp/index.js.map +1 -0
  265. package/dist/mcp/proxy.d.ts +81 -0
  266. package/dist/mcp/proxy.d.ts.map +1 -0
  267. package/dist/mcp/proxy.js +510 -0
  268. package/dist/mcp/proxy.js.map +1 -0
  269. package/dist/mcp/server-instructions.d.ts +18 -0
  270. package/dist/mcp/server-instructions.d.ts.map +1 -0
  271. package/dist/mcp/server-instructions.js +77 -0
  272. package/dist/mcp/server-instructions.js.map +1 -0
  273. package/dist/mcp/session.d.ts +77 -0
  274. package/dist/mcp/session.d.ts.map +1 -0
  275. package/dist/mcp/session.js +294 -0
  276. package/dist/mcp/session.js.map +1 -0
  277. package/dist/mcp/spec-tools.d.ts +39 -0
  278. package/dist/mcp/spec-tools.d.ts.map +1 -0
  279. package/dist/mcp/spec-tools.js +326 -0
  280. package/dist/mcp/spec-tools.js.map +1 -0
  281. package/dist/mcp/tools.d.ts +404 -0
  282. package/dist/mcp/tools.d.ts.map +1 -0
  283. package/dist/mcp/tools.js +3066 -0
  284. package/dist/mcp/tools.js.map +1 -0
  285. package/dist/mcp/transport.d.ts +188 -0
  286. package/dist/mcp/transport.d.ts.map +1 -0
  287. package/dist/mcp/transport.js +343 -0
  288. package/dist/mcp/transport.js.map +1 -0
  289. package/dist/mcp/version.d.ts +19 -0
  290. package/dist/mcp/version.d.ts.map +1 -0
  291. package/dist/mcp/version.js +71 -0
  292. package/dist/mcp/version.js.map +1 -0
  293. package/dist/resolution/callback-synthesizer.d.ts +10 -0
  294. package/dist/resolution/callback-synthesizer.d.ts.map +1 -0
  295. package/dist/resolution/callback-synthesizer.js +1300 -0
  296. package/dist/resolution/callback-synthesizer.js.map +1 -0
  297. package/dist/resolution/frameworks/cargo-workspace.d.ts +18 -0
  298. package/dist/resolution/frameworks/cargo-workspace.d.ts.map +1 -0
  299. package/dist/resolution/frameworks/cargo-workspace.js +225 -0
  300. package/dist/resolution/frameworks/cargo-workspace.js.map +1 -0
  301. package/dist/resolution/frameworks/csharp.d.ts +8 -0
  302. package/dist/resolution/frameworks/csharp.d.ts.map +1 -0
  303. package/dist/resolution/frameworks/csharp.js +241 -0
  304. package/dist/resolution/frameworks/csharp.js.map +1 -0
  305. package/dist/resolution/frameworks/drupal.d.ts +51 -0
  306. package/dist/resolution/frameworks/drupal.d.ts.map +1 -0
  307. package/dist/resolution/frameworks/drupal.js +367 -0
  308. package/dist/resolution/frameworks/drupal.js.map +1 -0
  309. package/dist/resolution/frameworks/expo-modules.d.ts +3 -0
  310. package/dist/resolution/frameworks/expo-modules.d.ts.map +1 -0
  311. package/dist/resolution/frameworks/expo-modules.js +143 -0
  312. package/dist/resolution/frameworks/expo-modules.js.map +1 -0
  313. package/dist/resolution/frameworks/express.d.ts +8 -0
  314. package/dist/resolution/frameworks/express.d.ts.map +1 -0
  315. package/dist/resolution/frameworks/express.js +308 -0
  316. package/dist/resolution/frameworks/express.js.map +1 -0
  317. package/dist/resolution/frameworks/fabric.d.ts +3 -0
  318. package/dist/resolution/frameworks/fabric.d.ts.map +1 -0
  319. package/dist/resolution/frameworks/fabric.js +354 -0
  320. package/dist/resolution/frameworks/fabric.js.map +1 -0
  321. package/dist/resolution/frameworks/go.d.ts +8 -0
  322. package/dist/resolution/frameworks/go.d.ts.map +1 -0
  323. package/dist/resolution/frameworks/go.js +161 -0
  324. package/dist/resolution/frameworks/go.js.map +1 -0
  325. package/dist/resolution/frameworks/index.d.ts +48 -0
  326. package/dist/resolution/frameworks/index.d.ts.map +1 -0
  327. package/dist/resolution/frameworks/index.js +161 -0
  328. package/dist/resolution/frameworks/index.js.map +1 -0
  329. package/dist/resolution/frameworks/java.d.ts +8 -0
  330. package/dist/resolution/frameworks/java.d.ts.map +1 -0
  331. package/dist/resolution/frameworks/java.js +504 -0
  332. package/dist/resolution/frameworks/java.js.map +1 -0
  333. package/dist/resolution/frameworks/laravel.d.ts +13 -0
  334. package/dist/resolution/frameworks/laravel.d.ts.map +1 -0
  335. package/dist/resolution/frameworks/laravel.js +257 -0
  336. package/dist/resolution/frameworks/laravel.js.map +1 -0
  337. package/dist/resolution/frameworks/nestjs.d.ts +26 -0
  338. package/dist/resolution/frameworks/nestjs.d.ts.map +1 -0
  339. package/dist/resolution/frameworks/nestjs.js +698 -0
  340. package/dist/resolution/frameworks/nestjs.js.map +1 -0
  341. package/dist/resolution/frameworks/play.d.ts +19 -0
  342. package/dist/resolution/frameworks/play.d.ts.map +1 -0
  343. package/dist/resolution/frameworks/play.js +111 -0
  344. package/dist/resolution/frameworks/play.js.map +1 -0
  345. package/dist/resolution/frameworks/python.d.ts +10 -0
  346. package/dist/resolution/frameworks/python.d.ts.map +1 -0
  347. package/dist/resolution/frameworks/python.js +396 -0
  348. package/dist/resolution/frameworks/python.js.map +1 -0
  349. package/dist/resolution/frameworks/react-native.d.ts +3 -0
  350. package/dist/resolution/frameworks/react-native.d.ts.map +1 -0
  351. package/dist/resolution/frameworks/react-native.js +360 -0
  352. package/dist/resolution/frameworks/react-native.js.map +1 -0
  353. package/dist/resolution/frameworks/react.d.ts +8 -0
  354. package/dist/resolution/frameworks/react.d.ts.map +1 -0
  355. package/dist/resolution/frameworks/react.js +365 -0
  356. package/dist/resolution/frameworks/react.js.map +1 -0
  357. package/dist/resolution/frameworks/ruby.d.ts +8 -0
  358. package/dist/resolution/frameworks/ruby.d.ts.map +1 -0
  359. package/dist/resolution/frameworks/ruby.js +302 -0
  360. package/dist/resolution/frameworks/ruby.js.map +1 -0
  361. package/dist/resolution/frameworks/rust.d.ts +8 -0
  362. package/dist/resolution/frameworks/rust.d.ts.map +1 -0
  363. package/dist/resolution/frameworks/rust.js +304 -0
  364. package/dist/resolution/frameworks/rust.js.map +1 -0
  365. package/dist/resolution/frameworks/svelte.d.ts +9 -0
  366. package/dist/resolution/frameworks/svelte.d.ts.map +1 -0
  367. package/dist/resolution/frameworks/svelte.js +249 -0
  368. package/dist/resolution/frameworks/svelte.js.map +1 -0
  369. package/dist/resolution/frameworks/swift-objc.d.ts +37 -0
  370. package/dist/resolution/frameworks/swift-objc.d.ts.map +1 -0
  371. package/dist/resolution/frameworks/swift-objc.js +252 -0
  372. package/dist/resolution/frameworks/swift-objc.js.map +1 -0
  373. package/dist/resolution/frameworks/swift.d.ts +10 -0
  374. package/dist/resolution/frameworks/swift.d.ts.map +1 -0
  375. package/dist/resolution/frameworks/swift.js +400 -0
  376. package/dist/resolution/frameworks/swift.js.map +1 -0
  377. package/dist/resolution/frameworks/vue.d.ts +9 -0
  378. package/dist/resolution/frameworks/vue.d.ts.map +1 -0
  379. package/dist/resolution/frameworks/vue.js +306 -0
  380. package/dist/resolution/frameworks/vue.js.map +1 -0
  381. package/dist/resolution/go-module.d.ts +26 -0
  382. package/dist/resolution/go-module.d.ts.map +1 -0
  383. package/dist/resolution/go-module.js +78 -0
  384. package/dist/resolution/go-module.js.map +1 -0
  385. package/dist/resolution/import-resolver.d.ts +68 -0
  386. package/dist/resolution/import-resolver.d.ts.map +1 -0
  387. package/dist/resolution/import-resolver.js +1275 -0
  388. package/dist/resolution/import-resolver.js.map +1 -0
  389. package/dist/resolution/index.d.ts +117 -0
  390. package/dist/resolution/index.d.ts.map +1 -0
  391. package/dist/resolution/index.js +895 -0
  392. package/dist/resolution/index.js.map +1 -0
  393. package/dist/resolution/lru-cache.d.ts +24 -0
  394. package/dist/resolution/lru-cache.d.ts.map +1 -0
  395. package/dist/resolution/lru-cache.js +62 -0
  396. package/dist/resolution/lru-cache.js.map +1 -0
  397. package/dist/resolution/name-matcher.d.ts +32 -0
  398. package/dist/resolution/name-matcher.d.ts.map +1 -0
  399. package/dist/resolution/name-matcher.js +596 -0
  400. package/dist/resolution/name-matcher.js.map +1 -0
  401. package/dist/resolution/path-aliases.d.ts +68 -0
  402. package/dist/resolution/path-aliases.d.ts.map +1 -0
  403. package/dist/resolution/path-aliases.js +238 -0
  404. package/dist/resolution/path-aliases.js.map +1 -0
  405. package/dist/resolution/spec-link-resolver.d.ts +103 -0
  406. package/dist/resolution/spec-link-resolver.d.ts.map +1 -0
  407. package/dist/resolution/spec-link-resolver.js +259 -0
  408. package/dist/resolution/spec-link-resolver.js.map +1 -0
  409. package/dist/resolution/strip-comments.d.ts +27 -0
  410. package/dist/resolution/strip-comments.d.ts.map +1 -0
  411. package/dist/resolution/strip-comments.js +441 -0
  412. package/dist/resolution/strip-comments.js.map +1 -0
  413. package/dist/resolution/swift-objc-bridge.d.ts +134 -0
  414. package/dist/resolution/swift-objc-bridge.d.ts.map +1 -0
  415. package/dist/resolution/swift-objc-bridge.js +256 -0
  416. package/dist/resolution/swift-objc-bridge.js.map +1 -0
  417. package/dist/resolution/types.d.ts +216 -0
  418. package/dist/resolution/types.d.ts.map +1 -0
  419. package/dist/resolution/types.js +8 -0
  420. package/dist/resolution/types.js.map +1 -0
  421. package/dist/resolution/workspace-packages.d.ts +48 -0
  422. package/dist/resolution/workspace-packages.d.ts.map +1 -0
  423. package/dist/resolution/workspace-packages.js +208 -0
  424. package/dist/resolution/workspace-packages.js.map +1 -0
  425. package/dist/search/query-parser.d.ts +57 -0
  426. package/dist/search/query-parser.d.ts.map +1 -0
  427. package/dist/search/query-parser.js +177 -0
  428. package/dist/search/query-parser.js.map +1 -0
  429. package/dist/search/query-utils.d.ts +71 -0
  430. package/dist/search/query-utils.d.ts.map +1 -0
  431. package/dist/search/query-utils.js +380 -0
  432. package/dist/search/query-utils.js.map +1 -0
  433. package/dist/server/cli.js +152 -0
  434. package/dist/server/index.js +12 -0
  435. package/dist/server/ingest/index.js +18 -0
  436. package/dist/server/ingest/ingestor.js +506 -0
  437. package/dist/server/ingest/parser.js +104 -0
  438. package/dist/server/ingest/pricing.js +78 -0
  439. package/dist/server/ingest/types.js +9 -0
  440. package/dist/server/ingest/watcher.js +77 -0
  441. package/dist/server/package.json +3 -0
  442. package/dist/server/project-registry.js +101 -0
  443. package/dist/server/routes/claude.js +868 -0
  444. package/dist/server/routes/graph.js +211 -0
  445. package/dist/server/routes/memory.js +272 -0
  446. package/dist/server/routes/projects.js +197 -0
  447. package/dist/server/routes/spec.js +265 -0
  448. package/dist/server/routes/status.js +112 -0
  449. package/dist/server/routes/workflow.js +212 -0
  450. package/dist/server/server.js +206 -0
  451. package/dist/server/static-handler.js +87 -0
  452. package/dist/sync/git-hooks.d.ts +45 -0
  453. package/dist/sync/git-hooks.d.ts.map +1 -0
  454. package/dist/sync/git-hooks.js +225 -0
  455. package/dist/sync/git-hooks.js.map +1 -0
  456. package/dist/sync/index.d.ts +19 -0
  457. package/dist/sync/index.d.ts.map +1 -0
  458. package/dist/sync/index.js +35 -0
  459. package/dist/sync/index.js.map +1 -0
  460. package/dist/sync/watch-policy.d.ts +48 -0
  461. package/dist/sync/watch-policy.d.ts.map +1 -0
  462. package/dist/sync/watch-policy.js +124 -0
  463. package/dist/sync/watch-policy.js.map +1 -0
  464. package/dist/sync/watcher.d.ts +283 -0
  465. package/dist/sync/watcher.d.ts.map +1 -0
  466. package/dist/sync/watcher.js +606 -0
  467. package/dist/sync/watcher.js.map +1 -0
  468. package/dist/sync/worktree.d.ts +54 -0
  469. package/dist/sync/worktree.d.ts.map +1 -0
  470. package/dist/sync/worktree.js +137 -0
  471. package/dist/sync/worktree.js.map +1 -0
  472. package/dist/types.d.ts +623 -0
  473. package/dist/types.d.ts.map +1 -0
  474. package/dist/types.js +108 -0
  475. package/dist/types.js.map +1 -0
  476. package/dist/ui/glyphs.d.ts +42 -0
  477. package/dist/ui/glyphs.d.ts.map +1 -0
  478. package/dist/ui/glyphs.js +78 -0
  479. package/dist/ui/glyphs.js.map +1 -0
  480. package/dist/ui/shimmer-progress.d.ts +11 -0
  481. package/dist/ui/shimmer-progress.d.ts.map +1 -0
  482. package/dist/ui/shimmer-progress.js +90 -0
  483. package/dist/ui/shimmer-progress.js.map +1 -0
  484. package/dist/ui/shimmer-worker.d.ts +2 -0
  485. package/dist/ui/shimmer-worker.d.ts.map +1 -0
  486. package/dist/ui/shimmer-worker.js +118 -0
  487. package/dist/ui/shimmer-worker.js.map +1 -0
  488. package/dist/ui/types.d.ts +17 -0
  489. package/dist/ui/types.d.ts.map +1 -0
  490. package/dist/ui/types.js +3 -0
  491. package/dist/ui/types.js.map +1 -0
  492. package/dist/utils.d.ts +205 -0
  493. package/dist/utils.d.ts.map +1 -0
  494. package/dist/utils.js +549 -0
  495. package/dist/utils.js.map +1 -0
  496. package/dist/web/chunk-2AJCHB7P.js +1 -0
  497. package/dist/web/chunk-2CPLUFCH.js +2 -0
  498. package/dist/web/chunk-2DHIGIOI.js +1 -0
  499. package/dist/web/chunk-2GBEK2GM.js +1 -0
  500. package/dist/web/chunk-2I7L37NS.js +1 -0
  501. package/dist/web/chunk-2NAWAJB5.js +1 -0
  502. package/dist/web/chunk-2OJBIPE4.js +1 -0
  503. package/dist/web/chunk-2OKMB4KX.js +2 -0
  504. package/dist/web/chunk-3E2WB6D5.js +1 -0
  505. package/dist/web/chunk-3EBFYSCH.js +2 -0
  506. package/dist/web/chunk-3QCQ4BXS.js +1 -0
  507. package/dist/web/chunk-3SEJX2BK.js +1 -0
  508. package/dist/web/chunk-42XVAQ6I.js +1 -0
  509. package/dist/web/chunk-4IMMPEYM.js +1 -0
  510. package/dist/web/chunk-4N5DWG46.js +1 -0
  511. package/dist/web/chunk-4TJQJPCZ.js +1 -0
  512. package/dist/web/chunk-4WZIHTPC.js +1 -0
  513. package/dist/web/chunk-4YVSYOSD.js +1 -0
  514. package/dist/web/chunk-5BQIOYKW.js +1 -0
  515. package/dist/web/chunk-5HGWHUJA.js +1 -0
  516. package/dist/web/chunk-5Y244R4G.js +1 -0
  517. package/dist/web/chunk-6RRDPT5Z.js +1 -0
  518. package/dist/web/chunk-6VKB2ZWM.js +1 -0
  519. package/dist/web/chunk-7DMFVTU4.js +1 -0
  520. package/dist/web/chunk-7RNS77UP.js +1 -0
  521. package/dist/web/chunk-7SMPKVEP.js +1 -0
  522. package/dist/web/chunk-AZJVTPLU.js +1 -0
  523. package/dist/web/chunk-BCZM5AXU.js +1 -0
  524. package/dist/web/chunk-BLBRMCN2.js +1 -0
  525. package/dist/web/chunk-BMIAXD2V.js +2 -0
  526. package/dist/web/chunk-BPECIDVO.js +1 -0
  527. package/dist/web/chunk-BUXWEHIY.js +1 -0
  528. package/dist/web/chunk-BYZFQSM6.js +1 -0
  529. package/dist/web/chunk-DA6SNNAF.js +1 -0
  530. package/dist/web/chunk-DLQPZWSI.css +1 -0
  531. package/dist/web/chunk-DTRN7FZR.js +1 -0
  532. package/dist/web/chunk-DYRFLPJA.js +1 -0
  533. package/dist/web/chunk-E3J3CXR5.js +1 -0
  534. package/dist/web/chunk-E44X4RH2.js +1 -0
  535. package/dist/web/chunk-E73OX2P7.js +1 -0
  536. package/dist/web/chunk-EAXRKDLV.js +1 -0
  537. package/dist/web/chunk-EBKKDHYI.js +1 -0
  538. package/dist/web/chunk-EE7V7Q5P.js +1 -0
  539. package/dist/web/chunk-EKY2FUHU.js +1 -0
  540. package/dist/web/chunk-EMGMOEVR.js +1 -0
  541. package/dist/web/chunk-EP6XOPXH.js +1 -0
  542. package/dist/web/chunk-ESGDLJOJ.js +1 -0
  543. package/dist/web/chunk-ETJG7NCY.js +1 -0
  544. package/dist/web/chunk-EUUEFEDI.js +1 -0
  545. package/dist/web/chunk-FGNZDHTL.js +11 -0
  546. package/dist/web/chunk-FIJW2UNJ.js +1 -0
  547. package/dist/web/chunk-FMV5PXRC.js +5 -0
  548. package/dist/web/chunk-G7VZT5KB.js +3 -0
  549. package/dist/web/chunk-GRZYXPSO.js +7 -0
  550. package/dist/web/chunk-GYGPS3AN.js +1 -0
  551. package/dist/web/chunk-H7AF7YS4.js +1 -0
  552. package/dist/web/chunk-HDZDQILN.js +1 -0
  553. package/dist/web/chunk-HMK6UO6N.js +1 -0
  554. package/dist/web/chunk-HZA6NEAB.js +1 -0
  555. package/dist/web/chunk-IHEE5NYJ.js +1 -0
  556. package/dist/web/chunk-ISNEBICW.js +1 -0
  557. package/dist/web/chunk-J2GZVLHH.js +1 -0
  558. package/dist/web/chunk-JFYVCXK3.js +1 -0
  559. package/dist/web/chunk-JN6W7HCN.js +17 -0
  560. package/dist/web/chunk-JT7P3DEK.js +6 -0
  561. package/dist/web/chunk-JTFXTIPE.js +903 -0
  562. package/dist/web/chunk-L37MTFSG.js +3 -0
  563. package/dist/web/chunk-LB6JPLX2.js +1 -0
  564. package/dist/web/chunk-LNSVDHCI.js +1 -0
  565. package/dist/web/chunk-LV4G6QFG.js +2 -0
  566. package/dist/web/chunk-LVGIY3SO.js +1 -0
  567. package/dist/web/chunk-LXLHIHEN.js +1 -0
  568. package/dist/web/chunk-MC4DFIHG.js +1 -0
  569. package/dist/web/chunk-MVOMVPYB.js +1 -0
  570. package/dist/web/chunk-N6SS4G6S.js +1 -0
  571. package/dist/web/chunk-NTBJG6SJ.js +1 -0
  572. package/dist/web/chunk-NUDB3Q2Y.js +3 -0
  573. package/dist/web/chunk-OXEF5E3E.js +1 -0
  574. package/dist/web/chunk-PDN6QYGJ.js +4 -0
  575. package/dist/web/chunk-PGGJPDJG.js +1 -0
  576. package/dist/web/chunk-PUYSJNJR.js +1 -0
  577. package/dist/web/chunk-Q2RVFS45.js +1 -0
  578. package/dist/web/chunk-Q7L6LLAK.js +1 -0
  579. package/dist/web/chunk-QCMKJIWY.js +1 -0
  580. package/dist/web/chunk-QH6CF3M3.js +1 -0
  581. package/dist/web/chunk-QQ5LD7PI.js +1 -0
  582. package/dist/web/chunk-QR6L3KAC.js +1 -0
  583. package/dist/web/chunk-R2DLK4HO.js +1 -0
  584. package/dist/web/chunk-R5W2MDZN.js +1 -0
  585. package/dist/web/chunk-RAAMPHPJ.js +1 -0
  586. package/dist/web/chunk-RD6TVPOT.js +1 -0
  587. package/dist/web/chunk-RKY4EJYJ.js +1 -0
  588. package/dist/web/chunk-RONYWVY7.js +1 -0
  589. package/dist/web/chunk-RXKXYF2C.js +1 -0
  590. package/dist/web/chunk-SBWU7JFC.js +1 -0
  591. package/dist/web/chunk-SEXBRGYK.js +1 -0
  592. package/dist/web/chunk-SHPTC4RL.js +1 -0
  593. package/dist/web/chunk-SUZYBYDW.js +1 -0
  594. package/dist/web/chunk-SWKJRNYY.js +1 -0
  595. package/dist/web/chunk-T66XVKGB.js +1 -0
  596. package/dist/web/chunk-T7AZ65JP.js +1 -0
  597. package/dist/web/chunk-TCZDVOHD.js +1 -0
  598. package/dist/web/chunk-TPTITA3V.js +1 -0
  599. package/dist/web/chunk-TR335633.js +1 -0
  600. package/dist/web/chunk-TWXZK6XM.js +1 -0
  601. package/dist/web/chunk-UR5KDXPX.js +1 -0
  602. package/dist/web/chunk-UR6O2GEH.js +1 -0
  603. package/dist/web/chunk-UTNMGWTP.js +1 -0
  604. package/dist/web/chunk-UYC52MBC.js +1 -0
  605. package/dist/web/chunk-VECWMHJP.js +1 -0
  606. package/dist/web/chunk-VUACT35R.js +3 -0
  607. package/dist/web/chunk-VZI7H4SZ.js +1 -0
  608. package/dist/web/chunk-WAI2JMZP.js +1 -0
  609. package/dist/web/chunk-WB6YHOD4.js +1 -0
  610. package/dist/web/chunk-WBT64AWV.js +1 -0
  611. package/dist/web/chunk-WDU3WICG.js +1 -0
  612. package/dist/web/chunk-WFXJIXZE.js +4 -0
  613. package/dist/web/chunk-WTGYRH3Z.js +298 -0
  614. package/dist/web/chunk-WXTCVDTP.js +1 -0
  615. package/dist/web/chunk-X2HTISHL.js +1 -0
  616. package/dist/web/chunk-XCDHWLVH.js +1 -0
  617. package/dist/web/chunk-Y3H6FFUZ.js +1 -0
  618. package/dist/web/chunk-Y4F5ULGJ.js +1 -0
  619. package/dist/web/chunk-YAWCRPHV.js +1 -0
  620. package/dist/web/chunk-YEGKAAEE.js +1 -0
  621. package/dist/web/chunk-YM2KU57F.js +1 -0
  622. package/dist/web/chunk-YRERBP6T.js +1 -0
  623. package/dist/web/chunk-ZLV4VCDG.js +3 -0
  624. package/dist/web/chunk-ZTVI5KFF.js +1 -0
  625. package/dist/web/favicon-16.png +0 -0
  626. package/dist/web/favicon-180.png +0 -0
  627. package/dist/web/favicon-32.png +0 -0
  628. package/dist/web/favicon-512.png +0 -0
  629. package/dist/web/favicon-small.svg +15 -0
  630. package/dist/web/favicon.ico +0 -0
  631. package/dist/web/favicon.svg +20 -0
  632. package/dist/web/index.html +145 -0
  633. package/dist/web/main-ESADRXN2.css +1 -0
  634. package/dist/web/main-WVI3YTDU.js +1 -0
  635. package/dist/web/media/codicon-LN6W7LCM.ttf +0 -0
  636. package/dist/web/styles-KSOPUVDA.css +1 -0
  637. package/dist/workflows/condition-evaluator.d.ts +75 -0
  638. package/dist/workflows/condition-evaluator.d.ts.map +1 -0
  639. package/dist/workflows/condition-evaluator.js +282 -0
  640. package/dist/workflows/condition-evaluator.js.map +1 -0
  641. package/dist/workflows/defaults/claude-design-implement.yaml +247 -0
  642. package/dist/workflows/defaults/index.d.ts +26 -0
  643. package/dist/workflows/defaults/index.d.ts.map +1 -0
  644. package/dist/workflows/defaults/index.js +94 -0
  645. package/dist/workflows/defaults/index.js.map +1 -0
  646. package/dist/workflows/defaults/spec-author.yaml +214 -0
  647. package/dist/workflows/defaults/spec-fix.yaml +110 -0
  648. package/dist/workflows/defaults/spec-implement.yaml +150 -0
  649. package/dist/workflows/defaults/spec-relink.yaml +81 -0
  650. package/dist/workflows/defaults/spec-verify.yaml +51 -0
  651. package/dist/workflows/discovery.d.ts +46 -0
  652. package/dist/workflows/discovery.d.ts.map +1 -0
  653. package/dist/workflows/discovery.js +193 -0
  654. package/dist/workflows/discovery.js.map +1 -0
  655. package/dist/workflows/executor.d.ts +83 -0
  656. package/dist/workflows/executor.d.ts.map +1 -0
  657. package/dist/workflows/executor.js +624 -0
  658. package/dist/workflows/executor.js.map +1 -0
  659. package/dist/workflows/runners/approval.d.ts +18 -0
  660. package/dist/workflows/runners/approval.d.ts.map +1 -0
  661. package/dist/workflows/runners/approval.js +34 -0
  662. package/dist/workflows/runners/approval.js.map +1 -0
  663. package/dist/workflows/runners/bash.d.ts +13 -0
  664. package/dist/workflows/runners/bash.d.ts.map +1 -0
  665. package/dist/workflows/runners/bash.js +143 -0
  666. package/dist/workflows/runners/bash.js.map +1 -0
  667. package/dist/workflows/runners/cancel.d.ts +10 -0
  668. package/dist/workflows/runners/cancel.d.ts.map +1 -0
  669. package/dist/workflows/runners/cancel.js +19 -0
  670. package/dist/workflows/runners/cancel.js.map +1 -0
  671. package/dist/workflows/runners/prompt.d.ts +28 -0
  672. package/dist/workflows/runners/prompt.d.ts.map +1 -0
  673. package/dist/workflows/runners/prompt.js +212 -0
  674. package/dist/workflows/runners/prompt.js.map +1 -0
  675. package/dist/workflows/runners/script.d.ts +17 -0
  676. package/dist/workflows/runners/script.d.ts.map +1 -0
  677. package/dist/workflows/runners/script.js +155 -0
  678. package/dist/workflows/runners/script.js.map +1 -0
  679. package/dist/workflows/runners/types.d.ts +51 -0
  680. package/dist/workflows/runners/types.d.ts.map +1 -0
  681. package/dist/workflows/runners/types.js +13 -0
  682. package/dist/workflows/runners/types.js.map +1 -0
  683. package/dist/workflows/schemas/workflow.d.ts +166 -0
  684. package/dist/workflows/schemas/workflow.d.ts.map +1 -0
  685. package/dist/workflows/schemas/workflow.js +437 -0
  686. package/dist/workflows/schemas/workflow.js.map +1 -0
  687. package/package.json +1 -1
  688. package/scripts/offline-install.sh +19 -6
  689. /package/commands/{cg-explore.md → ss-explore.md} +0 -0
  690. /package/commands/{cg-impact.md → ss-impact.md} +0 -0
  691. /package/commands/{cg-relink.md → ss-relink.md} +0 -0
  692. /package/commands/{cg-spec.md → ss-spec.md} +0 -0
  693. /package/commands/{cg-sync.md → ss-sync.md} +0 -0
  694. /package/commands/{cg-trace.md → ss-trace.md} +0 -0
@@ -0,0 +1 @@
1
+ import{a as oe}from"./chunk-R5W2MDZN.js";import{a as ie}from"./chunk-WDU3WICG.js";import{b as ae}from"./chunk-HZA6NEAB.js";import{a as ne}from"./chunk-2GBEK2GM.js";import{a as te}from"./chunk-SUZYBYDW.js";import{b as K}from"./chunk-4N5DWG46.js";import{c as J}from"./chunk-SHPTC4RL.js";import{a as Z}from"./chunk-7RNS77UP.js";import{a as Y}from"./chunk-E44X4RH2.js";import{Aa as p,Ga as y,I as N,Ia as b,Ka as c,M as h,N as v,O as f,P as C,Ta as I,Ua as R,Va as l,W as P,Wa as m,Xa as z,Za as W,bb as X,ea as o,ka as q,lb as w,qa as T,ra as g,sa as u,ua as G,va as k,wa as S,xa as x,ya as i,za as a,zb as ee}from"./chunk-PDN6QYGJ.js";import{a as A,b as U}from"./chunk-Q7L6LLAK.js";var de=()=>[1,2,3,4],pe=(t,n)=>n.node.id,L=(t,n)=>n.id;function se(t,n){t&1&&p(0,"app-pick-project-empty",0)}function ce(t,n){if(t&1){let e=y();i(0,"button",19),b("click",function(){let d=h(e).$implicit,s=c(2);return v(s.toggleFilter(d))}),p(1,"span",20),l(2),i(3,"span",21),l(4),a()()}if(t&2){let e=n.$implicit,r=c(2);I("--chip-color",r.chipColor(e)),R("is-active",r.isFilterActive(e)),o(),T("data-kind",e),o(),z(" ",r.kindLabel(e)," "),o(2),m(r.countFor(e))}}function me(t,n){t&1&&p(0,"span",12)}function ge(t,n){if(t&1){let e=y();i(0,"button",23),b("click",function(){let d=h(e).$implicit,s=c(3);return v(s.pickResult(d.node))}),p(1,"span",24),i(2,"span",25),l(3),a(),i(4,"span",26),l(5),a(),i(6,"span",27),l(7),a()()}if(t&2){let e=n.$implicit,r=c(3);o(),R("is-spec",e.node.kind==="spec")("is-route",e.node.kind==="route")("is-test",e.node.kind==="test"),o(2),m(e.node.name),o(2),m(e.node.kind),o(2),m(r.shortPath(e.node.filePath))}}function ue(t,n){if(t&1&&(i(0,"div",13),k(1,ge,8,9,"button",22,pe),a()),t&2){let e=c(2);o(),S(e.searchResults.state().data.results)}}function _e(t,n){if(t&1&&(i(0,"p",28),l(1),a()),t&2){let e=n;o(),W("",e.nodeCount.toLocaleString()," nodes \xB7 ",e.edgeCount.toLocaleString()," edges \xB7 ",e.fileCount.toLocaleString()," files")}}function xe(t,n){if(t&1&&(i(0,"div",17)(1,"h3"),l(2,"Explore the graph"),a(),i(3,"p"),l(4,"Search for a function, method or class to start. The graph renders the symbol with its callers, callees and any linked specs."),a(),g(5,_e,2,3,"p",28),a()),t&2){let e,r=c(2);o(5),u((e=r.status.state().data)?5:-1,e)}}function he(t,n){t&1&&(i(0,"div",17)(1,"p"),l(2,"Loading\u2026"),a()())}function ve(t,n){if(t&1&&(i(0,"div",17)(1,"h3"),l(2,"Couldn't load that symbol"),a(),i(3,"p"),l(4),a()()),t&2){let e=c(2);o(4),m(e.nodeDetail.state().error)}}function fe(t,n){if(t&1&&(i(0,"div",17)(1,"p"),l(2),a()()),t&2){let e=c(2);o(2),z('No match for "',e.selectedSymbol(),'".')}}function Ce(t,n){if(t&1&&(i(0,"div",32),p(1,"span",42),i(2,"span",43),l(3),a()()),t&2){let e=n.$implicit;o(),T("data-kind",e),o(2),m(e)}}function be(t,n){if(t&1){let e=y();i(0,"app-graph-canvas",29),b("nodeClick",function(d){h(e);let s=c(2);return v(s.pickFromCanvas(d))}),a(),i(1,"div",30)(2,"div",31),k(3,Ce,4,2,"div",32,G),a(),p(5,"div",33),i(6,"div",34)(7,"div",35),f(),i(8,"svg",36),p(9,"line",37),a(),C(),i(10,"span",38),l(11,"implements"),a()(),i(12,"div",35),f(),i(13,"svg",36),p(14,"line",39),a(),C(),i(15,"span",38),l(16,"tests"),a()(),i(17,"div",35),f(),i(18,"svg",36),p(19,"line",40),a(),C(),i(20,"span",38),l(21,"calls"),a()(),i(22,"div",35),f(),i(23,"svg",36),p(24,"line",41),a(),C(),i(25,"span",38),l(26,"synth"),a()()()()}if(t&2){let e=c(2);x("nodes",e.visibleNodes())("edges",e.visibleEdges())("selectedId",e.selectedDetail().id)("fitKey",e.fitKey())("hiddenIds",e.hiddenIds()),o(3),S(e.kindKeys)}}function ye(t,n){if(t&1&&(i(0,"span",50),l(1),a()),t&2){let e=c();o(),m(e.startLine?"L"+e.startLine:"")}}function ke(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Signature"),a(),i(3,"pre",61),l(4),a()()),t&2){let e=c();o(4),m(e.signature)}}function Se(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Docstring"),a(),i(3,"p",62),l(4),a()()),t&2){let e=c();o(4),m(e.docstring)}}function we(t,n){if(t&1&&(i(0,"span",67),l(1),a()),t&2){let e=c().$implicit;o(),m(e.specTitle)}}function Me(t,n){if(t&1&&(i(0,"div",64),p(1,"app-state-pill",65),i(2,"span",66),l(3),a(),g(4,we,2,1,"span",67),a()),t&2){let e=n.$implicit;o(),x("state",e.state),o(2),m(e.specId),o(),u(e.specTitle?4:-1)}}function Ee(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Linked specs "),i(3,"span",63),l(4),a()(),k(5,Me,5,3,"div",64,L),a()),t&2){let e=c();o(4),m(e.linkedSpecs.length),o(),S(e.linkedSpecs)}}function Pe(t,n){if(t&1){let e=y();i(0,"button",70),b("click",function(){let d=h(e).$implicit,s=c(5);return v(s.pickResult(d))}),p(1,"app-icon",71),i(2,"span",66),l(3),a(),i(4,"span",72),l(5),a()()}if(t&2){let e=n.$implicit,r=c(5);o(),x("size",12),o(2),m(e.name),o(2),m(r.fileName(e.filePath))}}function Oe(t,n){if(t&1&&k(0,Pe,6,3,"button",69,L),t&2){let e=c(2);S(e.callers)}}function Te(t,n){t&1&&(i(0,"div",68),l(1,"No callers"),a())}function Ge(t,n){if(t&1){let e=y();i(0,"button",70),b("click",function(){let d=h(e).$implicit,s=c(5);return v(s.pickResult(d))}),p(1,"app-icon",71),i(2,"span",66),l(3),a(),i(4,"span",72),l(5),a()()}if(t&2){let e=n.$implicit,r=c(5);o(),x("size",12),o(2),m(e.name),o(2),m(r.fileName(e.filePath))}}function Ie(t,n){if(t&1&&k(0,Ge,6,3,"button",69,L),t&2){let e=c(2);S(e.callees)}}function ze(t,n){t&1&&(i(0,"div",68),l(1,"No callees"),a())}function Ke(t,n){if(t&1&&(i(0,"div",58)(1,"div",60),l(2,"Callers "),i(3,"span",63),l(4),a()(),g(5,Oe,2,0)(6,Te,2,0,"div",68),a(),i(7,"div",58)(8,"div",60),l(9,"Callees "),i(10,"span",63),l(11),a()(),g(12,Ie,2,0)(13,ze,2,0,"div",68),a()),t&2){let e=c();o(4),m(e.callers.length),o(),u(e.callers.length?5:6),o(6),m(e.callees.length),o(),u(e.callees.length?12:13)}}function De(t,n){if(t&1){let e=y();i(0,"button",73),p(1,"app-icon",74),l(2," Implement "),a(),i(3,"button",14),b("click",function(){h(e);let d=c(3);return v(d.navigateToDrift())}),l(4,"Fix"),a(),i(5,"button",75),l(6,"Relink"),a()}t&2&&(o(),x("size",13))}function Ve(t,n){if(t&1){let e=y();i(0,"button",73),p(1,"app-icon",76),l(2," Reveal in editor "),a(),i(3,"button",14),b("click",function(){h(e);let d=c(3);return v(d.navigateToSpecs())}),l(4,"Open Specs"),a()}t&2&&(o(),x("size",13))}function Ne(t,n){if(t&1){let e=y();i(0,"div",44)(1,"div",45),p(2,"span",46),i(3,"div",47)(4,"div",48),l(5),a(),i(6,"div",49)(7,"span",50),l(8),a(),g(9,ye,2,1,"span",50),a()(),i(10,"button",51),b("click",function(){h(e);let d=c(2);return v(d.clearSelection())}),p(11,"app-icon",52),a()(),i(12,"div",53),p(13,"app-icon",54),i(14,"span",55),l(15),a(),p(16,"app-copy-btn",56),a()(),i(17,"div",57),g(18,ke,5,1,"div",58),g(19,Se,5,1,"div",58),g(20,Ee,7,1,"div",58),g(21,Ke,14,4),a(),i(22,"div",59),g(23,De,7,1)(24,Ve,5,1),a()}if(t&2){let e=n,r=e.kind==="spec",d=c(2).detailColor(e);o(2),I("background",d)("box-shadow","0 0 8px "+d),R("is-rect",r),o(3),m(e.name),o(2),I("color",d)("background","color-mix(in srgb, "+d+" 14%, transparent)"),o(),m(e.kind),o(),u(e.signature?9:-1),o(2),x("size",14),o(2),x("size",12),o(2),m(e.filePath),o(),x("text",e.filePath),o(2),u(e.signature?18:-1),o(),u(e.docstring?19:-1),o(),u(e.linkedSpecs&&e.linkedSpecs.length?20:-1),o(),u(r?-1:21),o(2),u(r?23:24)}}function Re(t,n){t&1&&(i(0,"span",81),l(1),a()),t&2&&(o(),z("",n.nodeCount.toLocaleString()," shown"))}function Le(t,n){if(t&1&&(i(0,"div",84),p(1,"span",86),i(2,"span",87),l(3),a(),i(4,"span",88),l(5),a()()),t&2){let e=n.$implicit,r=c(3);o(),T("data-kind",e),o(2),m(e),o(2),m(r.overviewKindCounts()[e])}}function Fe(t,n){t&1&&(i(0,"div",85),p(1,"app-state-pill",89)(2,"span",90)(3,"app-state-pill",91)(4,"span",90)(5,"app-state-pill",92)(6,"span",90),a())}function He(t,n){if(t&1&&(i(0,"div",85),p(1,"app-state-pill",89),i(2,"span",93),l(3),a(),p(4,"app-state-pill",91),i(5,"span",93),l(6),a(),p(7,"app-state-pill",92),i(8,"span",93),l(9),a()()),t&2){let e,r,d,s=c(3);o(3),m(((e=s.health.state().data)==null||e.linkHealth==null?null:e.linkHealth.verified)??0),o(3),m(((r=s.health.state().data)==null||r.linkHealth==null?null:r.linkHealth.drifted)??0),o(3),m((((d=s.health.state().data)==null||d.linkHealth==null?null:d.linkHealth.broken)??0)+(((d=s.health.state().data)==null||d.linkHealth==null?null:d.linkHealth.orphaned)??0))}}function $e(t,n){t&1&&(i(0,"div",94),f(),i(1,"svg",95),p(2,"line",96),a(),C(),p(3,"span",97),a(),i(4,"div",94),f(),i(5,"svg",95),p(6,"line",98),a(),C(),p(7,"span",97),a(),i(8,"div",94),f(),i(9,"svg",95),p(10,"line",99),a(),C(),p(11,"span",97),a(),i(12,"div",94),f(),i(13,"svg",95),p(14,"line",100),a(),C(),p(15,"span",97),a())}function je(t,n){if(t&1&&(i(0,"div",94),f(),i(1,"svg",95),p(2,"line",96),a(),C(),i(3,"span",101),l(4,"calls"),a(),i(5,"span",102),l(6),a()(),i(7,"div",94),f(),i(8,"svg",95),p(9,"line",98),a(),C(),i(10,"span",101),l(11,"implements / documents"),a(),i(12,"span",102),l(13),a()(),i(14,"div",94),f(),i(15,"svg",95),p(16,"line",99),a(),C(),i(17,"span",101),l(18,"tests"),a(),i(19,"span",102),l(20),a()(),i(21,"div",94),f(),i(22,"svg",95),p(23,"line",100),a(),C(),i(24,"span",101),l(25,"synthesized (heuristic)"),a(),i(26,"span",102),l(27),a()()),t&2){let e,r,d,s,M=c(3);o(6),m(((e=M.health.state().data)==null||e.edgeKinds==null?null:e.edgeKinds.calls)??0),o(7),m(((r=M.health.state().data)==null||r.edgeKinds==null?null:r.edgeKinds.implements)??0),o(7),m(((d=M.health.state().data)==null||d.edgeKinds==null?null:d.edgeKinds.tests)??0),o(7),m(((s=M.health.state().data)==null||s.edgeKinds==null?null:s.edgeKinds.synth)??0)}}function Be(t,n){t&1&&(i(0,"div",103),p(1,"span",104)(2,"span",105),a())}function Qe(t,n){t&1&&(i(0,"div",83)(1,"div",60),l(2,"Most connected"),a(),k(3,Be,3,0,"div",103,G),a()),t&2&&(o(3),S(X(0,de)))}function Ae(t,n){if(t&1){let e=y();i(0,"button",107),b("click",function(){let d=h(e).$implicit,s=c(4);return v(s.pickHub(d))}),p(1,"span",108),i(2,"span",109),l(3),a(),i(4,"span",110),l(5),a(),p(6,"app-icon",111),a()}if(t&2){let e=n.$implicit,r=c(4);T("aria-label",e.name+", "+e.degree+" edges"),o(),I("background",r.nodeColor(e.kind))("border-radius",e.kind==="spec"?"2px":"50%"),o(2),m(e.name),o(2),z("",e.degree," edges"),o(),x("size",11)}}function Ue(t,n){if(t&1&&(i(0,"div",83)(1,"div",60),l(2,"Most connected"),a(),k(3,Ae,7,8,"button",106,L),a()),t&2){let e=c(3);o(3),S(e.health.state().data.hubs.slice(0,8))}}function qe(t,n){if(t&1&&(i(0,"div",77),p(1,"app-icon",78),i(2,"span",79),l(3,"Graph overview"),a(),p(4,"div",80),g(5,Re,2,1,"span",81),a(),i(6,"div",57)(7,"p",82),l(8," Click any node to inspect its signature, links, callers and callees \u2014 without leaving this view. "),a(),i(9,"div",83)(10,"div",60),l(11,"Nodes by kind"),a(),k(12,Le,6,3,"div",84,G),a(),i(14,"div",83)(15,"div",60),l(16,"Spec link health"),a(),g(17,Fe,7,0,"div",85)(18,He,10,3,"div",85),a(),i(19,"div",83)(20,"div",60),l(21,"Edge types"),a(),g(22,$e,16,0)(23,je,28,4),a(),g(24,Qe,5,1,"div",83)(25,Ue,5,0,"div",83),a()),t&2){let e,r,d,s=c(2);o(),x("size",15),o(4),u((e=s.status.state().data)?5:-1,e),o(7),S(s.kindKeys),o(5),u(s.health.state().loading?17:18),o(5),u(s.health.state().loading?22:(r=s.health.state().data)!=null&&r.edgeKinds?23:-1),o(2),u(s.health.state().loading?24:!((d=s.health.state().data)==null||d.hubs==null)&&d.hubs.length?25:-1)}}function We(t,n){if(t&1){let e=y();i(0,"div",1)(1,"div",2)(2,"div",3)(3,"app-segmented",4),b("change",function(d){h(e);let s=c();return v(s.onLayoutChange(d))}),a(),p(4,"div",5),k(5,ce,5,7,"button",6,G),p(7,"div",7),i(8,"div",8)(9,"div",9),p(10,"app-icon",10),i(11,"input",11),b("input",function(d){h(e);let s=c();return v(s.onSearchInput(d.target.value))}),a(),g(12,me,1,0,"span",12),a(),g(13,ue,3,0,"div",13),a(),i(14,"button",14),b("click",function(){h(e);let d=c();return v(d.recenter())}),p(15,"app-icon",15),l(16," Recenter "),a()(),i(17,"div",16),g(18,xe,6,1,"div",17)(19,he,3,0,"div",17)(20,ve,5,1,"div",17)(21,fe,3,1,"div",17)(22,be,27,5),a()(),i(23,"aside",18),g(24,Ne,25,22)(25,qe,26,5),a()()}if(t&2){let e,r=c();o(3),x("options",r.layoutOptions)("value",r.layoutMode()),o(2),S(r.kindKeys),o(5),x("size",13),o(),x("value",r.searchInput()),o(),u(r.searchResults.state().loading?12:-1),o(),u(r.searchResults.state().data&&r.searchResults.state().data.results.length>0?13:-1),o(2),x("size",13),o(3),u(r.selectedSymbol()?r.nodeDetail.state().loading?19:r.nodeDetail.state().error?20:r.selectedDetail()?22:21:18),o(6),u((e=r.selectedDetail())?24:25,e)}}var re=class t{api=N(Y);projects=N(Z);router=N(J);status=K(this.api,()=>`/api/status${this.projects.projectQuery()}`);health=K(this.api,()=>`/api/graph/health${this.projects.projectQuery()}`);layoutMode=P("hierarchical");layoutOptions=[{value:"hierarchical",label:"Hierarchical"},{value:"force",label:"Force"},{value:"anchored",label:"Anchored"}];searchInput=P("");searchQuery=P("");searchDebounce=null;searchResults=K(this.api,()=>{let n=this.searchQuery().trim();return n.length>=2?`/api/graph/search?q=${encodeURIComponent(n)}&limit=12${this.projects.projectQuery("&")}`:null});selectedSymbol=P(null);nodeDetail=K(this.api,()=>{let n=this.selectedSymbol();return n?`/api/graph/node?symbol=${encodeURIComponent(n)}${this.projects.projectQuery("&")}`:null});selectedDetail=w(()=>this.nodeDetail.state().data?.matches?.[0]??null);filters=P({code:!0,spec:!0,route:!0,test:!0});fitKey=P(0);canvasData=w(()=>{let n=this.selectedDetail();if(!n)return{nodes:[],edges:[]};let e=this.filters(),r=_=>{let E=F(_);return e[E]},d={id:n.id,label:n.name,sub:H(n.filePath),kind:n.kind,x:0,y:0},s=(n.callers??[]).filter(_=>r(_.kind)),M=(n.callees??[]).filter(_=>r(_.kind)),$=(n.linkedSpecs??[]).filter(()=>e.spec),j=280,B=56,D=[d],V=[];return s.forEach((_,E)=>{let O=(E-(s.length-1)/2)*B;D.push(le(_,-j,O)),V.push({from:_.id,to:n.id,kind:"calls"})}),M.forEach((_,E)=>{let O=(E-(M.length-1)/2)*B;D.push(le(_,j,O)),V.push({from:n.id,to:_.id,kind:"calls"})}),$.forEach((_,E)=>{let O=(E-($.length-1)/2)*220,Q="spec:"+_.specId;D.push({id:Q,label:_.specId,sub:_.specTitle??void 0,kind:"spec",state:_.state,x:O,y:-160}),V.push({from:Q,to:n.id,kind:"implements"})}),{nodes:D,edges:V}});visibleNodes=w(()=>this.canvasData().nodes);visibleEdges=w(()=>this.canvasData().edges);hiddenIds=w(()=>{let n=this.filters(),e=new Set;for(let r of this.canvasData().nodes)n[F(r.kind)]||e.add(r.id);return e});kindCounts=w(()=>{let n={code:0,spec:0,route:0,test:0};for(let e of this.canvasData().nodes)n[F(e.kind)]++;return n});overviewKindCounts=w(()=>{let n=this.status.state().data;if(!n?.nodesByKind)return{code:0,spec:0,route:0,test:0};let e=n.nodesByKind;return{code:(e.function??0)+(e.method??0)+(e.class??0)+(e.variable??0)+(e.constant??0)+(e.type_alias??0)+(e.interface??0)+(e.struct??0)+(e.enum??0)+(e.property??0)+(e.field??0)+(e.file??0)+(e.module??0)+(e.namespace??0)+(e.component??0),spec:e.spec??0,route:e.route??0,test:e.test??0}});kindKeys=["code","spec","route","test"];isFilterActive(n){return this.filters()[n]}countFor(n){return this.kindCounts()[n]}chipColor(n){switch(n){case"spec":return"var(--node-spec)";case"route":return"var(--node-route)";case"test":return"var(--node-test)";default:return"var(--node-code)"}}onSearchInput(n){this.searchInput.set(n),this.searchDebounce&&clearTimeout(this.searchDebounce),this.searchDebounce=setTimeout(()=>this.searchQuery.set(n),180)}pickResult(n){this.searchInput.set(n.name),this.searchQuery.set(""),this.selectedSymbol.set(n.name)}pickFromCanvas(n){let e=this.selectedDetail();if(!e||n===e.id)return;let d=[...e.callers??[],...e.callees??[]].find(s=>s.id===n);d&&(this.selectedSymbol.set(d.name),this.fitKey.update(s=>s+1))}toggleFilter(n){this.filters.update(e=>U(A({},e),{[n]:!e[n]})),this.fitKey.update(e=>e+1)}recenter(){this.fitKey.update(n=>n+1)}clearSelection(){this.selectedSymbol.set(null),this.searchInput.set("")}onLayoutChange(n){this.layoutMode.set(n),this.fitKey.update(e=>e+1)}shortPath(n){return H(n)}fileName(n){return n?n.split("/").pop()??"":""}kindLabel(n){return n.charAt(0).toUpperCase()+n.slice(1)}navigateToSpecs(){this.router.navigate(["/specs"])}navigateToDrift(){this.router.navigate(["/drift"])}nodeColor(n){return n==="spec"?"var(--node-spec)":n==="route"?"var(--node-route)":n==="test"?"var(--node-test)":"var(--node-code)"}pickHub(n){this.selectedSymbol.set(n.name),this.fitKey.update(e=>e+1)}detailColor(n){if(n.kind==="spec"){let e=n.linkedSpecs??[],r=e.some(s=>s.state==="broken"||s.state==="orphaned"),d=!r&&e.some(s=>s.state==="drifted");return r?"var(--error)":d?"var(--warn)":"var(--node-spec)"}return n.kind==="test"?"var(--node-test)":n.kind==="route"?"var(--node-route)":"var(--node-code)"}static \u0275fac=function(e){return new(e||t)};static \u0275cmp=q({type:t,selectors:[["app-graph"]],decls:2,vars:1,consts:[["surface","The graph"],[1,"gp-root"],[1,"gp-main"],[1,"gp-toolbar"],["size","sm",3,"change","options","value"],[1,"gp-divider"],["type","button",1,"gp-chip",3,"is-active","--chip-color"],[1,"gp-spacer"],[1,"gp-search"],[1,"gp-search-inner"],["name","search",1,"gp-search-icon",3,"size"],["type","text","placeholder","Fuzzy symbol search\u2026","aria-label","Symbol search",3,"input","value"],["aria-hidden","true",1,"gp-spinner"],["role","listbox",1,"gp-results"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","recenter",3,"size"],[1,"gp-canvas-wrap"],[1,"gp-empty"],[1,"gp-panel"],["type","button",1,"gp-chip",3,"click"],[1,"gp-chip-dot"],[1,"gp-chip-count"],["type","button",1,"gp-result"],["type","button",1,"gp-result",3,"click"],[1,"gp-result-dot"],[1,"gp-result-name","mono"],[1,"gp-result-kind"],[1,"gp-result-path","mono"],[1,"gp-stats"],[3,"nodeClick","nodes","edges","selectedId","fitKey","hiddenIds"],[1,"gp-legend"],[1,"gp-legend-kinds"],[1,"gp-legend-item"],[1,"gp-legend-sep"],[1,"gp-legend-edges"],[1,"gp-legend-edge-row"],["width","16","height","8"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--node-spec)","stroke-width","1.6"],[1,"secondary"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--node-test)","stroke-width","1.6"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--text-muted)","stroke-width","1.6"],["x1","0","y1","4","x2","16","y2","4","stroke","var(--text-muted)","stroke-width","1.6","stroke-dasharray","4 3"],[1,"gp-legend-dot"],[1,"secondary",2,"text-transform","capitalize"],[1,"gp-panel-header"],[1,"gp-panel-header-inner"],[1,"gp-node-dot"],[1,"grow",2,"min-width","0"],[1,"mono","gp-panel-name"],[1,"row","gap-6",2,"margin-top","3px"],[1,"pill"],["type","button","aria-label","Close panel",1,"btn","btn-ghost","btn-xs",3,"click"],["name","x",3,"size"],[1,"gp-panel-path","row","gap-6"],["name","folder",2,"color","var(--text-muted)","flex-shrink","0",3,"size"],[1,"mono","secondary","gp-path-text"],[3,"text"],[1,"gp-panel-body","scroll-y"],[1,"gp-section"],[1,"gp-panel-footer"],[1,"eyebrow","gp-eyebrow"],[1,"gp-code","mono"],[1,"secondary",2,"font-size","12px","line-height","1.6","margin","0"],[1,"muted",2,"font-weight","400","margin-left","5px"],[1,"gp-link-row"],[3,"state"],[1,"mono","grow","gp-link-text"],[1,"muted",2,"font-size","10px","flex-shrink","0","overflow","hidden","text-overflow","ellipsis","white-space","nowrap","max-width","120px"],[1,"muted",2,"font-size","12px","padding","4px 8px"],["type","button",1,"gp-node-link"],["type","button",1,"gp-node-link",3,"click"],["name","box",2,"color","var(--node-code)","flex-shrink","0",3,"size"],[1,"mono","muted","gp-link-file"],["type","button",1,"btn","btn-primary","btn-sm","grow",2,"justify-content","center"],["name","play",3,"size"],["type","button",1,"btn","btn-secondary","btn-sm"],["name","reveal",3,"size"],[1,"gp-panel-header","gp-overview-head"],["name","graph",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","13.5px"],[1,"grow"],[1,"mono","muted",2,"font-size","11px"],[1,"secondary",2,"font-size","12px","line-height","1.55","margin","0 0 18px"],[1,"gp-section-plain"],[1,"gp-kind-row"],[1,"row","gap-6",2,"flex-wrap","wrap","align-items","center"],[1,"gp-kind-dot"],[1,"grow",2,"font-size","12.5px","text-transform","capitalize"],[1,"mono","tabular",2,"font-size","12.5px","font-weight","600"],["state","verified"],["aria-hidden","true",1,"gp-skel","gp-skel-sm"],["state","drifted"],["state","broken"],[1,"mono","tabular","muted",2,"font-size","11px","align-self","center"],[1,"gp-edge-row"],["width","20","height","8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--text-muted)","stroke-width","1.8"],["aria-hidden","true",1,"gp-skel","gp-skel-lg"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--node-spec)","stroke-width","1.8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--node-test)","stroke-width","1.8"],["x1","0","y1","4","x2","20","y2","4","stroke","var(--text-muted)","stroke-width","1.8","stroke-dasharray","4 3"],[1,"grow","secondary",2,"font-size","12px"],[1,"mono","tabular","muted",2,"font-size","11px"],["aria-hidden","true",1,"gp-hub-row"],[1,"gp-hub-dot","gp-skel-dot"],["aria-hidden","true",1,"gp-skel","gp-skel-hub"],["type","button",1,"gp-hub-row"],["type","button",1,"gp-hub-row",3,"click"],[1,"gp-hub-dot"],[1,"mono","grow","gp-hub-name"],[1,"muted","gp-hub-degree"],["name","chevron-right",2,"color","var(--text-muted)","flex-shrink","0",3,"size"]],template:function(e,r){e&1&&g(0,se,1,0,"app-pick-project-empty",0)(1,We,26,9,"div",1),e&2&&u(r.status.state().noProject?0:1)},dependencies:[ne,ie,ee,te,ae,oe],styles:["[_nghost-%COMP%]{display:contents}.gp-root[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0;min-width:0}.gp-main[_ngcontent-%COMP%]{flex:1;min-width:0;display:flex;flex-direction:column}.gp-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px solid var(--border-subtle);background:var(--bg-panel-2, var(--bg-panel));flex-wrap:wrap;flex-shrink:0}.gp-divider[_ngcontent-%COMP%]{width:1px;height:20px;background:var(--border-subtle);flex-shrink:0}.gp-chip[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;height:26px;padding:0 10px;border-radius:999px;font-size:11.5px;font-weight:500;cursor:pointer;border:1px solid var(--border-subtle);background:var(--bg-panel);color:var(--text-secondary);transition:all .1s}.gp-chip.is-active[_ngcontent-%COMP%]{border-color:transparent;background:color-mix(in srgb,var(--chip-color, var(--accent)) 22%,var(--bg-panel));color:var(--chip-color, var(--accent))}.gp-chip-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%}.gp-chip-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code)}.gp-chip-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-chip-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route)}.gp-chip-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test)}.gp-chip-count[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);font-variant-numeric:tabular-nums}.gp-spacer[_ngcontent-%COMP%]{flex:1}.gp-search[_ngcontent-%COMP%]{position:relative;flex-shrink:0}.gp-search-inner[_ngcontent-%COMP%]{display:flex;align-items:center;gap:6px;height:28px;padding:0 10px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;width:220px}.gp-search-inner[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{flex:1;background:transparent;border:none;outline:none;color:var(--text-primary);font-size:12px;font-family:var(--font-mono)}.gp-search-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.gp-spinner[_ngcontent-%COMP%]{width:12px;height:12px;border:2px solid var(--border-subtle);border-top-color:var(--accent);border-radius:50%;animation:_ngcontent-%COMP%_gp-spin .7s linear infinite;flex-shrink:0}@keyframes _ngcontent-%COMP%_gp-spin{to{transform:rotate(360deg)}}.gp-results[_ngcontent-%COMP%]{position:absolute;top:32px;left:0;right:0;background:var(--bg-elevated);border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow-pop, 0 12px 28px rgba(0, 0, 0, .5));padding:5px;z-index:30;max-height:320px;overflow-y:auto}.gp-result[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border-radius:5px;background:transparent;border:none;cursor:pointer;font:inherit;color:var(--text-primary);text-align:left}.gp-result[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-result-dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%;background:var(--node-code);flex-shrink:0}.gp-result-dot.is-spec[_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-result-dot.is-route[_ngcontent-%COMP%]{background:var(--node-route)}.gp-result-dot.is-test[_ngcontent-%COMP%]{background:var(--node-test)}.gp-result-name[_ngcontent-%COMP%]{font-size:12px;flex-shrink:0}.gp-result-kind[_ngcontent-%COMP%]{font-size:10px;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted)}.gp-result-path[_ngcontent-%COMP%]{flex:1;text-align:right;font-size:10px;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-canvas-wrap[_ngcontent-%COMP%]{flex:1;min-height:0;position:relative;display:flex}.gp-canvas-wrap[_ngcontent-%COMP%] app-graph-canvas[_ngcontent-%COMP%]{flex:1;min-height:0}.gp-empty[_ngcontent-%COMP%]{flex:1;display:grid;place-items:center;text-align:center;padding:60px 24px;background:var(--bg-canvas-2, var(--bg-canvas))}.gp-empty[_ngcontent-%COMP%] h3[_ngcontent-%COMP%]{font-size:18px;font-weight:600;margin:0 0 8px}.gp-empty[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:13.5px;line-height:1.6;margin:0;max-width:520px}.gp-stats[_ngcontent-%COMP%]{margin-top:18px!important;font-family:var(--font-mono);font-size:11.5px!important;color:var(--text-muted)!important}.gp-legend[_ngcontent-%COMP%]{position:absolute;top:14px;left:14px;display:flex;align-items:center;gap:12px;flex-wrap:wrap;max-width:70%;background:color-mix(in srgb,var(--bg-panel) 86%,transparent);border:1px solid var(--border-subtle);border-radius:8px;padding:6px 10px;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);font-size:11px;pointer-events:none;z-index:3}.gp-legend-kinds[_ngcontent-%COMP%]{display:flex;align-items:center;gap:12px}.gp-legend-item[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.gp-legend-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.gp-legend-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code)}.gp-legend-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px}.gp-legend-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route)}.gp-legend-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test)}.gp-legend-sep[_ngcontent-%COMP%]{width:1px;height:16px;background:var(--border-subtle);flex-shrink:0}.gp-legend-edges[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.gp-legend-edge-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:4px}.gp-panel[_ngcontent-%COMP%]{width:360px;flex-shrink:0;border-left:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;overflow:hidden}.gp-panel-header[_ngcontent-%COMP%]{padding:12px 14px;border-bottom:1px solid var(--border-subtle);flex-shrink:0}.gp-panel-header-inner[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:8px}.gp-overview-head[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px}.gp-node-dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;flex-shrink:0;margin-top:5px}.gp-node-dot.is-rect[_ngcontent-%COMP%]{border-radius:2px}.gp-panel-name[_ngcontent-%COMP%]{font-size:14px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-panel-path[_ngcontent-%COMP%]{margin-top:8px;font-size:11.5px;color:var(--text-secondary)}.gp-path-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1}.gp-panel-body[_ngcontent-%COMP%]{flex:1;padding:14px;overflow-y:auto;display:flex;flex-direction:column;gap:18px}.gp-section[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:4px}.gp-section-plain[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px}.gp-eyebrow[_ngcontent-%COMP%]{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-muted);margin-bottom:6px}.gp-code[_ngcontent-%COMP%]{margin:0;font-size:11.5px;line-height:1.6;color:var(--text-secondary);background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:7px;padding:10px;overflow-x:auto;white-space:pre-wrap;word-break:break-word}.gp-link-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;border:1px solid var(--border-subtle);margin-bottom:5px;font-size:11.5px}.gp-link-text[_ngcontent-%COMP%]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px}.gp-node-link[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;border-radius:6px;border:none;background:transparent;cursor:pointer;font:inherit;color:inherit;text-align:left;font-size:12px}.gp-node-link[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-link-file[_ngcontent-%COMP%]{font-size:10px;flex-shrink:0}.gp-edge-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:4px 0}.gp-kind-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:5px 0}.gp-kind-dot[_ngcontent-%COMP%]{width:9px;height:9px;border-radius:50%;flex-shrink:0}.gp-kind-dot[data-kind=code][_ngcontent-%COMP%]{background:var(--node-code);box-shadow:0 0 6px var(--node-code)}.gp-kind-dot[data-kind=spec][_ngcontent-%COMP%]{background:var(--node-spec);border-radius:2px;box-shadow:0 0 6px var(--node-spec)}.gp-kind-dot[data-kind=route][_ngcontent-%COMP%]{background:var(--node-route);box-shadow:0 0 6px var(--node-route)}.gp-kind-dot[data-kind=test][_ngcontent-%COMP%]{background:var(--node-test);box-shadow:0 0 6px var(--node-test)}.gp-panel-footer[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px 14px;border-top:1px solid var(--border-subtle);flex-shrink:0}.gp-hub-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;border-radius:6px;border:none;background:transparent;cursor:pointer;font:inherit;color:inherit;text-align:left}.gp-hub-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.gp-hub-dot[_ngcontent-%COMP%]{width:8px;height:8px;flex-shrink:0}.gp-hub-name[_ngcontent-%COMP%]{font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.gp-hub-degree[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);flex-shrink:0;font-variant-numeric:tabular-nums}@keyframes _ngcontent-%COMP%_gp-skel-pulse{0%,to{opacity:.35}50%{opacity:.7}}.gp-skel[_ngcontent-%COMP%]{display:inline-block;background:var(--border-subtle);border-radius:4px;animation:_ngcontent-%COMP%_gp-skel-pulse 1.4s ease-in-out infinite}.gp-skel-sm[_ngcontent-%COMP%]{width:24px;height:12px}.gp-skel-lg[_ngcontent-%COMP%]{width:80px;height:12px;flex:1}.gp-skel-hub[_ngcontent-%COMP%]{width:120px;height:12px;flex:1}.gp-skel-dot[_ngcontent-%COMP%]{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:var(--border-subtle);animation:_ngcontent-%COMP%_gp-skel-pulse 1.4s ease-in-out infinite}.grow[_ngcontent-%COMP%]{flex:1}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.mono[_ngcontent-%COMP%]{font-family:var(--font-mono)}"],changeDetection:0})};function le(t,n,e){return{id:t.id,label:t.name,sub:H(t.filePath),kind:t.kind,x:n,y:e}}function H(t){return t?t.split("/").slice(-2).join("/"):""}function F(t){return t==="spec"?"spec":t==="route"?"route":t==="test"?"test":"code"}export{re as Graph};
@@ -0,0 +1,17 @@
1
+ import{a as j}from"./chunk-G7VZT5KB.js";import{a as G}from"./chunk-R5W2MDZN.js";import{b as V}from"./chunk-4N5DWG46.js";import{a as H}from"./chunk-7RNS77UP.js";import{a as $}from"./chunk-E44X4RH2.js";import{Aa as c,Ga as E,I as z,Ia as P,Ka as m,M as w,N as k,Ta as _,Ua as S,Va as l,W as T,Wa as p,X as A,Xa as y,aa as I,bb as R,ea as o,ka as B,lb as u,qa as M,ra as x,sa as v,ua as N,va as C,wa as h,xa as d,ya as i,yb as U,za as r,zb as K}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";var J=()=>[1,2,3,4,5],Y=(n,t)=>t.key,F=(n,t)=>t.id;function X(n,t){n&1&&(i(0,"span",20),c(1,"span",33),l(2," Seed "),r())}function W(n,t){n&1&&(i(0,"span",21),c(1,"span",33),l(2," Live "),r())}function Z(n,t){if(n&1){let e=E();i(0,"div",24),c(1,"app-icon",34),i(2,"div",35)(3,"div",5),l(4,"Couldn't load memory"),r(),i(5,"div",36),l(6),r()(),i(7,"button",37),P("click",function(){w(e);let s=m();return k(s.reload())}),l(8,"Retry"),r()()}n&2&&(o(),d("size",16),o(5),p(t))}function ee(n,t){n&1&&(i(0,"div",25),c(1,"app-icon",38),i(2,"div",35)(3,"div",5),l(4,"No project selected"),r(),i(5,"div",36),l(6,"Pick a project from the top bar to see its CLAUDE.md hierarchy and saved notes."),r()()()),n&2&&(o(),d("size",16))}function te(n,t){n&1&&(i(0,"div",26),c(1,"app-icon",38),i(2,"div",35)(3,"div",5),l(4,"Showing example memory"),r(),i(5,"div",36),l(6,"The selected project has no CLAUDE.md or saved notes yet. The cards below illustrate what real data would look like."),r()()()),n&2&&(o(),d("size",16))}function ne(n,t){if(n&1&&c(0,"span",33),n&2){let e=m().$implicit;_("background",e.color)}}function oe(n,t){if(n&1&&(i(0,"span",41),l(1),r()),n&2){let e=m().$implicit;o(),p(e.count)}}function ie(n,t){if(n&1){let e=E();i(0,"button",39),P("click",function(){let s=w(e).$implicit,g=m();return k(g.onTypeFilter(s.key))}),x(1,ne,1,2,"span",40),l(2),x(3,oe,2,1,"span",41),r()}if(n&2){let e=t.$implicit,a=m();_("--chip-color",e.color)("--chip-bg",e.soft),S("active",a.typeFilter()===e.key),M("aria-pressed",a.typeFilter()===e.key),o(),v(e.key!=="all"?1:-1),o(),y(" ",e.label," "),o(),v(e.count!==void 0?3:-1)}}function re(n,t){if(n&1&&(i(0,"span",30),l(1),r()),n&2){let e=m();o(),p(e.typeDesc())}}function ae(n,t){n&1&&(i(0,"div",48),c(1,"div",49),i(2,"div",50),c(3,"div",51)(4,"div",52),r(),c(5,"div",53),r())}function le(n,t){n&1&&C(0,ae,6,0,"div",48,N),n&2&&h(R(0,J))}function ce(n,t){if(n&1){let e=E();i(0,"button",37),P("click",function(){w(e);let s=m(3);return k(s.clearFilter())}),l(1,"Show all types"),r()}}function de(n,t){if(n&1&&(i(0,"div",44)(1,"div",54),l(2,"Nothing here"),r(),i(3,"div"),l(4),r(),x(5,ce,2,0,"button",55),r()),n&2){let e=m(2);o(4),y("No ",e.filterEmptyNoun()," loaded for this project."),o(),v(e.typeFilter()!=="all"?5:-1)}}function se(n,t){n&1&&c(0,"app-icon",67),n&2&&d("size",10)}function pe(n,t){if(n&1){let e=E();i(0,"button",62),P("click",function(){let s=w(e).$implicit,g=m(4);return k(g.onSelectByObj(s))}),c(1,"span",63)(2,"app-icon",64),i(3,"span",65)(4,"span",66),l(5),x(6,se,1,1,"app-icon",67),r(),i(7,"span",68),l(8),r()(),i(9,"span",69),l(10),r()()}if(n&2){let e=t.$implicit,a=m(4);S("selected",a.selectedId()===e.id)("indent",a.isIndented(e)),M("aria-pressed",a.selectedId()===e.id)("aria-label",a.nameFor(e)+" \u2014 "+a.L[e.level].label),o(),_("background",a.L[e.level].color),o(),d("name",a.iconFor(e))("size",13),o(3),y(" ",a.nameFor(e)," "),o(),v(e.readOnly?6:-1),o(),d("title",a.shortPath(e)),o(),p(a.shortPath(e)),o(2),p(a.fmtK(e.tokens))}}function me(n,t){if(n&1&&(i(0,"div",56)(1,"div",57)(2,"span",58),l(3),r(),i(4,"span",59),l(5),r()(),i(6,"div",60),l(7),r(),C(8,pe,11,15,"button",61,F),r()),n&2){let e=t.$implicit,a=m(3);o(3),p(a.L[e.key].label),o(2),p(a.rowItems(e).length),o(2),p(a.L[e.key].desc),o(),h(a.rowItems(e))}}function ge(n,t){if(n&1&&C(0,me,10,3,"div",56,Y),n&2){let e=m(2);h(e.railGroups())}}function ue(n,t){n&1&&(i(0,"span",72),c(1,"app-icon",86),l(2," read-only"),r()),n&2&&(o(),d("size",10))}function xe(n,t){if(n&1&&(i(0,"div",77)(1,"div",12),l(2,"Saved in"),r(),i(3,"button",87),l(4),r()()),n&2){let e=m();o(3),M("aria-label","Jump to session "+e.session),o(),p(e.session)}}function ve(n,t){if(n&1&&(i(0,"span",88),l(1),r()),n&2){let e=t.$implicit;o(),y("#",e)}}function fe(n,t){if(n&1&&(i(0,"div",79),C(1,ve,2,1,"span",88,N),r()),n&2){let e=m();o(),h(e.tags)}}function _e(n,t){if(n&1&&(i(0,"div",90),c(1,"app-icon",91),i(2,"span",92),l(3),r(),i(4,"span",93),l(5),r()()),n&2){let e=t.$implicit,a=m(4);o(),d("size",12),o(),d("title",e.path),o(),p(e.path),o(2),p(a.fmtK(e.tokens))}}function ye(n,t){if(n&1&&(i(0,"div",81)(1,"div",58),l(2),r(),i(3,"div",89),C(4,_e,6,4,"div",90,F),r()()),n&2){let e=m(3);o(2),y("Imports \xB7 ",e.currentImports().length),o(2),h(e.currentImports())}}function be(n,t){if(n&1&&(i(0,"button",55),c(1,"app-icon",94),l(2),r()),n&2){let e=m();M("aria-label",(e.type==="note"?"Edit note":"Edit memory")+" "+e.path),o(),d("size",13),o(),y(" ",e.type==="note"?"Edit note":"Edit memory"," ")}}function Ce(n,t){if(n&1&&(i(0,"button",85),c(1,"app-icon",95),l(2," Forget "),r()),n&2){let e=m();M("aria-label","Forget note "+e.path),o(),d("size",13)}}function he(n,t){if(n&1&&(i(0,"div",46)(1,"div",70)(2,"span",71),c(3,"app-icon",64),l(4),r(),i(5,"span",71),l(6),r(),i(7,"span",30),l(8),r(),c(9,"span",19),x(10,ue,3,1,"span",72),r(),i(11,"div",73)(12,"span",74),l(13),r(),c(14,"app-copy-btn",75),r(),i(15,"div",76)(16,"div",77)(17,"div",12),l(18,"Tokens"),r(),i(19,"div",78),l(20),r()(),i(21,"div",77)(22,"div",12),l(23,"Lines"),r(),i(24,"div",78),l(25),r()(),i(26,"div",77)(27,"div",12),l(28,"Scope"),r(),i(29,"div",78),l(30),r()(),i(31,"div",77)(32,"div",12),l(33,"Modified"),r(),i(34,"div",78),l(35),r()(),x(36,xe,5,2,"div",77),r(),x(37,fe,3,0,"div",79),c(38,"div",80),x(39,ye,6,1,"div",81),i(40,"div",82),x(41,be,3,3,"button",55),i(42,"button",83),c(43,"app-icon",84),l(44," Copy contents "),r(),x(45,Ce,3,2,"button",85),r()()),n&2){let e=t,a=m(2);o(2),_("background",a.T[e.type].soft)("color",a.T[e.type].color),o(),d("name",a.T[e.type].icon)("size",10),o(),y(" ",a.T[e.type].label," "),o(),_("background",a.L[e.level].soft)("color",a.L[e.level].color),o(),p(a.L[e.level].label),o(2),p(a.L[e.level].desc),o(2),v(e.readOnly?10:-1),o(2),d("title",e.path),o(),p(e.path),o(),d("text",e.path),o(6),p(a.fmtK(e.tokens)),o(5),p(e.lines),o(5),p(a.L[e.level].label),o(5),p(e.modified),o(),v(e.type==="note"&&e.session?36:-1),o(),v(e.type==="note"&&(e.tags!=null&&e.tags.length)?37:-1),o(),d("innerHTML",a.currentBody(),I),o(),v(a.currentImports().length>0?39:-1),o(2),v(e.readOnly?-1:41),o(2),d("size",13),o(2),v(e.type==="note"?45:-1)}}function Me(n,t){n&1&&(i(0,"div",47),c(1,"app-icon",3),i(2,"div"),l(3,"Pick an item from the rail to see its contents."),r()()),n&2&&(o(),d("size",32))}function Pe(n,t){if(n&1&&(i(0,"div",31)(1,"div",42)(2,"div",43),x(3,le,2,1)(4,de,6,2,"div",44)(5,ge,2,0),r()(),i(6,"div",45),x(7,he,46,28,"div",46)(8,Me,4,1,"div",47),r()()),n&2){let e,a=m();o(3),v(a.loading()&&a.source()==="seed"?3:a.visibleCount()===0?4:5),o(4),v((e=a.current())?7:8,e)}}function Oe(n,t){n&1&&c(0,"app-icon",109),n&2&&d("size",11)}function we(n,t){if(n&1&&(i(0,"div",103),c(1,"div",104),i(2,"div",105)(3,"div",106)(4,"span",107),l(5),r(),i(6,"span",71),l(7),r(),i(8,"span",108),l(9),r(),c(10,"span",19),x(11,Oe,1,1,"app-icon",109),i(12,"span",110),l(13),r()(),c(14,"div",111),r()()),n&2){let e=t.$implicit,a=t.$index,s=m(3);o(),_("background",s.L[e.level].color),o(4),p(a+1),o(),_("background",s.L[e.level].soft)("color",s.L[e.level].color),o(),p(s.L[e.level].label),o(),d("title",e.path),o(),p(e.path),o(2),v(e.readOnly?11:-1),o(2),p(s.fmtK(e.tokens)),o(),d("innerHTML",s.renderBody(e.body),I)}}function ke(n,t){if(n&1&&(i(0,"div",101),l(1,"Instructions \xB7 precedence order"),r(),i(2,"div",102),C(3,we,15,13,"div",103,F),r()),n&2){let e=m(2);o(3),h(e.effectiveInstructions())}}function Ee(n,t){n&1&&(i(0,"div",100)(1,"div",54),l(2,"No instructions loaded"),r(),i(3,"div"),l(4,"This project has no CLAUDE.md hierarchy yet."),r()())}function Se(n,t){if(n&1&&(i(0,"div",103),c(1,"div",104),i(2,"div",105)(3,"div",106)(4,"span",71),l(5),r(),i(6,"span",108),l(7),r(),c(8,"span",19),i(9,"span",110),l(10),r()(),c(11,"div",111),r()()),n&2){let e=t.$implicit,a=m(3);o(),_("background",a.L[e.level].color),o(3),_("background",a.L[e.level].soft)("color",a.L[e.level].color),o(),p(a.L[e.level].label),o(),d("title",e.path),o(),p(e.path),o(3),p(a.fmtK(e.tokens)),o(),d("innerHTML",a.renderBody(e.body),I)}}function ze(n,t){if(n&1&&(i(0,"div",112)(1,"span"),l(2,"Notes \xB7 memory tool"),r(),i(3,"span",113),l(4,"retrieved facts, not precedence-ranked"),r()(),i(5,"div",102),C(6,Se,12,11,"div",103,F),r()),n&2){let e=m(2);o(6),h(e.effectiveNotes())}}function Te(n,t){if(n&1&&(i(0,"div",32)(1,"div",96),c(2,"app-icon",97),i(3,"span",98),l(4,"Effective memory"),r(),i(5,"span",30),l(6,"\xB7 everything the agent loads"),r()(),i(7,"div",99),l(8," Instructions merge in precedence order \u2014 managed policy is authoritative, and lower blocks fill in where higher ones are silent. Saved notes are appended as retrieved context. "),r(),x(9,ke,5,0)(10,Ee,5,0,"div",100),x(11,ze,8,0),r()),n&2){let e=m();o(2),d("size",15),o(7),v(e.effectiveInstructions().length>0?9:10),o(2),v(e.effectiveNotes().length>0?11:-1)}}var Q={enterprise:{key:"enterprise",label:"Managed",color:"#E5A50A",soft:"rgba(229,165,10,0.14)",desc:"Organization policy \xB7 cannot be overridden"},user:{key:"user",label:"User",color:"#29D2BE",soft:"rgba(41,210,190,0.14)",desc:"Personal \xB7 applies to every project"},project:{key:"project",label:"Project",color:"#5B93F2",soft:"rgba(91,147,242,0.14)",desc:"Team-shared \xB7 checked into the repo"},subdir:{key:"subdir",label:"Directory",color:"#A586F5",soft:"rgba(165,134,245,0.14)",desc:"Scoped to a subtree \xB7 loaded when cwd is inside"},import:{key:"import",label:"Import",color:"#7B8696",soft:"rgba(123,134,150,0.12)",desc:"Pulled in via @path reference"},note:{key:"note",label:"Notes",color:"#46C26B",soft:"rgba(70,194,107,0.14)",desc:"Agent-written \xB7 memory tool"}},f={instruction:{key:"instruction",label:"Instructions",color:"#5B93F2",soft:"rgba(91,147,242,0.14)",icon:"memory",desc:"Directives & rules from CLAUDE.md"},note:{key:"note",label:"Notes",color:"#46C26B",soft:"rgba(70,194,107,0.14)",icon:"tips",desc:"Facts the agent saved via the memory tool"},import:{key:"import",label:"Imports",color:"#29D2BE",soft:"rgba(41,210,190,0.14)",icon:"external",desc:"Files pulled in via @path"}},Ie=["enterprise","project","subdir","import","user"],Fe=[{id:"m-ent",level:"enterprise",type:"instruction",name:"CLAUDE.md",scope:"managed",readOnly:!0,path:"/Library/Application Support/ClaudeCode/CLAUDE.md",tokens:210,lines:9,modified:"managed",body:"# Engineering policy (managed)\n\n- All code must pass `pnpm lint` and `pnpm typecheck` before commit.\n- Never commit secrets, API keys, or `.env` files.\n- Prefer dependency-free solutions; new deps require review.\n- Validate all external input at trust boundaries.\n- Production logs must not contain user content."},{id:"m-user",level:"user",type:"instruction",name:"CLAUDE.md",scope:"~/.claude",path:"~/.claude/CLAUDE.md",tokens:280,lines:12,modified:"3d ago",body:"# Personal preferences\n\n- Before reading a file, try `specship_explore` for structure first.\n- Use conventional commits (`feat:`, `fix:`, `chore:`).\n- Prefer `rg` over `grep`, `fd` over `find`.\n- Keep responses terse \u2014 show diffs, not whole files.\n- Editor open command: `cursor`.\n- Default model for read/edit turns: Sonnet."},{id:"m-proj",level:"project",type:"instruction",name:"CLAUDE.md",scope:"project root",path:"~/dev/specship/CLAUDE.md",tokens:760,lines:28,modified:"2h ago",imports:["m-imp-conv","m-imp-style"],body:"# SpecShip \u2014 project memory\n\n## Architecture\n- Electron + Angular renderer in `packages/web-ng`.\n- MCP server in `src/mcp`, graph engine in `src/graph`.\n- SQLite via better-sqlite3; migrations in `src/db/migrations.ts`.\n\n## Commands\n- `npm run dev` \u2014 renderer + MCP in watch mode.\n- `npm test` \u2014 vitest; `npm run eval` \u2014 evaluation runner.\n- `npm run cli` \u2014 local SpecShip binary.\n\n## Conventions\n- Spec IDs are stable: `REQ-<AREA>-<NNN>`.\n- Never edit generated files under `src/graph/_gen`.\n\n@docs/conventions.md\n@specs/STYLE.md"},{id:"m-sub",level:"subdir",type:"instruction",name:"CLAUDE.md",scope:"src/graph",path:"~/dev/specship/src/graph/CLAUDE.md",tokens:190,lines:7,modified:"1d ago",body:`# Graph engine notes
2
+
3
+ - Layout runs in a worker \u2014 keep \`applyLayout\` pure.
4
+ - Node positions are cached by content hash.
5
+ - Above 5k nodes, cull to viewport + 1-hop (REQ-GRAPH-006).
6
+ - Synthesized edges are dashed; never persist them.`},{id:"m-imp-conv",level:"import",type:"import",name:"conventions.md",scope:"@import",path:"docs/conventions.md",tokens:120,lines:6,modified:"5d ago",body:"# Conventions\n\n- One component per file; co-locate styles.\n- Name event handlers `onX`; booleans `isX`/`hasX`.\n- No default exports in shared modules."},{id:"m-imp-style",level:"import",type:"import",name:"STYLE.md",scope:"@import",path:"specs/STYLE.md",tokens:100,lines:5,modified:"5d ago",body:`# Spec style
7
+
8
+ - Requirements use MUST / SHOULD / MAY.
9
+ - Each requirement gets one acceptance block.
10
+ - Keep titles under 8 words.`},{id:"n-build",level:"note",type:"note",name:"build-system.md",scope:"memory tool",path:"~/.claude/memory/build-system.md",tokens:64,lines:4,modified:"today 14:31",session:"a3f9c1d2",tags:["build","tooling"],body:"# Build system\n\n- Package manager is **npm**, never pnpm in this fork.\n- `npm run dev` runs renderer + MCP in watch mode.\n- Run `npm run build` after any schema change."},{id:"n-auth",level:"note",type:"note",name:"auth-jwt.md",scope:"memory tool",path:"~/.claude/memory/auth-jwt.md",tokens:58,lines:4,modified:"today 15:38",session:"a3f9c1d2",tags:["auth","REQ-AUTH-005"],body:"# Auth model\n\n- Session tokens are signed **JWTs**.\n- `checkExpiry` tolerates 30s clock skew (REQ-AUTH-005).\n- Expired tokens return 401 with `code: token_expired`."},{id:"n-graph",level:"note",type:"note",name:"graph-perf.md",scope:"memory tool",path:"~/.claude/memory/graph-perf.md",tokens:52,lines:4,modified:"yest 16:44",session:"f04a8b13",tags:["graph","perf"],body:`# Graph performance
11
+
12
+ - Above 5k nodes, layout culls to viewport + 1-hop.
13
+ - \`applyLayout\` must stay pure (runs in a worker).
14
+ - Node positions cached by content hash.`},{id:"n-cost",level:"note",type:"note",name:"cost-prefs.md",scope:"memory tool",path:"~/.claude/memory/cost-prefs.md",tokens:44,lines:3,modified:"Jun 4 09:20",session:"b5f2c8d9",tags:["cost","model"],body:`# Cost preferences
15
+
16
+ - Route read/edit-only turns to Sonnet.
17
+ - Pin a stable system-prompt prefix to keep the 1h cache warm.`}],q=class n{sanitizer=z(U);api=z($);projects=z(H);view=T("sources");typeFilter=T("all");selectedId=T("m-proj");L=Q;T=f;resource=V(this.api,()=>`/api/memory${this.projects.projectQuery()}`);files=u(()=>{let t=this.resource.state().data;return t?.files?.length?t.files:Fe});source=u(()=>this.resource.state().data?.files?.length?"api":"seed");loading=u(()=>this.resource.state().loading);errorMessage=u(()=>{let t=this.resource.state().error;return t?t.message:null});noProject=u(()=>this.resource.state().noProject);totalTokens=u(()=>this.files().reduce((t,e)=>t+e.tokens,0));instructionCount=u(()=>this.files().filter(t=>t.type==="instruction").length);noteCount=u(()=>this.files().filter(t=>t.type==="note").length);importCount=u(()=>this.files().filter(t=>t.type==="import").length);autoSelect=A(()=>{let t=this.files();if(t.length&&!t.find(e=>e.id===this.selectedId())){let e=t.find(a=>a.level==="project")??t[0];e&&this.selectedId.set(e.id)}});current=u(()=>this.files().find(t=>t.id===this.selectedId()));currentLevel=u(()=>{let t=this.current();return t?Q[t.level]:null});currentBody=u(()=>{let t=this.current();return this.sanitizer.bypassSecurityTrustHtml(t?j(t.body):"")});currentImports=u(()=>{let t=this.current();if(!t?.imports)return[];let e=this.files();return t.imports.map(a=>e.find(s=>s.id===a)).filter(a=>!!a)});typeDesc=u(()=>{let t=this.typeFilter();return t==="all"?"":f[t].desc});filterEmptyNoun=u(()=>{let t=this.typeFilter();return t==="all"?"memory files":f[t].label.toLowerCase()});typeChips=u(()=>[{key:"all",label:"All",color:"var(--text-secondary)",soft:"var(--bg-active)"},{key:"instruction",label:f.instruction.label,color:f.instruction.color,soft:f.instruction.soft,count:this.instructionCount()},{key:"note",label:f.note.label,color:f.note.color,soft:f.note.soft,count:this.noteCount()},{key:"import",label:f.import.label,color:f.import.color,soft:f.import.soft,count:this.importCount()}]);railGroups=u(()=>{let t=this.typeFilter(),e=this.files(),a=g=>t==="all"||g.type===t;return[{key:"enterprise",items:e.filter(g=>g.level==="enterprise")},{key:"user",items:e.filter(g=>g.level==="user")},{key:"project",items:e.filter(g=>g.level==="project"||g.level==="subdir")},{key:"note",items:e.filter(g=>g.level==="note")}].filter(g=>g.items.length>0).filter(g=>g.items.some(b=>a(b)||(b.imports??[]).some(L=>{let O=e.find(D=>D.id===L);return O?a(O):!1})))});visibleCount=u(()=>this.railGroups().reduce((e,a)=>e+this.rowItems(a).length,0));effectiveInstructions=u(()=>{let t=this.typeFilter(),e=this.files(),a=[];for(let s of Ie)for(let g of e)g.level===s&&a.push(g);return a.filter(s=>t==="all"||s.type===t)});effectiveNotes=u(()=>{let t=this.typeFilter();return this.files().filter(e=>e.type==="note"&&(t==="all"||t==="note"))});rowItems(t){let e=this.typeFilter(),a=this.files(),s=b=>e==="all"||b.type===e,g=[];for(let b of t.items)if(s(b)&&g.push(b),b.imports)for(let L of b.imports){let O=a.find(D=>D.id===L);O&&s(O)&&g.push(O)}return g}isIndented(t){return t.level==="import"}iconFor(t){return t.level==="import"?"external":t.level==="note"?"tips":"memory"}nameFor(t){return t.level==="import"||t.level==="note"?t.name:t.scope}shortPath(t){return t.path}fmtK(t){return t>=1e3?`${(t/1e3).toFixed(1)}k`:`${t}`}renderBody(t){return this.sanitizer.bypassSecurityTrustHtml(j(t))}onSelect(t){this.selectedId.set(t)}onViewChange(t){this.view.set(t)}onTypeFilter(t){this.typeFilter.set(t)}onSelectByObj(t){this.selectedId.set(t.id)}reload(){this.resource.refetch()}clearFilter(){this.typeFilter.set("all")}static \u0275fac=function(e){return new(e||n)};static \u0275cmp=B({type:n,selectors:[["app-memory"]],decls:60,vars:23,consts:[[1,"memory-page","col"],[1,"page-head"],[1,"row","gap-10"],["name","memory",3,"size"],[1,"col","gap-2","grow"],[1,"title"],[1,"sub"],["role","tablist","aria-label","Memory view",1,"seg"],["role","tab",1,"seg-btn",3,"click"],[1,"stat-strip","row","gap-10"],[1,"stat"],["name","memory",2,"color","var(--accent)",3,"size"],[1,"lbl"],[1,"val","mono"],["name","memory",2,"color","var(--node-spec)",3,"size"],[1,"stat","icon-tips"],["name","tips",3,"size"],[1,"stat","icon-import"],["name","external",3,"size"],[1,"grow"],["title","No /api/memory data \u2014 showing illustrative seed",1,"source-pill","seed"],["title","Live from /api/memory",1,"source-pill","ok"],["aria-label","Reload memory",1,"btn","btn-secondary","btn-sm",3,"click","disabled"],["name","refresh",3,"size"],["role","alert",1,"state-banner","error"],[1,"state-banner","no-project"],[1,"state-banner","seed"],[1,"filter-bar","row","gap-6"],["name","filter",2,"color","var(--text-muted)",3,"size"],[1,"chip",3,"active","--chip-color","--chip-bg"],[1,"secondary","xs"],[1,"split","row"],[1,"eff-scroll","scroll-y"],[1,"dot"],["name","warning",3,"size"],[1,"body"],[1,"desc"],[1,"btn","btn-secondary","btn-sm",3,"click"],["name","info",3,"size"],[1,"chip",3,"click"],[1,"dot",3,"background"],[1,"cnt","mono","tabular"],[1,"rail","col"],[1,"rail-scroll","scroll-y"],[1,"rail-empty"],[1,"detail","col"],[1,"detail-scroll","scroll-y"],[1,"detail-empty"],[1,"skeleton-row"],[1,"skeleton","skeleton-line"],[1,"col","gap-6","grow"],[1,"skeleton","skeleton-line",2,"width","60%"],[1,"skeleton","skeleton-line",2,"width","85%","height","8px"],[1,"skeleton","skeleton-line",2,"width","30px"],[1,"empty-title"],[1,"btn","btn-secondary","btn-sm"],[1,"rail-group"],[1,"rail-group-head"],[1,"eyebrow"],[1,"count","mono","tabular"],[1,"rail-group-desc"],[1,"src-row",3,"selected","indent"],[1,"src-row",3,"click"],[1,"pill-dot"],[3,"name","size"],[1,"src-text"],[1,"src-name"],["name","lock",2,"color","var(--warn)","margin-left","4px",3,"size"],[1,"src-path",3,"title"],[1,"src-tokens","mono","tabular"],[1,"row","gap-8","head-pills"],[1,"pill"],[1,"pill","warn"],[1,"path-row"],[1,"path",3,"title"],[3,"text"],[1,"kv-strip"],[1,"kv"],[1,"val","mono","tabular"],[1,"tags"],[1,"body-card","md-content",3,"innerHTML"],[1,"imports"],[1,"actions","row","gap-8"],["aria-label","Copy contents to clipboard",1,"btn","btn-secondary","btn-sm"],["name","copy",3,"size"],[1,"btn","btn-ghost","btn-sm","danger"],["name","lock",3,"size"],[1,"val","mono","session-link"],[1,"tag","mono"],[1,"col","gap-6"],[1,"import-row"],["name","external",2,"color","var(--node-route)",3,"size"],[1,"mono","grow",3,"title"],[1,"mono","tabular"],["name","reveal",3,"size"],["name","x",3,"size"],[1,"row","gap-8","eff-head"],["name","layers",2,"color","var(--accent)",3,"size"],[1,"eff-title"],[1,"eff-desc"],[1,"rail-empty",2,"margin","0"],[1,"eff-section-head"],[1,"col","gap-10"],[1,"eff-block"],[1,"bar"],[1,"body","col"],[1,"row","gap-8","head"],[1,"ord","mono","tabular"],[1,"path","mono",3,"title"],["name","lock",2,"color","var(--warn)",3,"size"],[1,"mono","tabular","muted"],[1,"md","md-content",3,"innerHTML"],[1,"row","gap-6","eff-section-head","notes-head"],[1,"muted","xs"]],template:function(e,a){if(e&1&&(i(0,"div",0)(1,"div",1)(2,"div",2),c(3,"app-icon",3),i(4,"div",4)(5,"div",5),l(6,"Memory"),r(),i(7,"div",6),l(8,"Everything the agent remembers \u2014 across levels and types"),r()(),i(9,"div",7)(10,"button",8),P("click",function(){return a.onViewChange("sources")}),l(11,"Sources"),r(),i(12,"button",8),P("click",function(){return a.onViewChange("effective")}),l(13,"Effective"),r()()()(),i(14,"div",9)(15,"div",10),c(16,"app-icon",11),i(17,"div")(18,"div",12),l(19,"Loaded"),r(),i(20,"div",13),l(21),r()()(),i(22,"div",10),c(23,"app-icon",14),i(24,"div")(25,"div",12),l(26,"Instructions"),r(),i(27,"div",13),l(28),r()()(),i(29,"div",15),c(30,"app-icon",16),i(31,"div")(32,"div",12),l(33,"Notes"),r(),i(34,"div",13),l(35),r()()(),i(36,"div",17),c(37,"app-icon",18),i(38,"div")(39,"div",12),l(40,"Imports"),r(),i(41,"div",13),l(42),r()()(),c(43,"span",19),x(44,X,3,0,"span",20)(45,W,3,0,"span",21),i(46,"button",22),P("click",function(){return a.reload()}),c(47,"app-icon",23),l(48),r()(),x(49,Z,9,2,"div",24)(50,ee,7,1,"div",25)(51,te,7,1,"div",26),i(52,"div",27),c(53,"app-icon",28),C(54,ie,4,10,"button",29,Y),c(56,"span",19),x(57,re,2,1,"span",30),r(),x(58,Pe,9,2,"div",31)(59,Te,12,3,"div",32),r()),e&2){let s;o(3),d("size",18),o(7),S("active",a.view()==="sources"),M("aria-pressed",a.view()==="sources"),o(2),S("active",a.view()==="effective"),M("aria-pressed",a.view()==="effective"),o(4),d("size",14),o(5),y("",a.fmtK(a.totalTokens())," tokens"),o(2),d("size",14),o(5),p(a.instructionCount()),o(2),d("size",14),o(5),p(a.noteCount()),o(2),d("size",14),o(5),p(a.importCount()),o(2),v(a.source()==="seed"?44:45),o(2),d("disabled",a.loading()),o(),d("size",13),o(),y(" ",a.loading()?"Loading\u2026":"Reload"," "),o(),v((s=a.errorMessage())?49:a.noProject()?50:a.source()==="seed"&&!a.loading()?51:-1,s),o(4),d("size",13),o(),h(a.typeChips()),o(3),v(a.typeFilter()!=="all"?57:-1),o(),v(a.view()==="sources"?58:59)}},dependencies:[K,G],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0}.memory-page[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-height:0;min-width:0;overflow:hidden}.xs[_ngcontent-%COMP%]{font-size:11px}.muted[_ngcontent-%COMP%]{color:var(--text-muted)}.secondary[_ngcontent-%COMP%]{color:var(--text-secondary)}.grow[_ngcontent-%COMP%]{flex:1}.eyebrow[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.page-head[_ngcontent-%COMP%]{flex-shrink:0;padding:16px 18px 4px}.page-head[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:16px;font-weight:650;letter-spacing:-.01em}.page-head[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:12px}.seg[_ngcontent-%COMP%]{display:inline-flex;gap:2px;padding:3px;border:1px solid var(--border-subtle);border-radius:8px;background:var(--bg-panel)}.seg-btn[_ngcontent-%COMP%]{background:transparent;border:0;padding:4px 11px;height:24px;border-radius:5px;color:var(--text-muted);font-family:var(--font-ui);font-size:12px;font-weight:500;cursor:pointer;transition:background .12s,color .12s}.seg-btn[_ngcontent-%COMP%]:hover{color:var(--text-secondary)}.seg-btn[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.seg-btn.active[_ngcontent-%COMP%]{background:var(--bg-active);color:var(--text-primary)}.stat-strip[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;flex-shrink:0;padding:12px 18px}.stat[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:8px;padding:8px 12px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:9px;color:var(--accent)}.stat[_ngcontent-%COMP%] .lbl[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10px;line-height:1.2;text-transform:uppercase;letter-spacing:.04em}.stat[_ngcontent-%COMP%] .val[_ngcontent-%COMP%]{font-size:13px;font-weight:600;color:var(--text-primary);margin-top:1px;white-space:nowrap}.stat.icon-tips[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--node-test)}.stat.icon-import[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--node-route)}.source-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:999px;font-size:11px;font-weight:600;white-space:nowrap}.source-pill[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%}.source-pill.ok[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.source-pill.ok[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--success)}.source-pill.seed[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.source-pill.seed[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--warn)}.filter-bar[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:center;flex-wrap:wrap;flex-shrink:0;padding:0 18px 14px}.chip[_ngcontent-%COMP%]{height:26px;padding:0 11px;border-radius:999px;border:1px solid var(--border-subtle);background:var(--bg-panel);color:var(--text-muted);font-family:var(--font-ui);font-size:11.5px;font-weight:500;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:background .12s,color .12s,border-color .12s}.chip[_ngcontent-%COMP%]:hover{border-color:var(--border-strong);color:var(--text-secondary)}.chip[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.chip.active[_ngcontent-%COMP%]{border-color:transparent;background:var(--chip-bg);color:var(--chip-color)}.chip[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%}.chip[_ngcontent-%COMP%] .cnt[_ngcontent-%COMP%]{opacity:.7;font-size:11px}.state-banner[_ngcontent-%COMP%]{flex-shrink:0;margin:0 18px 14px;padding:10px 14px;border-radius:8px;border:1px solid;font-size:12.5px;line-height:1.5;display:flex;align-items:flex-start;gap:10px}.state-banner[_ngcontent-%COMP%] .body[_ngcontent-%COMP%]{flex:1;min-width:0}.state-banner[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-weight:600;font-size:12.5px}.state-banner[_ngcontent-%COMP%] .desc[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:12px;margin-top:1px}.state-banner[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{white-space:nowrap}.state-banner.seed[_ngcontent-%COMP%]{background:var(--warn-soft);border-color:#e5a50a59;color:var(--warn)}.state-banner.error[_ngcontent-%COMP%]{background:var(--error-soft);border-color:#ff5a5a59;color:var(--error)}.state-banner.no-project[_ngcontent-%COMP%]{background:var(--bg-panel);border-color:var(--border-subtle);color:var(--text-secondary)}.state-banner.no-project[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{color:var(--text-primary)}.split[_ngcontent-%COMP%]{display:flex;flex-direction:row;align-items:stretch;flex:1;min-height:0;min-width:0;border-top:1px solid var(--border-subtle)}.rail[_ngcontent-%COMP%]{display:flex;flex-direction:column;width:320px;flex-shrink:0;min-width:0;min-height:0;overflow:hidden;border-right:1px solid var(--border-subtle);background:var(--bg-panel)}.rail-scroll[_ngcontent-%COMP%]{flex:1;min-height:0;padding:10px 8px 16px;overflow-y:auto;overflow-x:hidden}.rail-group[_ngcontent-%COMP%]{margin-bottom:14px}.rail-group-head[_ngcontent-%COMP%]{padding:8px 10px 4px;display:flex;align-items:baseline;justify-content:space-between;gap:8px}.rail-group-head[_ngcontent-%COMP%] .count[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-faint)}.rail-group-desc[_ngcontent-%COMP%]{padding:0 10px 6px;color:var(--text-faint);font-size:10.5px;line-height:1.45}.src-row[_ngcontent-%COMP%]{appearance:none;background:transparent;border:0;width:100%;text-align:left;cursor:pointer;color:inherit;display:grid;grid-template-columns:8px 14px 1fr auto;align-items:center;column-gap:10px;padding:8px 10px;border-radius:7px;min-width:0;transition:background .12s}.src-row.indent[_ngcontent-%COMP%]{padding-left:26px}.src-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.src-row[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.src-row.selected[_ngcontent-%COMP%]{background:var(--accent-soft)}.src-row.selected[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--accent)}.src-row.selected[_ngcontent-%COMP%] .src-name[_ngcontent-%COMP%]{color:var(--accent)}.src-row[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-muted);flex-shrink:0}.src-row[_ngcontent-%COMP%] .src-text[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:2px;min-width:0}.src-name[_ngcontent-%COMP%]{font-size:12px;color:var(--text-primary);font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.src-path[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;direction:rtl;text-align:left;unicode-bidi:plaintext}.src-tokens[_ngcontent-%COMP%]{font-size:10.5px;flex-shrink:0;color:var(--text-muted)}.pill-dot[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;flex-shrink:0}.rail-empty[_ngcontent-%COMP%]{margin:12px 10px;padding:16px 14px;border:1px dashed var(--border-subtle);border-radius:8px;text-align:center;color:var(--text-secondary);font-size:12px}.rail-empty[_ngcontent-%COMP%] .empty-title[_ngcontent-%COMP%]{color:var(--text-primary);font-weight:600;font-size:12.5px;margin-bottom:4px}.rail-empty[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{margin-top:8px}.detail[_ngcontent-%COMP%]{display:flex;flex-direction:column;flex:1;min-width:0;min-height:0}.detail-scroll[_ngcontent-%COMP%]{flex:1;min-height:0;padding:20px 24px;overflow-y:auto}.detail-empty[_ngcontent-%COMP%]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-secondary);gap:6px;font-size:13px}.detail-empty[_ngcontent-%COMP%] app-icon[_ngcontent-%COMP%]{color:var(--text-faint)}.head-pills[_ngcontent-%COMP%]{margin-bottom:8px;flex-wrap:wrap;align-items:center;row-gap:6px}.pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;line-height:1.4;white-space:nowrap}.pill.warn[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.pill.ok[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.path-row[_ngcontent-%COMP%]{margin-bottom:14px;display:flex;align-items:center;gap:8px;min-width:0}.path[_ngcontent-%COMP%]{font-size:13.5px;font-weight:600;color:var(--text-primary);font-family:var(--font-mono);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;direction:rtl;text-align:left;unicode-bidi:plaintext}.kv-strip[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:12px 24px;padding:12px 0;border-top:1px solid var(--border-subtle);border-bottom:1px solid var(--border-subtle);margin-bottom:18px}.kv[_ngcontent-%COMP%] .lbl[_ngcontent-%COMP%]{color:var(--text-muted);font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;font-weight:600}.kv[_ngcontent-%COMP%] .val[_ngcontent-%COMP%]{font-size:13px;font-weight:600;color:var(--text-primary);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.session-link[_ngcontent-%COMP%]{background:none;border:0;padding:0;cursor:pointer;color:var(--accent);font-family:var(--font-mono);font-size:13px;font-weight:600}.session-link[_ngcontent-%COMP%]:hover{text-decoration:underline}.session-link[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:2px}.tags[_ngcontent-%COMP%]{margin-bottom:14px;flex-wrap:wrap;gap:6px;display:flex}.tag[_ngcontent-%COMP%]{font-size:10.5px;color:var(--node-test);background:var(--node-test-soft);padding:2px 8px;border-radius:5px;white-space:nowrap;font-family:var(--font-mono)}.body-card[_ngcontent-%COMP%]{background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:10px;padding:18px 22px;margin-bottom:18px}.imports[_ngcontent-%COMP%]{margin-bottom:18px}.imports[_ngcontent-%COMP%] .eyebrow[_ngcontent-%COMP%]{margin-bottom:8px}.import-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:8px 12px;border-radius:7px;border:1px solid var(--border-subtle);font-size:11.5px;min-width:0}.import-row[_ngcontent-%COMP%] .mono[_ngcontent-%COMP%]{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.import-row[_ngcontent-%COMP%] .mono.tabular[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted)}.actions[_ngcontent-%COMP%]{margin-top:18px;flex-wrap:wrap}.btn-ghost.danger[_ngcontent-%COMP%]{color:var(--error)}.btn-ghost.danger[_ngcontent-%COMP%]:hover{background:var(--error-soft)}.eff-scroll[_ngcontent-%COMP%]{flex:1;min-height:0;padding:20px 24px;overflow-y:auto}.eff-head[_ngcontent-%COMP%]{margin-bottom:6px;align-items:center}.eff-title[_ngcontent-%COMP%]{font-weight:600;font-size:14px}.eff-desc[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.55;margin-bottom:18px;color:var(--text-secondary)}.eff-section-head[_ngcontent-%COMP%]{margin-bottom:10px;color:var(--text-muted);font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase}.notes-head[_ngcontent-%COMP%]{margin-top:22px;align-items:baseline}.eff-block[_ngcontent-%COMP%]{display:flex;overflow:hidden;border:1px solid var(--border-subtle);border-radius:10px;background:var(--bg-panel)}.eff-block[_ngcontent-%COMP%] .bar[_ngcontent-%COMP%]{width:4px;flex-shrink:0}.eff-block[_ngcontent-%COMP%] .body[_ngcontent-%COMP%]{flex:1;min-width:0;padding:14px 16px}.eff-block[_ngcontent-%COMP%] .head[_ngcontent-%COMP%]{margin-bottom:10px;align-items:center;row-gap:6px}.eff-block[_ngcontent-%COMP%] .ord[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted);width:18px;text-align:center;background:var(--bg-canvas);border-radius:4px;padding:1px 0}.eff-block[_ngcontent-%COMP%] .head[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{font-size:11.5px;color:var(--text-secondary);font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.eff-block[_ngcontent-%COMP%] .md[_ngcontent-%COMP%]{padding-left:24px}.md-content[_ngcontent-%COMP%] .md-h1[_ngcontent-%COMP%]{font-size:15px;font-weight:650;color:var(--text-primary);letter-spacing:-.01em;margin:0 0 10px}.md-content[_ngcontent-%COMP%] .md-h2[_ngcontent-%COMP%]{font-size:13px;font-weight:650;color:var(--text-primary);letter-spacing:-.005em;margin:18px 0 6px;padding-bottom:4px;border-bottom:1px solid var(--border-subtle)}.md-content[_ngcontent-%COMP%] .md-h3[_ngcontent-%COMP%]{font-size:12px;font-weight:650;color:var(--text-primary);margin:14px 0 6px}.md-content[_ngcontent-%COMP%] .md-h4[_ngcontent-%COMP%]{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);margin:12px 0 4px}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.6;color:var(--text-secondary);margin:0 0 4px;overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary)}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%]{padding:0;margin:4px 0 6px}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{position:relative;padding:2px 0 2px 22px;font-size:12.5px;line-height:1.6;color:var(--text-secondary);overflow-wrap:anywhere}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary)}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%]{list-style:none}.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:before{content:"\\2022";position:absolute;left:6px;top:2px;color:var(--text-faint)}.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%]{list-style:none;counter-reset:md-ol}.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{counter-increment:md-ol}.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:before{content:counter(md-ol) ".";position:absolute;left:0;top:2px;color:var(--text-faint);font-family:var(--font-mono);font-size:11.5px;min-width:18px;text-align:right}.md-content[_ngcontent-%COMP%] .md-spacer[_ngcontent-%COMP%]{height:6px}.md-content[_ngcontent-%COMP%] .md-import[_ngcontent-%COMP%]{display:inline-block;font-size:11.5px;color:var(--node-route);background:var(--node-route-soft);padding:2px 8px;border-radius:5px;margin:4px 0}.md-content[_ngcontent-%COMP%] .md-inline-code[_ngcontent-%COMP%]{font-size:11.5px;background:var(--bg-canvas);padding:1px 6px;border-radius:4px;border:1px solid var(--border-subtle);color:var(--node-spec)}.md-content[_ngcontent-%COMP%] .md-blockquote[_ngcontent-%COMP%]{margin:6px 0;padding:8px 12px;border-left:3px solid var(--accent);background:var(--accent-soft);color:var(--text-secondary);font-size:12.5px;line-height:1.55;border-radius:0 6px 6px 0}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%]{position:relative;margin:8px 0 10px;padding:12px 14px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:8px;overflow-x:auto;max-width:100%}.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;font-size:11.5px;line-height:1.55;color:var(--text-primary);white-space:pre}.md-content[_ngcontent-%COMP%] .md-pre-lang[_ngcontent-%COMP%]{position:absolute;top:6px;right:10px;font-size:10px;font-weight:600;color:var(--text-muted);text-transform:lowercase;background:var(--bg-panel);padding:1px 6px;border-radius:4px;border:1px solid var(--border-subtle)}.md-content[_ngcontent-%COMP%] .md-table-scroll[_ngcontent-%COMP%]{max-width:100%;overflow-x:auto;margin:10px 0;border:1px solid var(--border-subtle);border-radius:8px}.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;font-size:11.5px}.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:8px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border-subtle)}.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{background:var(--bg-panel);font-weight:650;color:var(--text-primary);font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border-strong);white-space:nowrap}.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{color:var(--text-secondary)}.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%]{border-bottom:0}.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.md-content[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{margin-top:0}.skeleton[_ngcontent-%COMP%]{background:var(--bg-panel);border-radius:6px;animation:_ngcontent-%COMP%_pulse 1.4s ease-in-out infinite}.skeleton-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:14px 1fr auto;gap:10px;padding:10px}.skeleton-line[_ngcontent-%COMP%]{height:10px;border-radius:4px}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:.55}50%{opacity:.85}}'],changeDetection:0})};export{q as Memory};
@@ -0,0 +1,6 @@
1
+ import{a as te}from"./chunk-G7VZT5KB.js";import{a as ne}from"./chunk-EMGMOEVR.js";import{a as ie}from"./chunk-X2HTISHL.js";import{a as ee}from"./chunk-R5W2MDZN.js";import{a as Y}from"./chunk-WDU3WICG.js";import{a as F,b as Z}from"./chunk-HZA6NEAB.js";import{b as W}from"./chunk-4N5DWG46.js";import{c as B}from"./chunk-SHPTC4RL.js";import{a as J}from"./chunk-7RNS77UP.js";import{a as X}from"./chunk-E44X4RH2.js";import{Aa as p,Ga as y,I as M,Ia as x,Ka as s,M as f,N as C,Oa as H,Pa as Q,Qa as U,R as G,T as S,Ta as $,Ua as R,Va as d,W as _,Wa as g,Xa as b,aa as z,ea as o,ka as k,lb as h,ra as m,sa as u,va as I,wa as N,xa as c,ya as r,yb as K,za as l,zb as E}from"./chunk-PDN6QYGJ.js";import"./chunk-Q7L6LLAK.js";var V=null,ue="self.onmessage = () => {};";function oe(){return V||(typeof window<"u"&&!window.MonacoEnvironment&&(window.MonacoEnvironment={getWorker:(i,t)=>{let e=new Blob([ue],{type:"text/javascript"}),n=URL.createObjectURL(e);return new Worker(n,{name:t||"monaco-noop"})}}),V=import("./chunk-FMV5PXRC.js"),V)}var re=!1;function ae(i){re||(re=!0,ge(i))}function le(i,t){let e=[],n=t.getValue().split(`
2
+ `),a=null,v=new Map,P=/<!--\s*id\s*:\s*([^\s-][^\s]*)\s*-->/,me=/^#{1,6}\s+/;for(let O=0;O<n.length;O++){let T=n[O]??"",D=O+1,j=T.match(P);if(j&&j[1]){a!==null&&e.push({severity:i.MarkerSeverity.Warning,message:`Stranded <!-- id: ${a.id} -->: no heading follows on line ${a.line+1}.`,startLineNumber:a.line+1,startColumn:1,endLineNumber:a.line+1,endColumn:(n[a.line]??"").length+1,code:"spec_stranded_id"});let w=j[1];a={id:w,line:O};let q=v.get(w);q!==void 0?e.push({severity:i.MarkerSeverity.Warning,message:`Duplicate spec ID "${w}" \u2014 first seen on line ${q+1}. The second occurrence will be silently lost by the parser.`,startLineNumber:D,startColumn:T.indexOf(w)+1,endLineNumber:D,endColumn:T.indexOf(w)+w.length+1,code:"spec_duplicate_id"}):v.set(w,O);continue}me.test(T)&&(a===null?e.push({severity:i.MarkerSeverity.Error,message:"This heading has no embedded ID. Add `<!-- id: REQ-X -->` on the line above it \u2014 required by the SpecShip parser.",startLineNumber:D,startColumn:1,endLineNumber:D,endColumn:T.length+1,code:"spec_missing_id"}):a=null)}i.editor.setModelMarkers(t,"specship-spec",e)}function ge(i){i.languages.registerCompletionItemProvider("markdown",{provideCompletionItems:(t,e)=>{let n=t.getWordUntilPosition(e),a={startLineNumber:e.lineNumber,endLineNumber:e.lineNumber,startColumn:n.startColumn,endColumn:n.endColumn},v=i.languages.CompletionItemKind,P=i.languages.CompletionItemInsertTextRule;return{suggestions:[{label:"req",kind:v.Snippet,insertText:["<!-- id: REQ-${1:AREA}-${2:001} -->","## ${3:Title MUST be concrete}","","${4:Body \u2014 describe the contract, not the implementation.}","","## Acceptance","<!-- id: REQ-${1:AREA}-${2:001}.A1 -->","- ${5:First testable acceptance criterion}","$0"].join(`
3
+ `),insertTextRules:P.InsertAsSnippet,documentation:"Insert a full requirement (heading + acceptance) with embedded IDs.",detail:"SpecShip \xB7 requirement",range:a},{label:"doc",kind:v.Snippet,insertText:["---","id: ${1:AREA}-DOC","title: ${2:Title}","owner: ${3:team-or-person}","priority: ${4|high,medium,low|}","---","","<!-- id: ${1:AREA}-DOC -->","# ${2:Title}","","${5:One-paragraph summary of what this document covers.}","$0"].join(`
4
+ `),insertTextRules:P.InsertAsSnippet,documentation:"Insert a new spec document with frontmatter.",detail:"SpecShip \xB7 document",range:a},{label:"accept",kind:v.Snippet,insertText:["## Acceptance","<!-- id: ${1:REQ-X}.A1 -->","- ${2:First testable acceptance criterion}","<!-- id: ${1:REQ-X}.A2 -->","- ${3:Second testable acceptance criterion}","$0"].join(`
5
+ `),insertTextRules:P.InsertAsSnippet,documentation:"Insert an Acceptance section with two ID-d bullets.",detail:"SpecShip \xB7 acceptance",range:a},{label:"impl",kind:v.Snippet,insertText:["implementations:"," - ${1:src/path/to/file.ts}:${2:QualifiedSymbol}","$0"].join(`
6
+ `),insertTextRules:P.InsertAsSnippet,documentation:"Insert an implementations block linking the spec to code.",detail:"SpecShip \xB7 implementations",range:a}]}},triggerCharacters:["r","d","a","i"]})}var _e=["host"];function ve(i,t){if(i&1&&(r(0,"span",5),d(1),l()),i&2){let e=s();c("title",e.path),o(),g(e.path)}}function xe(i,t){i&1&&(r(0,"div",15),d(1,"Loading editor\u2026"),l())}var L=class i{sanitizer=M(K);destroyRef=M(G);value="";path="";valueChange=new S;validationChange=new S;save=new S;cancel=new S;hostRef;loading=_(!0);currentValue=_("");errorCount=_(0);warningCount=_(0);dirty=_(!1);previewHtml=h(()=>this.sanitizer.bypassSecurityTrustHtml(te(this.currentValue()||"")));tokenCount=h(()=>Math.max(1,Math.round((this.currentValue()||"").length/4)));statusLabel=h(()=>{let t=this.errorCount(),e=this.warningCount();return t>0?`${t} error${t===1?"":"s"}`:e>0?`${e} warning${e===1?"":"s"}`:"clean"});statusKind=h(()=>this.errorCount()>0?"error":this.warningCount()>0?"warn":"ok");monaco=null;editor=null;model=null;diagnosticsTimer=null;async ngAfterViewInit(){this.currentValue.set(this.value);try{let t=await oe();this.monaco=t,ae(t),this.model=t.editor.createModel(this.value,"markdown"),this.editor=t.editor.create(this.hostRef.nativeElement,{model:this.model,theme:this.preferDark()?"vs-dark":"vs",automaticLayout:!0,wordWrap:"on",minimap:{enabled:!1},scrollBeyondLastLine:!1,renderWhitespace:"none",fontSize:13,lineNumbers:"on",folding:!1,tabSize:2,insertSpaces:!0,contextmenu:!1}),this.editor.onDidChangeModelContent(()=>this.handleEdit()),this.runDiagnosticsNow(),this.loading.set(!1)}catch(t){console.error("[spec-editor] failed to load Monaco",t),this.loading.set(!1)}this.destroyRef.onDestroy(()=>this.dispose())}ngOnDestroy(){this.dispose()}onSave(){this.save.emit()}onCancel(){this.cancel.emit()}handleEdit(){if(!this.model)return;let t=this.model.getValue();this.currentValue.set(t),this.dirty.set(t!==this.value),this.valueChange.emit(t),this.diagnosticsTimer!==null&&clearTimeout(this.diagnosticsTimer),this.diagnosticsTimer=setTimeout(()=>this.runDiagnosticsNow(),500)}runDiagnosticsNow(){if(!this.monaco||!this.model)return;le(this.monaco,this.model);let t=this.monaco.editor.getModelMarkers({resource:this.model.uri,owner:"specship-spec"}),e=t.filter(a=>a.severity===this.monaco.MarkerSeverity.Error).length,n=t.filter(a=>a.severity===this.monaco.MarkerSeverity.Warning).length;this.errorCount.set(e),this.warningCount.set(n),this.validationChange.emit({errors:e,warnings:n})}preferDark(){if(typeof window>"u")return!1;try{return window.matchMedia("(prefers-color-scheme: dark)").matches}catch{return!1}}dispose(){this.diagnosticsTimer!==null&&(clearTimeout(this.diagnosticsTimer),this.diagnosticsTimer=null),this.editor?.dispose(),this.editor=null,this.model?.dispose(),this.model=null}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=k({type:i,selectors:[["app-spec-editor"]],viewQuery:function(e,n){if(e&1&&H(_e,7),e&2){let a;Q(a=U())&&(n.hostRef=a.first)}},inputs:{value:"value",path:"path"},outputs:{valueChange:"valueChange",validationChange:"validationChange",save:"save",cancel:"cancel"},decls:23,vars:16,consts:[["host",""],[1,"editor-shell","col"],[1,"toolbar","row","gap-8"],["name","memory",3,"size"],[1,"title"],[1,"path","mono",3,"title"],[1,"grow"],[1,"status-pill"],[1,"dot"],[1,"tokens","mono","tabular","muted",3,"title"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled","title"],["name","check",3,"size"],[1,"panes","row"],[1,"editor-pane"],[1,"loading"],[1,"monaco-host"],[1,"preview-pane","md-content",3,"innerHTML"]],template:function(e,n){e&1&&(r(0,"div",1)(1,"div",2),p(2,"app-icon",3),r(3,"span",4),d(4,"Spec editor"),l(),m(5,ve,2,2,"span",5),p(6,"span",6),r(7,"span",7),p(8,"span",8),d(9),l(),r(10,"span",9),d(11),l(),r(12,"button",10),x("click",function(){return n.onCancel()}),d(13," Cancel "),l(),r(14,"button",11),x("click",function(){return n.onSave()}),p(15,"app-icon",12),d(16," Save "),l()(),r(17,"div",13)(18,"div",14),m(19,xe,2,0,"div",15),p(20,"div",16,0),l(),p(22,"div",17),l()()),e&2&&(o(2),c("size",14),o(3),u(n.path?5:-1),o(2),R("ok",n.statusKind()==="ok")("warn",n.statusKind()==="warn")("error",n.statusKind()==="error"),o(2),b(" ",n.statusLabel()," "),o(),c("title","~"+n.tokenCount()+" tokens (rough estimate)"),o(),b(" ~",n.tokenCount(),"t "),o(3),c("disabled",!n.dirty()||n.errorCount()>0)("title",n.errorCount()>0?"Fix errors before saving":n.dirty()?"Save changes":"No changes to save"),o(),c("size",13),o(4),u(n.loading()?19:-1),o(3),c("innerHTML",n.previewHtml(),z))},dependencies:[E],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:flex;flex:1;min-height:0}.editor-shell[_ngcontent-%COMP%]{flex:1;min-height:0;border:1px solid var(--border-subtle);border-radius:10px;overflow:hidden;background:var(--bg-panel)}.toolbar[_ngcontent-%COMP%]{align-items:center;padding:8px 12px;border-bottom:1px solid var(--border-subtle);background:var(--bg-panel);flex-wrap:wrap;row-gap:6px}.toolbar[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:12.5px;font-weight:650;color:var(--text-primary)}.toolbar[_ngcontent-%COMP%] .path[_ngcontent-%COMP%]{font-size:11px;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:320px}.toolbar[_ngcontent-%COMP%] .tokens[_ngcontent-%COMP%]{font-size:10.5px;color:var(--text-muted)}.status-pill[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:3px 9px;border-radius:999px;white-space:nowrap}.status-pill[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{width:7px;height:7px;border-radius:50%}.status-pill.ok[_ngcontent-%COMP%]{color:var(--success);background:var(--success-soft)}.status-pill.ok[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--success)}.status-pill.warn[_ngcontent-%COMP%]{color:var(--warn);background:var(--warn-soft)}.status-pill.warn[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--warn)}.status-pill.error[_ngcontent-%COMP%]{color:var(--error);background:var(--error-soft)}.status-pill.error[_ngcontent-%COMP%] .dot[_ngcontent-%COMP%]{background:var(--error)}.panes[_ngcontent-%COMP%]{flex:1;min-height:0}.editor-pane[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:0;position:relative;border-right:1px solid var(--border-subtle)}.loading[_ngcontent-%COMP%]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:var(--text-muted);font-size:12px;background:var(--bg-canvas);z-index:1}.monaco-host[_ngcontent-%COMP%]{position:absolute;inset:0}.preview-pane[_ngcontent-%COMP%]{flex:1;min-width:0;min-height:0;padding:14px 18px;overflow:auto;background:var(--bg-canvas)}.preview-pane.md-content[_ngcontent-%COMP%] .md-h1[_ngcontent-%COMP%]{font-size:15px;font-weight:650;color:var(--text-primary);letter-spacing:-.01em;margin:0 0 10px}.preview-pane.md-content[_ngcontent-%COMP%] .md-h2[_ngcontent-%COMP%]{font-size:13px;font-weight:650;color:var(--text-primary);letter-spacing:-.005em;margin:18px 0 6px;padding-bottom:4px;border-bottom:1px solid var(--border-subtle)}.preview-pane.md-content[_ngcontent-%COMP%] .md-h3[_ngcontent-%COMP%]{font-size:12px;font-weight:650;color:var(--text-primary);margin:14px 0 6px}.preview-pane.md-content[_ngcontent-%COMP%] .md-h4[_ngcontent-%COMP%]{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);margin:12px 0 4px}.preview-pane.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%]{font-size:12.5px;line-height:1.6;color:var(--text-secondary);margin:0 0 4px;overflow-wrap:anywhere}.preview-pane.md-content[_ngcontent-%COMP%] .md-p[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary)}.preview-pane.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%], .preview-pane.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%]{padding:0;margin:4px 0 6px}.preview-pane.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%], .preview-pane.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{position:relative;padding:2px 0 2px 22px;font-size:12.5px;line-height:1.6;color:var(--text-secondary);overflow-wrap:anywhere}.preview-pane.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%] strong[_ngcontent-%COMP%], .preview-pane.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%] strong[_ngcontent-%COMP%]{color:var(--text-primary)}.preview-pane.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%]{list-style:none}.preview-pane.md-content[_ngcontent-%COMP%] .md-list[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:before{content:"\\2022";position:absolute;left:6px;top:2px;color:var(--text-faint)}.preview-pane.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%]{list-style:none;counter-reset:md-ol}.preview-pane.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]{counter-increment:md-ol}.preview-pane.md-content[_ngcontent-%COMP%] .md-ol[_ngcontent-%COMP%] li[_ngcontent-%COMP%]:before{content:counter(md-ol) ".";position:absolute;left:0;top:2px;color:var(--text-faint);font-family:var(--font-mono);font-size:11.5px;min-width:18px;text-align:right}.preview-pane.md-content[_ngcontent-%COMP%] .md-spacer[_ngcontent-%COMP%]{height:6px}.preview-pane.md-content[_ngcontent-%COMP%] .md-import[_ngcontent-%COMP%]{display:inline-block;font-size:11.5px;color:var(--node-route);background:var(--node-route-soft);padding:2px 8px;border-radius:5px;margin:4px 0}.preview-pane.md-content[_ngcontent-%COMP%] .md-inline-code[_ngcontent-%COMP%]{font-size:11.5px;background:var(--bg-canvas);padding:1px 6px;border-radius:4px;border:1px solid var(--border-subtle);color:var(--node-spec)}.preview-pane.md-content[_ngcontent-%COMP%] .md-blockquote[_ngcontent-%COMP%]{margin:6px 0;padding:8px 12px;border-left:3px solid var(--accent);background:var(--accent-soft);color:var(--text-secondary);font-size:12.5px;line-height:1.55;border-radius:0 6px 6px 0}.preview-pane.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%]{position:relative;margin:8px 0 10px;padding:12px 14px;background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:8px;overflow-x:auto}.preview-pane.md-content[_ngcontent-%COMP%] .md-pre[_ngcontent-%COMP%] code[_ngcontent-%COMP%]{display:block;font-size:11.5px;line-height:1.55;color:var(--text-primary);white-space:pre}.preview-pane.md-content[_ngcontent-%COMP%] .md-pre-lang[_ngcontent-%COMP%]{position:absolute;top:6px;right:10px;font-size:10px;font-weight:600;color:var(--text-muted);text-transform:lowercase;background:var(--bg-canvas);padding:1px 6px;border-radius:4px;border:1px solid var(--border-subtle)}.preview-pane.md-content[_ngcontent-%COMP%] .md-table-scroll[_ngcontent-%COMP%]{overflow-x:auto;margin:10px 0;border:1px solid var(--border-subtle);border-radius:8px}.preview-pane.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;font-size:11.5px}.preview-pane.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] th[_ngcontent-%COMP%], .preview-pane.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{padding:8px 12px;text-align:left;vertical-align:top;border-bottom:1px solid var(--border-subtle)}.preview-pane.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] thead[_ngcontent-%COMP%] th[_ngcontent-%COMP%]{background:var(--bg-panel);font-weight:650;color:var(--text-primary);font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border-strong);white-space:nowrap}.preview-pane.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] td[_ngcontent-%COMP%]{color:var(--text-secondary)}.preview-pane.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:last-child td[_ngcontent-%COMP%]{border-bottom:0}.preview-pane.md-content[_ngcontent-%COMP%] .md-table[_ngcontent-%COMP%] tbody[_ngcontent-%COMP%] tr[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.preview-pane.md-content[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child{margin-top:0}'],changeDetection:0})};function fe(i,t){i&1&&(r(0,"div",14),d(1),l()),i&2&&(o(),g(t))}function Ce(i,t){if(i&1){let e=y();r(0,"div",0),x("click",function(){f(e);let a=s();return C(a.onBackdropClick())}),l(),r(1,"div",1)(2,"header",2)(3,"div",3)(4,"div",4),d(5,"Draft a new spec with Claude"),l(),r(6,"div",5),d(7,"Describe the feature in one sentence. Claude takes it from there."),l()(),r(8,"button",6),x("click",function(){f(e);let a=s();return C(a.onCloseClick())}),p(9,"app-icon",7),l()(),r(10,"div",8)(11,"label",9),d(12,"Feature description"),l(),r(13,"textarea",10),x("input",function(a){f(e);let v=s();return C(v.onDescriptionInput(a))}),l(),r(14,"div",11),d(15,"This will run in Claude Code:"),l(),r(16,"pre",12),d(17),l()(),r(18,"footer",13),m(19,fe,2,1,"div",14),p(20,"span",15),r(21,"button",16),x("click",function(){f(e);let a=s();return C(a.onCopyToClipboard())}),p(22,"app-icon",17),d(23," Copy prompt "),l(),r(24,"button",18),x("click",function(){f(e);let a=s();return C(a.onOpenInClaude())}),p(25,"app-icon",19),d(26," Open in Claude Code "),l()()()}if(i&2){let e,n=s();o(9),c("size",16),o(4),c("value",n.description()),o(4),g(n.slashCommand()),o(2),u((e=n.toast())?19:-1,e),o(2),c("disabled",!n.canSubmit()),o(),c("size",13),o(2),c("disabled",!n.canSubmit()),o(),c("size",13)}}var A=class i{open=!1;close=new S;description=_("");toast=_(null);slashCommand=h(()=>{let t=this.description().trim();return t?`/ss-spec-author "${t.replace(/"/g,'\\"')}"`:"/ss-spec-author"});canSubmit=h(()=>this.description().trim().length>0);onDescriptionInput(t){let e=t.target;this.description.set(e.value)}onBackdropClick(){this.dismiss()}onCloseClick(){this.dismiss()}async onOpenInClaude(){if(!this.canSubmit())return;let t=this.slashCommand();await this.writeToClipboard(t);try{window.location.href=`claude://prompt?text=${encodeURIComponent(t)}`,this.flashToast("Opening Claude Code\u2026 (also copied to clipboard)")}catch{this.flashToast("Claude Code handler unavailable \u2014 prompt copied to clipboard.")}}async onCopyToClipboard(){if(!this.canSubmit())return;let t=this.slashCommand(),e=await this.writeToClipboard(t);this.flashToast(e?"Copied! Switch to Claude Code and paste.":"Could not access clipboard \u2014 copy the prompt manually.")}async writeToClipboard(t){if(!navigator.clipboard)return!1;try{return await navigator.clipboard.writeText(t),!0}catch{return!1}}flashToast(t){this.toast.set(t),setTimeout(()=>this.toast.set(null),2500)}dismiss(){this.description.set(""),this.toast.set(null),this.close.emit()}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=k({type:i,selectors:[["app-draft-with-claude-modal"]],inputs:{open:"open"},outputs:{close:"close"},decls:1,vars:1,consts:[["role","presentation",1,"backdrop",3,"click"],["role","dialog","aria-labelledby","draft-modal-title","aria-modal","true",1,"modal"],[1,"head"],[1,"title-block"],["id","draft-modal-title",1,"title"],[1,"sub"],["type","button","aria-label","Close",1,"close",3,"click"],["name","x",3,"size"],[1,"body"],["for","draft-description",1,"field-label"],["id","draft-description","rows","3","placeholder","e.g. Failed payment retries should back off with T+1d, T+3d, T+7d then downgrade the account.","autofocus","",1,"field",3,"input","value"],[1,"preview-label"],[1,"preview","mono"],[1,"foot"],[1,"toast"],[1,"grow"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click","disabled"],["name","copy",3,"size"],["type","button",1,"btn","btn-primary","btn-sm",3,"click","disabled"],["name","external",3,"size"]],template:function(e,n){e&1&&m(0,Ce,27,8),e&2&&u(n.open?0:-1)},dependencies:[E],styles:[".backdrop[_ngcontent-%COMP%]{position:fixed;inset:0;background:#00000080;z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.modal[_ngcontent-%COMP%]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);width:min(560px,100vw - 32px);max-height:calc(100vh - 64px);background:var(--bg-panel);border:1px solid var(--border-subtle);border-radius:12px;box-shadow:0 24px 48px #0006;z-index:101;display:flex;flex-direction:column;overflow:hidden}.head[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:12px;padding:16px 18px;border-bottom:1px solid var(--border-subtle)}.head[_ngcontent-%COMP%] .title-block[_ngcontent-%COMP%]{flex:1;min-width:0}.head[_ngcontent-%COMP%] .title[_ngcontent-%COMP%]{font-size:14.5px;font-weight:650;color:var(--text-primary);letter-spacing:-.01em}.head[_ngcontent-%COMP%] .sub[_ngcontent-%COMP%]{font-size:12px;color:var(--text-secondary);margin-top:2px;line-height:1.45}.head[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]{appearance:none;background:transparent;border:0;width:28px;height:28px;border-radius:6px;color:var(--text-muted);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:background .12s,color .12s}.head[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]:hover{background:var(--bg-hover);color:var(--text-primary)}.head[_ngcontent-%COMP%] .close[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.body[_ngcontent-%COMP%]{padding:16px 18px;display:flex;flex-direction:column;gap:10px;overflow-y:auto}.field-label[_ngcontent-%COMP%]{font-size:11px;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}.field[_ngcontent-%COMP%]{width:100%;box-sizing:border-box;padding:10px 12px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:8px;color:var(--text-primary);font-family:var(--font-ui);font-size:13px;line-height:1.5;resize:vertical}.field[_ngcontent-%COMP%]:focus{outline:2px solid var(--accent);outline-offset:1px;border-color:transparent}.preview-label[_ngcontent-%COMP%]{font-size:11px;color:var(--text-muted);margin-top:4px}.preview[_ngcontent-%COMP%]{margin:0;padding:10px 12px;background:var(--bg-canvas);border:1px solid var(--border-subtle);border-radius:8px;font-size:11.5px;line-height:1.5;color:var(--node-spec);font-family:var(--font-mono);white-space:pre-wrap;word-break:break-all}.foot[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;padding:12px 18px;border-top:1px solid var(--border-subtle);background:var(--bg-canvas);flex-wrap:wrap}.foot[_ngcontent-%COMP%] .grow[_ngcontent-%COMP%]{flex:1}.toast[_ngcontent-%COMP%]{font-size:11.5px;color:var(--success);background:var(--success-soft);padding:4px 10px;border-radius:999px;white-space:nowrap}"],changeDetection:0})};var he=(i,t)=>t.path,pe=(i,t)=>t.id;function be(i,t){i&1&&p(0,"app-pick-project-empty",0)}function ye(i,t){i&1&&p(0,"app-empty",9)}function we(i,t){if(i&1&&(r(0,"span",18),d(1),l()),i&2){let e=s().$implicit,n=s(2);o(),b(" ",n.driftCountForGroup(e)," ")}}function Me(i,t){if(i&1){let e=y();r(0,"div",21),x("click",function(){let a=f(e).$implicit,v=s(4);return C(v.select(a.id))}),p(1,"span",22),r(2,"div",23)(3,"div",24),d(4),l(),r(5,"div",25),d(6),l()()()}if(i&2){let e=t.$implicit,n=s(4);R("selected",n.sel()===e.id),o(),$("background",n.stateColorFor(e.kind)),o(2),$("color",n.sel()===e.id?"var(--accent)":"var(--text-primary)"),o(),g(e.id),o(2),g(e.title)}}function Se(i,t){if(i&1&&(r(0,"div",19),I(1,Me,7,8,"div",20,pe),l()),i&2){let e=s().$implicit;o(),N(e.specs)}}function Pe(i,t){if(i&1){let e=y();r(0,"div",14),x("click",function(){let a=f(e).$implicit,v=s(2);return C(v.toggleGroup(a.path))}),p(1,"app-icon",15)(2,"app-icon",16),r(3,"span",17),d(4),l(),m(5,we,2,1,"span",18),l(),m(6,Se,3,0,"div",19)}if(i&2){let e=t.$implicit,n=s(2);o(),c("name",n.isGroupOpen(e.path)?"chevronDown":"chevronRight")("size",12),o(),c("size",13),o(2),g(e.title),o(),u(n.driftCountForGroup(e)>0?5:-1),o(),u(n.isGroupOpen(e.path)?6:-1)}}function Oe(i,t){if(i&1&&(r(0,"div",26),d(1),l()),i&2){let e=s();o(),b("Loading source for ",e.id,"\u2026")}}function ke(i,t){if(i&1){let e=y();r(0,"app-spec-editor",30),x("valueChange",function(a){f(e);let v=s(4);return C(v.onEditorValueChange(a))})("save",function(){f(e);let a=s(4);return C(a.onEditorSave())})("cancel",function(){f(e);let a=s(4);return C(a.onEditorCancel())}),l()}if(i&2){let e=s(),n=s(3);c("value",n.editingSource())("path",e.sourcePath)}}function Ee(i,t){i&1&&(r(0,"div",28),d(1),l()),i&2&&(o(),g(t))}function Te(i,t){i&1&&(r(0,"div",29),d(1,"Saving\u2026"),l())}function De(i,t){if(i&1&&(m(0,Oe,2,1,"div",26)(1,ke,1,2,"app-spec-editor",27),m(2,Ee,2,1,"div",28),m(3,Te,2,0,"div",29)),i&2){let e,n=s(3);u(n.editingSource()===null?0:1),o(2),u((e=n.saveError())?2:-1,e),o(),u(n.saving()?3:-1)}}function ze(i,t){if(i&1&&m(0,De,4,3),i&2){let e,n=s(2);u((e=n.selectedSpec())?0:-1,e)}}function Ie(i,t){if(i&1&&(r(0,"app-pill"),d(1),l()),i&2){let e=s();o(),g(e.priority)}}function Ne(i,t){if(i&1&&(r(0,"div",37)(1,"div",38),d(2,"Owner"),l(),r(3,"div",39),d(4),l()()),i&2){let e=s();o(4),g(e.owner)}}function $e(i,t){i&1&&p(0,"div",42)}function Re(i,t){if(i&1&&(r(0,"app-pill",56),d(1),l()),i&2){let e=s().$implicit;o(),b("",e.driftAxis," drift")}}function Ve(i,t){if(i&1&&(r(0,"div",55),p(1,"app-state-pill",34),m(2,Re,2,1,"app-pill",56),r(3,"span",57),d(4),l(),r(5,"app-pill"),d(6),l(),r(7,"button",58),p(8,"app-icon",51),d(9," Reveal "),l()()),i&2){let e=t.$implicit,n=t.$index;$("border-top",n>0?"1px solid var(--border-subtle)":"none"),o(),c("state",e.state),o(),u(e.driftAxis?2:-1),o(2),g(e.targetQualifiedName),o(2),g(e.provenance),o(2),c("size",12)}}function Le(i,t){if(i&1&&(r(0,"div",43),I(1,Ve,10,7,"div",54,pe),l()),i&2){let e=s(3);o(),N(e.selectedLinks())}}function Ae(i,t){i&1&&(r(0,"div",44),p(1,"app-icon",59),r(2,"div",60),d(3," Orphaned \u2014 no code implements this requirement yet "),l()()),i&2&&(o(),c("size",16))}function je(i,t){i&1&&(r(0,"div",53),d(1),l()),i&2&&(o(),g(t))}function We(i,t){if(i&1){let e=y();r(0,"div",11)(1,"div",31)(2,"span",32),d(3),l(),p(4,"app-copy-btn",33)(5,"div",6)(6,"app-state-pill",34),m(7,Ie,2,1,"app-pill"),l(),r(8,"h1",35),d(9),l(),r(10,"div",36)(11,"div",37)(12,"div",38),d(13,"Kind"),l(),r(14,"div",39),d(15),l()(),m(16,Ne,5,1,"div",37),r(17,"div",37)(18,"div",38),d(19,"Doc"),l(),r(20,"div",39),d(21),l()(),r(22,"div",37)(23,"div",38),d(24,"Siblings"),l(),r(25,"div",39),d(26),l()(),r(27,"div",37)(28,"div",38),d(29,"Links"),l(),r(30,"div",39),d(31),l()()(),r(32,"div",40),d(33,"Requirement"),l(),p(34,"div",41),r(35,"div",40),d(36,"Linked code"),l(),m(37,$e,1,0,"div",42)(38,Le,3,0,"div",43)(39,Ae,4,1,"div",44),r(40,"div",45)(41,"button",46),p(42,"app-icon",47),d(43," Implement "),l(),r(44,"button",48),p(45,"app-icon",49),d(46," Verify "),l(),r(47,"button",50),x("click",function(){f(e);let a=s(2);return C(a.onEditClick())}),p(48,"app-icon",51),d(49," Edit spec "),l(),r(50,"button",50),x("click",function(){let a=f(e),v=s(2);return C(v.goToGraph(a.id))}),p(51,"app-icon",52),d(52," Show in graph "),l()(),m(53,je,2,1,"div",53),l()}if(i&2){let e,n=t,a=s(2);o(3),g(n.id),o(),c("text",n.id),o(2),c("state",n.kind),o(),u(n.priority?7:-1),o(2),g(n.title),o(6),g(n.kind),o(),u(n.owner?16:-1),o(5),g(n.sourcePath.replace("specs/","")),o(5),b("",a.selectedSiblings().length," reqs"),o(5),g(a.selectedLinks().length),o(3),c("innerHTML",a.mdHtml(n.body),z),o(3),u(a.detailResource.state().loading?37:a.selectedLinks().length>0?38:39),o(5),c("size",13),o(3),c("size",13),o(3),c("size",13),o(3),c("size",13),o(2),u((e=a.saveError())?53:-1,e)}}function Fe(i,t){i&1&&(r(0,"app-empty",12)(1,"code",61),d(2,"specship init -i"),l()())}function qe(i,t){if(i&1){let e=y();r(0,"div",1)(1,"div",2)(2,"div",3),p(3,"app-icon",4),r(4,"span",5),d(5,"Specs"),l(),p(6,"span",6),r(7,"span",7),d(8),l()(),r(9,"div",8),m(10,ye,1,0,"app-empty",9),I(11,Pe,7,6,null,null,he),l()(),r(13,"div",10),m(14,ze,1,1)(15,We,54,17,"div",11)(16,Fe,3,0,"app-empty",12),l()(),r(17,"app-draft-with-claude-modal",13),x("close",function(){f(e);let a=s();return C(a.onDraftModalClose())}),l()}if(i&2){let e,n=s();o(3),c("size",15),o(5),b(" ",n.resource.state().loading?"\u2026":n.totalCount()+" reqs"," "),o(2),u(n.groups().length===0&&!n.resource.state().loading?10:-1),o(),N(n.groups()),o(3),u(n.editing()?14:(e=n.selectedSpec())?15:16,e),o(3),c("open",n.draftModalOpen())}}function Ge(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\*\*(.+?)\*\*/g,"<strong style='color:var(--text-primary)'>$1</strong>").replace(/`(.+?)`/g,"<code class='mono' style='font-size:12px;background:var(--bg-canvas);padding:1px 5px;border-radius:4px;border:1px solid var(--border-subtle)'>$1</code>")}var ce=class i{api=M(X);projects=M(J);router=M(B);resource=W(this.api,()=>`/api/specs${this.projects.projectQuery()}`);detailResource=W(this.api,()=>{let t=this.sel();return t?`/api/spec/${encodeURIComponent(t)}${this.projects.projectQuery()}`:null});sel=_(null);expandedGroups=_(new Set);editing=_(!1);editingSource=_(null);editingDirty=_(!1);saving=_(!1);saveError=_(null);draftModalOpen=_(!1);STATE=F;groups=h(()=>{let t=this.resource.state().data?.specs??[],e=new Map;for(let n of t){let a=n.sourcePath||"(unknown)";e.has(a)||e.set(a,{path:a,title:a.replace(/^specs\//,""),specs:[]}),e.get(a).specs.push(n)}return[...e.values()]});totalCount=h(()=>this.groups().reduce((t,e)=>t+e.specs.length,0));selectedSpec=h(()=>{let t=this.sel();if(!t)return null;for(let e of this.groups())for(let n of e.specs)if(n.id===t)return n;return null});selectedLinks=h(()=>this.detailResource.state().data?.links??[]);selectedSiblings=h(()=>{let t=this.selectedSpec();if(!t)return[];let e=this.groups().find(n=>n.path===t.sourcePath);return e?e.specs.filter(n=>n.id!==t.id):[]});isGroupOpen(t){return!this.expandedGroups().has("closed:"+t)}toggleGroup(t){this.expandedGroups.update(e=>{let n="closed:"+t,a=new Set(e);return a.has(n)?a.delete(n):a.add(n),a})}driftCountForGroup(t){let e=this.selectedSpec();return!e||e.sourcePath!==t.path?0:this.selectedLinks().filter(n=>["drifted","broken","orphaned"].includes(n.state)).length}stateColorFor(t){return F[t]?.color??"var(--node-spec)"}select(t){this.editing()&&(this.editing.set(!1),this.editingSource.set(null),this.editingDirty.set(!1)),this.sel.set(t)}mdHtml(t){return Ge(t)}goToGraph(t){this.router.navigate(["/graph"],{queryParams:{focus:"spec:"+t}})}async onEditClick(){let t=this.selectedSpec();if(t){this.saveError.set(null),this.editing.set(!0),this.editingSource.set(null);try{let e=this.projects.projectQuery(),n=await this.api.get(`/api/spec/${encodeURIComponent(t.id)}${e}`);this.editingSource.set(n.source??t.body)}catch(e){this.saveError.set(`Couldn't load source: ${e instanceof Error?e.message:String(e)}`),this.editing.set(!1)}}}onEditorValueChange(t){this.editingSource.set(t),this.editingDirty.set(!0)}async onEditorSave(){let t=this.selectedSpec(),e=this.editingSource();if(!(!t||e===null)){this.saving.set(!0),this.saveError.set(null);try{let n=this.projects.projectQuery();await this.api.put(`/api/spec/${encodeURIComponent(t.id)}${n}`,{content:e}),this.editing.set(!1),this.editingDirty.set(!1),this.editingSource.set(null),this.resource.refetch()}catch(n){this.saveError.set(`Save failed: ${n instanceof Error?n.message:String(n)}`)}finally{this.saving.set(!1)}}}onEditorCancel(){this.editingDirty()&&!window.confirm("Discard unsaved changes?")||(this.editing.set(!1),this.editingSource.set(null),this.editingDirty.set(!1),this.saveError.set(null))}onDraftWithClaudeClick(){this.draftModalOpen.set(!0)}onDraftModalClose(){this.draftModalOpen.set(!1)}static \u0275fac=function(e){return new(e||i)};static \u0275cmp=k({type:i,selectors:[["app-specs"]],decls:2,vars:1,consts:[["surface","Specs"],[1,"specs-shell"],[1,"tree-col"],[1,"tree-header","row","gap-8"],["name","book",2,"color","var(--accent)",3,"size"],[2,"font-weight","600","font-size","13px"],[1,"grow"],[1,"muted","tabular",2,"font-size","11px"],[1,"scroll-y","tree-scroll"],["icon","book","title","No specs found","body","Run specship init -i against a project with a specs/ directory."],[1,"detail-col","col"],[1,"scroll-y","detail-scroll"],["icon","book","title","Pick a spec from the tree","body","Or run specship init -i to index your specs/ folder if you haven't yet."],[3,"close","open"],[1,"doc-row","row","gap-6",3,"click"],[2,"color","var(--text-muted)",3,"name","size"],["name","book",2,"color","var(--node-spec)",3,"size"],[1,"mono","grow","doc-name"],[1,"pill",2,"font-size","9.5px","color","var(--warn)","background","var(--warn-soft)"],[1,"group-body"],[1,"req-row","row","gap-6",3,"selected"],[1,"req-row","row","gap-6",3,"click"],[1,"pill-dot",2,"flex-shrink","0"],[1,"grow",2,"min-width","0"],[1,"mono","req-id"],[1,"muted","req-title"],[1,"loading-detail"],[3,"value","path"],[1,"save-error"],[1,"save-status"],[3,"valueChange","save","cancel","value","path"],[1,"row","gap-8",2,"margin-bottom","4px"],[1,"mono",2,"font-size","12px","color","var(--node-spec)"],[3,"text"],[3,"state"],[1,"detail-title"],[1,"meta-row","row"],[1,"meta-item"],[1,"muted",2,"font-size","10.5px"],[1,"mono",2,"font-size","12.5px","margin-top","1px"],[1,"eyebrow",2,"margin-bottom","8px"],[1,"detail-body",3,"innerHTML"],[1,"skel",2,"height","42px","border-radius","8px","margin-bottom","22px"],[1,"card",2,"overflow","hidden","margin-bottom","22px"],[1,"card","card-pad","orphan-card"],[1,"row","gap-8",2,"flex-wrap","wrap"],["type","button",1,"btn","btn-primary","btn-sm"],["name","play",3,"size"],["type","button",1,"btn","btn-secondary","btn-sm"],["name","check",3,"size"],["type","button",1,"btn","btn-secondary","btn-sm",3,"click"],["name","reveal",3,"size"],["name","graph",3,"size"],[1,"save-error",2,"margin-top","16px"],[1,"row","gap-10","link-row",3,"border-top"],[1,"row","gap-10","link-row"],["color","var(--warn)","bg","var(--warn-soft)"],[1,"mono","grow","link-target"],["type","button",1,"btn","btn-ghost","btn-xs"],["name","drift",3,"size"],[2,"margin-top","6px","font-size","12.5px"],["action","",1,"mono",2,"font-size","11.5px","color","var(--accent)","background","var(--bg-canvas)","padding","5px 10px","border-radius","6px","border","1px solid var(--border-subtle)"]],template:function(e,n){e&1&&m(0,be,1,0,"app-pick-project-empty",0)(1,qe,18,5),e&2&&u(n.resource.state().noProject?0:1)},dependencies:[Y,E,L,A,ne,Z,ie,ee],styles:['@charset "UTF-8";[_nghost-%COMP%]{display:contents}.specs-shell[_ngcontent-%COMP%]{flex:1;display:flex;min-height:0}.tree-col[_ngcontent-%COMP%]{width:280px;flex-shrink:0;border-right:1px solid var(--border-subtle);background:var(--bg-panel);display:flex;flex-direction:column;min-height:0}.tree-header[_ngcontent-%COMP%]{padding:11px 12px;border-bottom:1px solid var(--border-subtle);align-items:center}.tree-scroll[_ngcontent-%COMP%]{flex:1;padding:6px}.doc-row[_ngcontent-%COMP%]{padding:6px 8px;border-radius:6px;cursor:pointer;color:var(--text-secondary);align-items:center}.doc-row[_ngcontent-%COMP%]:hover{background:var(--bg-hover)}.doc-name[_ngcontent-%COMP%]{font-size:12px;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-body[_ngcontent-%COMP%]{margin-left:14px;border-left:1px solid var(--border-subtle);padding-left:6px}.req-row[_ngcontent-%COMP%]{padding:5px 8px;border-radius:6px;cursor:pointer;align-items:flex-start;background:transparent}.req-row[_ngcontent-%COMP%]:not(.selected):hover{background:var(--bg-hover)}.req-row.selected[_ngcontent-%COMP%]{background:var(--accent-soft)}.req-id[_ngcontent-%COMP%]{font-size:11px}.req-title[_ngcontent-%COMP%]{font-size:10.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.detail-col[_ngcontent-%COMP%]{flex:1;min-width:0}.detail-scroll[_ngcontent-%COMP%]{flex:1;padding:22px}.detail-title[_ngcontent-%COMP%]{font-size:22px;font-weight:650;letter-spacing:-.01em;margin:2px 0 14px;text-wrap:pretty}.meta-row[_ngcontent-%COMP%]{gap:18px;padding:10px 0;border-top:1px solid var(--border-subtle);border-bottom:1px solid var(--border-subtle);margin-bottom:18px;flex-wrap:wrap}.detail-body[_ngcontent-%COMP%]{font-size:13.5px;line-height:1.65;color:var(--text-secondary);margin-bottom:22px;text-wrap:pretty}.link-row[_ngcontent-%COMP%]{padding:10px 12px}.link-target[_ngcontent-%COMP%]{font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.orphan-card[_ngcontent-%COMP%]{text-align:center;color:var(--error);margin-bottom:22px;border-color:#f2555a4d}.loading-detail[_ngcontent-%COMP%]{padding:40px 18px;color:var(--text-muted);font-size:13px;text-align:center}.save-error[_ngcontent-%COMP%]{padding:10px 14px;border:1px solid rgba(255,90,90,.35);background:var(--error-soft);color:var(--error);border-radius:8px;font-size:12.5px;line-height:1.5}.save-status[_ngcontent-%COMP%]{margin-top:8px;color:var(--text-muted);font-size:12px}'],changeDetection:0})};export{ce as Specs};