@jahanxu/trellis 0.5.0 → 0.5.5
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/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +98 -5
- package/dist/commands/init.js.map +1 -1
- package/dist/configurators/workflow.d.ts.map +1 -1
- package/dist/configurators/workflow.js +8 -58
- package/dist/configurators/workflow.js.map +1 -1
- package/dist/constants/paths.d.ts +0 -17
- package/dist/constants/paths.d.ts.map +1 -1
- package/dist/constants/paths.js +0 -19
- package/dist/constants/paths.js.map +1 -1
- package/dist/templates/claude/commands/trellis/handoff.md +56 -122
- package/dist/templates/claude/hooks/enforce-output-dir.py +115 -0
- package/dist/templates/claude/hooks/session-start.py +87 -166
- package/dist/templates/claude/settings.json +10 -0
- package/dist/templates/iflow/hooks/session-start.py +0 -171
- package/dist/templates/markdown/index.d.ts +0 -9
- package/dist/templates/markdown/index.d.ts.map +1 -1
- package/dist/templates/markdown/index.js +0 -10
- package/dist/templates/markdown/index.js.map +1 -1
- package/dist/templates/trellis/index.d.ts +9 -1
- package/dist/templates/trellis/index.d.ts.map +1 -1
- package/dist/templates/trellis/index.js +17 -2
- package/dist/templates/trellis/index.js.map +1 -1
- package/dist/templates/trellis/scripts/common/__init__.py +11 -0
- package/dist/templates/trellis/scripts/common/paths.py +1 -49
- package/dist/templates/trellis/scripts/common/roles.py +252 -0
- package/dist/templates/trellis/spec/roles/designer/index.md +49 -0
- package/dist/templates/trellis/spec/roles/frontend-impl/index.md +52 -0
- package/dist/templates/trellis/spec/roles/pm/index.md +44 -0
- package/dist/utils/template-hash.d.ts.map +1 -1
- package/dist/utils/template-hash.js +2 -0
- package/dist/utils/template-hash.js.map +1 -1
- package/package.json +2 -2
- package/dist/templates/claude/commands/trellis/pick-task.md +0 -145
- package/dist/templates/iflow/commands/trellis/handoff.md +0 -148
- package/dist/templates/iflow/commands/trellis/pick-task.md +0 -145
- package/dist/templates/markdown/spec/roles/designer/index.md.txt +0 -57
- package/dist/templates/markdown/spec/roles/designer/mock-data-standards.md.txt +0 -63
- package/dist/templates/markdown/spec/roles/designer/prototype-guidelines.md.txt +0 -49
- package/dist/templates/markdown/spec/roles/frontend-impl/api-integration.md.txt +0 -63
- package/dist/templates/markdown/spec/roles/frontend-impl/index.md.txt +0 -57
- package/dist/templates/markdown/spec/roles/frontend-impl/prototype-to-production.md.txt +0 -57
- package/dist/templates/markdown/spec/roles/pm/index.md.txt +0 -45
- package/dist/templates/markdown/spec/roles/pm/prd-template.md.txt +0 -64
- package/dist/templates/markdown/spec/roles/pm/requirement-checklist.md.txt +0 -43
- package/dist/templates/trellis/scripts/pool.py +0 -322
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Role management utilities for three-role collaboration pipeline.
|
|
4
|
+
|
|
5
|
+
Provides:
|
|
6
|
+
parse_role_from_username - Parse role prefix from username
|
|
7
|
+
load_roles_json - Load roles.json
|
|
8
|
+
save_roles_json - Save roles.json
|
|
9
|
+
get_upstream_dirs - Get upstream directories for a role
|
|
10
|
+
upsert_developer_role - Add or update developer role mapping
|
|
11
|
+
resolve_role_constraint - Resolve role and output directory
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
import sys
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
from .paths import (
|
|
21
|
+
DIR_WORKFLOW,
|
|
22
|
+
FILE_ROLES_JSON,
|
|
23
|
+
FILE_TASK_JSON,
|
|
24
|
+
get_repo_root,
|
|
25
|
+
get_current_task,
|
|
26
|
+
get_developer,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# =============================================================================
|
|
31
|
+
# Constants
|
|
32
|
+
# =============================================================================
|
|
33
|
+
|
|
34
|
+
KNOWN_ROLES = {"pm", "designer", "frontend"}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# =============================================================================
|
|
38
|
+
# JSON Helpers (per-module convention)
|
|
39
|
+
# =============================================================================
|
|
40
|
+
|
|
41
|
+
def _read_json_file(path: Path) -> dict | None:
|
|
42
|
+
"""Read and parse a JSON file."""
|
|
43
|
+
try:
|
|
44
|
+
return json.loads(path.read_text(encoding="utf-8"))
|
|
45
|
+
except (FileNotFoundError, json.JSONDecodeError, OSError):
|
|
46
|
+
return None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _write_json_file(path: Path, data: dict) -> bool:
|
|
50
|
+
"""Write dict to JSON file."""
|
|
51
|
+
try:
|
|
52
|
+
path.write_text(json.dumps(data, indent=2, ensure_ascii=False), encoding="utf-8")
|
|
53
|
+
return True
|
|
54
|
+
except (OSError, IOError):
|
|
55
|
+
return False
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
# =============================================================================
|
|
59
|
+
# Role Parsing
|
|
60
|
+
# =============================================================================
|
|
61
|
+
|
|
62
|
+
def parse_role_from_username(username: str) -> tuple[str | None, str]:
|
|
63
|
+
"""Parse role from -u parameter prefix.
|
|
64
|
+
|
|
65
|
+
Splits username on the first hyphen. If the prefix is a known role,
|
|
66
|
+
returns it alongside the full name; otherwise returns None.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
username: Developer username (e.g., "pm-alice", "bob").
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Tuple of (role, full_name). role is None if no known prefix found.
|
|
73
|
+
"""
|
|
74
|
+
if not username:
|
|
75
|
+
return None, username or ""
|
|
76
|
+
parts = username.split("-", 1)
|
|
77
|
+
if len(parts) == 2 and parts[0] in KNOWN_ROLES:
|
|
78
|
+
return parts[0], username
|
|
79
|
+
return None, username
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
# =============================================================================
|
|
83
|
+
# roles.json I/O
|
|
84
|
+
# =============================================================================
|
|
85
|
+
|
|
86
|
+
def load_roles_json(repo_root: Path | None = None) -> dict | None:
|
|
87
|
+
"""Load .trellis/roles.json.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Parsed dict or None if file doesn't exist or is invalid.
|
|
94
|
+
"""
|
|
95
|
+
if repo_root is None:
|
|
96
|
+
repo_root = get_repo_root()
|
|
97
|
+
|
|
98
|
+
roles_file = repo_root / DIR_WORKFLOW / FILE_ROLES_JSON
|
|
99
|
+
return _read_json_file(roles_file)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def save_roles_json(data: dict, repo_root: Path | None = None) -> bool:
|
|
103
|
+
"""Save roles.json.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
data: Dictionary to write.
|
|
107
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
True on success, False on error.
|
|
111
|
+
"""
|
|
112
|
+
if repo_root is None:
|
|
113
|
+
repo_root = get_repo_root()
|
|
114
|
+
|
|
115
|
+
roles_file = repo_root / DIR_WORKFLOW / FILE_ROLES_JSON
|
|
116
|
+
return _write_json_file(roles_file, data)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
# =============================================================================
|
|
120
|
+
# Upstream Directory Resolution
|
|
121
|
+
# =============================================================================
|
|
122
|
+
|
|
123
|
+
def get_upstream_dirs(role: str, roles_json: dict) -> list[str]:
|
|
124
|
+
"""Get upstream directories (all dirs NOT owned by current role).
|
|
125
|
+
|
|
126
|
+
Args:
|
|
127
|
+
role: Current developer's role.
|
|
128
|
+
roles_json: Parsed roles.json dict.
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
List of directory paths owned by other roles.
|
|
132
|
+
"""
|
|
133
|
+
directories = roles_json.get("directories", {})
|
|
134
|
+
return [d for d, r in directories.items() if r != role]
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
# =============================================================================
|
|
138
|
+
# Developer Role Upsert
|
|
139
|
+
# =============================================================================
|
|
140
|
+
|
|
141
|
+
def upsert_developer_role(
|
|
142
|
+
name: str,
|
|
143
|
+
role: str,
|
|
144
|
+
output_dir: str,
|
|
145
|
+
repo_root: Path | None = None,
|
|
146
|
+
) -> bool:
|
|
147
|
+
"""Add or update developer role mapping in roles.json.
|
|
148
|
+
|
|
149
|
+
Creates roles.json if it doesn't exist. Appends to existing if it does.
|
|
150
|
+
Rejects if output_dir is already bound to a DIFFERENT role.
|
|
151
|
+
Overwrites if same developer re-inits (with warning).
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
name: Developer name.
|
|
155
|
+
role: Developer role (e.g., "pm", "designer", "frontend").
|
|
156
|
+
output_dir: Output directory path.
|
|
157
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
True on success, False on conflict.
|
|
161
|
+
"""
|
|
162
|
+
if repo_root is None:
|
|
163
|
+
repo_root = get_repo_root()
|
|
164
|
+
|
|
165
|
+
data = load_roles_json(repo_root)
|
|
166
|
+
if data is None:
|
|
167
|
+
data = {"developers": {}, "directories": {}}
|
|
168
|
+
|
|
169
|
+
developers = data.get("developers", {})
|
|
170
|
+
directories = data.get("directories", {})
|
|
171
|
+
|
|
172
|
+
# Check conflict: output_dir already bound to a different role
|
|
173
|
+
if output_dir in directories and directories[output_dir] != role:
|
|
174
|
+
existing_role = directories[output_dir]
|
|
175
|
+
print(
|
|
176
|
+
f"Error: directory '{output_dir}' is already bound to role "
|
|
177
|
+
f"'{existing_role}', cannot assign to '{role}'",
|
|
178
|
+
file=sys.stderr,
|
|
179
|
+
)
|
|
180
|
+
return False
|
|
181
|
+
|
|
182
|
+
# Check re-init: same developer name already exists
|
|
183
|
+
if name in developers:
|
|
184
|
+
print(
|
|
185
|
+
f"Warning: developer '{name}' already exists, overwriting",
|
|
186
|
+
file=sys.stderr,
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# Upsert
|
|
190
|
+
developers[name] = {"role": role, "output_dir": output_dir}
|
|
191
|
+
directories[output_dir] = role
|
|
192
|
+
data["developers"] = developers
|
|
193
|
+
data["directories"] = directories
|
|
194
|
+
|
|
195
|
+
return save_roles_json(data, repo_root)
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
# =============================================================================
|
|
199
|
+
# Role Constraint Resolution
|
|
200
|
+
# =============================================================================
|
|
201
|
+
|
|
202
|
+
def resolve_role_constraint(
|
|
203
|
+
repo_root: Path | None = None,
|
|
204
|
+
) -> tuple[str | None, str | None]:
|
|
205
|
+
"""Three-layer fallback to resolve role and output directory.
|
|
206
|
+
|
|
207
|
+
L1: .current-task -> task.json.role / output_dir (highest priority)
|
|
208
|
+
L2: .developer name -> roles.json[name] (persistent fallback)
|
|
209
|
+
L3: (None, None) - no constraint
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
repo_root: Repository root path. Defaults to auto-detected.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Tuple of (role, output_dir). Both None if no constraint found.
|
|
216
|
+
"""
|
|
217
|
+
if repo_root is None:
|
|
218
|
+
repo_root = get_repo_root()
|
|
219
|
+
|
|
220
|
+
# L1: current task -> task.json
|
|
221
|
+
current_task = get_current_task(repo_root)
|
|
222
|
+
if current_task:
|
|
223
|
+
task_json = _read_json_file(repo_root / current_task / FILE_TASK_JSON)
|
|
224
|
+
if task_json:
|
|
225
|
+
task_role = task_json.get("role")
|
|
226
|
+
task_output = task_json.get("output_dir")
|
|
227
|
+
if task_role and task_output:
|
|
228
|
+
return task_role, task_output
|
|
229
|
+
|
|
230
|
+
# L2: developer name -> roles.json
|
|
231
|
+
developer = get_developer(repo_root)
|
|
232
|
+
if developer:
|
|
233
|
+
roles_data = load_roles_json(repo_root)
|
|
234
|
+
if roles_data:
|
|
235
|
+
dev_entry = roles_data.get("developers", {}).get(developer)
|
|
236
|
+
if dev_entry:
|
|
237
|
+
return dev_entry.get("role"), dev_entry.get("output_dir")
|
|
238
|
+
|
|
239
|
+
# L3: no constraint
|
|
240
|
+
return None, None
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
# =============================================================================
|
|
244
|
+
# Main Entry (for testing)
|
|
245
|
+
# =============================================================================
|
|
246
|
+
|
|
247
|
+
if __name__ == "__main__":
|
|
248
|
+
repo = get_repo_root()
|
|
249
|
+
print(f"Repository root: {repo}")
|
|
250
|
+
print(f"Roles JSON: {load_roles_json(repo)}")
|
|
251
|
+
role, output_dir = resolve_role_constraint(repo)
|
|
252
|
+
print(f"Role constraint: role={role}, output_dir={output_dir}")
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Designer Role Specification
|
|
2
|
+
|
|
3
|
+
> Work standards and constraints for the Interaction Designer role.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Role Definition
|
|
8
|
+
|
|
9
|
+
- **Role ID**: designer
|
|
10
|
+
- **Primary Output**: Interactive prototypes with mock data
|
|
11
|
+
- **Output Directory**: Bound via `trellis init -d`
|
|
12
|
+
|
|
13
|
+
## Work Standards
|
|
14
|
+
|
|
15
|
+
### Prototype Requirements
|
|
16
|
+
- All prototypes must be runnable (not static mockups)
|
|
17
|
+
- Use inline mock data with `// TODO: replace with real API` markers
|
|
18
|
+
- Follow the project's existing component library and design system
|
|
19
|
+
|
|
20
|
+
### Mock Data Convention
|
|
21
|
+
- Inline mock data in component files (not separate mock files)
|
|
22
|
+
- Mark every mock with: `// TODO: replace with real API`
|
|
23
|
+
- Use realistic but clearly fake data (e.g., "test@example.com")
|
|
24
|
+
|
|
25
|
+
### Component Structure
|
|
26
|
+
- One component per file
|
|
27
|
+
- Clear component hierarchy documented in HANDOFF.md
|
|
28
|
+
- Props interface defined for each component
|
|
29
|
+
|
|
30
|
+
### Quality Checklist
|
|
31
|
+
- [ ] Prototype renders without errors
|
|
32
|
+
- [ ] All mock data marked with TODO comments
|
|
33
|
+
- [ ] Component hierarchy documented
|
|
34
|
+
- [ ] Responsive layout considered
|
|
35
|
+
- [ ] Accessibility basics covered (labels, alt text)
|
|
36
|
+
|
|
37
|
+
## Handoff Guidelines
|
|
38
|
+
|
|
39
|
+
When running `/trellis:handoff`:
|
|
40
|
+
- List all components created with brief descriptions
|
|
41
|
+
- Document mock data locations (file:line)
|
|
42
|
+
- Create "needs frontend implementation" checklist
|
|
43
|
+
- Note any design decisions that differ from PRD
|
|
44
|
+
|
|
45
|
+
## Constraints
|
|
46
|
+
|
|
47
|
+
- Only write files within your bound output directory
|
|
48
|
+
- Do not modify requirements or production code
|
|
49
|
+
- Mock data must be inline, not in separate services
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Frontend Implementation Role Specification
|
|
2
|
+
|
|
3
|
+
> Work standards and constraints for the Frontend Developer role.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Role Definition
|
|
8
|
+
|
|
9
|
+
- **Role ID**: frontend
|
|
10
|
+
- **Primary Output**: Production-ready frontend code
|
|
11
|
+
- **Output Directory**: Bound via `trellis init -d`
|
|
12
|
+
|
|
13
|
+
## Work Standards
|
|
14
|
+
|
|
15
|
+
### Implementation Guidelines
|
|
16
|
+
- Replace all mock data with real API calls
|
|
17
|
+
- Follow the project's existing patterns for API integration
|
|
18
|
+
- Preserve prototype's component structure unless refactoring is justified
|
|
19
|
+
|
|
20
|
+
### API Integration
|
|
21
|
+
- Use the project's standard HTTP client
|
|
22
|
+
- Implement proper error handling for all API calls
|
|
23
|
+
- Add loading states for async operations
|
|
24
|
+
- Handle empty states and error states
|
|
25
|
+
|
|
26
|
+
### Code Quality
|
|
27
|
+
- TypeScript strict mode compliance
|
|
28
|
+
- No `any` types without justification
|
|
29
|
+
- Unit tests for business logic
|
|
30
|
+
- Integration tests for API calls
|
|
31
|
+
|
|
32
|
+
### Quality Checklist
|
|
33
|
+
- [ ] All `// TODO: replace with real API` markers resolved
|
|
34
|
+
- [ ] Error handling implemented for all API calls
|
|
35
|
+
- [ ] Loading and empty states handled
|
|
36
|
+
- [ ] TypeScript compiles without errors
|
|
37
|
+
- [ ] Lint passes
|
|
38
|
+
- [ ] Core business logic has unit tests
|
|
39
|
+
|
|
40
|
+
## Handoff Guidelines
|
|
41
|
+
|
|
42
|
+
When running `/trellis:handoff`:
|
|
43
|
+
- List API integrations completed
|
|
44
|
+
- Document any deviations from prototype
|
|
45
|
+
- Note remaining technical debt or known issues
|
|
46
|
+
- Include test coverage summary
|
|
47
|
+
|
|
48
|
+
## Constraints
|
|
49
|
+
|
|
50
|
+
- Only write files within your bound output directory
|
|
51
|
+
- Do not modify requirements or prototype code
|
|
52
|
+
- Preserve prototype component interfaces unless explicitly agreed
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# PM Role Specification
|
|
2
|
+
|
|
3
|
+
> Work standards and constraints for the Product Manager role.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Role Definition
|
|
8
|
+
|
|
9
|
+
- **Role ID**: pm
|
|
10
|
+
- **Primary Output**: Requirements documents (PRD, user stories, acceptance criteria)
|
|
11
|
+
- **Output Directory**: Bound via `trellis init -d`
|
|
12
|
+
|
|
13
|
+
## Work Standards
|
|
14
|
+
|
|
15
|
+
### Document Structure
|
|
16
|
+
- Every feature must have a PRD with: Goal, User Stories, Acceptance Criteria
|
|
17
|
+
- Use markdown format with clear headings and numbered lists
|
|
18
|
+
- Include edge cases and error scenarios
|
|
19
|
+
|
|
20
|
+
### Naming Conventions
|
|
21
|
+
- PRD files: `prd-<feature-name>.md`
|
|
22
|
+
- User stories: `user-stories-<feature-name>.md`
|
|
23
|
+
- Use kebab-case for all filenames
|
|
24
|
+
|
|
25
|
+
### Quality Checklist
|
|
26
|
+
- [ ] PRD has clear goal statement
|
|
27
|
+
- [ ] User stories follow "As a... I want... So that..." format
|
|
28
|
+
- [ ] Acceptance criteria are testable
|
|
29
|
+
- [ ] Edge cases documented
|
|
30
|
+
- [ ] Dependencies on other roles noted
|
|
31
|
+
|
|
32
|
+
## Handoff Guidelines
|
|
33
|
+
|
|
34
|
+
When running `/trellis:handoff`:
|
|
35
|
+
- Ensure all PRD sections are complete
|
|
36
|
+
- Flag any open questions or assumptions
|
|
37
|
+
- List dependencies for Designer role
|
|
38
|
+
- Include reference links (Figma, API docs, etc.)
|
|
39
|
+
|
|
40
|
+
## Constraints
|
|
41
|
+
|
|
42
|
+
- Only write files within your bound output directory
|
|
43
|
+
- Do not modify prototype or production code
|
|
44
|
+
- Do not make technical implementation decisions (leave to Designer/Frontend)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-hash.d.ts","sourceRoot":"","sources":["../../src/utils/template-hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AASD;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAYtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAGpE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAQ1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAU1E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAIlE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,IAAI,CAON;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,GACrB,OAAO,CAmBT;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,OAAO,CAST;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAQtB;
|
|
1
|
+
{"version":3,"file":"template-hash.d.ts","sourceRoot":"","sources":["../../src/utils/template-hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAK5D;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AASD;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAYtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAGpE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAQ1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAU1E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAIlE;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,IAAI,CAON;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,GACrB,OAAO,CAmBT;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,OAAO,CAST;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EAAE,EACvB,MAAM,EAAE,cAAc,GACrB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAQtB;AAsED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAoBpD"}
|
|
@@ -164,7 +164,9 @@ const EXCLUDE_FROM_HASH = [
|
|
|
164
164
|
".current-task", // Current task marker (file, not directory)
|
|
165
165
|
"spec/frontend/", // User-filled spec files
|
|
166
166
|
"spec/backend/", // User-filled spec files
|
|
167
|
+
"spec/roles/", // Role spec templates (user-customizable)
|
|
167
168
|
".backup-", // Backup directories
|
|
169
|
+
"roles.json", // Role mapping file (user data)
|
|
168
170
|
];
|
|
169
171
|
/**
|
|
170
172
|
* Check if a path should be excluded from hash tracking
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template-hash.js","sourceRoot":"","sources":["../../src/utils/template-hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,4CAA4C;AAC5C,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,MAAsB;IAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAA0B;IAClE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,YAAoB;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,YAAoB;IAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9C,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,GAAW,EACX,OAAe,EACf,OAAe;IAEf,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;QACzB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,YAAoB,EACpB,MAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE9C,2CAA2C;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sEAAsE;IACtE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAEhD,OAAO,WAAW,KAAK,UAAU,CAAC;AACpC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAAW,EACX,YAAoB,EACpB,eAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,cAAc,KAAK,eAAe,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,aAAuB,EACvB,MAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE1C,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,uBAAuB,EAAE,mBAAmB;IAC5C,UAAU,EAAE,eAAe;IAC3B,YAAY,EAAE,mBAAmB;IACjC,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,8BAA8B;IAC5C,QAAQ,EAAE,yBAAyB;IACnC,eAAe,EAAE,4CAA4C;IAC7D,gBAAgB,EAAE,yBAAyB;IAC3C,eAAe,EAAE,yBAAyB;IAC1C,UAAU,EAAE,qBAAqB;
|
|
1
|
+
{"version":3,"file":"template-hash.js","sourceRoot":"","sources":["../../src/utils/template-hash.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG7D,4CAA4C;AAC5C,MAAM,WAAW,GAAG,uBAAuB,CAAC;AAE5C;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW;IAChC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,MAAsB;IAC5D,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAA0B;IAClE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,KAAK,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QAC5C,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAED,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW,EAAE,YAAoB;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC5C,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,YAAoB;IAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IAC9C,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,GAAW,EACX,OAAe,EACf,OAAe;IAEf,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QAChD,IAAI,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC;QACzB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,YAAoB,EACpB,MAAsB;IAEtB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE9C,2CAA2C;IAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sEAAsE;IACtE,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gDAAgD;IAChD,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAEhD,OAAO,WAAW,KAAK,UAAU,CAAC;AACpC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,GAAW,EACX,YAAoB,EACpB,eAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAE9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,cAAc,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,OAAO,cAAc,KAAK,eAAe,CAAC;AAC5C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,aAAuB,EACvB,MAAsB;IAEtB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE1C,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,uBAAuB,EAAE,mBAAmB;IAC5C,UAAU,EAAE,eAAe;IAC3B,YAAY,EAAE,mBAAmB;IACjC,YAAY,EAAE,0BAA0B;IACxC,YAAY,EAAE,8BAA8B;IAC5C,QAAQ,EAAE,yBAAyB;IACnC,eAAe,EAAE,4CAA4C;IAC7D,gBAAgB,EAAE,yBAAyB;IAC3C,eAAe,EAAE,yBAAyB;IAC1C,aAAa,EAAE,0CAA0C;IACzD,UAAU,EAAE,qBAAqB;IACjC,YAAY,EAAE,gCAAgC;CAC/C,CAAC;AAEF;;GAEG;AACH,SAAS,qBAAqB,CAAC,YAAoB;IACjD,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACxC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,GAAW,EACX,GAAW,EACX,aAAqB,EAAE;IAEvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,qBAAqB,CAAC,YAAY,CAAC,EAAE,CAAC;YACxC,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,6BAA6B;IAC7B,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAErC,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAC9C,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACnD,MAAM,CAAC,YAAY,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YAC9C,CAAC;YAAC,MAAM,CAAC;gBACP,+CAA+C;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;AACpC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jahanxu/trellis",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"description": "AI capabilities grow like ivy — Trellis provides the structure to guide them along a disciplined path",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"memory",
|
|
25
25
|
"trellis"
|
|
26
26
|
],
|
|
27
|
-
"author": "
|
|
27
|
+
"author": "Mindfold LLC",
|
|
28
28
|
"license": "AGPL-3.0-only",
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"chalk": "^5.3.0",
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
# Pick Task - Select Upstream Deliverable and Start Working
|
|
2
|
-
|
|
3
|
-
Pick a deliverable from an upstream pool, create a task directory, and inject upstream context.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Usage
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
/trellis:pick-task <pool> <id>
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
- `<pool>`: `requirements` (for Designers) or `prototypes` (for Frontend)
|
|
14
|
-
- `<id>`: deliverable ID to pick (e.g., `user-login`)
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Process `[AI]`
|
|
19
|
-
|
|
20
|
-
### Step 1: Validate Role
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
python3 ./.trellis/scripts/get_context.py
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Read the developer name from `.developer` file. Parse role from `{role}-{name}` convention.
|
|
27
|
-
|
|
28
|
-
Validate role-pool match:
|
|
29
|
-
- `designer` can pick from `requirements`
|
|
30
|
-
- `frontend` / `frontend-impl` can pick from `prototypes`
|
|
31
|
-
- `pm` should NOT pick from pools (PMs create tasks directly)
|
|
32
|
-
|
|
33
|
-
If role cannot be parsed, warn but continue (soft detection).
|
|
34
|
-
|
|
35
|
-
### Step 2: Check Pool Availability
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
python3 ./.trellis/scripts/pool.py status <pool> <id>
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Verify the item:
|
|
42
|
-
- Exists in the pool
|
|
43
|
-
- Status is `available` (not `consumed`)
|
|
44
|
-
|
|
45
|
-
If not available, list what IS available:
|
|
46
|
-
```bash
|
|
47
|
-
python3 ./.trellis/scripts/pool.py list <pool>
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### Step 3: Check Current Task
|
|
51
|
-
|
|
52
|
-
If there is already a current task set, ask:
|
|
53
|
-
> "You have an active task: `<current-task>`. Would you like to finish it first, or switch to the new task?"
|
|
54
|
-
|
|
55
|
-
If user wants to continue, proceed.
|
|
56
|
-
|
|
57
|
-
### Step 4: Create Task Directory
|
|
58
|
-
|
|
59
|
-
Determine task suffix based on pool:
|
|
60
|
-
- `requirements` pool -> `{id}-prototype`
|
|
61
|
-
- `prototypes` pool -> `{id}-impl`
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
TASK_DIR=$(python3 ./.trellis/scripts/task.py create "<title>" --slug <id>-<suffix>)
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
### Step 5: Write source.json
|
|
68
|
-
|
|
69
|
-
Create `source.json` in the task directory to reference upstream:
|
|
70
|
-
|
|
71
|
-
```json
|
|
72
|
-
{
|
|
73
|
-
"based_on": {
|
|
74
|
-
"type": "<requirement|prototype>",
|
|
75
|
-
"id": "<id>",
|
|
76
|
-
"path": "<deliverable path>",
|
|
77
|
-
"handoff_doc": "<path>/HANDOFF.md"
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
Write this file:
|
|
83
|
-
```bash
|
|
84
|
-
cat > "$TASK_DIR/source.json" << 'EOF'
|
|
85
|
-
{content}
|
|
86
|
-
EOF
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### Step 6: Configure Context (JSONL)
|
|
90
|
-
|
|
91
|
-
Initialize context files for the task:
|
|
92
|
-
|
|
93
|
-
```bash
|
|
94
|
-
python3 ./.trellis/scripts/task.py init-context "$TASK_DIR" frontend
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Add upstream deliverable files and role specs to context:
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
# Add role spec
|
|
101
|
-
python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" implement ".trellis/spec/roles/<role>/index.md" "Role guidelines"
|
|
102
|
-
|
|
103
|
-
# Add upstream HANDOFF doc
|
|
104
|
-
python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" implement "<handoff_doc>" "Upstream handoff document"
|
|
105
|
-
|
|
106
|
-
# Add upstream deliverable directory files
|
|
107
|
-
# (add each significant file from the upstream output)
|
|
108
|
-
python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" implement "<upstream_file>" "Upstream deliverable"
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
### Step 7: Consume from Pool
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
python3 ./.trellis/scripts/pool.py consume <pool> <id> <developer>
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
### Step 8: Activate Task
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
python3 ./.trellis/scripts/task.py start "$TASK_DIR"
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### Step 9: Read Upstream Context
|
|
124
|
-
|
|
125
|
-
Read and summarize the upstream deliverables for the user:
|
|
126
|
-
|
|
127
|
-
1. Read the HANDOFF.md document
|
|
128
|
-
2. List all upstream files
|
|
129
|
-
3. Summarize key points the user should know
|
|
130
|
-
|
|
131
|
-
### Step 10: Report
|
|
132
|
-
|
|
133
|
-
```
|
|
134
|
-
Task picked and ready!
|
|
135
|
-
- Task: <task-dir>
|
|
136
|
-
- Based on: <pool>/<id>
|
|
137
|
-
- Upstream: <deliverable-path>
|
|
138
|
-
- Role specs loaded: .trellis/spec/roles/<role>/
|
|
139
|
-
|
|
140
|
-
Key points from upstream HANDOFF:
|
|
141
|
-
- (summary point 1)
|
|
142
|
-
- (summary point 2)
|
|
143
|
-
|
|
144
|
-
What would you like to work on first?
|
|
145
|
-
```
|