@slycode/slycode 0.2.19 → 0.2.21

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 (51) hide show
  1. package/dist/bridge/claude-utils.d.ts +5 -0
  2. package/dist/bridge/claude-utils.js +8 -1
  3. package/dist/bridge/claude-utils.js.map +1 -1
  4. package/dist/bridge/pty-handler.js +82 -14
  5. package/dist/bridge/pty-handler.js.map +1 -1
  6. package/dist/messaging/index.js +6 -6
  7. package/dist/messaging/index.js.map +1 -1
  8. package/dist/messaging/stt.d.ts +1 -1
  9. package/dist/messaging/stt.js +41 -9
  10. package/dist/messaging/stt.js.map +1 -1
  11. package/dist/web/.next/BUILD_ID +1 -1
  12. package/dist/web/.next/build-manifest.json +2 -2
  13. package/dist/web/.next/server/app/_global-error.html +2 -2
  14. package/dist/web/.next/server/app/_global-error.rsc +1 -1
  15. package/dist/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  16. package/dist/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  17. package/dist/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  18. package/dist/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  19. package/dist/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  20. package/dist/web/.next/server/app/_not-found.html +1 -1
  21. package/dist/web/.next/server/app/_not-found.rsc +1 -1
  22. package/dist/web/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  23. package/dist/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/dist/web/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  25. package/dist/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/dist/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/dist/web/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  28. package/dist/web/.next/server/app/page/react-loadable-manifest.json +1 -1
  29. package/dist/web/.next/server/app/page_client-reference-manifest.js +1 -1
  30. package/dist/web/.next/server/app/project/[id]/page/react-loadable-manifest.json +1 -1
  31. package/dist/web/.next/server/app/project/[id]/page_client-reference-manifest.js +1 -1
  32. package/dist/web/.next/server/chunks/[root-of-the-server]__f3e501b6._.js +1 -1
  33. package/dist/web/.next/server/chunks/ssr/src_components_c4135402._.js +1 -1
  34. package/dist/web/.next/server/pages/404.html +1 -1
  35. package/dist/web/.next/server/pages/500.html +2 -2
  36. package/dist/web/.next/static/chunks/{8cb404d087e9f3c7.js → 4049cceee6a49323.js} +1 -1
  37. package/dist/web/.next/static/chunks/{0a4b215957655f38.js → 7813de6392004c3f.js} +1 -1
  38. package/dist/web/.next/static/chunks/{c7a853519f3ebcb8.js → 94b526560cbd7bc0.js} +1 -1
  39. package/dist/web/.next/static/chunks/{e52d73ad4544e983.js → a199b72c0ad65aea.js} +1 -1
  40. package/dist/web/src/app/api/projects/route.ts +11 -2
  41. package/dist/web/src/components/CardModal.tsx +31 -24
  42. package/dist/web/src/components/Terminal.tsx +12 -0
  43. package/dist/web/tsconfig.tsbuildinfo +1 -1
  44. package/lib/cli/update.d.ts.map +1 -1
  45. package/lib/cli/update.js +3 -0
  46. package/lib/cli/update.js.map +1 -1
  47. package/package.json +2 -2
  48. package/templates/kanban-seed.json +1 -1
  49. /package/dist/web/.next/static/{qMss0q1Ox38k4U6oxip2H → 0sPAbk-Qw-InZ0rdHjHnC}/_buildManifest.js +0 -0
  50. /package/dist/web/.next/static/{qMss0q1Ox38k4U6oxip2H → 0sPAbk-Qw-InZ0rdHjHnC}/_clientMiddlewareManifest.json +0 -0
  51. /package/dist/web/.next/static/{qMss0q1Ox38k4U6oxip2H → 0sPAbk-Qw-InZ0rdHjHnC}/_ssgManifest.js +0 -0
