@kernhq/module-tracker 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/server/seeds/templates.d.ts +31 -0
- package/dist/server/seeds/templates.d.ts.map +1 -0
- package/dist/server/seeds/templates.js +332 -0
- package/dist/server/seeds/templates.js.map +1 -0
- package/dist/server/services/config.d.ts +29 -7
- package/dist/server/services/config.d.ts.map +1 -1
- package/dist/server/services/config.js +168 -93
- package/dist/server/services/config.js.map +1 -1
- package/dist/server/services/planning.d.ts.map +1 -1
- package/dist/server/services/planning.js +9 -0
- package/dist/server/services/planning.js.map +1 -1
- package/dist/server/services/projects.d.ts +8 -0
- package/dist/server/services/projects.d.ts.map +1 -1
- package/dist/server/services/projects.js +23 -3
- package/dist/server/services/projects.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type ProjectTemplateBody, ProjectTemplateId } from '../../contract/models.js';
|
|
2
|
+
export declare const SOFTWARE: ProjectTemplateBody;
|
|
3
|
+
export declare const SUPPORT: ProjectTemplateBody;
|
|
4
|
+
export declare const MARKETING: ProjectTemplateBody;
|
|
5
|
+
/** Deliberately bare: a list of things to do, and nothing to learn before you can use it. */
|
|
6
|
+
export declare const SIMPLE: ProjectTemplateBody;
|
|
7
|
+
/**
|
|
8
|
+
* `kanban` and `blank` are kept because projects were created from them before the four shapes
|
|
9
|
+
* existed. They map onto the nearest of the four rather than being maintained separately.
|
|
10
|
+
*/
|
|
11
|
+
export declare const PROJECT_TEMPLATES: Record<ProjectTemplateId, ProjectTemplateBody>;
|
|
12
|
+
export declare const projectTemplateBody: (id: string) => ProjectTemplateBody;
|
|
13
|
+
/** What a chooser shows: the four shapes, in the order a team is likely to want them. */
|
|
14
|
+
export declare const PROJECT_TEMPLATE_CHOICES: readonly [{
|
|
15
|
+
readonly id: "software";
|
|
16
|
+
readonly name: "Software";
|
|
17
|
+
readonly description: "Epics, stories, bugs, and a review step.";
|
|
18
|
+
}, {
|
|
19
|
+
readonly id: "support";
|
|
20
|
+
readonly name: "Support desk";
|
|
21
|
+
readonly description: "Tickets with a customer, an impact and a clock.";
|
|
22
|
+
}, {
|
|
23
|
+
readonly id: "marketing";
|
|
24
|
+
readonly name: "Marketing";
|
|
25
|
+
readonly description: "Campaigns, assets and requests, with a publish date.";
|
|
26
|
+
}, {
|
|
27
|
+
readonly id: "simple";
|
|
28
|
+
readonly name: "Simple task list";
|
|
29
|
+
readonly description: "Tasks. Nothing to learn first.";
|
|
30
|
+
}];
|
|
31
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../../src/server/seeds/templates.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAgDtF,eAAO,MAAM,QAAQ,EAAE,mBA4EtB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,mBAmGrB,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,mBA6EvB,CAAA;AAED,6FAA6F;AAC7F,eAAO,MAAM,MAAM,EAAE,mBAUpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,CAO5E,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,IAAI,MAAM,KAAG,mBACe,CAAA;AAEhE,yFAAyF;AACzF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;EAK3B,CAAA"}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
import { createWorkflowFromTemplate } from '@kernhq/workflow';
|
|
2
|
+
import { ProjectTemplateId } from '../../contract/models.js';
|
|
3
|
+
/**
|
|
4
|
+
* The project templates the tracker ships with.
|
|
5
|
+
*
|
|
6
|
+
* These are values, not database rows. A built-in used to be stored as a row with a null workspace,
|
|
7
|
+
* which `listTemplates` could never return because it filters by workspace — so the built-ins were
|
|
8
|
+
* unreachable by the very screen meant to offer them. In code they are also reviewable in a diff
|
|
9
|
+
* and typed by the same `ProjectTemplateBody` a saved snapshot produces, so one applier serves both.
|
|
10
|
+
*
|
|
11
|
+
* Each one answers a question about a team, not about software: what do they track, what do they
|
|
12
|
+
* need to record about it, and what does "done" mean for them.
|
|
13
|
+
*/
|
|
14
|
+
const workflow = (id, name) => ({
|
|
15
|
+
name,
|
|
16
|
+
definition: createWorkflowFromTemplate(id, { id, name }),
|
|
17
|
+
});
|
|
18
|
+
/** Points, because software teams estimate in relative size rather than hours. */
|
|
19
|
+
const storyPoints = {
|
|
20
|
+
key: 'story_points',
|
|
21
|
+
name: 'Story points',
|
|
22
|
+
type: 'number',
|
|
23
|
+
config: { min: 0, max: 100, precision: 0 },
|
|
24
|
+
showInCards: true,
|
|
25
|
+
};
|
|
26
|
+
const severity = {
|
|
27
|
+
key: 'severity',
|
|
28
|
+
name: 'Severity',
|
|
29
|
+
type: 'select',
|
|
30
|
+
description: 'How badly this hurts in production',
|
|
31
|
+
options: [
|
|
32
|
+
{ id: 's1', label: 'S1 — everything is down', color: '#A63D26', order: 0, archived: false },
|
|
33
|
+
{ id: 's2', label: 'S2 — a lot of people, no way round it', color: '#B4661C', order: 1, archived: false },
|
|
34
|
+
{
|
|
35
|
+
id: 's3',
|
|
36
|
+
label: 'S3 — annoying, there is a way round it',
|
|
37
|
+
color: '#B49A5F',
|
|
38
|
+
order: 2,
|
|
39
|
+
archived: false,
|
|
40
|
+
},
|
|
41
|
+
{ id: 's4', label: 'S4 — cosmetic', color: '#8E8779', order: 3, archived: false },
|
|
42
|
+
],
|
|
43
|
+
showInCards: true,
|
|
44
|
+
};
|
|
45
|
+
export const SOFTWARE = {
|
|
46
|
+
version: 1,
|
|
47
|
+
settings: { estimation: 'points', triage: { enabled: true } },
|
|
48
|
+
workflows: [workflow('software', 'Software')],
|
|
49
|
+
fields: [
|
|
50
|
+
storyPoints,
|
|
51
|
+
severity,
|
|
52
|
+
{
|
|
53
|
+
key: 'environment',
|
|
54
|
+
name: 'Environment',
|
|
55
|
+
type: 'select',
|
|
56
|
+
options: [
|
|
57
|
+
{ id: 'production', label: 'Production', color: null, order: 0, archived: false },
|
|
58
|
+
{ id: 'staging', label: 'Staging', color: null, order: 1, archived: false },
|
|
59
|
+
{ id: 'local', label: 'Local', color: null, order: 2, archived: false },
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
key: 'steps_to_reproduce',
|
|
64
|
+
name: 'Steps to reproduce',
|
|
65
|
+
type: 'textarea',
|
|
66
|
+
description: 'What you did, what you expected, what happened instead',
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
types: [
|
|
70
|
+
{ key: 'epic', name: 'Epic', level: 1, icon: 'zap', workflowIndex: 0 },
|
|
71
|
+
{
|
|
72
|
+
key: 'story',
|
|
73
|
+
name: 'Story',
|
|
74
|
+
level: 0,
|
|
75
|
+
icon: 'bookmark',
|
|
76
|
+
isDefault: true,
|
|
77
|
+
workflowIndex: 0,
|
|
78
|
+
fieldLayout: [
|
|
79
|
+
{ fieldId: 'cf.story_points', section: 'sidebar', order: 8, required: false, hidden: false },
|
|
80
|
+
// a story is not a defect, so the defect fields are not on it
|
|
81
|
+
{ fieldId: 'cf.severity', section: 'hidden', order: 30, required: false, hidden: true },
|
|
82
|
+
{ fieldId: 'cf.environment', section: 'hidden', order: 31, required: false, hidden: true },
|
|
83
|
+
{ fieldId: 'cf.steps_to_reproduce', section: 'hidden', order: 32, required: false, hidden: true },
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
{ key: 'task', name: 'Task', level: 0, icon: 'square-check-big', workflowIndex: 0 },
|
|
87
|
+
{
|
|
88
|
+
key: 'bug',
|
|
89
|
+
name: 'Bug',
|
|
90
|
+
level: 0,
|
|
91
|
+
icon: 'bug',
|
|
92
|
+
workflowIndex: 0,
|
|
93
|
+
fieldLayout: [
|
|
94
|
+
{ fieldId: 'cf.severity', section: 'sidebar', order: 1, required: true, hidden: false },
|
|
95
|
+
{ fieldId: 'cf.environment', section: 'sidebar', order: 2, required: false, hidden: false },
|
|
96
|
+
{ fieldId: 'cf.steps_to_reproduce', section: 'main', order: 2, required: false, hidden: false },
|
|
97
|
+
{ fieldId: 'cf.story_points', section: 'hidden', order: 30, required: false, hidden: true },
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
{ key: 'sub_task', name: 'Sub-task', level: -1, icon: 'git-branch', workflowIndex: 0 },
|
|
101
|
+
],
|
|
102
|
+
labels: [
|
|
103
|
+
{ name: 'regression', color: '#A63D26' },
|
|
104
|
+
{ name: 'good first issue', color: '#5ec269' },
|
|
105
|
+
{ name: 'needs design', color: '#a78bfa' },
|
|
106
|
+
],
|
|
107
|
+
views: [
|
|
108
|
+
{
|
|
109
|
+
name: 'My work',
|
|
110
|
+
kql: 'assignee = currentUser() and status != done',
|
|
111
|
+
layout: 'list',
|
|
112
|
+
visibility: 'project',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
name: 'Bugs by severity',
|
|
116
|
+
kql: 'type = bug and status != done',
|
|
117
|
+
layout: 'board',
|
|
118
|
+
visibility: 'project',
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
};
|
|
122
|
+
export const SUPPORT = {
|
|
123
|
+
version: 1,
|
|
124
|
+
// Support teams answer to a clock, so triage and service levels are on from the start.
|
|
125
|
+
settings: {
|
|
126
|
+
estimation: 'hours',
|
|
127
|
+
triage: { enabled: true },
|
|
128
|
+
// A support team answers to a clock, so service levels are on from the start — with goals a
|
|
129
|
+
// workspace fills in for itself, because nobody else can say what "soon" means to their
|
|
130
|
+
// customers.
|
|
131
|
+
sla: { enabled: true, goals: {}, pauseInCategories: [] },
|
|
132
|
+
},
|
|
133
|
+
workflows: [workflow('kanban', 'Support')],
|
|
134
|
+
fields: [
|
|
135
|
+
{
|
|
136
|
+
key: 'customer',
|
|
137
|
+
name: 'Customer',
|
|
138
|
+
type: 'text',
|
|
139
|
+
config: { maxLength: 120 },
|
|
140
|
+
searchable: true,
|
|
141
|
+
showInCards: true,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
key: 'channel',
|
|
145
|
+
name: 'Came in by',
|
|
146
|
+
type: 'select',
|
|
147
|
+
options: [
|
|
148
|
+
{ id: 'email', label: 'Email', color: null, order: 0, archived: false },
|
|
149
|
+
{ id: 'portal', label: 'Portal', color: null, order: 1, archived: false },
|
|
150
|
+
{ id: 'chat', label: 'Chat', color: null, order: 2, archived: false },
|
|
151
|
+
{ id: 'phone', label: 'Phone', color: null, order: 3, archived: false },
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
key: 'impact',
|
|
156
|
+
name: 'Impact',
|
|
157
|
+
type: 'select',
|
|
158
|
+
required: true,
|
|
159
|
+
options: [
|
|
160
|
+
{ id: 'blocked', label: 'Cannot work at all', color: '#A63D26', order: 0, archived: false },
|
|
161
|
+
{ id: 'degraded', label: 'Working, but badly', color: '#B4661C', order: 1, archived: false },
|
|
162
|
+
{ id: 'question', label: 'A question', color: '#8E8779', order: 2, archived: false },
|
|
163
|
+
],
|
|
164
|
+
showInCards: true,
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
key: 'csat',
|
|
168
|
+
name: 'Satisfaction',
|
|
169
|
+
type: 'number',
|
|
170
|
+
description: 'What the customer said afterwards, 1 to 5',
|
|
171
|
+
config: { min: 1, max: 5, precision: 0 },
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
types: [
|
|
175
|
+
{
|
|
176
|
+
key: 'ticket',
|
|
177
|
+
name: 'Ticket',
|
|
178
|
+
level: 0,
|
|
179
|
+
icon: 'inbox',
|
|
180
|
+
isDefault: true,
|
|
181
|
+
workflowIndex: 0,
|
|
182
|
+
fieldLayout: [
|
|
183
|
+
{ fieldId: 'cf.customer', section: 'sidebar', order: 1, required: false, hidden: false },
|
|
184
|
+
{ fieldId: 'cf.impact', section: 'sidebar', order: 2, required: true, hidden: false },
|
|
185
|
+
{ fieldId: 'cf.channel', section: 'sidebar', order: 3, required: false, hidden: false },
|
|
186
|
+
{ fieldId: 'cf.csat', section: 'sidebar', order: 20, required: false, hidden: false },
|
|
187
|
+
// a ticket is a conversation with one customer, not a unit of estimated work
|
|
188
|
+
{ fieldId: 'estimate', section: 'hidden', order: 30, required: false, hidden: true },
|
|
189
|
+
{ fieldId: 'cycle', section: 'hidden', order: 31, required: false, hidden: true },
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
key: 'problem',
|
|
194
|
+
name: 'Problem',
|
|
195
|
+
level: 1,
|
|
196
|
+
icon: 'circle-alert',
|
|
197
|
+
workflowIndex: 0,
|
|
198
|
+
// the underlying cause behind several tickets: no single customer, no satisfaction score
|
|
199
|
+
fieldLayout: [
|
|
200
|
+
{ fieldId: 'cf.customer', section: 'hidden', order: 30, required: false, hidden: true },
|
|
201
|
+
{ fieldId: 'cf.csat', section: 'hidden', order: 31, required: false, hidden: true },
|
|
202
|
+
{ fieldId: 'cf.impact', section: 'sidebar', order: 2, required: false, hidden: false },
|
|
203
|
+
],
|
|
204
|
+
},
|
|
205
|
+
{ key: 'task', name: 'Task', level: 0, icon: 'square-check-big', workflowIndex: 0 },
|
|
206
|
+
],
|
|
207
|
+
labels: [
|
|
208
|
+
{ name: 'billing', color: '#5ec269' },
|
|
209
|
+
{ name: 'bug report', color: '#A63D26' },
|
|
210
|
+
{ name: 'how do I', color: '#6e7f9a' },
|
|
211
|
+
],
|
|
212
|
+
views: [
|
|
213
|
+
{
|
|
214
|
+
name: 'Waiting on us',
|
|
215
|
+
kql: 'status != done and assignee = currentUser()',
|
|
216
|
+
layout: 'list',
|
|
217
|
+
visibility: 'project',
|
|
218
|
+
},
|
|
219
|
+
{ name: 'By impact', kql: 'status != done', layout: 'board', visibility: 'project' },
|
|
220
|
+
],
|
|
221
|
+
};
|
|
222
|
+
export const MARKETING = {
|
|
223
|
+
version: 1,
|
|
224
|
+
settings: { estimation: 'none' },
|
|
225
|
+
workflows: [workflow('kanban', 'Marketing')],
|
|
226
|
+
fields: [
|
|
227
|
+
{
|
|
228
|
+
key: 'channel',
|
|
229
|
+
name: 'Channel',
|
|
230
|
+
type: 'multiselect',
|
|
231
|
+
options: [
|
|
232
|
+
{ id: 'blog', label: 'Blog', color: null, order: 0, archived: false },
|
|
233
|
+
{ id: 'email', label: 'Email', color: null, order: 1, archived: false },
|
|
234
|
+
{ id: 'social', label: 'Social', color: null, order: 2, archived: false },
|
|
235
|
+
{ id: 'event', label: 'Event', color: null, order: 3, archived: false },
|
|
236
|
+
{ id: 'paid', label: 'Paid', color: null, order: 4, archived: false },
|
|
237
|
+
],
|
|
238
|
+
showInCards: true,
|
|
239
|
+
},
|
|
240
|
+
{ key: 'audience', name: 'Audience', type: 'text', config: { maxLength: 120 } },
|
|
241
|
+
{ key: 'publish_date', name: 'Publish on', type: 'date', showInCards: true },
|
|
242
|
+
{
|
|
243
|
+
key: 'brand_approved',
|
|
244
|
+
name: 'Brand approved',
|
|
245
|
+
type: 'checkbox',
|
|
246
|
+
description: 'Signed off by whoever owns the brand',
|
|
247
|
+
},
|
|
248
|
+
{ key: 'asset_link', name: 'Asset', type: 'url', description: 'Where the artwork or copy lives' },
|
|
249
|
+
],
|
|
250
|
+
types: [
|
|
251
|
+
{
|
|
252
|
+
key: 'campaign',
|
|
253
|
+
name: 'Campaign',
|
|
254
|
+
level: 1,
|
|
255
|
+
icon: 'zap',
|
|
256
|
+
workflowIndex: 0,
|
|
257
|
+
fieldLayout: [
|
|
258
|
+
{ fieldId: 'cf.channel', section: 'sidebar', order: 1, required: false, hidden: false },
|
|
259
|
+
{ fieldId: 'cf.audience', section: 'sidebar', order: 2, required: false, hidden: false },
|
|
260
|
+
{ fieldId: 'cf.publish_date', section: 'sidebar', order: 3, required: false, hidden: false },
|
|
261
|
+
{ fieldId: 'cf.asset_link', section: 'hidden', order: 30, required: false, hidden: true },
|
|
262
|
+
],
|
|
263
|
+
},
|
|
264
|
+
{
|
|
265
|
+
key: 'asset',
|
|
266
|
+
name: 'Asset',
|
|
267
|
+
level: 0,
|
|
268
|
+
icon: 'bookmark',
|
|
269
|
+
isDefault: true,
|
|
270
|
+
workflowIndex: 0,
|
|
271
|
+
fieldLayout: [
|
|
272
|
+
{ fieldId: 'cf.asset_link', section: 'sidebar', order: 1, required: false, hidden: false },
|
|
273
|
+
{ fieldId: 'cf.brand_approved', section: 'sidebar', order: 2, required: false, hidden: false },
|
|
274
|
+
{ fieldId: 'cf.publish_date', section: 'sidebar', order: 3, required: false, hidden: false },
|
|
275
|
+
{ fieldId: 'cf.channel', section: 'sidebar', order: 4, required: false, hidden: false },
|
|
276
|
+
],
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
key: 'request',
|
|
280
|
+
name: 'Request',
|
|
281
|
+
level: 0,
|
|
282
|
+
icon: 'inbox',
|
|
283
|
+
workflowIndex: 0,
|
|
284
|
+
fieldLayout: [
|
|
285
|
+
{ fieldId: 'cf.audience', section: 'sidebar', order: 1, required: false, hidden: false },
|
|
286
|
+
{ fieldId: 'cf.brand_approved', section: 'hidden', order: 30, required: false, hidden: true },
|
|
287
|
+
],
|
|
288
|
+
},
|
|
289
|
+
],
|
|
290
|
+
labels: [
|
|
291
|
+
{ name: 'launch', color: '#A63D26' },
|
|
292
|
+
{ name: 'evergreen', color: '#5ec269' },
|
|
293
|
+
{ name: 'needs copy', color: '#a78bfa' },
|
|
294
|
+
],
|
|
295
|
+
views: [
|
|
296
|
+
{ name: 'Publishing soon', kql: 'status != done', layout: 'list', visibility: 'project' },
|
|
297
|
+
{ name: 'By stage', kql: 'status != done', layout: 'board', visibility: 'project' },
|
|
298
|
+
],
|
|
299
|
+
};
|
|
300
|
+
/** Deliberately bare: a list of things to do, and nothing to learn before you can use it. */
|
|
301
|
+
export const SIMPLE = {
|
|
302
|
+
version: 1,
|
|
303
|
+
settings: { estimation: 'none' },
|
|
304
|
+
workflows: [workflow('simple', 'Simple')],
|
|
305
|
+
fields: [],
|
|
306
|
+
types: [
|
|
307
|
+
{ key: 'task', name: 'Task', level: 0, icon: 'square-check-big', isDefault: true, workflowIndex: 0 },
|
|
308
|
+
],
|
|
309
|
+
labels: [],
|
|
310
|
+
views: [{ name: 'Everything', kql: '', layout: 'list', visibility: 'project' }],
|
|
311
|
+
};
|
|
312
|
+
/**
|
|
313
|
+
* `kanban` and `blank` are kept because projects were created from them before the four shapes
|
|
314
|
+
* existed. They map onto the nearest of the four rather than being maintained separately.
|
|
315
|
+
*/
|
|
316
|
+
export const PROJECT_TEMPLATES = {
|
|
317
|
+
software: SOFTWARE,
|
|
318
|
+
support: SUPPORT,
|
|
319
|
+
marketing: MARKETING,
|
|
320
|
+
simple: SIMPLE,
|
|
321
|
+
kanban: { ...SIMPLE, workflows: [workflow('kanban', 'Kanban')] },
|
|
322
|
+
blank: SIMPLE,
|
|
323
|
+
};
|
|
324
|
+
export const projectTemplateBody = (id) => PROJECT_TEMPLATES[ProjectTemplateId.catch('simple').parse(id)];
|
|
325
|
+
/** What a chooser shows: the four shapes, in the order a team is likely to want them. */
|
|
326
|
+
export const PROJECT_TEMPLATE_CHOICES = [
|
|
327
|
+
{ id: 'software', name: 'Software', description: 'Epics, stories, bugs, and a review step.' },
|
|
328
|
+
{ id: 'support', name: 'Support desk', description: 'Tickets with a customer, an impact and a clock.' },
|
|
329
|
+
{ id: 'marketing', name: 'Marketing', description: 'Campaigns, assets and requests, with a publish date.' },
|
|
330
|
+
{ id: 'simple', name: 'Simple task list', description: 'Tasks. Nothing to learn first.' },
|
|
331
|
+
];
|
|
332
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../src/server/seeds/templates.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import type { Principal } from '@kernhq/contracts';
|
|
|
2
2
|
import { type Kernel, type Tx } from '@kernhq/kernel';
|
|
3
3
|
import { type WorkflowDefinition } from '@kernhq/workflow';
|
|
4
4
|
import type { z } from 'zod';
|
|
5
|
-
import { type FieldDef, HierarchyRules, type StatusInfo, type TypeScheme, type UpsertFieldDef, type UpsertWorkflow, type UpsertWorkflowScheme as UpsertWorkflowSchemeSchema, type UpsertWorkItemType, type Workflow, type WorkflowScheme, type WorkItemType } from '../../contract/models.js';
|
|
5
|
+
import { type FieldDef, HierarchyRules, ProjectTemplateBody, type StatusInfo, type TypeScheme, type UpsertFieldDef, type UpsertWorkflow, type UpsertWorkflowScheme as UpsertWorkflowSchemeSchema, type UpsertWorkItemType, type Workflow, type WorkflowScheme, type WorkItemType } from '../../contract/models.js';
|
|
6
6
|
import type { AccessService } from './access.js';
|
|
7
7
|
import { type FieldDefRow, type ProjectRow, type WorkflowRow, type WorkItemTypeRow } from './db.js';
|
|
8
8
|
import type { NotifyService } from './notify.js';
|
|
@@ -98,19 +98,41 @@ export declare class ConfigService {
|
|
|
98
98
|
}>;
|
|
99
99
|
/** Every status of every workflow the project can use, deduplicated for board columns and KQL. */
|
|
100
100
|
statusesForProject(tx: Tx, workspaceId: string, projectId?: string): Promise<StatusInfo[]>;
|
|
101
|
-
/**
|
|
101
|
+
/**
|
|
102
|
+
* Create the workflow, fields and types a brand-new project starts with.
|
|
103
|
+
*
|
|
104
|
+
* A built-in template is a `ProjectTemplateBody` in `seeds/templates.ts`, so this is the applier
|
|
105
|
+
* with a body chosen by name. There used to be a second seeding path here — a table of type
|
|
106
|
+
* names and a workflow id — which meant "create from Software" and "create from a saved
|
|
107
|
+
* template" produced projects that were configured differently for no reason anyone chose.
|
|
108
|
+
*/
|
|
102
109
|
seedProject(tx: Tx, workspaceId: string, projectId: string, template: string): Promise<{
|
|
103
110
|
workflowId: string;
|
|
104
|
-
typeIds: string[];
|
|
105
111
|
defaultTypeId: string;
|
|
106
112
|
}>;
|
|
107
|
-
/**
|
|
108
|
-
|
|
113
|
+
/**
|
|
114
|
+
* Apply a template body to a fresh project: workflows, fields, types and their layouts.
|
|
115
|
+
*
|
|
116
|
+
* This is the only applier. A built-in template is a value of the same shape as a snapshot taken
|
|
117
|
+
* from an existing project, so "create from Software" and "create from the template we saved
|
|
118
|
+
* last week" walk exactly the same code — there is no second path to drift.
|
|
119
|
+
*
|
|
120
|
+
* Ids inside a body are template-local: workflows are named by index, and a type's layout names
|
|
121
|
+
* fields by `cf.<key>`. That is what lets a body written in one workspace apply in another.
|
|
122
|
+
*/
|
|
123
|
+
applyProjectTemplateBody(tx: Tx, workspaceId: string, projectId: string, input: unknown): Promise<{
|
|
109
124
|
workflowId: string;
|
|
110
125
|
defaultTypeId: string;
|
|
111
126
|
} | null>;
|
|
112
|
-
/**
|
|
113
|
-
|
|
127
|
+
/**
|
|
128
|
+
* A project's configuration as a template body, ready to create another project from.
|
|
129
|
+
*
|
|
130
|
+
* It emits everything the applier reads, and the round trip is a test: create from a built-in,
|
|
131
|
+
* snapshot it, create again from the snapshot, and the resolved layouts match. Until now this
|
|
132
|
+
* emitted fields the applier ignored and dropped layouts, labels and views entirely — so a
|
|
133
|
+
* template saved from a carefully configured project produced a project configured differently.
|
|
134
|
+
*/
|
|
135
|
+
snapshotProject(tx: Tx, workspaceId: string, projectId: string): Promise<ProjectTemplateBody>;
|
|
114
136
|
/** Ensure a set of type ids all belong to this workspace (scheme validation). */
|
|
115
137
|
assertTypesExist(tx: Tx, workspaceId: string, ids: string[]): Promise<void>;
|
|
116
138
|
/** Permission gate shared by every configuration mutation. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/server/services/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAa,KAAK,MAAM,EAAE,KAAK,EAAE,EAAU,MAAM,gBAAgB,CAAA;AACxE,OAAO,EAML,KAAK,kBAAkB,EAGxB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,EACL,KAAK,QAAQ,EACb,cAAc,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,oBAAoB,IAAI,0BAA0B,EACvD,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/server/services/config.ts"],"names":[],"mappings":"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"}
|