crewly 1.20.128 → 1.20.129
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/config/templates/growth-marketing-team.json +12 -1
- package/config/templates/personal-assistant-team.json +28 -0
- package/dist/backend/backend/src/constants.d.ts +45 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +51 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +135 -106
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/index.d.ts +1 -0
- package/dist/backend/backend/src/controllers/onboarding/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/index.js +1 -0
- package/dist/backend/backend/src/controllers/onboarding/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts +38 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js +106 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js +34 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +17 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +5 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +10 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts +45 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +103 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js +122 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
- package/dist/backend/backend/src/services/template/template.service.d.ts +15 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +22 -1
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +30 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js +24 -0
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +45 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +51 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js +122 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts +116 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.js +155 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.js.map +1 -0
- package/dist/cli/backend/src/services/template/template.service.d.ts +152 -0
- package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/template/template.service.js +506 -0
- package/dist/cli/backend/src/services/template/template.service.js.map +1 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts +30 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js +24 -0
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard-checklist.d.ts +152 -0
- package/dist/cli/cli/src/commands/onboard-checklist.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/onboard-checklist.js +241 -0
- package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +87 -6
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +203 -37
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +5 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +5 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +2 -1
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/templates.d.ts +27 -0
- package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/templates.js +29 -0
- package/dist/cli/cli/src/utils/templates.js.map +1 -1
- package/frontend/dist/assets/index-2bdb57b9.css +42 -0
- package/frontend/dist/assets/{index-aaf65055.js → index-5b98bf77.js} +285 -285
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-0a2f783c.css +0 -42
|
@@ -0,0 +1,506 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template Service
|
|
3
|
+
*
|
|
4
|
+
* Loads, lists, and applies team templates from config/templates/.
|
|
5
|
+
* Supports both the new TeamTemplate format (with verificationPipeline)
|
|
6
|
+
* and legacy flat JSON format (backward compatible).
|
|
7
|
+
*
|
|
8
|
+
* @module services/template/template
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync, readdirSync, existsSync, statSync, mkdirSync, copyFileSync, writeFileSync } from 'fs';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { join, resolve } from 'path';
|
|
13
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
14
|
+
import { randomUUID } from 'crypto';
|
|
15
|
+
import { isValidTeamTemplate, isValidTemplateOnboarding } from '../../types/team-template.types.js';
|
|
16
|
+
import { SkillTierService } from '../skill/skill-tier.service.js';
|
|
17
|
+
import { CLOUD_CONSTANTS } from '../../constants.js';
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Constants
|
|
20
|
+
// =============================================================================
|
|
21
|
+
const logger = LoggerService.getInstance().createComponentLogger('TemplateService');
|
|
22
|
+
/** Default path to templates directory */
|
|
23
|
+
const DEFAULT_TEMPLATES_DIR = resolve(process.cwd(), 'config/templates');
|
|
24
|
+
/**
|
|
25
|
+
* Convert a kebab-case role id into a human display name used as a member's
|
|
26
|
+
* default name when a roles-format template omits an explicit `defaultName`
|
|
27
|
+
* (e.g. `"team-lead"` → `"Team Lead"`).
|
|
28
|
+
*
|
|
29
|
+
* @param roleId - The kebab-case role identifier.
|
|
30
|
+
* @returns A title-cased, space-separated name.
|
|
31
|
+
*/
|
|
32
|
+
function humanizeRoleId(roleId) {
|
|
33
|
+
return roleId
|
|
34
|
+
.split('-')
|
|
35
|
+
.map((p) => (p.length ? p[0].toUpperCase() + p.slice(1) : p))
|
|
36
|
+
.join(' ');
|
|
37
|
+
}
|
|
38
|
+
// =============================================================================
|
|
39
|
+
// Service
|
|
40
|
+
// =============================================================================
|
|
41
|
+
/**
|
|
42
|
+
* TemplateService manages team templates.
|
|
43
|
+
* Loads templates from config/templates/ directory, provides
|
|
44
|
+
* listing/querying, and creates teams from templates.
|
|
45
|
+
*
|
|
46
|
+
* Singleton pattern matching other Crewly services.
|
|
47
|
+
*/
|
|
48
|
+
export class TemplateService {
|
|
49
|
+
static instance = null;
|
|
50
|
+
/** Loaded templates indexed by ID */
|
|
51
|
+
templates = new Map();
|
|
52
|
+
/** Templates directory path */
|
|
53
|
+
templatesDir;
|
|
54
|
+
/** Whether templates have been loaded */
|
|
55
|
+
loaded = false;
|
|
56
|
+
constructor(templatesDir) {
|
|
57
|
+
this.templatesDir = templatesDir ?? DEFAULT_TEMPLATES_DIR;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get the singleton instance.
|
|
61
|
+
*
|
|
62
|
+
* @param templatesDir - Optional override for templates directory
|
|
63
|
+
* @returns The singleton instance
|
|
64
|
+
*/
|
|
65
|
+
static getInstance(templatesDir) {
|
|
66
|
+
if (!TemplateService.instance) {
|
|
67
|
+
TemplateService.instance = new TemplateService(templatesDir);
|
|
68
|
+
}
|
|
69
|
+
return TemplateService.instance;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Clear the singleton instance (for testing).
|
|
73
|
+
*/
|
|
74
|
+
static clearInstance() {
|
|
75
|
+
TemplateService.instance = null;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Load all templates from the templates directory.
|
|
79
|
+
* Scans for template.json files in subdirectories and
|
|
80
|
+
* legacy flat JSON files at the root level.
|
|
81
|
+
*
|
|
82
|
+
* @returns Number of templates loaded
|
|
83
|
+
*/
|
|
84
|
+
loadTemplates() {
|
|
85
|
+
this.templates.clear();
|
|
86
|
+
if (!existsSync(this.templatesDir)) {
|
|
87
|
+
this.loaded = true;
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
const entries = readdirSync(this.templatesDir);
|
|
91
|
+
for (const entry of entries) {
|
|
92
|
+
const fullPath = join(this.templatesDir, entry);
|
|
93
|
+
const stat = statSync(fullPath);
|
|
94
|
+
if (stat.isDirectory()) {
|
|
95
|
+
// Check for template.json in subdirectory (new format)
|
|
96
|
+
const templateJsonPath = join(fullPath, 'template.json');
|
|
97
|
+
if (existsSync(templateJsonPath)) {
|
|
98
|
+
this.loadTemplateFile(templateJsonPath, entry);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (entry.endsWith('.json') && !entry.startsWith('.')) {
|
|
102
|
+
// Legacy flat JSON at root level
|
|
103
|
+
this.loadLegacyTemplate(fullPath, entry);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
this.loaded = true;
|
|
107
|
+
return this.templates.size;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List local templates as summaries.
|
|
111
|
+
*
|
|
112
|
+
* @returns Array of local template summaries
|
|
113
|
+
*/
|
|
114
|
+
listTemplates() {
|
|
115
|
+
if (!this.loaded)
|
|
116
|
+
this.loadTemplates();
|
|
117
|
+
return Array.from(this.templates.values()).map(t => ({
|
|
118
|
+
id: t.id,
|
|
119
|
+
name: t.name,
|
|
120
|
+
description: t.description,
|
|
121
|
+
category: t.category,
|
|
122
|
+
hierarchical: t.hierarchical,
|
|
123
|
+
roleCount: t.roles.length,
|
|
124
|
+
version: t.version,
|
|
125
|
+
tags: t.tags,
|
|
126
|
+
icon: t.icon,
|
|
127
|
+
source: 'local',
|
|
128
|
+
requiredTier: t.requiredTier,
|
|
129
|
+
...(t.onboarding ? { onboarding: t.onboarding } : {}),
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* The first-run starter templates (those with `onboarding` metadata),
|
|
134
|
+
* ordered by `onboarding.order`.
|
|
135
|
+
*
|
|
136
|
+
* @returns Starter templates, first-shown first
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* ```ts
|
|
140
|
+
* const [recommended] = TemplateService.getInstance().listOnboardingStarters();
|
|
141
|
+
* ```
|
|
142
|
+
*/
|
|
143
|
+
listOnboardingStarters() {
|
|
144
|
+
if (!this.loaded)
|
|
145
|
+
this.loadTemplates();
|
|
146
|
+
return Array.from(this.templates.values())
|
|
147
|
+
.filter((t) => !!t.onboarding)
|
|
148
|
+
.sort((a, b) => a.onboarding.order - b.onboarding.order);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get a specific template by ID.
|
|
152
|
+
*
|
|
153
|
+
* @param id - Template ID
|
|
154
|
+
* @returns The template, or null if not found
|
|
155
|
+
*/
|
|
156
|
+
getTemplate(id) {
|
|
157
|
+
if (!this.loaded)
|
|
158
|
+
this.loadTemplates();
|
|
159
|
+
return this.templates.get(id) ?? null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Create a team from a template.
|
|
163
|
+
* Generates TeamMember objects with IDs, session names,
|
|
164
|
+
* and hierarchy fields based on the template's role definitions.
|
|
165
|
+
*
|
|
166
|
+
* @param templateId - ID of the template to use
|
|
167
|
+
* @param teamName - Name for the new team
|
|
168
|
+
* @param nameOverrides - Optional map of role to custom name
|
|
169
|
+
* @returns The created team result, or null if template not found
|
|
170
|
+
*/
|
|
171
|
+
createTeamFromTemplate(templateId, teamName, nameOverrides, userTier) {
|
|
172
|
+
const template = this.getTemplate(templateId);
|
|
173
|
+
if (!template)
|
|
174
|
+
return null;
|
|
175
|
+
// Check if user's tier is sufficient for this template
|
|
176
|
+
const effectiveTier = userTier || CLOUD_CONSTANTS.TIERS.FREE;
|
|
177
|
+
if (template.requiredTier) {
|
|
178
|
+
const tierService = SkillTierService.getInstance();
|
|
179
|
+
if (!tierService.isTierSufficient(effectiveTier, template.requiredTier)) {
|
|
180
|
+
throw new Error(`Template "${template.name}" requires ${template.requiredTier} plan. ` +
|
|
181
|
+
`Current plan: ${effectiveTier}. Upgrade at https://crewlyai.com/pricing`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
const members = [];
|
|
185
|
+
const memberIdsByRole = new Map();
|
|
186
|
+
// Resolve skills with tier-based graceful degradation
|
|
187
|
+
const tierService = SkillTierService.getInstance();
|
|
188
|
+
// First pass: create all members
|
|
189
|
+
for (const role of template.roles) {
|
|
190
|
+
const roleMembers = [];
|
|
191
|
+
// Apply skill tier filtering for this role
|
|
192
|
+
let resolvedSkills = role.defaultSkills;
|
|
193
|
+
if (role.defaultSkills.length > 0) {
|
|
194
|
+
const skillInfos = role.defaultSkills.map(id => ({
|
|
195
|
+
id,
|
|
196
|
+
// Skills without requiredTier are free by default
|
|
197
|
+
}));
|
|
198
|
+
const resolution = tierService.resolveSkills(skillInfos, effectiveTier);
|
|
199
|
+
resolvedSkills = resolution.skills.map(s => s.id);
|
|
200
|
+
if (resolution.degraded.length > 0) {
|
|
201
|
+
logger.info('Skills degraded for role due to tier', {
|
|
202
|
+
templateId,
|
|
203
|
+
role: role.role,
|
|
204
|
+
userTier: effectiveTier,
|
|
205
|
+
degraded: resolution.degraded.map(d => d.original),
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
for (let i = 0; i < role.count; i++) {
|
|
210
|
+
const memberId = randomUUID();
|
|
211
|
+
const suffix = role.count > 1 ? `${i + 1}` : '';
|
|
212
|
+
const name = nameOverrides?.[role.role]
|
|
213
|
+
?? `${role.defaultName}${suffix}`;
|
|
214
|
+
const member = {
|
|
215
|
+
id: memberId,
|
|
216
|
+
name,
|
|
217
|
+
sessionName: '',
|
|
218
|
+
role: role.role,
|
|
219
|
+
systemPrompt: role.promptAdditions ?? '',
|
|
220
|
+
agentStatus: 'inactive',
|
|
221
|
+
workingStatus: 'idle',
|
|
222
|
+
runtimeType: role.runtimeOverride ?? template.defaultRuntime,
|
|
223
|
+
hierarchyLevel: role.hierarchyLevel,
|
|
224
|
+
canDelegate: role.canDelegate,
|
|
225
|
+
skillOverrides: resolvedSkills.length > 0 ? resolvedSkills : undefined,
|
|
226
|
+
excludedRoleSkills: role.excludedSkills,
|
|
227
|
+
createdAt: new Date().toISOString(),
|
|
228
|
+
updatedAt: new Date().toISOString(),
|
|
229
|
+
// Organization Model fields from template role
|
|
230
|
+
jobTitle: role.jobTitle,
|
|
231
|
+
jobDescription: role.jobDescription,
|
|
232
|
+
ownershipScope: role.ownershipScope,
|
|
233
|
+
responsibilityType: role.responsibilityType,
|
|
234
|
+
autonomyLevel: role.autonomyLevel,
|
|
235
|
+
expertId: role.expertId,
|
|
236
|
+
domainSOP: role.domainSOP,
|
|
237
|
+
riskPolicy: role.riskPolicy,
|
|
238
|
+
};
|
|
239
|
+
members.push(member);
|
|
240
|
+
roleMembers.push(memberId);
|
|
241
|
+
}
|
|
242
|
+
memberIdsByRole.set(role.role, roleMembers);
|
|
243
|
+
}
|
|
244
|
+
// Second pass: wire up hierarchy (parentMemberId, subordinateIds)
|
|
245
|
+
for (const role of template.roles) {
|
|
246
|
+
const currentIds = memberIdsByRole.get(role.role) ?? [];
|
|
247
|
+
if (role.reportsTo) {
|
|
248
|
+
const parentIds = memberIdsByRole.get(role.reportsTo) ?? [];
|
|
249
|
+
if (parentIds.length > 0) {
|
|
250
|
+
const parentId = parentIds[0]; // Each child reports to first member of parent role
|
|
251
|
+
for (const childId of currentIds) {
|
|
252
|
+
const child = members.find(m => m.id === childId);
|
|
253
|
+
if (child)
|
|
254
|
+
child.parentMemberId = parentId;
|
|
255
|
+
}
|
|
256
|
+
// Update parent's subordinateIds
|
|
257
|
+
const parent = members.find(m => m.id === parentId);
|
|
258
|
+
if (parent) {
|
|
259
|
+
parent.subordinateIds = [...(parent.subordinateIds ?? []), ...currentIds];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Find leader ID
|
|
265
|
+
const leaderRole = template.roles.find(r => r.canDelegate && r.hierarchyLevel === 1);
|
|
266
|
+
const leaderIds = leaderRole ? memberIdsByRole.get(leaderRole.role) : undefined;
|
|
267
|
+
const leaderId = leaderIds?.[0];
|
|
268
|
+
const team = {
|
|
269
|
+
id: randomUUID(),
|
|
270
|
+
name: teamName,
|
|
271
|
+
description: template.description,
|
|
272
|
+
members,
|
|
273
|
+
projectIds: [],
|
|
274
|
+
hierarchical: template.hierarchical,
|
|
275
|
+
leaderId,
|
|
276
|
+
templateId: template.id,
|
|
277
|
+
createdAt: new Date().toISOString(),
|
|
278
|
+
updatedAt: new Date().toISOString(),
|
|
279
|
+
// Organization Model fields from template
|
|
280
|
+
mission: template.mission,
|
|
281
|
+
ownershipScope: template.ownershipScope,
|
|
282
|
+
serviceContract: template.serviceContract,
|
|
283
|
+
};
|
|
284
|
+
// Copy norms from template to team directory
|
|
285
|
+
this.copyTeamNorms(template.id, team.id);
|
|
286
|
+
return {
|
|
287
|
+
team,
|
|
288
|
+
templateId: template.id,
|
|
289
|
+
memberCount: members.length,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Copy norms files from a template to the team's norms directory.
|
|
294
|
+
*
|
|
295
|
+
* Copies config/templates/{templateId}/norms/*.md to ~/.crewly/teams/{teamId}/norms/.
|
|
296
|
+
* Also copies the norms config from template.json into the team's config.json.
|
|
297
|
+
*
|
|
298
|
+
* @param templateId - Source template ID
|
|
299
|
+
* @param teamId - Target team ID
|
|
300
|
+
*/
|
|
301
|
+
copyTeamNorms(templateId, teamId) {
|
|
302
|
+
try {
|
|
303
|
+
const normsSourceDir = join(this.templatesDir, templateId, 'norms');
|
|
304
|
+
if (!existsSync(normsSourceDir))
|
|
305
|
+
return;
|
|
306
|
+
const normsFiles = readdirSync(normsSourceDir).filter(f => f.endsWith('.md'));
|
|
307
|
+
if (normsFiles.length === 0)
|
|
308
|
+
return;
|
|
309
|
+
const crewlyHome = join(homedir(), '.crewly');
|
|
310
|
+
const normsTargetDir = join(crewlyHome, 'teams', teamId, 'norms');
|
|
311
|
+
mkdirSync(normsTargetDir, { recursive: true });
|
|
312
|
+
for (const file of normsFiles) {
|
|
313
|
+
copyFileSync(join(normsSourceDir, file), join(normsTargetDir, file));
|
|
314
|
+
}
|
|
315
|
+
// Copy norms config from template.json into team config
|
|
316
|
+
const template = this.getTemplate(templateId);
|
|
317
|
+
if (template) {
|
|
318
|
+
const teamConfigPath = join(crewlyHome, 'teams', teamId, 'config.json');
|
|
319
|
+
if (existsSync(teamConfigPath)) {
|
|
320
|
+
try {
|
|
321
|
+
const config = JSON.parse(readFileSync(teamConfigPath, 'utf-8'));
|
|
322
|
+
const templateJson = this.loadTemplateJson(templateId);
|
|
323
|
+
if (templateJson?.norms) {
|
|
324
|
+
config.norms = templateJson.norms;
|
|
325
|
+
writeFileSync(teamConfigPath, JSON.stringify(config, null, 2));
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
// Best-effort — config update failure doesn't block team creation
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
logger.info('Copied team norms from template', {
|
|
334
|
+
templateId,
|
|
335
|
+
teamId,
|
|
336
|
+
normsCount: normsFiles.length,
|
|
337
|
+
files: normsFiles,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
logger.warn('Failed to copy team norms (non-fatal)', {
|
|
342
|
+
templateId,
|
|
343
|
+
teamId,
|
|
344
|
+
error: err instanceof Error ? err.message : String(err),
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Load the raw template.json for a template (including norms config).
|
|
350
|
+
*
|
|
351
|
+
* @param templateId - Template ID
|
|
352
|
+
* @returns Parsed template.json or null
|
|
353
|
+
*/
|
|
354
|
+
loadTemplateJson(templateId) {
|
|
355
|
+
try {
|
|
356
|
+
const jsonPath = join(this.templatesDir, templateId, 'template.json');
|
|
357
|
+
if (!existsSync(jsonPath))
|
|
358
|
+
return null;
|
|
359
|
+
return JSON.parse(readFileSync(jsonPath, 'utf-8'));
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
return null;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Get the number of loaded templates.
|
|
367
|
+
*
|
|
368
|
+
* @returns Template count
|
|
369
|
+
*/
|
|
370
|
+
getTemplateCount() {
|
|
371
|
+
return this.templates.size;
|
|
372
|
+
}
|
|
373
|
+
// ===========================================================================
|
|
374
|
+
// Private helpers
|
|
375
|
+
// ===========================================================================
|
|
376
|
+
/**
|
|
377
|
+
* Load a new-format template.json file.
|
|
378
|
+
*
|
|
379
|
+
* @param filePath - Absolute path to the template.json file
|
|
380
|
+
* @param dirName - Directory name containing the template
|
|
381
|
+
*/
|
|
382
|
+
loadTemplateFile(filePath, dirName) {
|
|
383
|
+
try {
|
|
384
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
385
|
+
const data = JSON.parse(content);
|
|
386
|
+
// Check if it's already the new format (has verificationPipeline)
|
|
387
|
+
if (isValidTeamTemplate(data)) {
|
|
388
|
+
this.templates.set(data.id, data);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
// It might be an education-smb/insurance-smb style template.json (metadata only)
|
|
392
|
+
// These don't have roles/verificationPipeline, skip them
|
|
393
|
+
}
|
|
394
|
+
catch (error) {
|
|
395
|
+
logger.warn('Skipped invalid template file', { dirName, filePath, error: error instanceof Error ? error.message : String(error) });
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Load a legacy flat JSON template (e.g., web-dev-team.json).
|
|
400
|
+
* Converts to TeamTemplate format with sensible defaults.
|
|
401
|
+
*
|
|
402
|
+
* @param filePath - Absolute path to the JSON file
|
|
403
|
+
* @param fileName - File name of the template
|
|
404
|
+
*/
|
|
405
|
+
loadLegacyTemplate(filePath, fileName) {
|
|
406
|
+
try {
|
|
407
|
+
const content = readFileSync(filePath, 'utf-8');
|
|
408
|
+
const data = JSON.parse(content);
|
|
409
|
+
if (!data.name)
|
|
410
|
+
return;
|
|
411
|
+
const id = data.id ?? fileName.replace('.json', '');
|
|
412
|
+
// Default verification pipeline for flat templates that omit one.
|
|
413
|
+
const defaultPipeline = {
|
|
414
|
+
name: 'Manual Review',
|
|
415
|
+
steps: [{
|
|
416
|
+
id: 'manual',
|
|
417
|
+
name: 'Manual Review',
|
|
418
|
+
description: 'Team leader reviews output manually',
|
|
419
|
+
method: 'manual_review',
|
|
420
|
+
critical: true,
|
|
421
|
+
config: {},
|
|
422
|
+
}],
|
|
423
|
+
passPolicy: 'all',
|
|
424
|
+
maxRetries: 1,
|
|
425
|
+
};
|
|
426
|
+
// New roles-format flat template (e.g. pragmatic-mvp-dev-team.json): the
|
|
427
|
+
// `roles` array is already in TeamTemplate shape. Load it directly so the
|
|
428
|
+
// template's real hierarchy (hierarchyLevel / canDelegate / reportsTo),
|
|
429
|
+
// skills and runtime survive. Previously these files were silently SKIPPED
|
|
430
|
+
// because the loader only accepted `members[]`, leaving every roles-format
|
|
431
|
+
// template — the only ones that define a delegating leader — unregistered.
|
|
432
|
+
if (Array.isArray(data.roles)) {
|
|
433
|
+
const rolesFromTemplate = data.roles.map((r) => ({
|
|
434
|
+
...r,
|
|
435
|
+
role: String(r.role ?? 'developer'),
|
|
436
|
+
label: String(r.label ?? r.role ?? 'Member'),
|
|
437
|
+
defaultName: String(r.defaultName ?? humanizeRoleId(String(r.role ?? 'member'))),
|
|
438
|
+
count: typeof r.count === 'number' ? r.count : 1,
|
|
439
|
+
hierarchyLevel: typeof r.hierarchyLevel === 'number' ? r.hierarchyLevel : 2,
|
|
440
|
+
canDelegate: r.canDelegate === true,
|
|
441
|
+
defaultSkills: Array.isArray(r.defaultSkills) ? r.defaultSkills : [],
|
|
442
|
+
}));
|
|
443
|
+
const rolesTemplate = {
|
|
444
|
+
id,
|
|
445
|
+
name: data.name,
|
|
446
|
+
description: data.description ?? '',
|
|
447
|
+
category: data.category ?? 'custom',
|
|
448
|
+
version: data.version ?? '0.1.0',
|
|
449
|
+
hierarchical: typeof data.hierarchical === 'boolean'
|
|
450
|
+
? data.hierarchical
|
|
451
|
+
: rolesFromTemplate.some((r) => r.canDelegate),
|
|
452
|
+
roles: rolesFromTemplate,
|
|
453
|
+
defaultRuntime: data.defaultRuntime ?? 'claude-code',
|
|
454
|
+
verificationPipeline: data.verificationPipeline ?? defaultPipeline,
|
|
455
|
+
...(typeof data.requiredTier === 'string' ? { requiredTier: data.requiredTier } : {}),
|
|
456
|
+
...(Array.isArray(data.tags) ? { tags: data.tags } : {}),
|
|
457
|
+
...(isValidTemplateOnboarding(data.onboarding) ? { onboarding: data.onboarding } : {}),
|
|
458
|
+
};
|
|
459
|
+
this.templates.set(id, rolesTemplate);
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
// Legacy members[] format (e.g. web-dev-team.json): convert members→roles.
|
|
463
|
+
if (!Array.isArray(data.members))
|
|
464
|
+
return;
|
|
465
|
+
const roles = data.members.map((m, i) => ({
|
|
466
|
+
role: m.role ?? 'developer',
|
|
467
|
+
label: m.name ?? `Member ${i + 1}`,
|
|
468
|
+
defaultName: m.name ?? `Member ${i + 1}`,
|
|
469
|
+
count: 1,
|
|
470
|
+
hierarchyLevel: 2,
|
|
471
|
+
canDelegate: false,
|
|
472
|
+
defaultSkills: [],
|
|
473
|
+
promptAdditions: m.systemPrompt,
|
|
474
|
+
}));
|
|
475
|
+
const template = {
|
|
476
|
+
id,
|
|
477
|
+
name: data.name,
|
|
478
|
+
description: data.description ?? '',
|
|
479
|
+
category: 'custom',
|
|
480
|
+
version: '0.1.0',
|
|
481
|
+
hierarchical: false,
|
|
482
|
+
roles,
|
|
483
|
+
defaultRuntime: 'claude-code',
|
|
484
|
+
verificationPipeline: {
|
|
485
|
+
name: 'Manual Review',
|
|
486
|
+
steps: [{
|
|
487
|
+
id: 'manual',
|
|
488
|
+
name: 'Manual Review',
|
|
489
|
+
description: 'Team leader reviews output manually',
|
|
490
|
+
method: 'manual_review',
|
|
491
|
+
critical: true,
|
|
492
|
+
config: {},
|
|
493
|
+
}],
|
|
494
|
+
passPolicy: 'all',
|
|
495
|
+
maxRetries: 1,
|
|
496
|
+
},
|
|
497
|
+
...(isValidTemplateOnboarding(data.onboarding) ? { onboarding: data.onboarding } : {}),
|
|
498
|
+
};
|
|
499
|
+
this.templates.set(id, template);
|
|
500
|
+
}
|
|
501
|
+
catch (error) {
|
|
502
|
+
logger.warn('Skipped invalid legacy template', { fileName, filePath, error: error instanceof Error ? error.message : String(error) });
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
//# sourceMappingURL=template.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/template/template.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -131,6 +131,34 @@ export interface TemplateRole {
|
|
|
131
131
|
/** Risk policy ID — loads config/risk-policies/{riskPolicy}.policy.md into the role's prompt */
|
|
132
132
|
riskPolicy?: string;
|
|
133
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* Marks a template as a first-run starter (specs/onboarding-harness-login.md,
|
|
136
|
+
* Phase 3). Only free, members-only templates in `config/templates/` carry it.
|
|
137
|
+
*/
|
|
138
|
+
export interface TemplateOnboarding {
|
|
139
|
+
/** Position in the starter list (lower first) */
|
|
140
|
+
order: number;
|
|
141
|
+
/** The default starter (exactly one template sets this) */
|
|
142
|
+
recommended: boolean;
|
|
143
|
+
/** Short Chinese display name, e.g. 个人助理 */
|
|
144
|
+
label: string;
|
|
145
|
+
/** One-line pitch shown under the label */
|
|
146
|
+
tagline: string;
|
|
147
|
+
/** Example first tasks shown under the "派第一件事" box */
|
|
148
|
+
suggestions: string[];
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if a value is valid onboarding starter metadata.
|
|
152
|
+
*
|
|
153
|
+
* @param value - Value to check
|
|
154
|
+
* @returns True when every field has the right type
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```ts
|
|
158
|
+
* if (isValidTemplateOnboarding(raw.onboarding)) starters.push(raw);
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export declare function isValidTemplateOnboarding(value: unknown): value is TemplateOnboarding;
|
|
134
162
|
/**
|
|
135
163
|
* A complete team recipe: roles, skills, hierarchy, and verification pipeline.
|
|
136
164
|
*/
|
|
@@ -176,6 +204,8 @@ export interface TeamTemplate {
|
|
|
176
204
|
serviceContract?: ServiceContract;
|
|
177
205
|
/** Team mission statement */
|
|
178
206
|
mission?: string;
|
|
207
|
+
/** Set when this template is a first-run starter (Phase 3 onboarding) */
|
|
208
|
+
onboarding?: TemplateOnboarding;
|
|
179
209
|
}
|
|
180
210
|
/**
|
|
181
211
|
* Check if a value is a valid TemplateCategory.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-template.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/team-template.types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"team-template.types.d.ts","sourceRoot":"","sources":["../../../../../backend/src/types/team-template.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,30 @@ export const VERIFICATION_METHODS = [
|
|
|
28
28
|
'manual_review',
|
|
29
29
|
'custom_script',
|
|
30
30
|
];
|
|
31
|
+
/**
|
|
32
|
+
* Check if a value is valid onboarding starter metadata.
|
|
33
|
+
*
|
|
34
|
+
* @param value - Value to check
|
|
35
|
+
* @returns True when every field has the right type
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```ts
|
|
39
|
+
* if (isValidTemplateOnboarding(raw.onboarding)) starters.push(raw);
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export function isValidTemplateOnboarding(value) {
|
|
43
|
+
if (!value || typeof value !== 'object')
|
|
44
|
+
return false;
|
|
45
|
+
const o = value;
|
|
46
|
+
return (typeof o.order === 'number' &&
|
|
47
|
+
Number.isFinite(o.order) &&
|
|
48
|
+
typeof o.recommended === 'boolean' &&
|
|
49
|
+
typeof o.label === 'string' &&
|
|
50
|
+
o.label.trim().length > 0 &&
|
|
51
|
+
typeof o.tagline === 'string' &&
|
|
52
|
+
Array.isArray(o.suggestions) &&
|
|
53
|
+
o.suggestions.every((s) => typeof s === 'string' && s.trim().length > 0));
|
|
54
|
+
}
|
|
31
55
|
// =============================================================================
|
|
32
56
|
// Validators
|
|
33
57
|
// =============================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-template.types.js","sourceRoot":"","sources":["../../../../../backend/src/types/team-template.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,MAAM,CAAC,MAAM,mBAAmB,GAAuB;IACrD,aAAa;IACb,SAAS;IACT,UAAU;IACV,YAAY;IACZ,QAAQ;CACT,CAAC;AAwBF,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD,eAAe;IACf,UAAU;IACV,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,eAAe;IACf,eAAe;IACf,YAAY;IACZ,eAAe;IACf,eAAe;IACf,eAAe;IACf,eAAe;CAChB,CAAC;
|
|
1
|
+
{"version":3,"file":"team-template.types.js","sourceRoot":"","sources":["../../../../../backend/src/types/team-template.types.ts"],"names":[],"mappings":"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"}
|