code-squad-cli 1.2.2 → 1.2.4

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.
@@ -4,8 +4,8 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>Flip</title>
7
- <script type="module" crossorigin src="/assets/index-CgNq-jV5.js"></script>
8
- <link rel="stylesheet" crossorigin href="/assets/index-BqoCRrTA.css">
7
+ <script type="module" crossorigin src="/assets/index-DmJdj9bX.js"></script>
8
+ <link rel="stylesheet" crossorigin href="/assets/index-DTf1sRAX.css">
9
9
  </head>
10
10
  <body>
11
11
  <div id="root"></div>
package/dist/index.js CHANGED
@@ -433,9 +433,34 @@ var DEFAULT_IGNORES = [
433
433
  "yarn.lock",
434
434
  ".DS_Store"
435
435
  ];
436
+ var VISIBLE_DOTFILES = /* @__PURE__ */ new Set([
437
+ ".gitignore",
438
+ ".gitattributes",
439
+ ".env.example",
440
+ ".env.local.example",
441
+ ".eslintrc",
442
+ ".eslintrc.js",
443
+ ".eslintrc.cjs",
444
+ ".eslintrc.json",
445
+ ".eslintrc.yml",
446
+ ".prettierrc",
447
+ ".prettierrc.js",
448
+ ".prettierrc.cjs",
449
+ ".prettierrc.json",
450
+ ".prettierrc.yml",
451
+ ".editorconfig",
452
+ ".npmrc",
453
+ ".nvmrc",
454
+ ".node-version",
455
+ ".dockerignore",
456
+ ".browserslistrc",
457
+ ".babelrc",
458
+ ".babelrc.js",
459
+ ".babelrc.json"
460
+ ]);
436
461
  function shouldIgnore(name) {
437
- if (name.startsWith(".") && name !== ".gitignore" && name !== ".env.example") {
438
- return true;
462
+ if (name.startsWith(".")) {
463
+ return !VISIBLE_DOTFILES.has(name);
439
464
  }
440
465
  return DEFAULT_IGNORES.includes(name);
441
466
  }
@@ -510,42 +535,126 @@ import { Router as Router2 } from "express";
510
535
  import fs3 from "fs";
511
536
  import path3 from "path";
512
537
  var router2 = Router2();
538
+ var extensionMap = {
539
+ // JavaScript/TypeScript
540
+ js: "javascript",
541
+ mjs: "javascript",
542
+ cjs: "javascript",
543
+ ts: "typescript",
544
+ mts: "typescript",
545
+ cts: "typescript",
546
+ tsx: "tsx",
547
+ jsx: "jsx",
548
+ // Systems languages
549
+ rs: "rust",
550
+ go: "go",
551
+ c: "c",
552
+ cpp: "cpp",
553
+ cc: "cpp",
554
+ cxx: "cpp",
555
+ h: "cpp",
556
+ hpp: "cpp",
557
+ hxx: "cpp",
558
+ // JVM languages
559
+ java: "java",
560
+ kt: "kotlin",
561
+ kts: "kotlin",
562
+ scala: "scala",
563
+ groovy: "groovy",
564
+ // Scripting languages
565
+ py: "python",
566
+ rb: "ruby",
567
+ php: "php",
568
+ pl: "perl",
569
+ lua: "lua",
570
+ // Mobile
571
+ swift: "swift",
572
+ m: "objective-c",
573
+ mm: "objective-cpp",
574
+ dart: "dart",
575
+ // Web
576
+ html: "html",
577
+ htm: "html",
578
+ css: "css",
579
+ scss: "scss",
580
+ sass: "sass",
581
+ less: "less",
582
+ vue: "vue",
583
+ svelte: "svelte",
584
+ astro: "astro",
585
+ // Data formats
586
+ json: "json",
587
+ jsonc: "jsonc",
588
+ yaml: "yaml",
589
+ yml: "yaml",
590
+ toml: "toml",
591
+ xml: "xml",
592
+ csv: "csv",
593
+ // Documentation
594
+ md: "markdown",
595
+ mdx: "mdx",
596
+ rst: "rst",
597
+ tex: "latex",
598
+ // Shell
599
+ sh: "bash",
600
+ bash: "bash",
601
+ zsh: "bash",
602
+ fish: "fish",
603
+ ps1: "powershell",
604
+ bat: "batch",
605
+ cmd: "batch",
606
+ // Database
607
+ sql: "sql",
608
+ prisma: "prisma",
609
+ graphql: "graphql",
610
+ gql: "graphql",
611
+ // Config
612
+ ini: "ini",
613
+ conf: "ini",
614
+ cfg: "ini",
615
+ env: "dotenv",
616
+ // Other
617
+ dockerfile: "dockerfile",
618
+ makefile: "makefile",
619
+ cmake: "cmake",
620
+ diff: "diff",
621
+ patch: "diff"
622
+ };
623
+ var filenameMap = {
624
+ "Makefile": "makefile",
625
+ "makefile": "makefile",
626
+ "GNUmakefile": "makefile",
627
+ "Dockerfile": "dockerfile",
628
+ "dockerfile": "dockerfile",
629
+ "Containerfile": "dockerfile",
630
+ "Jenkinsfile": "groovy",
631
+ "Vagrantfile": "ruby",
632
+ "Gemfile": "ruby",
633
+ "Rakefile": "ruby",
634
+ "Brewfile": "ruby",
635
+ "Podfile": "ruby",
636
+ "Fastfile": "ruby",
637
+ "Guardfile": "ruby",
638
+ ".gitignore": "gitignore",
639
+ ".gitattributes": "gitattributes",
640
+ ".editorconfig": "editorconfig",
641
+ ".bashrc": "bash",
642
+ ".zshrc": "bash",
643
+ ".bash_profile": "bash",
644
+ ".profile": "bash",
645
+ "CMakeLists.txt": "cmake",
646
+ "CODEOWNERS": "gitignore"
647
+ };
513
648
  function detectLanguage(filePath) {
649
+ const basename2 = path3.basename(filePath);
650
+ if (filenameMap[basename2]) {
651
+ return filenameMap[basename2];
652
+ }
514
653
  const ext = path3.extname(filePath).slice(1).toLowerCase();
515
- const languageMap = {
516
- rs: "rust",
517
- js: "javascript",
518
- ts: "typescript",
519
- tsx: "tsx",
520
- jsx: "jsx",
521
- py: "python",
522
- go: "go",
523
- java: "java",
524
- c: "c",
525
- cpp: "cpp",
526
- cc: "cpp",
527
- cxx: "cpp",
528
- h: "cpp",
529
- hpp: "cpp",
530
- md: "markdown",
531
- json: "json",
532
- yaml: "yaml",
533
- yml: "yaml",
534
- toml: "toml",
535
- html: "html",
536
- css: "css",
537
- scss: "scss",
538
- sh: "bash",
539
- bash: "bash",
540
- sql: "sql",
541
- rb: "ruby",
542
- swift: "swift",
543
- kt: "kotlin",
544
- kts: "kotlin",
545
- xml: "xml",
546
- vue: "vue"
547
- };
548
- return languageMap[ext] || "plaintext";
654
+ if (extensionMap[ext]) {
655
+ return extensionMap[ext];
656
+ }
657
+ return "text";
549
658
  }
550
659
  router2.get("/", (req, res) => {
551
660
  const state = req.app.locals.state;
@@ -1488,6 +1597,37 @@ async function writeCdFile(targetPath) {
1488
1597
  await fs10.promises.writeFile(cdFile, targetPath);
1489
1598
  }
1490
1599
  }
1600
+ async function cdInCurrentTerminal(targetPath) {
1601
+ const { exec: exec2 } = await import("child_process");
1602
+ const escapedPath = targetPath.replace(/'/g, "'\\''");
1603
+ const hasIterm = await new Promise((resolve2) => {
1604
+ exec2('mdfind "kMDItemCFBundleIdentifier == com.googlecode.iterm2"', (error, stdout) => {
1605
+ resolve2(!error && stdout.trim().length > 0);
1606
+ });
1607
+ });
1608
+ if (hasIterm) {
1609
+ const script = `
1610
+ tell application "iTerm2"
1611
+ tell current session of current window
1612
+ write text "cd '${escapedPath}'"
1613
+ end tell
1614
+ end tell`;
1615
+ return new Promise((resolve2) => {
1616
+ exec2(`osascript -e '${script}'`, (error) => {
1617
+ resolve2(!error);
1618
+ });
1619
+ });
1620
+ }
1621
+ const terminalScript = `
1622
+ tell application "Terminal"
1623
+ do script "cd '${escapedPath}'" in front window
1624
+ end tell`;
1625
+ return new Promise((resolve2) => {
1626
+ exec2(`osascript -e '${terminalScript}'`, (error) => {
1627
+ resolve2(!error);
1628
+ });
1629
+ });
1630
+ }
1491
1631
  async function openNewTerminal(targetPath) {
1492
1632
  const { exec: exec2 } = await import("child_process");
1493
1633
  const escapedPath = targetPath.replace(/'/g, "'\\''");
@@ -1508,12 +1648,7 @@ tell application "iTerm2"
1508
1648
  end tell`;
1509
1649
  return new Promise((resolve2) => {
1510
1650
  exec2(`osascript -e '${script}'`, (error) => {
1511
- if (error) {
1512
- console.error(chalk2.red("Failed to open iTerm2 split pane"));
1513
- resolve2(false);
1514
- } else {
1515
- resolve2(true);
1516
- }
1651
+ resolve2(!error);
1517
1652
  });
1518
1653
  });
1519
1654
  }
@@ -1524,26 +1659,14 @@ tell application "Terminal"
1524
1659
  end tell`;
1525
1660
  return new Promise((resolve2) => {
1526
1661
  exec2(`osascript -e '${terminalScript}'`, (error) => {
1527
- if (error) {
1528
- console.error(chalk2.red("Failed to open Terminal"));
1529
- resolve2(false);
1530
- } else {
1531
- resolve2(true);
1532
- }
1662
+ resolve2(!error);
1533
1663
  });
1534
1664
  });
1535
1665
  }
1536
1666
  async function interactiveMode(workspaceRoot) {
1537
1667
  const result = await runInteraction(workspaceRoot);
1538
1668
  if (result?.cdPath) {
1539
- if (process.env.CSQ_CD_FILE) {
1540
- console.log(result.cdPath);
1541
- } else {
1542
- console.log(chalk2.dim("\nRun this to switch:"));
1543
- console.log(chalk2.cyan(` cd "${result.cdPath}"`));
1544
- console.log(chalk2.dim("\nTip: Add to ~/.zshrc for auto-cd:"));
1545
- console.log(chalk2.dim(' eval "$(csq --init)"'));
1546
- }
1669
+ await cdInCurrentTerminal(result.cdPath);
1547
1670
  }
1548
1671
  }
1549
1672
  async function persistentInteractiveMode(workspaceRoot) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-squad-cli",
3
- "version": "1.2.2",
3
+ "version": "1.2.4",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "csq": "./dist/index.js"
@@ -1 +0,0 @@
1
- *{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary: #0d1117;--bg-secondary: #161b22;--bg-tertiary: #21262d;--bg-hover: #30363d;--bg-selected: #1f6feb26;--text-primary: #e6edf3;--text-secondary: #8b949e;--text-muted: #6e7681;--border-color: #30363d;--border-subtle: #21262d;--accent-primary: #238636;--accent-primary-hover: #2ea043;--accent-secondary: #1f6feb;--git-modified: #d29922;--git-untracked: #3fb950;--git-deleted: #f85149;--git-added: #3fb950;--line-number-color: #6e7681;--selection-bg: #264f78;--diff-add-bg: rgba(46, 160, 67, .15);--diff-add-text: #7ee787;--diff-add-border: rgba(46, 160, 67, .4);--diff-delete-bg: rgba(248, 81, 73, .15);--diff-delete-text: #ffa198;--diff-delete-border: rgba(248, 81, 73, .4);--diff-hunk-bg: rgba(56, 139, 253, .1);--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;--font-mono: "SF Mono", "Menlo", "Monaco", "Consolas", monospace;--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 24px;--transition-fast: .15s ease;--transition-normal: .2s ease}body{font-family:var(--font-sans);font-size:14px;background-color:var(--bg-primary);color:var(--text-primary);height:100vh;overflow:hidden}#root{height:100%}.app{display:flex;flex-direction:column;height:100%}.main-content{display:flex;flex:1;overflow:hidden}.toolbar{display:flex;align-items:center;justify-content:space-between;height:40px;padding:0 var(--space-3);background-color:var(--bg-secondary);border-bottom:1px solid var(--border-subtle)}.toolbar-left,.toolbar-center,.toolbar-right{display:flex;align-items:center;gap:var(--space-2)}.toolbar-btn{display:flex;align-items:center;justify-content:center;gap:var(--space-1);height:28px;padding:0 var(--space-2);border:none;background:transparent;border-radius:6px;color:var(--text-secondary);cursor:pointer;transition:all var(--transition-fast)}.toolbar-btn:hover{background-color:var(--bg-hover);color:var(--text-primary)}.toolbar-btn.active{background-color:var(--bg-tertiary);color:var(--text-primary)}.toolbar-btn svg{flex-shrink:0}.diff-toggle{min-width:100px}.diff-mode-label{font-size:12px}.sidebar{width:280px;background-color:var(--bg-secondary);border-right:1px solid var(--border-subtle);overflow:hidden;display:flex;flex-direction:column;transition:width var(--transition-normal),opacity var(--transition-fast)}.sidebar.collapsed{width:0;opacity:0;border-right:none}.content{flex:1;overflow:hidden;display:flex;flex-direction:column;min-width:0}.staging-panel{width:320px;background-color:var(--bg-secondary);border-left:1px solid var(--border-subtle);overflow:hidden;display:flex;flex-direction:column;transition:width var(--transition-normal),opacity var(--transition-fast)}.staging-panel.collapsed{width:0;opacity:0;border-left:none}.footer{display:flex;align-items:center;justify-content:space-between;padding:var(--space-2) var(--space-4);background-color:var(--bg-secondary);border-top:1px solid var(--border-subtle);gap:var(--space-4)}.footer-actions{display:flex;gap:var(--space-2)}.file-tree{display:flex;flex-direction:column;height:100%}.file-tree-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary);border-bottom:1px solid var(--border-subtle)}.file-tree-header-actions{display:flex;gap:var(--space-1)}.filter-btn{display:flex;align-items:center;gap:var(--space-1);padding:2px 8px;border:none;background:transparent;border-radius:4px;color:var(--text-muted);font-size:10px;font-weight:600;cursor:pointer;transition:all var(--transition-fast)}.filter-btn:hover{background-color:var(--bg-hover);color:var(--text-secondary)}.filter-btn.active{background-color:var(--accent-secondary);color:#fff}.filter-btn .count{background-color:var(--bg-hover);padding:0 4px;border-radius:3px;font-size:9px}.filter-btn.active .count{background-color:#fff3}.file-tree-content{flex:1;overflow-y:auto;padding:var(--space-1) 0}.tree-item{display:flex;align-items:center;padding:var(--space-1) var(--space-2);cursor:pointer;-webkit-user-select:none;user-select:none;gap:6px}.tree-item:hover{background-color:var(--bg-hover)}.tree-icon{font-size:10px;width:14px;text-align:center;color:var(--text-secondary)}.tree-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.git-badge{font-size:10px;font-weight:600;padding:1px 4px;border-radius:3px}.git-badge-modified{color:var(--git-modified);background-color:#d2992226}.git-badge-untracked{color:var(--git-untracked);background-color:#3fb95026}.git-badge-deleted{color:var(--git-deleted);background-color:#f8514926}.git-badge-added{color:var(--git-added);background-color:#3fb95026}.code-viewer{display:flex;flex-direction:column;height:100%;overflow:hidden}.code-viewer-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;color:var(--text-secondary);gap:var(--space-2)}.code-viewer-empty .hint{font-size:12px;color:var(--text-muted)}.code-viewer-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-2) var(--space-4);background-color:var(--bg-secondary);border-bottom:1px solid var(--border-subtle)}.file-path{font-size:13px;font-family:var(--font-mono)}.file-language{font-size:11px;color:var(--text-secondary);text-transform:uppercase}.code-viewer-content{flex:1;overflow:auto;font-family:var(--font-mono);font-size:13px;line-height:1.5}.code-line{display:flex;min-height:20px;cursor:pointer}.code-line:hover{background-color:var(--bg-hover)}.code-line-selected{background-color:var(--selection-bg)!important}.code-line-added{background-color:var(--diff-add-bg)!important}.code-line-added:hover{background-color:#2ea04340!important}.code-line-deleted{background-color:var(--diff-delete-bg)!important}.code-line-deleted:hover{background-color:#f8514940!important}.line-number{display:inline-block;min-width:50px;padding:0 var(--space-3);text-align:right;color:var(--line-number-color);-webkit-user-select:none;user-select:none;background-color:var(--bg-tertiary);border-right:1px solid var(--border-subtle)}.code-line code{flex:1;padding:0 var(--space-3);white-space:pre;background:transparent}.code-line code.hljs{background:transparent;padding:0 var(--space-3)}.code-content{flex:1;padding:0 var(--space-3);white-space:pre}.staging-list{display:flex;flex-direction:column;height:100%}.staging-list-empty{padding:var(--space-4)}.staging-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-3) var(--space-4);font-weight:600;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--text-secondary);border-bottom:1px solid var(--border-subtle)}.staging-hint{font-size:12px;color:var(--text-muted);line-height:1.5}.staging-items{flex:1;overflow-y:auto;padding:var(--space-2)}.staging-item{background-color:var(--bg-tertiary);border-radius:6px;padding:var(--space-2) var(--space-3);margin-bottom:var(--space-2)}.staging-item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-1)}.staging-location{font-family:var(--font-mono);font-size:12px;color:var(--text-secondary)}.staging-comment{font-size:13px;line-height:1.4}.comment-input{display:flex;align-items:center;gap:var(--space-3);flex:1}.comment-selection{font-family:var(--font-mono);font-size:12px;color:var(--accent-secondary);white-space:nowrap}.comment-field{flex:1;padding:var(--space-2) var(--space-3);background-color:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);font-size:14px;transition:border-color var(--transition-fast)}.comment-field:focus{outline:none;border-color:var(--accent-secondary)}.comment-hint{color:var(--text-muted);font-size:13px}.fuzzy-finder-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#0009;display:flex;justify-content:center;padding-top:80px;z-index:100}.fuzzy-finder{background-color:var(--bg-secondary);border:1px solid var(--border-color);border-radius:12px;box-shadow:0 16px 48px #00000080;width:600px;max-height:400px;display:flex;flex-direction:column;overflow:hidden}.fuzzy-finder-input{padding:var(--space-4);background-color:var(--bg-tertiary);border:none;border-bottom:1px solid var(--border-subtle);color:var(--text-primary);font-size:16px}.fuzzy-finder-input:focus{outline:none}.fuzzy-finder-results{flex:1;overflow-y:auto}.fuzzy-finder-item{padding:var(--space-3) var(--space-4);cursor:pointer;font-family:var(--font-mono);font-size:13px}.fuzzy-finder-item:hover,.fuzzy-finder-item-selected{background-color:var(--bg-selected)}.fuzzy-finder-empty{padding:var(--space-4);color:var(--text-muted);text-align:center}.btn{padding:var(--space-2) var(--space-4);border:none;border-radius:6px;font-size:13px;font-weight:500;cursor:pointer;transition:background-color var(--transition-fast)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-primary{background-color:var(--accent-primary);color:#fff}.btn-primary:hover:not(:disabled){background-color:var(--accent-primary-hover)}.btn-secondary{background-color:var(--bg-tertiary);color:var(--text-primary)}.btn-secondary:hover:not(:disabled){background-color:var(--bg-hover)}.btn-small{padding:var(--space-1) var(--space-3)}.btn-link{background:none;border:none;color:var(--accent-secondary);cursor:pointer;font-size:11px}.btn-link:hover{text-decoration:underline}.btn-icon{background:none;border:none;color:var(--text-muted);cursor:pointer;font-size:14px;padding:2px 6px}.btn-icon:hover{color:var(--text-primary)}.diff-side-by-side{display:flex;height:100%;overflow:hidden}.diff-pane{flex:1;overflow:auto;font-family:var(--font-mono);font-size:13px;line-height:1.5}.diff-pane-left{border-right:1px solid var(--border-color)}.diff-pane-header{padding:var(--space-2) var(--space-3);background-color:var(--bg-tertiary);border-bottom:1px solid var(--border-subtle);font-size:11px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px}.code-viewer-loading{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text-muted)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--bg-hover);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#484f58}::-webkit-scrollbar-corner{background:transparent}