tabby-tabbyspaces 0.0.1
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 +15 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +35 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- package/CHANGELOG.md +20 -0
- package/CLAUDE.md +159 -0
- package/CONTRIBUTING.md +64 -0
- package/LICENSE +21 -0
- package/README.md +61 -0
- package/RELEASE_PLAN.md +161 -0
- package/dist/build-config.d.ts +4 -0
- package/dist/build-config.d.ts.map +1 -0
- package/dist/components/paneEditor.component.d.ts +14 -0
- package/dist/components/paneEditor.component.d.ts.map +1 -0
- package/dist/components/splitPreview.component.d.ts +36 -0
- package/dist/components/splitPreview.component.d.ts.map +1 -0
- package/dist/components/workspaceEditor.component.d.ts +29 -0
- package/dist/components/workspaceEditor.component.d.ts.map +1 -0
- package/dist/components/workspaceList.component.d.ts +28 -0
- package/dist/components/workspaceList.component.d.ts.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.LICENSE.txt +43 -0
- package/dist/index.js.map +1 -0
- package/dist/models/workspace.model.d.ts +77 -0
- package/dist/models/workspace.model.d.ts.map +1 -0
- package/dist/providers/config.provider.d.ts +9 -0
- package/dist/providers/config.provider.d.ts.map +1 -0
- package/dist/providers/settings.provider.d.ts +8 -0
- package/dist/providers/settings.provider.d.ts.map +1 -0
- package/dist/providers/toolbar.provider.d.ts +13 -0
- package/dist/providers/toolbar.provider.d.ts.map +1 -0
- package/dist/services/workspaceEditor.service.d.ts +25 -0
- package/dist/services/workspaceEditor.service.d.ts.map +1 -0
- package/package.json +73 -0
- package/screenshots/editor.png +0 -0
- package/screenshots/pane-edit.png +0 -0
- package/screenshots/workspace-edit.png +0 -0
- package/scripts/build-dev.js +46 -0
- package/src/build-config.ts +8 -0
- package/src/components/paneEditor.component.pug +46 -0
- package/src/components/paneEditor.component.scss +112 -0
- package/src/components/paneEditor.component.ts +33 -0
- package/src/components/splitPreview.component.pug +45 -0
- package/src/components/splitPreview.component.scss +126 -0
- package/src/components/splitPreview.component.ts +111 -0
- package/src/components/workspaceEditor.component.pug +84 -0
- package/src/components/workspaceEditor.component.scss +169 -0
- package/src/components/workspaceEditor.component.ts +181 -0
- package/src/components/workspaceList.component.pug +46 -0
- package/src/components/workspaceList.component.scss +112 -0
- package/src/components/workspaceList.component.ts +124 -0
- package/src/index.ts +38 -0
- package/src/models/workspace.model.ts +126 -0
- package/src/providers/config.provider.ts +12 -0
- package/src/providers/settings.provider.ts +15 -0
- package/src/providers/toolbar.provider.ts +81 -0
- package/src/services/workspaceEditor.service.ts +228 -0
- package/tsconfig.json +29 -0
- package/webpack.config.js +62 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(npm run build:*)",
|
|
5
|
+
"Bash(npm install:*)",
|
|
6
|
+
"Bash(gh search:*)",
|
|
7
|
+
"WebSearch",
|
|
8
|
+
"WebFetch(domain:deepwiki.com)",
|
|
9
|
+
"WebFetch(domain:github.com)",
|
|
10
|
+
"Bash(npm run build:dev:*)",
|
|
11
|
+
"Bash(wc:*)",
|
|
12
|
+
"Bash(tree:*)"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Something broken? Report it here.
|
|
4
|
+
title: ''
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What happened
|
|
10
|
+
|
|
11
|
+
Describe the bug. Be specific.
|
|
12
|
+
|
|
13
|
+
## Steps to reproduce
|
|
14
|
+
|
|
15
|
+
1.
|
|
16
|
+
2.
|
|
17
|
+
3.
|
|
18
|
+
|
|
19
|
+
## Expected behavior
|
|
20
|
+
|
|
21
|
+
What should have happened instead.
|
|
22
|
+
|
|
23
|
+
## Environment
|
|
24
|
+
|
|
25
|
+
- OS:
|
|
26
|
+
- Tabby version:
|
|
27
|
+
- TabbySpaces version:
|
|
28
|
+
|
|
29
|
+
## Screenshots
|
|
30
|
+
|
|
31
|
+
If applicable.
|
|
32
|
+
|
|
33
|
+
## Additional context
|
|
34
|
+
|
|
35
|
+
Anything else relevant.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature request
|
|
3
|
+
about: Got an idea? Share it.
|
|
4
|
+
title: ''
|
|
5
|
+
labels: enhancement
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The problem
|
|
10
|
+
|
|
11
|
+
What's missing or annoying?
|
|
12
|
+
|
|
13
|
+
## Proposed solution
|
|
14
|
+
|
|
15
|
+
How would you solve it?
|
|
16
|
+
|
|
17
|
+
## Alternatives considered
|
|
18
|
+
|
|
19
|
+
Any other approaches you thought about?
|
|
20
|
+
|
|
21
|
+
## Additional context
|
|
22
|
+
|
|
23
|
+
Mockups, examples, or anything else useful.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.0.1] - 2026-01-03
|
|
4
|
+
|
|
5
|
+
Initial release.
|
|
6
|
+
|
|
7
|
+
### Features
|
|
8
|
+
|
|
9
|
+
- Workspace list with create, edit, duplicate, delete
|
|
10
|
+
- Visual split-layout editor (horizontal/vertical, any nesting depth)
|
|
11
|
+
- Pane configuration: base profile, working directory, startup command, custom title
|
|
12
|
+
- Toolbar button for quick workspace launch
|
|
13
|
+
- Default workspace option (launches on Tabby startup)
|
|
14
|
+
- Icon and color customization per workspace
|
|
15
|
+
- Hotkey support (planned)
|
|
16
|
+
|
|
17
|
+
### Technical
|
|
18
|
+
|
|
19
|
+
- Full dev/prod build isolation for parallel development
|
|
20
|
+
- Automatic Tabby profile generation from workspace config
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# TabbySpaces
|
|
2
|
+
|
|
3
|
+
Visual split-layout workspace editor for Tabby.
|
|
4
|
+
|
|
5
|
+
## Tech Stack
|
|
6
|
+
|
|
7
|
+
- **Framework**: Angular 15 (Tabby uses Angular 15)
|
|
8
|
+
- **Language**: TypeScript 4.9
|
|
9
|
+
- **Templates**: Pug (.pug)
|
|
10
|
+
- **Styles**: SCSS
|
|
11
|
+
- **Build**: Webpack 5
|
|
12
|
+
|
|
13
|
+
## Structure
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
src/
|
|
17
|
+
├── index.ts # NgModule entry point
|
|
18
|
+
├── models/ # TypeScript interfaces
|
|
19
|
+
├── services/ # Business logic
|
|
20
|
+
├── providers/ # Tabby config/settings providers
|
|
21
|
+
└── components/ # Angular components (.ts, .pug, .scss)
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Build
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install # .npmrc has legacy-peer-deps=true
|
|
28
|
+
npm run build # Production build → dist/
|
|
29
|
+
npm run build:dev # Dev build → dist-dev/ (isolated package)
|
|
30
|
+
npm run watch:dev # Watch mode for dev build
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Debug: `Ctrl+Shift+I` in Tabby opens DevTools.
|
|
34
|
+
|
|
35
|
+
## Tabby Plugin Patterns
|
|
36
|
+
|
|
37
|
+
### package.json (required)
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"keywords": ["tabby-plugin"],
|
|
41
|
+
"main": "dist/index.js",
|
|
42
|
+
"tabbyPlugin": {
|
|
43
|
+
"name": "tabbyspaces",
|
|
44
|
+
"displayName": "TabbySpaces",
|
|
45
|
+
"description": "Workspaces for Tabby - Visual split-layout workspace editor"
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Config Provider
|
|
51
|
+
```typescript
|
|
52
|
+
@Injectable()
|
|
53
|
+
export class MyConfigProvider extends ConfigProvider {
|
|
54
|
+
defaults = { myPlugin: { setting: 'value' } }
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Settings Tab Provider
|
|
59
|
+
```typescript
|
|
60
|
+
@Injectable()
|
|
61
|
+
export class MySettingsProvider extends SettingsTabProvider {
|
|
62
|
+
id = 'my-plugin'
|
|
63
|
+
icon = 'cog'
|
|
64
|
+
title = 'My Plugin'
|
|
65
|
+
getComponentType() { return MySettingsComponent }
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Module Registration
|
|
70
|
+
```typescript
|
|
71
|
+
@NgModule({
|
|
72
|
+
providers: [
|
|
73
|
+
{ provide: ConfigProvider, useClass: MyConfigProvider, multi: true },
|
|
74
|
+
{ provide: SettingsTabProvider, useClass: MySettingsProvider, multi: true },
|
|
75
|
+
],
|
|
76
|
+
})
|
|
77
|
+
export default class MyModule {}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Data Model
|
|
81
|
+
|
|
82
|
+
- `Workspace` - Main object with name, icon, color, root split
|
|
83
|
+
- `WorkspaceSplit` - Recursive structure with orientation, ratios, children
|
|
84
|
+
- `WorkspacePane` - Leaf node with profileId, cwd, startupCommand, title
|
|
85
|
+
|
|
86
|
+
## Tabby Profile Generation
|
|
87
|
+
|
|
88
|
+
Plugin stores a simplified model in `config.store.tabbyspaces.workspaces` and auto-generates verbose Tabby `split-layout` profiles in `config.store.profiles`.
|
|
89
|
+
|
|
90
|
+
## Nushell Startup Commands
|
|
91
|
+
|
|
92
|
+
For Nushell, startup commands are passed as:
|
|
93
|
+
```typescript
|
|
94
|
+
options.args = ['-e', startupCommand]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## References
|
|
98
|
+
|
|
99
|
+
- tabby-workspace-manager: https://github.com/composer404/tabby-workspace-manager
|
|
100
|
+
- tabby-clippy: https://github.com/Eugeny/tabby-clippy
|
|
101
|
+
- Tabby docs: https://docs.tabby.sh/
|
|
102
|
+
|
|
103
|
+
## Installation
|
|
104
|
+
|
|
105
|
+
### Plugin folder locations
|
|
106
|
+
```
|
|
107
|
+
Windows: %APPDATA%\tabby\plugins
|
|
108
|
+
macOS: ~/Library/Application Support/tabby/plugins
|
|
109
|
+
Linux: ~/.config/tabby/plugins
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Production install
|
|
113
|
+
```bash
|
|
114
|
+
cd <plugins-folder>
|
|
115
|
+
npm install tabby-tabbyspaces
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Development
|
|
119
|
+
|
|
120
|
+
### Dev install (once)
|
|
121
|
+
```bash
|
|
122
|
+
npm run build:dev
|
|
123
|
+
cd %APPDATA%\tabby\plugins
|
|
124
|
+
npm install "<path-to-repo>/dist-dev"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Dev workflow (after install)
|
|
128
|
+
```bash
|
|
129
|
+
npm run build:dev # Initial build (creates dist-dev/package.json)
|
|
130
|
+
npm run watch:dev # Watch mode - rebuilds on file changes
|
|
131
|
+
# restart Tabby after each rebuild
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
npm auto-creates symlinks for local packages, so each build is immediately available.
|
|
135
|
+
|
|
136
|
+
### Dev vs Prod Isolation
|
|
137
|
+
|
|
138
|
+
| | Prod | Dev |
|
|
139
|
+
|---|---|---|
|
|
140
|
+
| Package | `tabby-tabbyspaces` | `tabby-tabbyspaces-dev` |
|
|
141
|
+
| Config | `config.store.tabbyspaces` | `config.store.tabbyspaces_dev` |
|
|
142
|
+
| Display | "TabbySpaces" | "TabbySpaces DEV" |
|
|
143
|
+
|
|
144
|
+
Both plugins can be installed simultaneously.
|
|
145
|
+
|
|
146
|
+
## Known Issues
|
|
147
|
+
|
|
148
|
+
### YAML escape sequences in config.yaml
|
|
149
|
+
If a base profile in Tabby config uses double-quoted strings with wrong escape sequences (e.g., `\t` instead of `\\t`), the plugin will copy the corrupted path.
|
|
150
|
+
|
|
151
|
+
```yaml
|
|
152
|
+
# WRONG - \t becomes TAB character
|
|
153
|
+
command: "C:\\Users\\...\\Program\ts\\nu\\bin\\nu.exe"
|
|
154
|
+
|
|
155
|
+
# CORRECT - unquoted string
|
|
156
|
+
command: C:\Users\...\Programs\nu\bin\nu.exe
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
You want to contribute to an Angular project? Respect.
|
|
4
|
+
|
|
5
|
+
## Before you start
|
|
6
|
+
|
|
7
|
+
Read [CLAUDE.md](CLAUDE.md). It has the technical context: data model, Tabby plugin patterns, known issues.
|
|
8
|
+
|
|
9
|
+
## Setup
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
git clone https://github.com/halilc4/tabbyspaces.git
|
|
13
|
+
cd tabbyspaces
|
|
14
|
+
npm install
|
|
15
|
+
npm run build:dev
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Install the dev build in Tabby:
|
|
19
|
+
```bash
|
|
20
|
+
cd %APPDATA%\tabby\plugins # Windows
|
|
21
|
+
cd ~/.config/tabby/plugins # Linux
|
|
22
|
+
cd ~/Library/Application\ Support/tabby/plugins # macOS
|
|
23
|
+
|
|
24
|
+
npm install "<path-to-repo>/dist-dev"
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Restart Tabby. You should see "TabbySpaces DEV" in Settings.
|
|
28
|
+
|
|
29
|
+
## Development workflow
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm run build:dev # rebuild
|
|
33
|
+
# restart Tabby to see changes
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
No hot reload. Tabby doesn't support it for plugins. Restart after each build.
|
|
37
|
+
|
|
38
|
+
## What we need
|
|
39
|
+
|
|
40
|
+
- Bug fixes (check Issues)
|
|
41
|
+
- UX improvements
|
|
42
|
+
- Better split layout manipulation
|
|
43
|
+
- Drag & drop support
|
|
44
|
+
- Import/export workspaces
|
|
45
|
+
|
|
46
|
+
## Pull requests
|
|
47
|
+
|
|
48
|
+
1. Fork the repo
|
|
49
|
+
2. Create a branch (`git checkout -b fix/thing`)
|
|
50
|
+
3. Make your changes
|
|
51
|
+
4. Test manually in Tabby
|
|
52
|
+
5. Submit PR with a clear description
|
|
53
|
+
|
|
54
|
+
No strict commit message format. Just be clear about what you changed and why.
|
|
55
|
+
|
|
56
|
+
## Code style
|
|
57
|
+
|
|
58
|
+
- TypeScript, strongly typed
|
|
59
|
+
- No `any` unless absolutely necessary
|
|
60
|
+
- Keep it simple - this isn't enterprise software
|
|
61
|
+
|
|
62
|
+
## Questions?
|
|
63
|
+
|
|
64
|
+
Open an issue. Don't overthink it.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Igor Halilović
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# TabbySpaces
|
|
2
|
+
|
|
3
|
+
Visual workspace editor for [Tabby](https://tabby.sh). Create split-layout terminal workspaces without touching config files.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## What it does
|
|
8
|
+
|
|
9
|
+
- Visual editor for split layouts (horizontal/vertical, nested, any depth)
|
|
10
|
+
- Per-pane configuration: profile, working directory, startup command, title
|
|
11
|
+
- One-click workspace launch from toolbar
|
|
12
|
+
- Hotkey support for quick workspace switching
|
|
13
|
+
- Works with any shell (Bash, Zsh, PowerShell, Nushell, etc.)
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
**From Tabby Plugin Manager:**
|
|
18
|
+
Settings → Plugins → Search "tabbyspaces" → Install
|
|
19
|
+
|
|
20
|
+
**Manual:**
|
|
21
|
+
```bash
|
|
22
|
+
cd ~/.config/tabby/plugins # or %APPDATA%\tabby\plugins on Windows
|
|
23
|
+
npm install tabby-tabbyspaces
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Restart Tabby after installation.
|
|
27
|
+
|
|
28
|
+
## Usage
|
|
29
|
+
|
|
30
|
+
1. Open Settings → TabbySpaces
|
|
31
|
+
2. Create a workspace
|
|
32
|
+
3. Design your split layout visually
|
|
33
|
+
4. Configure each pane (profile, cwd, startup command)
|
|
34
|
+
5. Save and launch from the toolbar
|
|
35
|
+
|
|
36
|
+
### Workspace editor
|
|
37
|
+
|
|
38
|
+

|
|
39
|
+
|
|
40
|
+
### Pane configuration
|
|
41
|
+
|
|
42
|
+

|
|
43
|
+
|
|
44
|
+
## About this project
|
|
45
|
+
|
|
46
|
+
This plugin was written 100% by [Claude Code](https://claude.ai/code).
|
|
47
|
+
|
|
48
|
+
Igor Halilović 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.
|
|
49
|
+
|
|
50
|
+
Human provides the *what* and *why*. AI handles the *how*.
|
|
51
|
+
|
|
52
|
+
## Tech
|
|
53
|
+
|
|
54
|
+
- Angular 15 (Tabby's framework)
|
|
55
|
+
- TypeScript 4.9
|
|
56
|
+
- Webpack 5
|
|
57
|
+
- Pug templates, SCSS styles
|
|
58
|
+
|
|
59
|
+
## License
|
|
60
|
+
|
|
61
|
+
MIT
|
package/RELEASE_PLAN.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# TabbySpaces - Public Release Plan
|
|
2
|
+
|
|
3
|
+
## Cilj
|
|
4
|
+
|
|
5
|
+
Napraviti public repo koji omogućava:
|
|
6
|
+
1. Korisnicima da instaliraju plugin iz Tabby Plugin Manager-a
|
|
7
|
+
2. Developerima da doprinose (fork → develop → PR)
|
|
8
|
+
3. Maintaineru (Igor) da testira i dev i production verziju istovremeno
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1. Package.json izmene
|
|
13
|
+
|
|
14
|
+
- [x] Verzija: `1.0.0` → `0.0.1`
|
|
15
|
+
- [x] Dodaj `repository` polje
|
|
16
|
+
- [x] Dodaj `homepage` polje
|
|
17
|
+
- [x] Dodaj `bugs` polje
|
|
18
|
+
- [x] Sredi `scripts` sekciju - uklonjena TABBY_PLUGINS zavisnost
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 2. Dev Workflow
|
|
23
|
+
|
|
24
|
+
**Pristup:** build:dev + instalacija u plugins folder
|
|
25
|
+
|
|
26
|
+
**Radi:**
|
|
27
|
+
- [x] `npm run build:dev` - kreira dist-dev/ sa izolovanim package-om
|
|
28
|
+
- [x] Instalacija u plugins folder
|
|
29
|
+
|
|
30
|
+
**Poznati problemi:**
|
|
31
|
+
- [x] ~~Prod i dev plugin imaju isto ime u Tabby UI~~ (REŠENO)
|
|
32
|
+
|
|
33
|
+
**TODO:**
|
|
34
|
+
- [x] ~~Popraviti izolaciju imena u UI~~ (DONE - toolbar, settings, profile groups)
|
|
35
|
+
- [ ] Testirati watch mode
|
|
36
|
+
- [ ] Dokumentovati u README
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 3. Testiranje
|
|
41
|
+
|
|
42
|
+
**Koegzistencija (maintainer)** ✅ RADI
|
|
43
|
+
```
|
|
44
|
+
tabby-tabbyspaces (prod) + tabby-tabbyspaces-dev (dev) u plugins folderu
|
|
45
|
+
Različiti config keys, različita imena u UI
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Napomene:**
|
|
49
|
+
- Contributor workflow će biti dokumentovan u CONTRIBUTING.md
|
|
50
|
+
- Production test će biti live npm publish
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 4. Potrebni fajlovi
|
|
55
|
+
|
|
56
|
+
| Fajl | Status | Prioritet |
|
|
57
|
+
|------|--------|-----------|
|
|
58
|
+
| `README.md` | DONE | P0 |
|
|
59
|
+
| `LICENSE` | DONE | P0 |
|
|
60
|
+
| `CHANGELOG.md` | DONE | P0 |
|
|
61
|
+
| `CONTRIBUTING.md` | DONE | P0 |
|
|
62
|
+
| `.github/ISSUE_TEMPLATE/*` | DONE | P0 |
|
|
63
|
+
| `CLAUDE.md` | DONE (EN) | P0 |
|
|
64
|
+
| `screenshots/` | DONE | P0 |
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## 5. Distribucija
|
|
69
|
+
|
|
70
|
+
**Metod:** npm publish (jedini način da se pojavi u Tabby Plugin Manager-u)
|
|
71
|
+
|
|
72
|
+
**Proces:**
|
|
73
|
+
```bash
|
|
74
|
+
# Setup (jednom)
|
|
75
|
+
npm login
|
|
76
|
+
|
|
77
|
+
# Release
|
|
78
|
+
npm version patch # ili minor/major
|
|
79
|
+
npm publish
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Pre-publish checklist:**
|
|
83
|
+
- [ ] Verzija bump-ovana
|
|
84
|
+
- [ ] Build radi (`npm run build`)
|
|
85
|
+
- [ ] README ažuriran
|
|
86
|
+
- [ ] CHANGELOG ažuriran
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 6. GitHub Repo Setup
|
|
91
|
+
|
|
92
|
+
- [ ] Kreiraj repo: `github.com/halilc4/tabbyspaces`
|
|
93
|
+
- [ ] Dodaj opis
|
|
94
|
+
- [ ] Dodaj topics: `tabby`, `tabby-plugin`, `terminal`, `workspace`
|
|
95
|
+
- [ ] Uključi Issues
|
|
96
|
+
- [ ] Push koda
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 7. Redosled akcija
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
1. [x] Reši dev workflow → build:dev pristup
|
|
104
|
+
2. [x] Popravi dev vs prod izolaciju (ime u UI)
|
|
105
|
+
3. [x] Testiraj koegzistenciju (maintainer scenario)
|
|
106
|
+
4. [x] Napravi LICENSE (MIT, engleski)
|
|
107
|
+
5. [x] Napravi README.md (engleski, Claude Code attribution, screenshots)
|
|
108
|
+
6. [x] Napravi CHANGELOG.md
|
|
109
|
+
7. [x] Napravi CONTRIBUTING.md
|
|
110
|
+
8. [x] Napravi .github/ISSUE_TEMPLATE/*
|
|
111
|
+
9. [x] Prevedi CLAUDE.md na engleski
|
|
112
|
+
10. [ ] Kreiraj GitHub repo (halilc4/tabbyspaces)
|
|
113
|
+
11. [ ] Push
|
|
114
|
+
12. [ ] npm publish
|
|
115
|
+
13. [ ] Testiraj instalaciju iz Tabby Plugin Manager-a
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Odluke
|
|
121
|
+
|
|
122
|
+
1. **GitHub username** - `halilc4` → `github.com/halilc4/tabbyspaces`
|
|
123
|
+
2. **CHANGELOG** - DA, vodimo ga
|
|
124
|
+
3. **Jezici** - README i LICENSE na engleskom
|
|
125
|
+
4. **Attribution** - README mora jasno naglasiti:
|
|
126
|
+
- Kod 100% napisan od Claude Code-a
|
|
127
|
+
- Igor = ideja i product vision
|
|
128
|
+
- Igor toliko mrzi Angular da nije ni pogledao kod
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## Otvorena pitanja
|
|
133
|
+
|
|
134
|
+
~~1. **CLAUDE.md jezik** - Prevesti na engleski za contributore?~~ → DA, engleski
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## 8. Final Review (2026-01-03)
|
|
139
|
+
|
|
140
|
+
**Status:** ✅ PASS
|
|
141
|
+
|
|
142
|
+
**Pregledano:**
|
|
143
|
+
- [x] Struktura projekta - čista, standardni Angular pattern
|
|
144
|
+
- [x] Kod - tipiziran, bez `any`, čitljiv
|
|
145
|
+
- [x] README.md - jasan, sa screenshotovima
|
|
146
|
+
- [x] LICENSE, CONTRIBUTING.md, CHANGELOG.md - kompletno
|
|
147
|
+
- [x] package.json metapodaci - repo, bugs, homepage
|
|
148
|
+
- [x] .github/ISSUE_TEMPLATE/* - bug report, feature request
|
|
149
|
+
- [x] Dev/Prod izolacija - radi
|
|
150
|
+
|
|
151
|
+
**Zaključak:** Projekat je spreman za public release.
|
|
152
|
+
|
|
153
|
+
**Sledeća sesija:** Full publish (GitHub repo + npm publish)
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Stil dokumentacije
|
|
158
|
+
|
|
159
|
+
- Bez mainstream GitHub corporate stila
|
|
160
|
+
- Bez AI slop-a (generic, over-polished)
|
|
161
|
+
- Direktno, iskreno, sa karakterom
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../src/build-config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,UAAU,QAAyE,CAAA;AAChG,eAAO,MAAM,YAAY,QAA6E,CAAA;AACtG,eAAO,MAAM,MAAM,SAAyD,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { WorkspacePane, TabbyProfile } from '../models/workspace.model';
|
|
3
|
+
export declare class PaneEditorComponent implements OnInit {
|
|
4
|
+
pane: WorkspacePane;
|
|
5
|
+
profiles: TabbyProfile[];
|
|
6
|
+
save: EventEmitter<WorkspacePane>;
|
|
7
|
+
cancel: EventEmitter<void>;
|
|
8
|
+
editedPane: WorkspacePane;
|
|
9
|
+
ngOnInit(): void;
|
|
10
|
+
onSave(): void;
|
|
11
|
+
onCancel(): void;
|
|
12
|
+
getProfileName(profileId: string): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=paneEditor.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paneEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/paneEditor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAEvE,qBAKa,mBAAoB,YAAW,MAAM;IACvC,IAAI,EAAG,aAAa,CAAA;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC5B,IAAI,8BAAoC;IACxC,MAAM,qBAA2B;IAE3C,UAAU,EAAG,aAAa,CAAA;IAE1B,QAAQ,IAAI,IAAI;IAIhB,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI1C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { WorkspaceSplit, WorkspacePane } from '../models/workspace.model';
|
|
3
|
+
import { WorkspaceEditorService } from '../services/workspaceEditor.service';
|
|
4
|
+
export declare class SplitPreviewComponent {
|
|
5
|
+
private workspaceService;
|
|
6
|
+
split: WorkspaceSplit;
|
|
7
|
+
depth: number;
|
|
8
|
+
paneClick: EventEmitter<WorkspacePane>;
|
|
9
|
+
splitHorizontal: EventEmitter<WorkspacePane>;
|
|
10
|
+
splitVertical: EventEmitter<WorkspacePane>;
|
|
11
|
+
removePane: EventEmitter<WorkspacePane>;
|
|
12
|
+
contextMenuPane: WorkspacePane | null;
|
|
13
|
+
contextMenuPosition: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
};
|
|
17
|
+
constructor(workspaceService: WorkspaceEditorService);
|
|
18
|
+
isPane(child: WorkspacePane | WorkspaceSplit): boolean;
|
|
19
|
+
isSplit(child: WorkspacePane | WorkspaceSplit): boolean;
|
|
20
|
+
asSplit(child: WorkspacePane | WorkspaceSplit): WorkspaceSplit;
|
|
21
|
+
asPane(child: WorkspacePane | WorkspaceSplit): WorkspacePane;
|
|
22
|
+
getFlexStyle(index: number): string;
|
|
23
|
+
onPaneClick(pane: WorkspacePane): void;
|
|
24
|
+
onContextMenu(event: MouseEvent, pane: WorkspacePane): void;
|
|
25
|
+
closeContextMenu(): void;
|
|
26
|
+
onSplitH(): void;
|
|
27
|
+
onSplitV(): void;
|
|
28
|
+
onRemove(): void;
|
|
29
|
+
getProfileName(profileId: string): string;
|
|
30
|
+
getPaneLabel(pane: WorkspacePane): string;
|
|
31
|
+
onNestedPaneClick(pane: WorkspacePane): void;
|
|
32
|
+
onNestedSplitH(pane: WorkspacePane): void;
|
|
33
|
+
onNestedSplitV(pane: WorkspacePane): void;
|
|
34
|
+
onNestedRemove(pane: WorkspacePane): void;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=splitPreview.component.d.ts.map
|
|
@@ -0,0 +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;AACtE,OAAO,EACL,cAAc,EACd,aAAa,EAEd,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAE5E,qBAKa,qBAAqB;IAWpB,OAAO,CAAC,gBAAgB;IAV3B,KAAK,EAAG,cAAc,CAAA;IACtB,KAAK,SAAI;IACR,SAAS,8BAAoC;IAC7C,eAAe,8BAAoC;IACnD,aAAa,8BAAoC;IACjD,UAAU,8BAAoC;IAExD,eAAe,EAAE,aAAa,GAAG,IAAI,CAAO;IAC5C,mBAAmB;;;MAAiB;gBAEhB,gBAAgB,EAAE,sBAAsB;IAE5D,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,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAM3D,gBAAgB,IAAI,IAAI;IAIxB,QAAQ,IAAI,IAAI;IAOhB,QAAQ,IAAI,IAAI;IAOhB,QAAQ,IAAI,IAAI;IAOhB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzC,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IAUzC,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI5C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;CAG1C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { EventEmitter, OnInit } from '@angular/core';
|
|
2
|
+
import { Workspace, WorkspacePane, TabbyProfile } from '../models/workspace.model';
|
|
3
|
+
import { WorkspaceEditorService } from '../services/workspaceEditor.service';
|
|
4
|
+
export declare class WorkspaceEditorComponent implements OnInit {
|
|
5
|
+
private workspaceService;
|
|
6
|
+
workspace: Workspace;
|
|
7
|
+
save: EventEmitter<Workspace>;
|
|
8
|
+
cancel: EventEmitter<void>;
|
|
9
|
+
selectedPane: WorkspacePane | null;
|
|
10
|
+
showPaneEditor: boolean;
|
|
11
|
+
profiles: TabbyProfile[];
|
|
12
|
+
availableIcons: string[];
|
|
13
|
+
constructor(workspaceService: WorkspaceEditorService);
|
|
14
|
+
ngOnInit(): Promise<void>;
|
|
15
|
+
onSave(): void;
|
|
16
|
+
onCancel(): void;
|
|
17
|
+
selectPane(pane: WorkspacePane): void;
|
|
18
|
+
closePaneEditor(): void;
|
|
19
|
+
onPaneSave(pane: WorkspacePane): void;
|
|
20
|
+
private updatePaneInTree;
|
|
21
|
+
splitPane(pane: WorkspacePane, orientation: 'horizontal' | 'vertical'): void;
|
|
22
|
+
private splitPaneInTree;
|
|
23
|
+
removePane(pane: WorkspacePane): void;
|
|
24
|
+
private removePaneFromTree;
|
|
25
|
+
private recalculateRatios;
|
|
26
|
+
setOrientation(orientation: 'horizontal' | 'vertical'): void;
|
|
27
|
+
updateRatio(index: number, value: number): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=workspaceEditor.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/workspaceEditor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EACL,SAAS,EACT,aAAa,EAEb,YAAY,EAIb,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAE5E,qBAKa,wBAAyB,YAAW,MAAM;IAczC,OAAO,CAAC,gBAAgB;IAb3B,SAAS,EAAG,SAAS,CAAA;IACpB,IAAI,0BAAgC;IACpC,MAAM,qBAA2B;IAE3C,YAAY,EAAE,aAAa,GAAG,IAAI,CAAO;IACzC,cAAc,UAAQ;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC7B,cAAc,WAIb;gBAEmB,gBAAgB,EAAE,sBAAsB;IAEtD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B,MAAM,IAAI,IAAI;IAOd,QAAQ,IAAI,IAAI;IAIhB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKrC,eAAe,IAAI,IAAI;IAKvB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKrC,OAAO,CAAC,gBAAgB;IAexB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI;IAI5E,OAAO,CAAC,eAAe;IA2BvB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIrC,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,iBAAiB;IAKzB,cAAc,CAAC,WAAW,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI;IAI5D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAoBhD"}
|