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.
Files changed (99) hide show
  1. package/config/templates/growth-marketing-team.json +12 -1
  2. package/config/templates/personal-assistant-team.json +28 -0
  3. package/dist/backend/backend/src/constants.d.ts +45 -0
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +51 -0
  6. package/dist/backend/backend/src/constants.js.map +1 -1
  7. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +49 -0
  8. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/chat/chat.controller.js +135 -106
  10. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  11. package/dist/backend/backend/src/controllers/onboarding/index.d.ts +1 -0
  12. package/dist/backend/backend/src/controllers/onboarding/index.d.ts.map +1 -1
  13. package/dist/backend/backend/src/controllers/onboarding/index.js +1 -0
  14. package/dist/backend/backend/src/controllers/onboarding/index.js.map +1 -1
  15. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts +38 -0
  16. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts.map +1 -0
  17. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js +106 -0
  18. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js.map +1 -0
  19. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts +24 -0
  20. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts.map +1 -0
  21. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js +34 -0
  22. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js.map +1 -0
  23. package/dist/backend/backend/src/index.d.ts.map +1 -1
  24. package/dist/backend/backend/src/index.js +17 -0
  25. package/dist/backend/backend/src/index.js.map +1 -1
  26. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  27. package/dist/backend/backend/src/routes/api.routes.js +5 -0
  28. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  29. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +10 -0
  31. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts +45 -0
  33. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -0
  34. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +103 -0
  35. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -0
  36. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
  37. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
  38. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
  39. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
  40. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
  41. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
  42. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js +122 -0
  43. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
  44. package/dist/backend/backend/src/services/template/template.service.d.ts +15 -1
  45. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/template/template.service.js +22 -1
  47. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  48. package/dist/backend/backend/src/types/team-template.types.d.ts +30 -0
  49. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  50. package/dist/backend/backend/src/types/team-template.types.js +24 -0
  51. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  52. package/dist/backend/build-info.json +2 -2
  53. package/dist/cli/backend/src/constants.d.ts +45 -0
  54. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  55. package/dist/cli/backend/src/constants.js +51 -0
  56. package/dist/cli/backend/src/constants.js.map +1 -1
  57. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
  58. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
  59. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
  60. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
  61. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
  62. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
  63. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js +122 -0
  64. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
  65. package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts +116 -0
  66. package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
  67. package/dist/cli/backend/src/services/skill/skill-tier.service.js +155 -0
  68. package/dist/cli/backend/src/services/skill/skill-tier.service.js.map +1 -0
  69. package/dist/cli/backend/src/services/template/template.service.d.ts +152 -0
  70. package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -0
  71. package/dist/cli/backend/src/services/template/template.service.js +506 -0
  72. package/dist/cli/backend/src/services/template/template.service.js.map +1 -0
  73. package/dist/cli/backend/src/types/team-template.types.d.ts +30 -0
  74. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  75. package/dist/cli/backend/src/types/team-template.types.js +24 -0
  76. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  77. package/dist/cli/cli/src/commands/onboard-checklist.d.ts +152 -0
  78. package/dist/cli/cli/src/commands/onboard-checklist.d.ts.map +1 -0
  79. package/dist/cli/cli/src/commands/onboard-checklist.js +241 -0
  80. package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -0
  81. package/dist/cli/cli/src/commands/onboard.d.ts +87 -6
  82. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  83. package/dist/cli/cli/src/commands/onboard.js +203 -37
  84. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  85. package/dist/cli/cli/src/constants.d.ts +5 -0
  86. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  87. package/dist/cli/cli/src/constants.js +5 -0
  88. package/dist/cli/cli/src/constants.js.map +1 -1
  89. package/dist/cli/cli/src/index.js +2 -1
  90. package/dist/cli/cli/src/index.js.map +1 -1
  91. package/dist/cli/cli/src/utils/templates.d.ts +27 -0
  92. package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
  93. package/dist/cli/cli/src/utils/templates.js +29 -0
  94. package/dist/cli/cli/src/utils/templates.js.map +1 -1
  95. package/frontend/dist/assets/index-2bdb57b9.css +42 -0
  96. package/frontend/dist/assets/{index-aaf65055.js → index-5b98bf77.js} +285 -285
  97. package/frontend/dist/index.html +2 -2
  98. package/package.json +1 -1
  99. 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":"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"}
1
+ {"version":3,"file":"team-template.types.js","sourceRoot":"","sources":["../../../../../backend/src/types/team-template.types.ts"],"names":[],"mappings":"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"}