tabby-tabbyspaces 0.1.0 → 0.2.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.
- package/.claude/settings.local.json +2 -1
- package/.github/workflows/ci.yml +26 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +81 -0
- package/.github/workflows/release.yml +30 -0
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +33 -0
- package/CONTRIBUTING.md +3 -1
- package/README.md +27 -18
- package/TODO.md +5 -0
- package/dist/build-config.d.ts +3 -3
- package/dist/components/deleteConfirmModal.component.d.ts +7 -0
- package/dist/components/deleteConfirmModal.component.d.ts.map +1 -0
- package/dist/components/paneEditor.component.d.ts +9 -18
- package/dist/components/paneEditor.component.d.ts.map +1 -1
- package/dist/components/splitPreview.component.d.ts +50 -50
- package/dist/components/splitPreview.component.d.ts.map +1 -1
- package/dist/components/workspaceEditor.component.d.ts +61 -54
- package/dist/components/workspaceEditor.component.d.ts.map +1 -1
- package/dist/components/workspaceList.component.d.ts +56 -39
- package/dist/components/workspaceList.component.d.ts.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/workspace.model.d.ts +118 -78
- package/dist/models/workspace.model.d.ts.map +1 -1
- package/dist/package.json +1 -1
- package/dist/providers/config.provider.d.ts +8 -8
- package/dist/providers/settings.provider.d.ts +7 -7
- package/dist/providers/toolbar.provider.d.ts +23 -15
- package/dist/providers/toolbar.provider.d.ts.map +1 -1
- package/dist/services/startupCommand.service.d.ts +27 -19
- package/dist/services/startupCommand.service.d.ts.map +1 -1
- package/dist/services/workspaceBackground.service.d.ts +38 -0
- package/dist/services/workspaceBackground.service.d.ts.map +1 -0
- package/dist/services/workspaceEditor.service.d.ts +46 -32
- package/dist/services/workspaceEditor.service.d.ts.map +1 -1
- package/docs/DESIGN.md +57 -0
- package/docs/SESSION-2026-01-14-S1-DESIGN.md +134 -0
- package/mockups/index.html +162 -0
- package/mockups/s1-tight-sharp.html +522 -0
- package/mockups/shared/base.css +216 -0
- package/mockups/v06-tabbed.html +643 -0
- package/package.json +2 -1
- package/screenshots/editor.png +0 -0
- package/screenshots/pane-edit.png +0 -0
- package/scripts/build-dev.js +2 -1
- package/scripts/build-prod.js +2 -1
- package/src/components/deleteConfirmModal.component.ts +23 -0
- package/src/components/paneEditor.component.pug +27 -43
- package/src/components/paneEditor.component.scss +37 -85
- package/src/components/paneEditor.component.ts +4 -32
- package/src/components/splitPreview.component.pug +0 -9
- package/src/components/splitPreview.component.scss +46 -70
- package/src/components/splitPreview.component.ts +15 -25
- package/src/components/workspaceEditor.component.pug +140 -112
- package/src/components/workspaceEditor.component.scss +270 -202
- package/src/components/workspaceEditor.component.ts +161 -85
- package/src/components/workspaceList.component.pug +31 -51
- package/src/components/workspaceList.component.scss +86 -77
- package/src/components/workspaceList.component.ts +89 -34
- package/src/index.ts +4 -0
- package/src/models/workspace.model.ts +80 -2
- package/src/providers/toolbar.provider.ts +78 -9
- package/src/services/startupCommand.service.ts +30 -32
- package/src/services/workspaceBackground.service.ts +167 -0
- package/src/services/workspaceEditor.service.ts +77 -40
- package/src/styles/_index.scss +3 -0
- package/src/styles/_mixins.scss +180 -0
- package/src/styles/_variables.scss +67 -0
- package/TEST_MCP.md +0 -176
- package/cdp-click.js +0 -22
- package/cdp-test.js +0 -28
- package/test_cdp.py +0 -50
|
@@ -31,7 +31,8 @@
|
|
|
31
31
|
"Bash(git log:*)",
|
|
32
32
|
"Bash(ls -la \"C:\\\\Users\\\\halil\\\\tabbyspaces\\\\screenshots\"\" 2>nul || echo \"Directory not found \")",
|
|
33
33
|
"Bash(dir:*)",
|
|
34
|
-
"Bash(cmd.exe /c start \"\" \"C:\\\\Program Files \\(x86\\)\\\\Tabby\\\\Tabby.exe\" --remote-debugging-port=9222)"
|
|
34
|
+
"Bash(cmd.exe /c start \"\" \"C:\\\\Program Files \\(x86\\)\\\\Tabby\\\\Tabby.exe\" --remote-debugging-port=9222)",
|
|
35
|
+
"Bash(ls:*)"
|
|
35
36
|
]
|
|
36
37
|
},
|
|
37
38
|
"enableAllProjectMcpServers": true,
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [dev]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
build:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Setup Node.js
|
|
17
|
+
uses: actions/setup-node@v4
|
|
18
|
+
with:
|
|
19
|
+
node-version: '18'
|
|
20
|
+
cache: 'npm'
|
|
21
|
+
|
|
22
|
+
- name: Install dependencies
|
|
23
|
+
run: npm ci --legacy-peer-deps
|
|
24
|
+
|
|
25
|
+
- name: Build
|
|
26
|
+
run: npm run build
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Claude Code Review
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
types: [opened, synchronize, ready_for_review, reopened]
|
|
6
|
+
# Optional: Only run on specific file changes
|
|
7
|
+
# paths:
|
|
8
|
+
# - "src/**/*.ts"
|
|
9
|
+
# - "src/**/*.tsx"
|
|
10
|
+
# - "src/**/*.js"
|
|
11
|
+
# - "src/**/*.jsx"
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude-review:
|
|
15
|
+
# Only run for repository members to control costs
|
|
16
|
+
if: |
|
|
17
|
+
github.event.pull_request.author_association == 'OWNER' ||
|
|
18
|
+
github.event.pull_request.author_association == 'MEMBER' ||
|
|
19
|
+
github.event.pull_request.author_association == 'COLLABORATOR'
|
|
20
|
+
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
permissions:
|
|
23
|
+
contents: write
|
|
24
|
+
pull-requests: write
|
|
25
|
+
issues: read
|
|
26
|
+
id-token: write
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout repository
|
|
30
|
+
uses: actions/checkout@v4
|
|
31
|
+
with:
|
|
32
|
+
fetch-depth: 0
|
|
33
|
+
|
|
34
|
+
- name: Run Claude Code Review
|
|
35
|
+
id: claude-review
|
|
36
|
+
uses: anthropics/claude-code-action@v1.0.0
|
|
37
|
+
with:
|
|
38
|
+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
39
|
+
prompt: >
|
|
40
|
+
Please review the changes in this pull request and leave a concise summary comment with any issues, suggestions, and potential bugs:
|
|
41
|
+
https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}
|
|
42
|
+
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
|
|
43
|
+
# or https://code.claude.com/docs/en/cli-reference for available options
|
|
44
|
+
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
name: Claude Code
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issue_comment:
|
|
5
|
+
types: [created]
|
|
6
|
+
pull_request_review_comment:
|
|
7
|
+
types: [created]
|
|
8
|
+
issues:
|
|
9
|
+
types: [opened]
|
|
10
|
+
pull_request_review:
|
|
11
|
+
types: [submitted]
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude:
|
|
15
|
+
if: |
|
|
16
|
+
(
|
|
17
|
+
github.event_name == 'issue_comment' &&
|
|
18
|
+
contains(github.event.comment.body, '@claude') &&
|
|
19
|
+
(
|
|
20
|
+
github.event.comment.author_association == 'OWNER' ||
|
|
21
|
+
github.event.comment.author_association == 'MEMBER' ||
|
|
22
|
+
github.event.comment.author_association == 'COLLABORATOR'
|
|
23
|
+
)
|
|
24
|
+
) ||
|
|
25
|
+
(
|
|
26
|
+
github.event_name == 'pull_request_review_comment' &&
|
|
27
|
+
contains(github.event.comment.body, '@claude') &&
|
|
28
|
+
(
|
|
29
|
+
github.event.comment.author_association == 'OWNER' ||
|
|
30
|
+
github.event.comment.author_association == 'MEMBER' ||
|
|
31
|
+
github.event.comment.author_association == 'COLLABORATOR'
|
|
32
|
+
)
|
|
33
|
+
) ||
|
|
34
|
+
(
|
|
35
|
+
github.event_name == 'pull_request_review' &&
|
|
36
|
+
contains(github.event.review.body, '@claude') &&
|
|
37
|
+
(
|
|
38
|
+
github.event.review.author_association == 'OWNER' ||
|
|
39
|
+
github.event.review.author_association == 'MEMBER' ||
|
|
40
|
+
github.event.review.author_association == 'COLLABORATOR'
|
|
41
|
+
)
|
|
42
|
+
) ||
|
|
43
|
+
(
|
|
44
|
+
github.event_name == 'issues' &&
|
|
45
|
+
(
|
|
46
|
+
contains(github.event.issue.body, '@claude') ||
|
|
47
|
+
contains(github.event.issue.title, '@claude')
|
|
48
|
+
) &&
|
|
49
|
+
(
|
|
50
|
+
github.event.issue.author_association == 'OWNER' ||
|
|
51
|
+
github.event.issue.author_association == 'MEMBER' ||
|
|
52
|
+
github.event.issue.author_association == 'COLLABORATOR'
|
|
53
|
+
)
|
|
54
|
+
)
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
permissions:
|
|
57
|
+
contents: read
|
|
58
|
+
pull-requests: write
|
|
59
|
+
issues: write
|
|
60
|
+
id-token: write
|
|
61
|
+
actions: read # Required for Claude to read CI results on PRs
|
|
62
|
+
steps:
|
|
63
|
+
- name: Checkout repository
|
|
64
|
+
uses: actions/checkout@v4
|
|
65
|
+
with:
|
|
66
|
+
fetch-depth: 0
|
|
67
|
+
|
|
68
|
+
- name: Run Claude Code
|
|
69
|
+
id: claude
|
|
70
|
+
uses: anthropics/claude-code-action@v1.0.0
|
|
71
|
+
with:
|
|
72
|
+
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
|
73
|
+
|
|
74
|
+
# Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.
|
|
75
|
+
# prompt: 'Update the pull request description to include a summary of changes.'
|
|
76
|
+
|
|
77
|
+
# Optional: Add claude_args to customize behavior and configuration
|
|
78
|
+
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
|
|
79
|
+
# or https://code.claude.com/docs/en/cli-reference for available options
|
|
80
|
+
# claude_args: '--allowed-tools Bash(gh pr:*)'
|
|
81
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
publish:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
|
|
14
|
+
- name: Setup Node.js
|
|
15
|
+
uses: actions/setup-node@v4
|
|
16
|
+
with:
|
|
17
|
+
node-version: '18'
|
|
18
|
+
cache: 'npm'
|
|
19
|
+
registry-url: 'https://registry.npmjs.org'
|
|
20
|
+
|
|
21
|
+
- name: Install dependencies
|
|
22
|
+
run: npm ci --legacy-peer-deps
|
|
23
|
+
|
|
24
|
+
- name: Build
|
|
25
|
+
run: npm run build
|
|
26
|
+
|
|
27
|
+
- name: Publish to npm
|
|
28
|
+
run: npm publish --access public
|
|
29
|
+
env:
|
|
30
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,51 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.0] - 2026-01-26
|
|
4
|
+
|
|
5
|
+
### Design
|
|
6
|
+
|
|
7
|
+
- **S1 "Tight & Sharp" UI redesign**
|
|
8
|
+
- Tab bar navigation replaces vertical workspace list
|
|
9
|
+
- Inline pane editor replaces modal overlay
|
|
10
|
+
- Section-based layout with uppercase titles
|
|
11
|
+
- Reorganized preview toolbar with icon buttons
|
|
12
|
+
- 2-column form grid in pane editor
|
|
13
|
+
- Refactor SCSS to modular DRY architecture
|
|
14
|
+
- Shared variables: spacing scale, border radius, colors, z-index
|
|
15
|
+
- Reusable mixins: flex-row, form-input, interactive-card, toolbar-btn
|
|
16
|
+
- All components migrated to use shared styles
|
|
17
|
+
- Add design system documentation (docs/DESIGN.md)
|
|
18
|
+
- Add HTML mockups for design exploration
|
|
19
|
+
|
|
20
|
+
### Reliability
|
|
21
|
+
|
|
22
|
+
- Improved duplicate workspace detection on Tabby restart
|
|
23
|
+
- Add workspaceId to recovery tokens
|
|
24
|
+
- Two-strategy detection (restored tabs + freshly opened)
|
|
25
|
+
- Better shell initialization with 2s timeout and error handling
|
|
26
|
+
- Wait for Tabby recovery before launching startup workspaces
|
|
27
|
+
- Type-safe workspace detection with proper type guards
|
|
28
|
+
|
|
29
|
+
### Bug Fixes
|
|
30
|
+
|
|
31
|
+
- Fix focus lost after workspace delete (NgbModal replaces native confirm)
|
|
32
|
+
- Fix split preview change detection (remove OnPush strategy)
|
|
33
|
+
- Fix race condition in shell initialization
|
|
34
|
+
|
|
35
|
+
### Infrastructure
|
|
36
|
+
|
|
37
|
+
- Add CI/CD workflows (GitHub Actions for build + release)
|
|
38
|
+
- Add dev branch workflow documentation
|
|
39
|
+
|
|
40
|
+
### Technical
|
|
41
|
+
|
|
42
|
+
- Code review cleanup and fixes
|
|
43
|
+
- Consistent use of deepClone helper
|
|
44
|
+
- Add deleteConfirmModal component
|
|
45
|
+
- Improve singleton service patterns
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
3
49
|
## [0.1.0] - 2026-01-13
|
|
4
50
|
|
|
5
51
|
### Features
|
package/CLAUDE.md
CHANGED
|
@@ -44,6 +44,9 @@ src/
|
|
|
44
44
|
│ ├── config.provider.ts
|
|
45
45
|
│ ├── settings.provider.ts
|
|
46
46
|
│ └── toolbar.provider.ts
|
|
47
|
+
├── styles/ # Shared SCSS (modular DRY)
|
|
48
|
+
│ ├── _variables.scss # Spacing, radius, colors, z-index
|
|
49
|
+
│ └── _mixins.scss # Reusable patterns
|
|
47
50
|
└── components/ # Angular components (.ts, .pug, .scss)
|
|
48
51
|
├── workspaceList # Main settings UI
|
|
49
52
|
├── workspaceEditor # Single workspace editor
|
|
@@ -51,6 +54,16 @@ src/
|
|
|
51
54
|
└── splitPreview # Visual split preview
|
|
52
55
|
```
|
|
53
56
|
|
|
57
|
+
## Styles
|
|
58
|
+
|
|
59
|
+
Modular DRY SCSS architecture. All components load shared styles via `@use '../styles/index' as *;`.
|
|
60
|
+
|
|
61
|
+
- **Variables**: `$spacing-*`, `$radius-*`, `$color-*`, `$z-*`, `$transition-*`
|
|
62
|
+
- **Mixins**: Layout, form, card, and button patterns. See `src/styles/_mixins.scss` for the available mixins.
|
|
63
|
+
- **Theming**: Uses Tabby's `--theme-*` CSS variables
|
|
64
|
+
|
|
65
|
+
See `docs/DESIGN.md` for details.
|
|
66
|
+
|
|
54
67
|
## Build
|
|
55
68
|
|
|
56
69
|
```bash
|
|
@@ -291,6 +304,26 @@ await new Promise(r => setTimeout(r, 100));
|
|
|
291
304
|
return document.querySelectorAll('.preview-pane.selected').length;
|
|
292
305
|
```
|
|
293
306
|
|
|
307
|
+
## Angular Change Detection
|
|
308
|
+
|
|
309
|
+
**KRITIČNO**: NE koristi `OnPush` strategiju na komponentama koje primaju mutirane objekte.
|
|
310
|
+
|
|
311
|
+
### Pravilo
|
|
312
|
+
- **NE koristi `OnPush`** ako parent komponenta mutira objekte umesto da kreira nove reference
|
|
313
|
+
- Angular default strategija automatski detektuje sve promene
|
|
314
|
+
- `OnPush` je samo za leaf komponente koje emituju events bez lokalnog state-a
|
|
315
|
+
|
|
316
|
+
### Zašto
|
|
317
|
+
- `OnPush` osvežava view samo kada se `@Input` referenca promeni
|
|
318
|
+
- Mutacija objekta (npr. `workspace.root.children.push()`) NE menja referencu
|
|
319
|
+
- Bez nove reference, Angular ne zna da treba re-renderovati
|
|
320
|
+
|
|
321
|
+
### Komponente u ovom projektu
|
|
322
|
+
- `workspaceEditor` - **default CD** (mutira workspace)
|
|
323
|
+
- `workspaceList` - **default CD** (koristi `detectChanges()` za async operacije)
|
|
324
|
+
- `splitPreview` - **default CD** (prima mutirane objekte)
|
|
325
|
+
- `paneEditor` - može biti `OnPush` (samo emituje, nema mutacija)
|
|
326
|
+
|
|
294
327
|
## Known Issues
|
|
295
328
|
|
|
296
329
|
### YAML escape sequences in config.yaml
|
package/CONTRIBUTING.md
CHANGED
|
@@ -49,7 +49,9 @@ No hot reload. Tabby doesn't support it for plugins. Restart after each build.
|
|
|
49
49
|
2. Create a branch (`git checkout -b fix/thing`)
|
|
50
50
|
3. Make your changes
|
|
51
51
|
4. Test manually in Tabby
|
|
52
|
-
5. Submit PR
|
|
52
|
+
5. Submit PR **to the `dev` branch** (not `main`)
|
|
53
|
+
|
|
54
|
+
CI will check that your code builds. `main` is for releases only.
|
|
53
55
|
|
|
54
56
|
No strict commit message format. Just be clear about what you changed and why.
|
|
55
57
|
|
package/README.md
CHANGED
|
@@ -4,19 +4,26 @@ Visual workspace editor for [Tabby](https://tabby.sh). Create split-layout termi
|
|
|
4
4
|
|
|
5
5
|

|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Features
|
|
8
8
|
|
|
9
|
-
- Visual editor
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
9
|
+
- **Visual split editor** - Design layouts inline, not in modal dialogs. Split horizontally, vertically, nest to any depth
|
|
10
|
+
- **Layout toolbar** - Select a pane, then split, add adjacent panes, or delete with toolbar buttons
|
|
11
|
+
- **Per-pane configuration** - Set profile, working directory, and startup command for each pane
|
|
12
|
+
- **One-click launch** - Open workspaces instantly from the toolbar dropdown
|
|
13
|
+
- **Launch on startup** - Auto-open multiple workspaces when Tabby starts
|
|
14
|
+
- **Any shell** - Works with Bash, Zsh, PowerShell, Nushell, cmd, WSL, and any other shell Tabby supports
|
|
15
|
+
|
|
16
|
+
## Screenshots
|
|
17
|
+
|
|
18
|
+
| Editor with selected pane | Pane configuration |
|
|
19
|
+
|---------------------------|-------------------|
|
|
20
|
+
|  |  |
|
|
14
21
|
|
|
15
22
|
## About this project
|
|
16
23
|
|
|
17
24
|
This plugin was written 100% by [Claude Code](https://claude.ai/code).
|
|
18
25
|
|
|
19
|
-
Igor
|
|
26
|
+
Igor Halilovic had the idea and provided product direction. He hates Angular so much (19 years of web dev, wrote his own TypeScript framework) that he didn't look at this code. Not once. He told Claude Code what he wanted, Claude Code built it.
|
|
20
27
|
|
|
21
28
|
Human provides the *what* and *why*. AI handles the *how*.
|
|
22
29
|
|
|
@@ -25,7 +32,7 @@ Here's the fun part: to test this plugin, we built [tabby-mcp](https://github.co
|
|
|
25
32
|
## Install
|
|
26
33
|
|
|
27
34
|
**From Tabby Plugin Manager:**
|
|
28
|
-
Settings
|
|
35
|
+
Settings > Plugins > Search "tabbyspaces" > Install
|
|
29
36
|
|
|
30
37
|
**Manual:**
|
|
31
38
|
```bash
|
|
@@ -35,17 +42,13 @@ npm install tabby-tabbyspaces
|
|
|
35
42
|
|
|
36
43
|
Restart Tabby after installation.
|
|
37
44
|
|
|
38
|
-
##
|
|
39
|
-
|
|
40
|
-
1. Open Settings → TabbySpaces
|
|
41
|
-
2. Create a workspace
|
|
42
|
-
3. Design your split layout visually
|
|
43
|
-
4. Configure each pane (profile, cwd, startup command)
|
|
44
|
-
5. Save and launch from the toolbar
|
|
45
|
-
|
|
46
|
-
### Pane configuration
|
|
45
|
+
## Quick Start
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
1. **Open settings** - Settings > TabbySpaces
|
|
48
|
+
2. **Create workspace** - Click "New Workspace", name it
|
|
49
|
+
3. **Design layout** - Click a pane to select it, use toolbar to split (horizontal/vertical)
|
|
50
|
+
4. **Configure panes** - Click a pane (or use its context menu) to set profile, cwd, startup command
|
|
51
|
+
5. **Save and launch** - Save changes, then click "Open" or use the toolbar dropdown
|
|
49
52
|
|
|
50
53
|
## Roadmap
|
|
51
54
|
|
|
@@ -66,6 +69,12 @@ Restart Tabby after installation.
|
|
|
66
69
|
- [Discussions](https://github.com/halilc4/tabbyspaces/discussions) - Questions, ideas, show your setup
|
|
67
70
|
- [Issues](https://github.com/halilc4/tabbyspaces/issues) - Bug reports
|
|
68
71
|
|
|
72
|
+
## Contributing
|
|
73
|
+
|
|
74
|
+
PRs welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions.
|
|
75
|
+
|
|
76
|
+
All PRs go to the `dev` branch. CI checks the build automatically.
|
|
77
|
+
|
|
69
78
|
## License
|
|
70
79
|
|
|
71
80
|
MIT
|
package/TODO.md
CHANGED
|
@@ -13,10 +13,14 @@
|
|
|
13
13
|
- [ ] List: add small layout preview
|
|
14
14
|
- [ ] Better input for command
|
|
15
15
|
- [ ] Better input for cwd
|
|
16
|
+
- [ ] Editor workspace + pane editor autosave
|
|
17
|
+
- [ ] Undo/redo for editor changes
|
|
16
18
|
|
|
17
19
|
### Bugs
|
|
18
20
|
- [~] Resize panes in Tabby reverts to original values (ratio problem) - WATCH: happens only on one workspace
|
|
19
21
|
- [ ] Layout preview responsive - nested splits don't adapt well to smaller sizes
|
|
22
|
+
- [ ] Launch on startup - Tabby remembers open tabs, check if we can detect if workspace is already open; if not, kill the feature
|
|
23
|
+
- [x] Tab titles are a mess - keep only workspace name or default to Tabby behavior (verify no caching/lookup by tab name)
|
|
20
24
|
|
|
21
25
|
### Other
|
|
22
26
|
- [ ] Update screenshots in README
|
|
@@ -60,6 +64,7 @@
|
|
|
60
64
|
- [x] Refactoring: Remove profile persistence, shell-aware CWD, dead code cleanup
|
|
61
65
|
|
|
62
66
|
### Bugs
|
|
67
|
+
- [x] Focus lost after deleting workspace (native confirm() steals focus from Electron) - fix: use NgbModal instead
|
|
63
68
|
- [x] Audit async functions - check if `detectChanges()` is missing after async operations that change state
|
|
64
69
|
- [x] Split pane runs command (in-memory profiles) - fix: clear profile.options.args after command execution
|
|
65
70
|
- [x] Pane editor modal bug - mouseup outside dialog closes modal. Dialog should close only on Esc or close/cancel/save button
|
package/dist/build-config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const CONFIG_KEY: string;
|
|
2
|
-
export declare const DISPLAY_NAME: string;
|
|
3
|
-
export declare const IS_DEV: boolean;
|
|
1
|
+
export declare const CONFIG_KEY: string;
|
|
2
|
+
export declare const DISPLAY_NAME: string;
|
|
3
|
+
export declare const IS_DEV: boolean;
|
|
4
4
|
//# sourceMappingURL=build-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deleteConfirmModal.component.d.ts","sourceRoot":"","sources":["../../src/components/deleteConfirmModal.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,qBAgBa,2BAA2B;IAEnB,KAAK,EAAE,cAAc;IAD/B,aAAa,SAAK;gBACR,KAAK,EAAE,cAAc;CACzC"}
|
|
@@ -1,19 +1,10 @@
|
|
|
1
|
-
import { EventEmitter
|
|
2
|
-
import { WorkspacePane, TabbyProfile } from '../models/workspace.model';
|
|
3
|
-
export declare class PaneEditorComponent
|
|
4
|
-
pane: WorkspacePane;
|
|
5
|
-
profiles: TabbyProfile[];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
private pointerDownInsideModal;
|
|
11
|
-
ngOnInit(): void;
|
|
12
|
-
onEscapeKey(): void;
|
|
13
|
-
onDocumentPointerDown(event: PointerEvent): void;
|
|
14
|
-
onOverlayClick(event: MouseEvent): void;
|
|
15
|
-
onSave(): void;
|
|
16
|
-
onCancel(): void;
|
|
17
|
-
getProfileName(profileId: string): string;
|
|
18
|
-
}
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { WorkspacePane, TabbyProfile } from '../models/workspace.model';
|
|
3
|
+
export declare class PaneEditorComponent {
|
|
4
|
+
pane: WorkspacePane;
|
|
5
|
+
profiles: TabbyProfile[];
|
|
6
|
+
close: EventEmitter<void>;
|
|
7
|
+
onEscapeKey(): void;
|
|
8
|
+
getProfileName(profileId: string): string;
|
|
9
|
+
}
|
|
19
10
|
//# sourceMappingURL=paneEditor.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paneEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/paneEditor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,
|
|
1
|
+
{"version":3,"file":"paneEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/paneEditor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAgB,MAAM,eAAe,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAEvE,qBAKa,mBAAmB;IACrB,IAAI,EAAG,aAAa,CAAA;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC5B,KAAK,qBAA2B;IAG1C,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI1C"}
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import { EventEmitter } from '@angular/core';
|
|
2
|
-
import { WorkspaceSplit, WorkspacePane, TabbyProfile } from '../models/workspace.model';
|
|
3
|
-
export declare class SplitPreviewComponent {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
paneEdit: EventEmitter<WorkspacePane>;
|
|
10
|
-
splitHorizontal: EventEmitter<WorkspacePane>;
|
|
11
|
-
splitVertical: EventEmitter<WorkspacePane>;
|
|
12
|
-
removePane: EventEmitter<WorkspacePane>;
|
|
13
|
-
addLeft: EventEmitter<WorkspacePane>;
|
|
14
|
-
addRight: EventEmitter<WorkspacePane>;
|
|
15
|
-
addTop: EventEmitter<WorkspacePane>;
|
|
16
|
-
addBottom: EventEmitter<WorkspacePane>;
|
|
17
|
-
contextMenuPane: WorkspacePane | null;
|
|
18
|
-
contextMenuPosition: {
|
|
19
|
-
x: number;
|
|
20
|
-
y: number;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
onNestedPaneEdit(pane: WorkspacePane): void;
|
|
43
|
-
onNestedSplitH(pane: WorkspacePane): void;
|
|
44
|
-
onNestedSplitV(pane: WorkspacePane): void;
|
|
45
|
-
onNestedAddLeft(pane: WorkspacePane): void;
|
|
46
|
-
onNestedAddRight(pane: WorkspacePane): void;
|
|
47
|
-
onNestedAddTop(pane: WorkspacePane): void;
|
|
48
|
-
onNestedAddBottom(pane: WorkspacePane): void;
|
|
49
|
-
onNestedRemove(pane: WorkspacePane): void;
|
|
50
|
-
}
|
|
1
|
+
import { EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
|
|
2
|
+
import { WorkspaceSplit, WorkspacePane, TabbyProfile } from '../models/workspace.model';
|
|
3
|
+
export declare class SplitPreviewComponent implements OnChanges {
|
|
4
|
+
private cdr;
|
|
5
|
+
split: WorkspaceSplit;
|
|
6
|
+
depth: number;
|
|
7
|
+
selectedPaneId: string | null;
|
|
8
|
+
profiles: TabbyProfile[];
|
|
9
|
+
paneEdit: EventEmitter<WorkspacePane>;
|
|
10
|
+
splitHorizontal: EventEmitter<WorkspacePane>;
|
|
11
|
+
splitVertical: EventEmitter<WorkspacePane>;
|
|
12
|
+
removePane: EventEmitter<WorkspacePane>;
|
|
13
|
+
addLeft: EventEmitter<WorkspacePane>;
|
|
14
|
+
addRight: EventEmitter<WorkspacePane>;
|
|
15
|
+
addTop: EventEmitter<WorkspacePane>;
|
|
16
|
+
addBottom: EventEmitter<WorkspacePane>;
|
|
17
|
+
contextMenuPane: WorkspacePane | null;
|
|
18
|
+
contextMenuPosition: {
|
|
19
|
+
x: number;
|
|
20
|
+
y: number;
|
|
21
|
+
};
|
|
22
|
+
constructor(cdr: ChangeDetectorRef);
|
|
23
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
24
|
+
isPane(child: WorkspacePane | WorkspaceSplit): boolean;
|
|
25
|
+
isSplit(child: WorkspacePane | WorkspaceSplit): boolean;
|
|
26
|
+
asSplit(child: WorkspacePane | WorkspaceSplit): WorkspaceSplit;
|
|
27
|
+
asPane(child: WorkspacePane | WorkspaceSplit): WorkspacePane;
|
|
28
|
+
getFlexStyle(index: number): string;
|
|
29
|
+
onPaneClick(pane: WorkspacePane): void;
|
|
30
|
+
truncate(text: string, maxLength: number): string;
|
|
31
|
+
onContextMenu(event: MouseEvent, pane: WorkspacePane): void;
|
|
32
|
+
closeContextMenu(): void;
|
|
33
|
+
onEdit(): void;
|
|
34
|
+
onSplitH(): void;
|
|
35
|
+
onSplitV(): void;
|
|
36
|
+
onAddLeft(): void;
|
|
37
|
+
onAddRight(): void;
|
|
38
|
+
onAddTop(): void;
|
|
39
|
+
onAddBottom(): void;
|
|
40
|
+
onRemove(): void;
|
|
41
|
+
getPaneLabel(pane: WorkspacePane): string;
|
|
42
|
+
onNestedPaneEdit(pane: WorkspacePane): void;
|
|
43
|
+
onNestedSplitH(pane: WorkspacePane): void;
|
|
44
|
+
onNestedSplitV(pane: WorkspacePane): void;
|
|
45
|
+
onNestedAddLeft(pane: WorkspacePane): void;
|
|
46
|
+
onNestedAddRight(pane: WorkspacePane): void;
|
|
47
|
+
onNestedAddTop(pane: WorkspacePane): void;
|
|
48
|
+
onNestedAddBottom(pane: WorkspacePane): void;
|
|
49
|
+
onNestedRemove(pane: WorkspacePane): void;
|
|
50
|
+
}
|
|
51
51
|
//# sourceMappingURL=splitPreview.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"splitPreview.component.d.ts","sourceRoot":"","sources":["../../src/components/splitPreview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"splitPreview.component.d.ts","sourceRoot":"","sources":["../../src/components/splitPreview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACnH,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EAEb,MAAM,2BAA2B,CAAA;AAElC,qBAKa,qBAAsB,YAAW,SAAS;IAiBzC,OAAO,CAAC,GAAG;IAhBd,KAAK,EAAG,cAAc,CAAA;IACtB,KAAK,SAAI;IACT,cAAc,EAAE,MAAM,GAAG,IAAI,CAAO;IACpC,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC5B,QAAQ,8BAAoC;IAC5C,eAAe,8BAAoC;IACnD,aAAa,8BAAoC;IACjD,UAAU,8BAAoC;IAC9C,OAAO,8BAAoC;IAC3C,QAAQ,8BAAoC;IAC5C,MAAM,8BAAoC;IAC1C,SAAS,8BAAoC;IAEvD,eAAe,EAAE,aAAa,GAAG,IAAI,CAAO;IAC5C,mBAAmB;;;MAAiB;gBAEhB,GAAG,EAAE,iBAAiB;IAE1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO;IAItD,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO;IAIvD,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,cAAc;IAI9D,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa;IAI5D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAInC,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAItC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAMjD,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAM3D,gBAAgB,IAAI,IAAI;IAKxB,MAAM,IAAI,IAAI;IAOd,QAAQ,IAAI,IAAI;IAOhB,QAAQ,IAAI,IAAI;IAOhB,SAAS,IAAI,IAAI;IAOjB,UAAU,IAAI,IAAI;IAOlB,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IAOnB,QAAQ,IAAI,IAAI;IAOhB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IAQzC,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI3C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI1C,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI3C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI5C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;CAG1C"}
|