dev-team-mcp-server 0.1.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/README.md +168 -0
- package/dist/cli.d.ts +5 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +127 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/permissions.d.ts +26 -0
- package/dist/config/permissions.d.ts.map +1 -0
- package/dist/config/permissions.js +82 -0
- package/dist/config/permissions.js.map +1 -0
- package/dist/config/team-config.d.ts +28 -0
- package/dist/config/team-config.d.ts.map +1 -0
- package/dist/config/team-config.js +101 -0
- package/dist/config/team-config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1301 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/add-backlog.d.ts +21 -0
- package/dist/tools/add-backlog.d.ts.map +1 -0
- package/dist/tools/add-backlog.js +96 -0
- package/dist/tools/add-backlog.js.map +1 -0
- package/dist/tools/approve-plan.d.ts +12 -0
- package/dist/tools/approve-plan.d.ts.map +1 -0
- package/dist/tools/approve-plan.js +181 -0
- package/dist/tools/approve-plan.js.map +1 -0
- package/dist/tools/approve-test.d.ts +15 -0
- package/dist/tools/approve-test.d.ts.map +1 -0
- package/dist/tools/approve-test.js +113 -0
- package/dist/tools/approve-test.js.map +1 -0
- package/dist/tools/archive-all-tasks.d.ts +9 -0
- package/dist/tools/archive-all-tasks.d.ts.map +1 -0
- package/dist/tools/archive-all-tasks.js +39 -0
- package/dist/tools/archive-all-tasks.js.map +1 -0
- package/dist/tools/assign-task.d.ts +31 -0
- package/dist/tools/assign-task.d.ts.map +1 -0
- package/dist/tools/assign-task.js +285 -0
- package/dist/tools/assign-task.js.map +1 -0
- package/dist/tools/check-queue.d.ts +18 -0
- package/dist/tools/check-queue.d.ts.map +1 -0
- package/dist/tools/check-queue.js +129 -0
- package/dist/tools/check-queue.js.map +1 -0
- package/dist/tools/clear-agent.d.ts +8 -0
- package/dist/tools/clear-agent.d.ts.map +1 -0
- package/dist/tools/clear-agent.js +52 -0
- package/dist/tools/clear-agent.js.map +1 -0
- package/dist/tools/compact-agent.d.ts +8 -0
- package/dist/tools/compact-agent.d.ts.map +1 -0
- package/dist/tools/compact-agent.js +52 -0
- package/dist/tools/compact-agent.js.map +1 -0
- package/dist/tools/compact-all.d.ts +11 -0
- package/dist/tools/compact-all.d.ts.map +1 -0
- package/dist/tools/compact-all.js +61 -0
- package/dist/tools/compact-all.js.map +1 -0
- package/dist/tools/configure-modes.d.ts +19 -0
- package/dist/tools/configure-modes.d.ts.map +1 -0
- package/dist/tools/configure-modes.js +114 -0
- package/dist/tools/configure-modes.js.map +1 -0
- package/dist/tools/distribute-tasks.d.ts +40 -0
- package/dist/tools/distribute-tasks.d.ts.map +1 -0
- package/dist/tools/distribute-tasks.js +276 -0
- package/dist/tools/distribute-tasks.js.map +1 -0
- package/dist/tools/get-backlog.d.ts +9 -0
- package/dist/tools/get-backlog.d.ts.map +1 -0
- package/dist/tools/get-backlog.js +65 -0
- package/dist/tools/get-backlog.js.map +1 -0
- package/dist/tools/get-dashboard.d.ts +15 -0
- package/dist/tools/get-dashboard.d.ts.map +1 -0
- package/dist/tools/get-dashboard.js +154 -0
- package/dist/tools/get-dashboard.js.map +1 -0
- package/dist/tools/get-project-context.d.ts +11 -0
- package/dist/tools/get-project-context.d.ts.map +1 -0
- package/dist/tools/get-project-context.js +84 -0
- package/dist/tools/get-project-context.js.map +1 -0
- package/dist/tools/health-check.d.ts +21 -0
- package/dist/tools/health-check.d.ts.map +1 -0
- package/dist/tools/health-check.js +86 -0
- package/dist/tools/health-check.js.map +1 -0
- package/dist/tools/kill-member.d.ts +15 -0
- package/dist/tools/kill-member.d.ts.map +1 -0
- package/dist/tools/kill-member.js +89 -0
- package/dist/tools/kill-member.js.map +1 -0
- package/dist/tools/kill-member.test.d.ts +2 -0
- package/dist/tools/kill-member.test.d.ts.map +1 -0
- package/dist/tools/kill-member.test.js +228 -0
- package/dist/tools/kill-member.test.js.map +1 -0
- package/dist/tools/process-approval.d.ts +14 -0
- package/dist/tools/process-approval.d.ts.map +1 -0
- package/dist/tools/process-approval.js +225 -0
- package/dist/tools/process-approval.js.map +1 -0
- package/dist/tools/process-skill-candidate.d.ts +14 -0
- package/dist/tools/process-skill-candidate.d.ts.map +1 -0
- package/dist/tools/process-skill-candidate.js +56 -0
- package/dist/tools/process-skill-candidate.js.map +1 -0
- package/dist/tools/recall-memory.d.ts +9 -0
- package/dist/tools/recall-memory.d.ts.map +1 -0
- package/dist/tools/recall-memory.js +97 -0
- package/dist/tools/recall-memory.js.map +1 -0
- package/dist/tools/reject-plan.d.ts +13 -0
- package/dist/tools/reject-plan.d.ts.map +1 -0
- package/dist/tools/reject-plan.js +154 -0
- package/dist/tools/reject-plan.js.map +1 -0
- package/dist/tools/reject-test.d.ts +13 -0
- package/dist/tools/reject-test.d.ts.map +1 -0
- package/dist/tools/reject-test.js +122 -0
- package/dist/tools/reject-test.js.map +1 -0
- package/dist/tools/report-skill-candidate.d.ts +12 -0
- package/dist/tools/report-skill-candidate.d.ts.map +1 -0
- package/dist/tools/report-skill-candidate.js +51 -0
- package/dist/tools/report-skill-candidate.js.map +1 -0
- package/dist/tools/request-approval.d.ts +13 -0
- package/dist/tools/request-approval.d.ts.map +1 -0
- package/dist/tools/request-approval.js +53 -0
- package/dist/tools/request-approval.js.map +1 -0
- package/dist/tools/request-member-decrease.d.ts +15 -0
- package/dist/tools/request-member-decrease.d.ts.map +1 -0
- package/dist/tools/request-member-decrease.js +100 -0
- package/dist/tools/request-member-decrease.js.map +1 -0
- package/dist/tools/request-member-increase.d.ts +15 -0
- package/dist/tools/request-member-increase.d.ts.map +1 -0
- package/dist/tools/request-member-increase.js +81 -0
- package/dist/tools/request-member-increase.js.map +1 -0
- package/dist/tools/save-memory.d.ts +9 -0
- package/dist/tools/save-memory.d.ts.map +1 -0
- package/dist/tools/save-memory.js +82 -0
- package/dist/tools/save-memory.js.map +1 -0
- package/dist/tools/send-task.d.ts +18 -0
- package/dist/tools/send-task.d.ts.map +1 -0
- package/dist/tools/send-task.js +216 -0
- package/dist/tools/send-task.js.map +1 -0
- package/dist/tools/set-review-mode.d.ts +13 -0
- package/dist/tools/set-review-mode.d.ts.map +1 -0
- package/dist/tools/set-review-mode.js +69 -0
- package/dist/tools/set-review-mode.js.map +1 -0
- package/dist/tools/submit-plan.d.ts +16 -0
- package/dist/tools/submit-plan.d.ts.map +1 -0
- package/dist/tools/submit-plan.js +151 -0
- package/dist/tools/submit-plan.js.map +1 -0
- package/dist/tools/submit-test.d.ts +15 -0
- package/dist/tools/submit-test.d.ts.map +1 -0
- package/dist/tools/submit-test.js +110 -0
- package/dist/tools/submit-test.js.map +1 -0
- package/dist/tools/update-backlog.d.ts +22 -0
- package/dist/tools/update-backlog.d.ts.map +1 -0
- package/dist/tools/update-backlog.js +94 -0
- package/dist/tools/update-backlog.js.map +1 -0
- package/dist/tools/update-project-context.d.ts +9 -0
- package/dist/tools/update-project-context.d.ts.map +1 -0
- package/dist/tools/update-project-context.js +81 -0
- package/dist/tools/update-project-context.js.map +1 -0
- package/dist/tools/update-task-status.d.ts +25 -0
- package/dist/tools/update-task-status.d.ts.map +1 -0
- package/dist/tools/update-task-status.js +160 -0
- package/dist/tools/update-task-status.js.map +1 -0
- package/dist/tools/watch-queue.d.ts +17 -0
- package/dist/tools/watch-queue.d.ts.map +1 -0
- package/dist/tools/watch-queue.js +132 -0
- package/dist/tools/watch-queue.js.map +1 -0
- package/dist/types/memory.d.ts +44 -0
- package/dist/types/memory.d.ts.map +1 -0
- package/dist/types/memory.js +2 -0
- package/dist/types/memory.js.map +1 -0
- package/dist/types/message.d.ts +25 -0
- package/dist/types/message.d.ts.map +1 -0
- package/dist/types/message.js +2 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/task.d.ts +113 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +2 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/ansi-table.d.ts +41 -0
- package/dist/utils/ansi-table.d.ts.map +1 -0
- package/dist/utils/ansi-table.js +139 -0
- package/dist/utils/ansi-table.js.map +1 -0
- package/dist/utils/court.d.ts +22 -0
- package/dist/utils/court.d.ts.map +1 -0
- package/dist/utils/court.js +76 -0
- package/dist/utils/court.js.map +1 -0
- package/dist/utils/court.test.d.ts +2 -0
- package/dist/utils/court.test.d.ts.map +1 -0
- package/dist/utils/court.test.js +151 -0
- package/dist/utils/court.test.js.map +1 -0
- package/dist/utils/file-lock.d.ts +4 -0
- package/dist/utils/file-lock.d.ts.map +1 -0
- package/dist/utils/file-lock.js +59 -0
- package/dist/utils/file-lock.js.map +1 -0
- package/dist/utils/format.d.ts +7 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +33 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/init-project.d.ts +5 -0
- package/dist/utils/init-project.d.ts.map +1 -0
- package/dist/utils/init-project.js +89 -0
- package/dist/utils/init-project.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +53 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory.d.ts +60 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +403 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/permission.d.ts +34 -0
- package/dist/utils/permission.d.ts.map +1 -0
- package/dist/utils/permission.js +52 -0
- package/dist/utils/permission.js.map +1 -0
- package/dist/utils/permission.test.d.ts +2 -0
- package/dist/utils/permission.test.d.ts.map +1 -0
- package/dist/utils/permission.test.js +26 -0
- package/dist/utils/permission.test.js.map +1 -0
- package/dist/utils/queue.d.ts +55 -0
- package/dist/utils/queue.d.ts.map +1 -0
- package/dist/utils/queue.js +705 -0
- package/dist/utils/queue.js.map +1 -0
- package/dist/utils/status-transition.d.ts +57 -0
- package/dist/utils/status-transition.d.ts.map +1 -0
- package/dist/utils/status-transition.js +94 -0
- package/dist/utils/status-transition.js.map +1 -0
- package/dist/utils/task-archive.d.ts +33 -0
- package/dist/utils/task-archive.d.ts.map +1 -0
- package/dist/utils/task-archive.js +233 -0
- package/dist/utils/task-archive.js.map +1 -0
- package/dist/utils/task-manager.d.ts +67 -0
- package/dist/utils/task-manager.d.ts.map +1 -0
- package/dist/utils/task-manager.js +225 -0
- package/dist/utils/task-manager.js.map +1 -0
- package/dist/utils/team-session.d.ts +99 -0
- package/dist/utils/team-session.d.ts.map +1 -0
- package/dist/utils/team-session.js +585 -0
- package/dist/utils/team-session.js.map +1 -0
- package/dist/utils/validation.d.ts +40 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +57 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/wezterm.d.ts +23 -0
- package/dist/utils/wezterm.d.ts.map +1 -0
- package/dist/utils/wezterm.js +189 -0
- package/dist/utils/wezterm.js.map +1 -0
- package/package.json +60 -0
- package/templates/skills/report-template.md +58 -0
- package/templates/skills/review-code.md +83 -0
- package/templates/skills/review-plan.md +65 -0
- package/templates/skills/strict-review.md +83 -0
- package/templates/skills/strict-workflow.md +48 -0
- package/templates/skills/tdd.md +50 -0
- package/templates/start-team-skill.md +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
# dev-team-mcp-server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/dev-team-mcp-server)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
6
|
+
Multi-agent development team system for [Claude Code](https://claude.ai/claude-code) — orchestrate PM, Leader, and Member roles via MCP with WezTerm integration.
|
|
7
|
+
|
|
8
|
+
Multiple Claude Code instances work as a "development team" with a hierarchical structure (PM → Leader → Members), event-driven file-based communication, and zero API consumption during idle.
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
- **Node.js** 18+
|
|
13
|
+
- **WezTerm** 20230326+ (terminal multiplexer)
|
|
14
|
+
- **Claude Code CLI** v2.1.0+
|
|
15
|
+
- **Windows OS**
|
|
16
|
+
|
|
17
|
+
## Install
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install -g dev-team-mcp-server
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Quick Start
|
|
24
|
+
|
|
25
|
+
### 1. Initialize project
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
dev-team init /path/to/your-project
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
This creates the `.dev-team/` directory structure with workspace configurations.
|
|
32
|
+
|
|
33
|
+
### 2. Configure MCP
|
|
34
|
+
|
|
35
|
+
Add to your `~/.mcp.json`:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"mcpServers": {
|
|
40
|
+
"dev-team": {
|
|
41
|
+
"command": "dev-team-mcp-server",
|
|
42
|
+
"args": []
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 3. Start the team
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
dev-team start /path/to/your-project "Implement user authentication"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
This opens WezTerm panes for each role (PM, Leader, Member-01, Member-02) and starts the team session.
|
|
55
|
+
|
|
56
|
+
### 4. Manage the team
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Add members
|
|
60
|
+
dev-team add-member /path/to/your-project --count 1
|
|
61
|
+
|
|
62
|
+
# Remove members
|
|
63
|
+
dev-team remove-member /path/to/your-project --count 1
|
|
64
|
+
|
|
65
|
+
# Stop the team
|
|
66
|
+
dev-team stop /path/to/your-project
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Environment Variables
|
|
70
|
+
|
|
71
|
+
Set automatically by `dev-team start`. Manual configuration is not required.
|
|
72
|
+
|
|
73
|
+
| Variable | Description | Example |
|
|
74
|
+
|----------|-------------|---------|
|
|
75
|
+
| `DEV_TEAM_ROLE` | Agent role | `pm`, `leader`, `member-01` |
|
|
76
|
+
| `DEV_TEAM_PROJECT_PATH` | Project path | `/path/to/project` |
|
|
77
|
+
| `DEV_TEAM_LOG_LEVEL` | Log level (optional) | `debug`, `info`, `warn`, `error` |
|
|
78
|
+
|
|
79
|
+
## Tools
|
|
80
|
+
|
|
81
|
+
### Basic Operations
|
|
82
|
+
|
|
83
|
+
| Tool | Who | Description |
|
|
84
|
+
|------|-----|-------------|
|
|
85
|
+
| `check_queue` | All | Check task queue for incoming messages |
|
|
86
|
+
| `send_task` | All (restricted) | Send task/message to another role |
|
|
87
|
+
| `get_dashboard` | All | Get project progress dashboard |
|
|
88
|
+
| `health_check` | All | Check system status |
|
|
89
|
+
|
|
90
|
+
### Task Management
|
|
91
|
+
|
|
92
|
+
| Tool | Who | Description |
|
|
93
|
+
|------|-----|-------------|
|
|
94
|
+
| `assign_task` | Leader | Assign structured task to a member |
|
|
95
|
+
| `distribute_tasks` | Leader | Distribute multiple subtasks at once |
|
|
96
|
+
| `submit_plan` | Member | Submit implementation plan for review |
|
|
97
|
+
| `approve_plan` | Leader | Approve member's plan |
|
|
98
|
+
| `reject_plan` | Leader | Reject member's plan with feedback |
|
|
99
|
+
| `submit_test` | Member | Submit test code for review (strict mode) |
|
|
100
|
+
| `approve_test` | Leader | Approve member's test code |
|
|
101
|
+
| `reject_test` | Leader | Reject member's test code |
|
|
102
|
+
| `update_task_status` | PM, Leader | Update task status |
|
|
103
|
+
|
|
104
|
+
### Backlog
|
|
105
|
+
|
|
106
|
+
| Tool | Who | Description |
|
|
107
|
+
|------|-----|-------------|
|
|
108
|
+
| `add_backlog` | PM | Add task to backlog |
|
|
109
|
+
| `get_backlog` | All | Get backlog task list |
|
|
110
|
+
| `update_backlog` | PM | Update backlog task status |
|
|
111
|
+
|
|
112
|
+
### Memory & Context
|
|
113
|
+
|
|
114
|
+
| Tool | Who | Description |
|
|
115
|
+
|------|-----|-------------|
|
|
116
|
+
| `save_memory` | All | Save decisions and notes |
|
|
117
|
+
| `recall_memory` | All | Search and retrieve memories |
|
|
118
|
+
| `get_project_context` | All | Get project context |
|
|
119
|
+
| `update_project_context` | PM, Leader | Update project context |
|
|
120
|
+
|
|
121
|
+
### Approval
|
|
122
|
+
|
|
123
|
+
| Tool | Who | Description |
|
|
124
|
+
|------|-----|-------------|
|
|
125
|
+
| `request_approval` | PM | Request approval from user |
|
|
126
|
+
| `process_approval` | PM | Process approval request |
|
|
127
|
+
|
|
128
|
+
### Configuration
|
|
129
|
+
|
|
130
|
+
| Tool | Who | Description |
|
|
131
|
+
|------|-----|-------------|
|
|
132
|
+
| `configure_modes` | PM | Configure review mode and task split approval |
|
|
133
|
+
|
|
134
|
+
### Member Management
|
|
135
|
+
|
|
136
|
+
| Tool | Who | Description |
|
|
137
|
+
|------|-----|-------------|
|
|
138
|
+
| `request_member_increase` | Leader | Request member increase |
|
|
139
|
+
| `request_member_decrease` | Leader | Request member decrease |
|
|
140
|
+
|
|
141
|
+
### Agent Control
|
|
142
|
+
|
|
143
|
+
| Tool | Who | Description |
|
|
144
|
+
|------|-----|-------------|
|
|
145
|
+
| `compact_agent` | PM, Leader | Send /compact to a role |
|
|
146
|
+
| `clear_agent` | PM, Leader | Send /clear to a role |
|
|
147
|
+
| `compact_all` | PM, Leader | Send /compact to all roles |
|
|
148
|
+
| `archive_all_tasks` | PM | Archive all tasks |
|
|
149
|
+
|
|
150
|
+
## CLI Commands
|
|
151
|
+
|
|
152
|
+
| Command | Description |
|
|
153
|
+
|---------|-------------|
|
|
154
|
+
| `dev-team init [path]` | Initialize project structure |
|
|
155
|
+
| `dev-team start <path> [task]` | Start team session |
|
|
156
|
+
| `dev-team stop <path>` | Stop team session |
|
|
157
|
+
| `dev-team add-member <path>` | Add members to session |
|
|
158
|
+
| `dev-team remove-member <path>` | Remove members from session |
|
|
159
|
+
| `dev-team --version` | Show version |
|
|
160
|
+
|
|
161
|
+
## License
|
|
162
|
+
|
|
163
|
+
[MIT](https://github.com/tomcat12295/dev-team/blob/master/LICENSE)
|
|
164
|
+
|
|
165
|
+
## Links
|
|
166
|
+
|
|
167
|
+
- [GitHub Repository](https://github.com/tomcat12295/dev-team)
|
|
168
|
+
- [Bug Reports](https://github.com/tomcat12295/dev-team/issues)
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,eAAO,MAAM,WAAW,EAAE,MAAoB,CAAC;AAE/C,eAAO,MAAM,OAAO,SAAgB,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import * as path from 'path';
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { startTeamSession, stopTeamSession, addMember, removeMember } from './utils/team-session.js';
|
|
8
|
+
import { initProject } from './utils/init-project.js';
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = dirname(__filename);
|
|
11
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
12
|
+
export const CLI_VERSION = pkg.version;
|
|
13
|
+
export const program = new Command();
|
|
14
|
+
program
|
|
15
|
+
.name('dev-team')
|
|
16
|
+
.description('Dev Team CLI')
|
|
17
|
+
.version(CLI_VERSION);
|
|
18
|
+
program
|
|
19
|
+
.command('start')
|
|
20
|
+
.description('Start dev team session')
|
|
21
|
+
.argument('<projectPath>', 'Path to the project directory')
|
|
22
|
+
.argument('[initialTask]', 'Initial task for PM')
|
|
23
|
+
.option('-m, --members <count>', 'Number of members (default: 2)', '2')
|
|
24
|
+
.action(async (projectPath, initialTask, options) => {
|
|
25
|
+
try {
|
|
26
|
+
const absolutePath = path.resolve(projectPath);
|
|
27
|
+
const memberCount = parseInt(options?.members || '2', 10);
|
|
28
|
+
await startTeamSession({
|
|
29
|
+
projectPath: absolutePath,
|
|
30
|
+
initialTask,
|
|
31
|
+
memberCount,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error('Failed to start dev team session:', err);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
program
|
|
40
|
+
.command('stop')
|
|
41
|
+
.description('Stop dev team session')
|
|
42
|
+
.argument('<projectPath>', 'Path to the project directory')
|
|
43
|
+
.option('--delete-queue', 'Delete queue files (default: keep)')
|
|
44
|
+
.action(async (projectPath, options) => {
|
|
45
|
+
try {
|
|
46
|
+
const absolutePath = path.resolve(projectPath);
|
|
47
|
+
await stopTeamSession(absolutePath, {
|
|
48
|
+
keepQueue: !options?.deleteQueue,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.error('Failed to stop dev team session:', err);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
program
|
|
57
|
+
.command('add-member')
|
|
58
|
+
.description('Add members to an existing team session')
|
|
59
|
+
.argument('<projectPath>', 'Path to the project directory')
|
|
60
|
+
.option('-c, --count <count>', 'Number of members to add (default: 1)', '1')
|
|
61
|
+
.action(async (projectPath, options) => {
|
|
62
|
+
try {
|
|
63
|
+
const absolutePath = path.resolve(projectPath);
|
|
64
|
+
const count = parseInt(options?.count || '1', 10);
|
|
65
|
+
const result = await addMember({
|
|
66
|
+
projectPath: absolutePath,
|
|
67
|
+
count,
|
|
68
|
+
});
|
|
69
|
+
console.log(`Successfully added ${result.addedRoles.length} member(s)`);
|
|
70
|
+
console.log(` Previous count: ${result.previousCount}`);
|
|
71
|
+
console.log(` New count: ${result.newCount}`);
|
|
72
|
+
console.log(` Added roles: ${result.addedRoles.join(', ')}`);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error('Failed to add members:', err);
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
program
|
|
80
|
+
.command('remove-member')
|
|
81
|
+
.description('Remove members from an existing team session')
|
|
82
|
+
.argument('<projectPath>', 'Path to the project directory')
|
|
83
|
+
.option('-c, --count <count>', 'Number of members to remove (default: 1)', '1')
|
|
84
|
+
.action(async (projectPath, options) => {
|
|
85
|
+
try {
|
|
86
|
+
const absolutePath = path.resolve(projectPath);
|
|
87
|
+
const count = parseInt(options?.count || '1', 10);
|
|
88
|
+
const result = await removeMember(absolutePath, { count });
|
|
89
|
+
console.log(`Successfully removed ${result.removedRoles.length} member(s)`);
|
|
90
|
+
console.log(` Previous count: ${result.previousCount}`);
|
|
91
|
+
console.log(` New count: ${result.newCount}`);
|
|
92
|
+
console.log(` Removed roles: ${result.removedRoles.join(', ')}`);
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
console.error('Failed to remove members:', err);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
program
|
|
100
|
+
.command('init')
|
|
101
|
+
.description('Init dev team project structure')
|
|
102
|
+
.argument('[projectPath]', 'Path to the project directory', '.')
|
|
103
|
+
.option('-f, --force', 'Overwrite existing files')
|
|
104
|
+
.action(async (projectPath, options) => {
|
|
105
|
+
try {
|
|
106
|
+
const absolutePath = path.resolve(projectPath);
|
|
107
|
+
await initProject(absolutePath, {
|
|
108
|
+
force: options?.force,
|
|
109
|
+
});
|
|
110
|
+
console.log('Successfully initialized dev team project');
|
|
111
|
+
console.log(` Project path: ${absolutePath}`);
|
|
112
|
+
console.log(' Created:');
|
|
113
|
+
console.log(' - .dev-team/workspaces/{pm,leader,member-01,member-02}/CLAUDE.md');
|
|
114
|
+
console.log(' - .dev-team/queue/');
|
|
115
|
+
console.log(' - .dev-team/dashboard.json');
|
|
116
|
+
console.log(' - .claude/skills/start-team/SKILL.md');
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
console.error('Failed to initialize dev team project:', err);
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
// Only parse if this file is run directly (not imported for testing)
|
|
124
|
+
if (process.argv[1]?.endsWith('cli.js') || process.argv[1]?.endsWith('cli.ts')) {
|
|
125
|
+
program.parse();
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,WAAW,GAAW,GAAG,CAAC,OAAO,CAAC;AAE/C,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAErC,OAAO;KACF,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,cAAc,CAAC;KAC3B,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,eAAe,EAAE,+BAA+B,CAAC;KAC1D,QAAQ,CAAC,eAAe,EAAE,qBAAqB,CAAC;KAChD,MAAM,CAAC,uBAAuB,EAAE,gCAAgC,EAAE,GAAG,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,WAAoB,EAAE,OAA8B,EAAE,EAAE;IACxF,IAAI,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAE1D,MAAM,gBAAgB,CAAC;YACnB,WAAW,EAAE,YAAY;YACzB,WAAW;YACX,WAAW;SACd,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uBAAuB,CAAC;KACpC,QAAQ,CAAC,eAAe,EAAE,+BAA+B,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,oCAAoC,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAAmC,EAAE,EAAE;IACvE,IAAI,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,eAAe,CAAC,YAAY,EAAE;YAChC,SAAS,EAAE,CAAC,OAAO,EAAE,WAAW;SACnC,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CAAC,yCAAyC,CAAC;KACtD,QAAQ,CAAC,eAAe,EAAE,+BAA+B,CAAC;KAC1D,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,EAAE,GAAG,CAAC;KAC3E,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAA4B,EAAE,EAAE;IAChE,IAAI,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;YAC3B,WAAW,EAAE,YAAY;YACzB,KAAK;SACR,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,UAAU,CAAC,MAAM,YAAY,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,8CAA8C,CAAC;KAC3D,QAAQ,CAAC,eAAe,EAAE,+BAA+B,CAAC;KAC1D,MAAM,CAAC,qBAAqB,EAAE,0CAA0C,EAAE,GAAG,CAAC;KAC9E,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAA4B,EAAE,EAAE;IAChE,IAAI,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,wBAAwB,MAAM,CAAC,YAAY,CAAC,MAAM,YAAY,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,OAAO;KACF,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,iCAAiC,CAAC;KAC9C,QAAQ,CAAC,eAAe,EAAE,+BAA+B,EAAE,GAAG,CAAC;KAC/D,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,KAAK,EAAE,WAAmB,EAAE,OAA6B,EAAE,EAAE;IACjE,IAAI,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAE/C,MAAM,WAAW,CAAC,YAAY,EAAE;YAC5B,KAAK,EAAE,OAAO,EAAE,KAAK;SACxB,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,qEAAqE;AACrE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7E,OAAO,CAAC,KAAK,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Role } from '../types/task.js';
|
|
2
|
+
export interface PermissionConfig {
|
|
3
|
+
canSendTo: Role[];
|
|
4
|
+
canRequestApproval: boolean;
|
|
5
|
+
canProcessApproval: boolean;
|
|
6
|
+
canUpdateDashboard: boolean;
|
|
7
|
+
canRequestMemberIncrease: boolean;
|
|
8
|
+
canRequestMemberDecrease: boolean;
|
|
9
|
+
canAssignTask: boolean;
|
|
10
|
+
canSubmitPlan: boolean;
|
|
11
|
+
canApprovePlan: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare const PERMISSIONS: Record<string, PermissionConfig>;
|
|
14
|
+
export declare function canSendTo(from: Role, to: Role): boolean;
|
|
15
|
+
type BooleanPermissionKey = Exclude<keyof PermissionConfig, 'canSendTo'>;
|
|
16
|
+
export declare function hasPermission(role: Role, permission: BooleanPermissionKey): boolean;
|
|
17
|
+
export declare const canRequestApproval: (role: Role) => boolean;
|
|
18
|
+
export declare const canProcessApproval: (role: Role) => boolean;
|
|
19
|
+
export declare const canUpdateDashboard: (role: Role) => boolean;
|
|
20
|
+
export declare const canRequestMemberIncrease: (role: Role) => boolean;
|
|
21
|
+
export declare const canRequestMemberDecrease: (role: Role) => boolean;
|
|
22
|
+
export declare const canAssignTask: (role: Role) => boolean;
|
|
23
|
+
export declare const canSubmitPlan: (role: Role) => boolean;
|
|
24
|
+
export declare const canApprovePlan: (role: Role) => boolean;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/config/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,MAAM,WAAW,gBAAgB;IAC7B,SAAS,EAAE,IAAI,EAAE,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,wBAAwB,EAAE,OAAO,CAAC;IAClC,wBAAwB,EAAE,OAAO,CAAC;IAElC,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;CAC3B;AAwDD,eAAO,MAAM,WAAW,kCActB,CAAC;AAEH,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAGvD;AAED,KAAK,oBAAoB,GAAG,OAAO,CAAC,MAAM,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAEzE,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,oBAAoB,GAAG,OAAO,CAGnF;AAED,eAAO,MAAM,kBAAkB,GAAI,MAAM,IAAI,YAA8C,CAAC;AAC5F,eAAO,MAAM,kBAAkB,GAAI,MAAM,IAAI,YAA8C,CAAC;AAC5F,eAAO,MAAM,kBAAkB,GAAI,MAAM,IAAI,YAA8C,CAAC;AAC5F,eAAO,MAAM,wBAAwB,GAAI,MAAM,IAAI,YAAoD,CAAC;AACxG,eAAO,MAAM,wBAAwB,GAAI,MAAM,IAAI,YAAoD,CAAC;AACxG,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,YAAyC,CAAC;AAClF,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,YAAyC,CAAC;AAClF,eAAO,MAAM,cAAc,GAAI,MAAM,IAAI,YAA0C,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { getMemberRoles, getTeamConfig } from './team-config.js';
|
|
2
|
+
function generatePermissions() {
|
|
3
|
+
const config = getTeamConfig();
|
|
4
|
+
const memberTemplate = config.permissionTemplates.member;
|
|
5
|
+
const memberRoles = getMemberRoles();
|
|
6
|
+
const permissions = {
|
|
7
|
+
pm: {
|
|
8
|
+
canSendTo: ['leader'],
|
|
9
|
+
canRequestApproval: true,
|
|
10
|
+
canProcessApproval: true,
|
|
11
|
+
canUpdateDashboard: true,
|
|
12
|
+
canRequestMemberIncrease: false,
|
|
13
|
+
canRequestMemberDecrease: false,
|
|
14
|
+
canAssignTask: false,
|
|
15
|
+
canSubmitPlan: false,
|
|
16
|
+
canApprovePlan: false,
|
|
17
|
+
},
|
|
18
|
+
leader: {
|
|
19
|
+
canSendTo: ['pm', ...memberRoles],
|
|
20
|
+
canRequestApproval: false,
|
|
21
|
+
canProcessApproval: false,
|
|
22
|
+
canUpdateDashboard: true,
|
|
23
|
+
canRequestMemberIncrease: true,
|
|
24
|
+
canRequestMemberDecrease: true,
|
|
25
|
+
canAssignTask: true,
|
|
26
|
+
canSubmitPlan: false,
|
|
27
|
+
canApprovePlan: true,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
// メンバー権限をテンプレートから動的生成
|
|
31
|
+
memberRoles.forEach(role => {
|
|
32
|
+
permissions[role] = {
|
|
33
|
+
canSendTo: memberTemplate.canSendTo,
|
|
34
|
+
canRequestApproval: memberTemplate.canRequestApproval,
|
|
35
|
+
canProcessApproval: memberTemplate.canProcessApproval,
|
|
36
|
+
canUpdateDashboard: memberTemplate.canUpdateDashboard,
|
|
37
|
+
canRequestMemberIncrease: false,
|
|
38
|
+
canRequestMemberDecrease: false,
|
|
39
|
+
canAssignTask: false,
|
|
40
|
+
canSubmitPlan: true,
|
|
41
|
+
canApprovePlan: false,
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
return permissions;
|
|
45
|
+
}
|
|
46
|
+
// Dynamically generate permissions on each access to support member changes at runtime
|
|
47
|
+
function getPermissions() {
|
|
48
|
+
return generatePermissions();
|
|
49
|
+
}
|
|
50
|
+
// Backwards-compatible getter (used by tests)
|
|
51
|
+
export const PERMISSIONS = new Proxy({}, {
|
|
52
|
+
get(_target, prop) {
|
|
53
|
+
return getPermissions()[prop];
|
|
54
|
+
},
|
|
55
|
+
ownKeys() {
|
|
56
|
+
return Object.keys(getPermissions());
|
|
57
|
+
},
|
|
58
|
+
getOwnPropertyDescriptor(_target, prop) {
|
|
59
|
+
const perms = getPermissions();
|
|
60
|
+
if (prop in perms) {
|
|
61
|
+
return { configurable: true, enumerable: true, value: perms[prop] };
|
|
62
|
+
}
|
|
63
|
+
return undefined;
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
export function canSendTo(from, to) {
|
|
67
|
+
const perms = getPermissions();
|
|
68
|
+
return perms[from]?.canSendTo?.includes(to) ?? false;
|
|
69
|
+
}
|
|
70
|
+
export function hasPermission(role, permission) {
|
|
71
|
+
const perms = getPermissions();
|
|
72
|
+
return perms[role]?.[permission] ?? false;
|
|
73
|
+
}
|
|
74
|
+
export const canRequestApproval = (role) => hasPermission(role, 'canRequestApproval');
|
|
75
|
+
export const canProcessApproval = (role) => hasPermission(role, 'canProcessApproval');
|
|
76
|
+
export const canUpdateDashboard = (role) => hasPermission(role, 'canUpdateDashboard');
|
|
77
|
+
export const canRequestMemberIncrease = (role) => hasPermission(role, 'canRequestMemberIncrease');
|
|
78
|
+
export const canRequestMemberDecrease = (role) => hasPermission(role, 'canRequestMemberDecrease');
|
|
79
|
+
export const canAssignTask = (role) => hasPermission(role, 'canAssignTask');
|
|
80
|
+
export const canSubmitPlan = (role) => hasPermission(role, 'canSubmitPlan');
|
|
81
|
+
export const canApprovePlan = (role) => hasPermission(role, 'canApprovePlan');
|
|
82
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/config/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export interface MemberPermissionTemplate {
|
|
2
|
+
canSendTo: string[];
|
|
3
|
+
canRequestApproval: boolean;
|
|
4
|
+
canProcessApproval: boolean;
|
|
5
|
+
canUpdateDashboard: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface TeamConfig {
|
|
8
|
+
version: string;
|
|
9
|
+
team: {
|
|
10
|
+
fixedRoles: string[];
|
|
11
|
+
members: {
|
|
12
|
+
count: number;
|
|
13
|
+
prefix: string;
|
|
14
|
+
startIndex: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
permissionTemplates: {
|
|
18
|
+
member: MemberPermissionTemplate;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export declare function getTeamConfig(): TeamConfig;
|
|
22
|
+
export declare function getAllRoles(): string[];
|
|
23
|
+
export declare function getMemberRoles(): string[];
|
|
24
|
+
export declare function getFixedRoles(): string[];
|
|
25
|
+
export declare function isValidRole(role: string): boolean;
|
|
26
|
+
export declare function isMemberRole(role: string): boolean;
|
|
27
|
+
export declare function getMemberCount(): number;
|
|
28
|
+
//# sourceMappingURL=team-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-config.d.ts","sourceRoot":"","sources":["../../src/config/team-config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,wBAAwB;IACrC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,kBAAkB,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE;QACF,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,OAAO,EAAE;YACL,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;YACf,UAAU,EAAE,MAAM,CAAC;SACtB,CAAC;KACL,CAAC;IACF,mBAAmB,EAAE;QACjB,MAAM,EAAE,wBAAwB,CAAC;KACpC,CAAC;CACL;AAiDD,wBAAgB,aAAa,IAAI,UAAU,CAyB1C;AAeD,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAMtC;AAED,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAGzC;AAED,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAGxC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGlD;AAED,wBAAgB,cAAc,IAAI,MAAM,CAGvC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
const DEFAULT_CONFIG = {
|
|
4
|
+
version: '1.0',
|
|
5
|
+
team: {
|
|
6
|
+
fixedRoles: ['pm', 'leader'],
|
|
7
|
+
members: {
|
|
8
|
+
count: 2,
|
|
9
|
+
prefix: 'member-',
|
|
10
|
+
startIndex: 1,
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
permissionTemplates: {
|
|
14
|
+
member: {
|
|
15
|
+
canSendTo: ['leader'],
|
|
16
|
+
canRequestApproval: false,
|
|
17
|
+
canProcessApproval: false,
|
|
18
|
+
canUpdateDashboard: false,
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
function isValidConfig(config) {
|
|
23
|
+
if (typeof config !== 'object' || config === null) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
const c = config;
|
|
27
|
+
if (!c.team ||
|
|
28
|
+
!c.team.members ||
|
|
29
|
+
typeof c.team.members.count !== 'number' ||
|
|
30
|
+
typeof c.team.members.startIndex !== 'number') {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
if (c.team.members.count <= 0) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (c.team.members.startIndex < 0) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
export function getTeamConfig() {
|
|
42
|
+
const projectPath = process.env.DEV_TEAM_PROJECT_PATH;
|
|
43
|
+
if (!projectPath) {
|
|
44
|
+
return DEFAULT_CONFIG;
|
|
45
|
+
}
|
|
46
|
+
const configPath = path.join(projectPath, '.dev-team', 'config', 'team.json');
|
|
47
|
+
if (!fs.existsSync(configPath)) {
|
|
48
|
+
return DEFAULT_CONFIG;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
52
|
+
const parsed = JSON.parse(content);
|
|
53
|
+
if (!isValidConfig(parsed)) {
|
|
54
|
+
return DEFAULT_CONFIG;
|
|
55
|
+
}
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return DEFAULT_CONFIG;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function generateMemberRoles(config) {
|
|
63
|
+
const { prefix, count, startIndex } = config.team.members;
|
|
64
|
+
const members = [];
|
|
65
|
+
for (let i = 0; i < count; i++) {
|
|
66
|
+
const index = startIndex + i;
|
|
67
|
+
const paddedIndex = index.toString().padStart(2, '0');
|
|
68
|
+
members.push(`${prefix}${paddedIndex}`);
|
|
69
|
+
}
|
|
70
|
+
return members;
|
|
71
|
+
}
|
|
72
|
+
export function getAllRoles() {
|
|
73
|
+
const config = getTeamConfig();
|
|
74
|
+
const fixedRoles = config.team.fixedRoles;
|
|
75
|
+
const memberRoles = generateMemberRoles(config);
|
|
76
|
+
return [...fixedRoles, ...memberRoles];
|
|
77
|
+
}
|
|
78
|
+
export function getMemberRoles() {
|
|
79
|
+
const config = getTeamConfig();
|
|
80
|
+
return generateMemberRoles(config);
|
|
81
|
+
}
|
|
82
|
+
export function getFixedRoles() {
|
|
83
|
+
const config = getTeamConfig();
|
|
84
|
+
return [...config.team.fixedRoles];
|
|
85
|
+
}
|
|
86
|
+
export function isValidRole(role) {
|
|
87
|
+
if (!role) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
const allRoles = getAllRoles();
|
|
91
|
+
return allRoles.includes(role);
|
|
92
|
+
}
|
|
93
|
+
export function isMemberRole(role) {
|
|
94
|
+
const memberRoles = getMemberRoles();
|
|
95
|
+
return memberRoles.includes(role);
|
|
96
|
+
}
|
|
97
|
+
export function getMemberCount() {
|
|
98
|
+
const config = getTeamConfig();
|
|
99
|
+
return config.team.members.count;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=team-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"team-config.js","sourceRoot":"","sources":["../../src/config/team-config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|