@@ -649,33 +649,40 @@ export function CardModal({ card, stage, projectId, projectPath, onClose, onUpda
649
649
  };
650
650
  const currentDocPath = getDocPath(activeTab);
651
651
 
652
- // Track loaded docs by path to avoid reloading
652
+ // Track loaded docs by path
653
653
  const [loadedDocs, setLoadedDocs] = useState<Record<string, string>>({});
654
654
  const [docErrors, setDocErrors] = useState<Record<string, string>>({});
655
655
 
656
- // Load document when a doc tab is selected
656
+ // Re-fetch document every time a doc tab is selected (always show latest from disk)
657
657
  useEffect(() => {
658
658
  const isDocTab = activeTab === 'design' || activeTab === 'feature' || activeTab === 'test';
659
- if (isDocTab && currentDocPath && !loadedDocs[currentDocPath] && !docLoading) {
660
- // eslint-disable-next-line react-hooks/set-state-in-effect -- gating fetch with loading flag
661
- setDocLoading(true);
662
- fetch(`/api/file?path=${encodeURIComponent(currentDocPath)}&projectId=${encodeURIComponent(projectId)}`)
663
- .then((res) => res.json())
664
- .then((data) => {
665
- if (data.error) {
666
- setDocErrors((prev) => ({ ...prev, [currentDocPath!]: data.error }));
667
- } else {
668
- setLoadedDocs((prev) => ({ ...prev, [currentDocPath!]: data.content }));
669
- }
670
- })
671
- .catch((err) => {
672
- setDocErrors((prev) => ({ ...prev, [currentDocPath!]: err.message }));
673
- })
674
- .finally(() => {
675
- setDocLoading(false);
676
- });
677
- }
678
- }, [activeTab, currentDocPath, loadedDocs, docLoading, projectId]);
659
+ if (!isDocTab || !currentDocPath) return;
660
+
661
+ // eslint-disable-next-line react-hooks/set-state-in-effect -- gating fetch with loading flag
662
+ setDocLoading(true);
663
+ const fetchPath = currentDocPath;
664
+ fetch(`/api/file?path=${encodeURIComponent(fetchPath)}&projectId=${encodeURIComponent(projectId)}`)
665
+ .then((res) => res.json())
666
+ .then((data) => {
667
+ if (data.error) {
668
+ setDocErrors((prev) => ({ ...prev, [fetchPath]: data.error }));
669
+ } else {
670
+ setDocErrors((prev) => {
671
+ const next = { ...prev };
672
+ delete next[fetchPath];
673
+ return next;
674
+ });
675
+ setLoadedDocs((prev) => ({ ...prev, [fetchPath]: data.content }));
676
+ }
677
+ })
678
+ .catch((err) => {
679
+ setDocErrors((prev) => ({ ...prev, [fetchPath]: err.message }));
680
+ })
681
+ .finally(() => {
682
+ setDocLoading(false);
683
+ });
684
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- intentionally re-fetch on every tab switch
685
+ }, [activeTab, currentDocPath, projectId]);
679
686
 
680
687
  const handleTitleSave = () => {
681
688
  if (editedTitle.trim() && editedTitle !== card.title) {
@@ -1623,12 +1630,12 @@ export function CardModal({ card, stage, projectId, projectPath, onClose, onUpda
1623
1630
  )}
1624
1631
  </button>
1625
1632
  )}
1626
- {docLoading && !loadedDocs[currentDocPath!] && (
1633
+ {docLoading && !loadedDocs[currentDocPath!] && !docErrors[currentDocPath!] && (
1627
1634
  <div className="flex items-center justify-center py-8">
1628
1635
  <div className="text-void-500">Loading document...</div>
1629
1636
  </div>
1630
1637
  )}
1631
- {currentDocPath && docErrors[currentDocPath] && (
1638
+ {currentDocPath && docErrors[currentDocPath] && !loadedDocs[currentDocPath] && (
1632
1639
  <div className="rounded-lg bg-red-50 p-4 text-red-700 dark:bg-red-900/20 dark:text-red-300">
1633
1640
  Error loading document: {docErrors[currentDocPath]}
1634
1641
  </div>
@@ -134,6 +134,18 @@ export const Terminal = forwardRef<TerminalHandle, TerminalProps>(function Termi
134
134
  };
135
135
 
136
136
  terminal.attachCustomKeyEventHandler((e: KeyboardEvent) => {
137
+ // Shift+Enter → send CSI u escape sequence for "insert newline" instead
138
+ // of xterm's default \r (which submits). CLI tools like Claude Code,
139
+ // Codex, and Gemini interpret \x1b[13;2u as newline insertion.
140
+ // Must return false for ALL event types (keydown, keypress) to prevent
141
+ // xterm from sending \r via the keypress path.
142
+ if (e.key === 'Enter' && e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) {
143
+ if (e.type === 'keydown') {
144
+ pasteText('\x1b[13;2u');
145
+ }
146
+ return false;
147
+ }
148
+
137
149
  if (e.type !== 'keydown') return true;
138
150
  if (!((e.ctrlKey || e.metaKey) && e.key === 'v' && !e.shiftKey)) return true;
139
151