perttool 0.1.0-alpha.2 → 0.2.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/CHANGELOG.md +78 -28
- package/README.md +173 -95
- package/dist/application/agent-help.d.ts +3 -0
- package/dist/application/agent-help.d.ts.map +1 -0
- package/dist/application/agent-help.js +5 -0
- package/dist/application/agent-help.js.map +1 -0
- package/dist/application/analyze.js +5 -5
- package/dist/application/analyze.js.map +1 -1
- package/dist/application/init.d.ts +42 -0
- package/dist/application/init.d.ts.map +1 -0
- package/dist/application/init.js +217 -0
- package/dist/application/init.js.map +1 -0
- package/dist/application/mutate.d.ts.map +1 -1
- package/dist/application/mutate.js +28 -15
- package/dist/application/mutate.js.map +1 -1
- package/dist/application/project.d.ts +25 -0
- package/dist/application/project.d.ts.map +1 -0
- package/dist/application/project.js +54 -0
- package/dist/application/project.js.map +1 -0
- package/dist/cli.js +419 -331
- package/dist/cli.js.map +1 -1
- package/dist/command/discovery.d.ts +30 -0
- package/dist/command/discovery.d.ts.map +1 -0
- package/dist/command/discovery.js +625 -0
- package/dist/command/discovery.js.map +1 -0
- package/dist/command/registry.d.ts +84 -0
- package/dist/command/registry.d.ts.map +1 -0
- package/dist/command/registry.js +951 -0
- package/dist/command/registry.js.map +1 -0
- package/dist/command/usage.d.ts +42 -0
- package/dist/command/usage.d.ts.map +1 -0
- package/dist/command/usage.js +337 -0
- package/dist/command/usage.js.map +1 -0
- package/dist/conversion/mermaid-import.js +56 -56
- package/dist/conversion/mermaid-import.js.map +1 -1
- package/dist/conversion/mermaid.js +1 -1
- package/dist/conversion/mermaid.js.map +1 -1
- package/dist/guidance/profile.d.ts +6 -0
- package/dist/guidance/profile.d.ts.map +1 -0
- package/dist/guidance/profile.js +1158 -0
- package/dist/guidance/profile.js.map +1 -0
- package/dist/guidance/projection.d.ts +16 -0
- package/dist/guidance/projection.d.ts.map +1 -0
- package/dist/guidance/projection.js +276 -0
- package/dist/guidance/projection.js.map +1 -0
- package/dist/guidance/query.d.ts +4 -0
- package/dist/guidance/query.d.ts.map +1 -0
- package/dist/guidance/query.js +178 -0
- package/dist/guidance/query.js.map +1 -0
- package/dist/guidance/text.d.ts +4 -0
- package/dist/guidance/text.d.ts.map +1 -0
- package/dist/guidance/text.js +118 -0
- package/dist/guidance/text.js.map +1 -0
- package/dist/guidance/types.d.ts +227 -0
- package/dist/guidance/types.d.ts.map +1 -0
- package/dist/guidance/types.js +54 -0
- package/dist/guidance/types.js.map +1 -0
- package/dist/guidance/validator.d.ts +8 -0
- package/dist/guidance/validator.d.ts.map +1 -0
- package/dist/guidance/validator.js +383 -0
- package/dist/guidance/validator.js.map +1 -0
- package/dist/help/guide.d.ts +12 -0
- package/dist/help/guide.d.ts.map +1 -0
- package/dist/help/guide.js +103 -0
- package/dist/help/guide.js.map +1 -0
- package/dist/help/registry.d.ts.map +1 -1
- package/dist/help/registry.js +76 -67
- package/dist/help/registry.js.map +1 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/io/safe-write.js +17 -17
- package/dist/io/safe-write.js.map +1 -1
- package/dist/mutation/gate.d.ts +5 -0
- package/dist/mutation/gate.d.ts.map +1 -0
- package/dist/mutation/gate.js +156 -0
- package/dist/mutation/gate.js.map +1 -0
- package/dist/mutation/milestone.js +26 -26
- package/dist/mutation/milestone.js.map +1 -1
- package/dist/mutation/project.d.ts +5 -0
- package/dist/mutation/project.d.ts.map +1 -0
- package/dist/mutation/project.js +148 -0
- package/dist/mutation/project.js.map +1 -0
- package/dist/mutation/resource.js +22 -22
- package/dist/mutation/resource.js.map +1 -1
- package/dist/mutation/task.js +40 -40
- package/dist/mutation/task.js.map +1 -1
- package/dist/mutation/types.d.ts +46 -1
- package/dist/mutation/types.d.ts.map +1 -1
- package/dist/parser/document-parser.js +17 -17
- package/dist/parser/document-parser.js.map +1 -1
- package/dist/semantic/validator.js +41 -41
- package/dist/semantic/validator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/mutation/project.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAExE,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,KAAK,EAGV,kBAAkB,EACnB,MAAM,YAAY,CAAC;AA4IpB,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,kBAAkB,GAC3B,gBAAgB,CASlB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { EntityEditor } from "./entity-editor.js";
|
|
2
|
+
import { mutationDiagnostic } from "./diagnostics.js";
|
|
3
|
+
const fieldOrder = [
|
|
4
|
+
"version",
|
|
5
|
+
"title",
|
|
6
|
+
"description",
|
|
7
|
+
"as_of",
|
|
8
|
+
"duration_unit",
|
|
9
|
+
"velocity",
|
|
10
|
+
"finish",
|
|
11
|
+
"critical_epsilon",
|
|
12
|
+
"target_duration",
|
|
13
|
+
];
|
|
14
|
+
const clearableFields = new Set([
|
|
15
|
+
"description",
|
|
16
|
+
"as_of",
|
|
17
|
+
"velocity",
|
|
18
|
+
"critical_epsilon",
|
|
19
|
+
"target_duration",
|
|
20
|
+
]);
|
|
21
|
+
function requestError(value) {
|
|
22
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
23
|
+
return "project mutation request is not an object";
|
|
24
|
+
}
|
|
25
|
+
const request = value;
|
|
26
|
+
if (request["kind"] !== "project.set")
|
|
27
|
+
return "project mutation kind is unsupported";
|
|
28
|
+
if (Object.keys(request).some((name) => !["kind", "set", "clear"].includes(name))) {
|
|
29
|
+
return "project.set request contains unsupported fields";
|
|
30
|
+
}
|
|
31
|
+
const rawSet = request["set"];
|
|
32
|
+
const rawClear = request["clear"];
|
|
33
|
+
if (rawSet !== undefined &&
|
|
34
|
+
(rawSet === null || typeof rawSet !== "object" || Array.isArray(rawSet))) {
|
|
35
|
+
return "project set is not an object";
|
|
36
|
+
}
|
|
37
|
+
if (rawClear !== undefined && !Array.isArray(rawClear))
|
|
38
|
+
return "clear is not an array";
|
|
39
|
+
const set = (rawSet ?? {});
|
|
40
|
+
const clear = (rawClear ?? []);
|
|
41
|
+
const setEntries = Object.entries(set).filter(([, item]) => item !== undefined);
|
|
42
|
+
if (setEntries.length === 0 && clear.length === 0) {
|
|
43
|
+
return "project.set requires at least one change specification";
|
|
44
|
+
}
|
|
45
|
+
const setFields = new Set([
|
|
46
|
+
"id",
|
|
47
|
+
"version",
|
|
48
|
+
"title",
|
|
49
|
+
"description",
|
|
50
|
+
"asOf",
|
|
51
|
+
"durationUnit",
|
|
52
|
+
"velocity",
|
|
53
|
+
"finish",
|
|
54
|
+
"criticalEpsilon",
|
|
55
|
+
"targetDuration",
|
|
56
|
+
]);
|
|
57
|
+
if (Object.keys(set).some((name) => !setFields.has(name))) {
|
|
58
|
+
return "project set contains unsupported fields";
|
|
59
|
+
}
|
|
60
|
+
for (const name of [
|
|
61
|
+
"id",
|
|
62
|
+
"title",
|
|
63
|
+
"description",
|
|
64
|
+
"asOf",
|
|
65
|
+
"velocity",
|
|
66
|
+
"finish",
|
|
67
|
+
"criticalEpsilon",
|
|
68
|
+
"targetDuration",
|
|
69
|
+
]) {
|
|
70
|
+
if (set[name] !== undefined && typeof set[name] !== "string") {
|
|
71
|
+
return `${name} is not a string`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (set.version !== undefined && !Number.isSafeInteger(set.version)) {
|
|
75
|
+
return "version is not a safe integer";
|
|
76
|
+
}
|
|
77
|
+
if (set.durationUnit !== undefined &&
|
|
78
|
+
!new Set(["day", "hour", "point"]).has(set.durationUnit)) {
|
|
79
|
+
return "durationUnit must be day, hour, or point";
|
|
80
|
+
}
|
|
81
|
+
if (clear.some((name) => typeof name !== "string" || !clearableFields.has(name))) {
|
|
82
|
+
return "clear contains unsupported fields";
|
|
83
|
+
}
|
|
84
|
+
if (new Set(clear).size !== clear.length)
|
|
85
|
+
return "clear contains duplicate fields";
|
|
86
|
+
const conflicts = [
|
|
87
|
+
["description", "description"],
|
|
88
|
+
["asOf", "as_of"],
|
|
89
|
+
["velocity", "velocity"],
|
|
90
|
+
["criticalEpsilon", "critical_epsilon"],
|
|
91
|
+
["targetDuration", "target_duration"],
|
|
92
|
+
];
|
|
93
|
+
for (const [setName, clearName] of conflicts) {
|
|
94
|
+
if (set[setName] !== undefined && clear.includes(clearName)) {
|
|
95
|
+
return `${clearName} cannot be specified in both set and clear`;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
function planSet(text, declaration, mutation) {
|
|
101
|
+
const error = requestError(mutation);
|
|
102
|
+
if (error !== undefined) {
|
|
103
|
+
return { edits: [], diagnostic: mutationDiagnostic("PTMUT-301", error, declaration) };
|
|
104
|
+
}
|
|
105
|
+
const editor = new EntityEditor(text, declaration, fieldOrder, mutation.clear ?? []);
|
|
106
|
+
const set = mutation.set ?? {};
|
|
107
|
+
const edits = [];
|
|
108
|
+
if (set.id !== undefined) {
|
|
109
|
+
edits.push({
|
|
110
|
+
startOffset: declaration.idSpan.start.offset,
|
|
111
|
+
endOffset: declaration.idSpan.end.offset,
|
|
112
|
+
replacement: set.id,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (set.version !== undefined)
|
|
116
|
+
editor.setScalar("version", String(set.version));
|
|
117
|
+
if (set.title !== undefined)
|
|
118
|
+
editor.setScalar("title", JSON.stringify(set.title));
|
|
119
|
+
if (set.description !== undefined)
|
|
120
|
+
editor.setText("description", set.description);
|
|
121
|
+
if (set.asOf !== undefined)
|
|
122
|
+
editor.setScalar("as_of", set.asOf);
|
|
123
|
+
if (set.durationUnit !== undefined)
|
|
124
|
+
editor.setScalar("duration_unit", set.durationUnit);
|
|
125
|
+
if (set.velocity !== undefined)
|
|
126
|
+
editor.setScalar("velocity", set.velocity);
|
|
127
|
+
if (set.finish !== undefined)
|
|
128
|
+
editor.setScalar("finish", set.finish);
|
|
129
|
+
if (set.criticalEpsilon !== undefined) {
|
|
130
|
+
editor.setScalar("critical_epsilon", set.criticalEpsilon);
|
|
131
|
+
}
|
|
132
|
+
if (set.targetDuration !== undefined) {
|
|
133
|
+
editor.setScalar("target_duration", set.targetDuration);
|
|
134
|
+
}
|
|
135
|
+
edits.push(...editor.finish());
|
|
136
|
+
return { edits };
|
|
137
|
+
}
|
|
138
|
+
export function planProjectMutationEdits(text, document, mutation) {
|
|
139
|
+
const declaration = document.declarations.find(({ kind }) => kind === "project");
|
|
140
|
+
if (declaration === undefined) {
|
|
141
|
+
return {
|
|
142
|
+
edits: [],
|
|
143
|
+
diagnostic: mutationDiagnostic("PTMUT-302", "project declaration does not exist"),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return planSet(text, declaration, mutation);
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/mutation/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,40 +4,40 @@ import { appendDeclarationEdit, deleteDeclarationEdit, majorLineEnding, serializ
|
|
|
4
4
|
const fieldOrder = ["title", "description", "capacity", "tags"];
|
|
5
5
|
function requestShapeError(value) {
|
|
6
6
|
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
7
|
-
return "resource mutation request
|
|
7
|
+
return "resource mutation request is not an object";
|
|
8
8
|
}
|
|
9
9
|
const request = value;
|
|
10
10
|
const kind = request["kind"];
|
|
11
11
|
if (kind !== "resource.add" && kind !== "resource.set" && kind !== "resource.remove") {
|
|
12
|
-
return "resource mutation kind
|
|
12
|
+
return "resource mutation kind is unsupported";
|
|
13
13
|
}
|
|
14
14
|
if (typeof request["id"] !== "string")
|
|
15
|
-
return "resource id
|
|
15
|
+
return "resource id is not a string";
|
|
16
16
|
const fieldsByKind = {
|
|
17
17
|
"resource.add": new Set(["kind", "id", "resource"]),
|
|
18
18
|
"resource.set": new Set(["kind", "id", "set", "clear"]),
|
|
19
19
|
"resource.remove": new Set(["kind", "id"]),
|
|
20
20
|
};
|
|
21
21
|
if (Object.keys(request).some((name) => !fieldsByKind[kind].has(name))) {
|
|
22
|
-
return `${kind} request
|
|
22
|
+
return `${kind} request contains unsupported fields`;
|
|
23
23
|
}
|
|
24
24
|
return undefined;
|
|
25
25
|
}
|
|
26
26
|
function definitionError(value) {
|
|
27
27
|
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
28
|
-
return "resource definition
|
|
28
|
+
return "resource definition is not an object";
|
|
29
29
|
}
|
|
30
30
|
const resource = value;
|
|
31
31
|
if (Object.keys(resource).some((name) => !["title", "description", "capacity"].includes(name))) {
|
|
32
|
-
return "resource definition
|
|
32
|
+
return "resource definition contains unsupported fields";
|
|
33
33
|
}
|
|
34
34
|
if (typeof resource["title"] !== "string")
|
|
35
|
-
return "resource title
|
|
35
|
+
return "resource title is not a string";
|
|
36
36
|
if (!Number.isSafeInteger(resource["capacity"])) {
|
|
37
|
-
return "resource capacity
|
|
37
|
+
return "resource capacity is not a safe integer";
|
|
38
38
|
}
|
|
39
39
|
if (resource["description"] !== undefined && typeof resource["description"] !== "string") {
|
|
40
|
-
return "resource description
|
|
40
|
+
return "resource description is not a string";
|
|
41
41
|
}
|
|
42
42
|
return undefined;
|
|
43
43
|
}
|
|
@@ -57,34 +57,34 @@ function setRequestError(mutation) {
|
|
|
57
57
|
const rawClear = mutation.clear;
|
|
58
58
|
if (rawSet !== undefined &&
|
|
59
59
|
(rawSet === null || typeof rawSet !== "object" || Array.isArray(rawSet))) {
|
|
60
|
-
return "resource set
|
|
60
|
+
return "resource set is not an object";
|
|
61
61
|
}
|
|
62
62
|
if (rawClear !== undefined && !Array.isArray(rawClear))
|
|
63
|
-
return "clear
|
|
63
|
+
return "clear is not an array";
|
|
64
64
|
const set = (rawSet ?? {});
|
|
65
65
|
const clear = (rawClear ?? []);
|
|
66
66
|
const setEntries = Object.entries(set).filter(([, item]) => item !== undefined);
|
|
67
67
|
if (setEntries.length === 0 && clear.length === 0) {
|
|
68
|
-
return "resource.set
|
|
68
|
+
return "resource.set requires at least one change specification";
|
|
69
69
|
}
|
|
70
70
|
if (Object.keys(set).some((name) => !["title", "description", "capacity"].includes(name))) {
|
|
71
|
-
return "resource set
|
|
71
|
+
return "resource set contains unsupported fields";
|
|
72
72
|
}
|
|
73
73
|
if (set.title !== undefined && typeof set.title !== "string")
|
|
74
|
-
return "title
|
|
74
|
+
return "title is not a string";
|
|
75
75
|
if (set.description !== undefined && typeof set.description !== "string") {
|
|
76
|
-
return "description
|
|
76
|
+
return "description is not a string";
|
|
77
77
|
}
|
|
78
78
|
if (set.capacity !== undefined && !Number.isSafeInteger(set.capacity)) {
|
|
79
|
-
return "capacity
|
|
79
|
+
return "capacity is not a safe integer";
|
|
80
80
|
}
|
|
81
81
|
if (!Array.isArray(clear) || clear.some((name) => name !== "description")) {
|
|
82
|
-
return "clear
|
|
82
|
+
return "clear contains unsupported fields";
|
|
83
83
|
}
|
|
84
84
|
if (new Set(clear).size !== clear.length)
|
|
85
|
-
return "clear
|
|
85
|
+
return "clear contains duplicate fields";
|
|
86
86
|
if (set.description !== undefined && clear.includes("description")) {
|
|
87
|
-
return "description
|
|
87
|
+
return "description cannot be specified in both set and clear";
|
|
88
88
|
}
|
|
89
89
|
return undefined;
|
|
90
90
|
}
|
|
@@ -113,7 +113,7 @@ export function planResourceMutationEdits(text, document, mutation) {
|
|
|
113
113
|
if (entity !== undefined) {
|
|
114
114
|
return {
|
|
115
115
|
edits: [],
|
|
116
|
-
diagnostic: mutationDiagnostic("PTMUT-304", `entity ID ${mutation.id}
|
|
116
|
+
diagnostic: mutationDiagnostic("PTMUT-304", `entity ID ${mutation.id} is already in use`, entity),
|
|
117
117
|
};
|
|
118
118
|
}
|
|
119
119
|
const error = definitionError(mutation.resource);
|
|
@@ -128,13 +128,13 @@ export function planResourceMutationEdits(text, document, mutation) {
|
|
|
128
128
|
if (entity === undefined) {
|
|
129
129
|
return {
|
|
130
130
|
edits: [],
|
|
131
|
-
diagnostic: mutationDiagnostic("PTMUT-302", `resource ${mutation.id}
|
|
131
|
+
diagnostic: mutationDiagnostic("PTMUT-302", `resource ${mutation.id} does not exist`),
|
|
132
132
|
};
|
|
133
133
|
}
|
|
134
134
|
if (entity.kind !== "resource") {
|
|
135
135
|
return {
|
|
136
136
|
edits: [],
|
|
137
|
-
diagnostic: mutationDiagnostic("PTMUT-303", `entity ${mutation.id}
|
|
137
|
+
diagnostic: mutationDiagnostic("PTMUT-303", `entity ${mutation.id} is not a resource`, entity),
|
|
138
138
|
};
|
|
139
139
|
}
|
|
140
140
|
if (mutation.kind === "resource.remove") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/mutation/resource.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAyB,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,eAAe,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AASpI,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,CAAU,CAAC;AAEzE,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/mutation/resource.ts"],"names":[],"mappings":"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"}
|
package/dist/mutation/task.js
CHANGED
|
@@ -47,7 +47,7 @@ function validStringArray(value) {
|
|
|
47
47
|
}
|
|
48
48
|
function taskDefinitionError(value) {
|
|
49
49
|
if (value === null || typeof value !== "object")
|
|
50
|
-
return "task definition
|
|
50
|
+
return "task definition is not an object";
|
|
51
51
|
const task = value;
|
|
52
52
|
const knownFields = new Set([
|
|
53
53
|
"title",
|
|
@@ -63,42 +63,42 @@ function taskDefinitionError(value) {
|
|
|
63
63
|
"source",
|
|
64
64
|
]);
|
|
65
65
|
if (Object.keys(task).some((name) => !knownFields.has(name))) {
|
|
66
|
-
return "task definition
|
|
66
|
+
return "task definition contains unsupported fields";
|
|
67
67
|
}
|
|
68
68
|
if (typeof task["title"] !== "string")
|
|
69
|
-
return "task title
|
|
69
|
+
return "task title is not a string";
|
|
70
70
|
if ((task["duration"] === undefined) === (task["estimate"] === undefined)) {
|
|
71
|
-
return "duration
|
|
71
|
+
return "exactly one of duration or estimate is required";
|
|
72
72
|
}
|
|
73
73
|
if (task["duration"] !== undefined && typeof task["duration"] !== "string") {
|
|
74
|
-
return "duration
|
|
74
|
+
return "duration is not a string";
|
|
75
75
|
}
|
|
76
76
|
if (task["estimate"] !== undefined && !validEstimate(task["estimate"])) {
|
|
77
|
-
return "estimate
|
|
77
|
+
return "estimate requires optimistic, mostLikely, and pessimistic string fields";
|
|
78
78
|
}
|
|
79
79
|
for (const name of ["description", "owner", "blockedReason", "source"]) {
|
|
80
80
|
if (task[name] !== undefined && typeof task[name] !== "string") {
|
|
81
|
-
return `${name}
|
|
81
|
+
return `${name} is not a string`;
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
84
|
if (task["status"] !== undefined && !taskStatuses.has(task["status"])) {
|
|
85
|
-
return "status
|
|
85
|
+
return "status is not a task status";
|
|
86
86
|
}
|
|
87
87
|
if (task["priority"] !== undefined && !Number.isSafeInteger(task["priority"])) {
|
|
88
|
-
return "priority
|
|
88
|
+
return "priority is not a safe integer";
|
|
89
89
|
}
|
|
90
90
|
if (task["tags"] !== undefined && !validStringArray(task["tags"])) {
|
|
91
|
-
return "tags
|
|
91
|
+
return "tags are not a string array";
|
|
92
92
|
}
|
|
93
93
|
if (task["requirements"] !== undefined &&
|
|
94
94
|
(!Array.isArray(task["requirements"]) || !task["requirements"].every(validRequirement))) {
|
|
95
|
-
return "requirements
|
|
95
|
+
return "requirements must be an array of entries with resourceId and safe integer units";
|
|
96
96
|
}
|
|
97
97
|
return undefined;
|
|
98
98
|
}
|
|
99
99
|
function taskMutationRequestError(value) {
|
|
100
100
|
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
101
|
-
return "mutation request
|
|
101
|
+
return "mutation request is not an object";
|
|
102
102
|
}
|
|
103
103
|
const request = value;
|
|
104
104
|
const kind = request["kind"];
|
|
@@ -106,10 +106,10 @@ function taskMutationRequestError(value) {
|
|
|
106
106
|
kind !== "task.set" &&
|
|
107
107
|
kind !== "task.remove" &&
|
|
108
108
|
kind !== "task.finish") {
|
|
109
|
-
return "mutation kind
|
|
109
|
+
return "mutation kind is unsupported";
|
|
110
110
|
}
|
|
111
111
|
if (typeof request["id"] !== "string")
|
|
112
|
-
return "mutation id
|
|
112
|
+
return "mutation id is not a string";
|
|
113
113
|
const fieldsByKind = {
|
|
114
114
|
"task.add": new Set(["kind", "id", "from", "to", "task"]),
|
|
115
115
|
"task.set": new Set([
|
|
@@ -128,7 +128,7 @@ function taskMutationRequestError(value) {
|
|
|
128
128
|
"task.finish": new Set(["kind", "id"]),
|
|
129
129
|
};
|
|
130
130
|
if (Object.keys(request).some((name) => !fieldsByKind[kind].has(name))) {
|
|
131
|
-
return `${kind} request
|
|
131
|
+
return `${kind} request contains unsupported fields`;
|
|
132
132
|
}
|
|
133
133
|
return undefined;
|
|
134
134
|
}
|
|
@@ -224,7 +224,7 @@ function addTaskPlan(text, mutation) {
|
|
|
224
224
|
taskError !== undefined) {
|
|
225
225
|
return {
|
|
226
226
|
edits: [],
|
|
227
|
-
diagnostic: mutationDiagnostic("PTMUT-301", `task.add request
|
|
227
|
+
diagnostic: mutationDiagnostic("PTMUT-301", `task.add request is invalid${taskError === undefined ? "" : `: ${taskError}`}`),
|
|
228
228
|
};
|
|
229
229
|
}
|
|
230
230
|
const lineEnding = majorLineEnding(text);
|
|
@@ -241,7 +241,7 @@ function setRequestError(mutation) {
|
|
|
241
241
|
const rawRemoveRequirements = mutation.removeRequirements;
|
|
242
242
|
if (rawSet !== undefined &&
|
|
243
243
|
(rawSet === null || typeof rawSet !== "object" || Array.isArray(rawSet))) {
|
|
244
|
-
return "set
|
|
244
|
+
return "set is not an object";
|
|
245
245
|
}
|
|
246
246
|
for (const [name, value] of [
|
|
247
247
|
["clear", rawClear],
|
|
@@ -251,7 +251,7 @@ function setRequestError(mutation) {
|
|
|
251
251
|
["removeRequirements", rawRemoveRequirements],
|
|
252
252
|
]) {
|
|
253
253
|
if (value !== undefined && !Array.isArray(value))
|
|
254
|
-
return `${name}
|
|
254
|
+
return `${name} is not an array`;
|
|
255
255
|
}
|
|
256
256
|
const set = (rawSet ?? {});
|
|
257
257
|
const setEntries = Object.entries(set).filter(([, value]) => value !== undefined);
|
|
@@ -268,16 +268,16 @@ function setRequestError(mutation) {
|
|
|
268
268
|
removeTags.length === 0 &&
|
|
269
269
|
upsertRequirements.length === 0 &&
|
|
270
270
|
removeRequirements.length === 0) {
|
|
271
|
-
return "task.set
|
|
271
|
+
return "task.set requires at least one change specification";
|
|
272
272
|
}
|
|
273
273
|
if (set.duration !== undefined && set.estimate !== undefined) {
|
|
274
|
-
return "duration
|
|
274
|
+
return "duration and estimate cannot both be specified in set";
|
|
275
275
|
}
|
|
276
276
|
if (mutation.from !== undefined && typeof mutation.from !== "string") {
|
|
277
|
-
return "from
|
|
277
|
+
return "from is not a string";
|
|
278
278
|
}
|
|
279
279
|
if (mutation.to !== undefined && typeof mutation.to !== "string") {
|
|
280
|
-
return "to
|
|
280
|
+
return "to is not a string";
|
|
281
281
|
}
|
|
282
282
|
const knownSetFields = new Set([
|
|
283
283
|
"title",
|
|
@@ -291,35 +291,35 @@ function setRequestError(mutation) {
|
|
|
291
291
|
"source",
|
|
292
292
|
]);
|
|
293
293
|
if (Object.keys(set).some((name) => !knownSetFields.has(name))) {
|
|
294
|
-
return "set
|
|
294
|
+
return "set contains unsupported fields";
|
|
295
295
|
}
|
|
296
296
|
for (const name of ["title", "description", "duration", "owner", "blockedReason", "source"]) {
|
|
297
297
|
if (set[name] !== undefined && typeof set[name] !== "string") {
|
|
298
|
-
return `${name}
|
|
298
|
+
return `${name} is not a string`;
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
301
|
if (set.estimate !== undefined && !validEstimate(set.estimate)) {
|
|
302
|
-
return "estimate
|
|
302
|
+
return "estimate requires optimistic, mostLikely, and pessimistic string fields";
|
|
303
303
|
}
|
|
304
304
|
if (set.status !== undefined && !taskStatuses.has(set.status)) {
|
|
305
|
-
return "status
|
|
305
|
+
return "status is not a task status";
|
|
306
306
|
}
|
|
307
307
|
if (set.priority !== undefined && !Number.isSafeInteger(set.priority)) {
|
|
308
|
-
return "priority
|
|
308
|
+
return "priority is not a safe integer";
|
|
309
309
|
}
|
|
310
310
|
if (!Array.isArray(clear) || clear.some((name) => !clearableFields.has(name))) {
|
|
311
|
-
return "clear
|
|
311
|
+
return "clear contains unsupported fields";
|
|
312
312
|
}
|
|
313
313
|
if (!validStringArray(addTags) || !validStringArray(removeTags)) {
|
|
314
|
-
return "addTags
|
|
314
|
+
return "addTags and removeTags must be string arrays";
|
|
315
315
|
}
|
|
316
316
|
if (!Array.isArray(upsertRequirements) ||
|
|
317
317
|
!upsertRequirements.every(validRequirement) ||
|
|
318
318
|
!validStringArray(removeRequirements)) {
|
|
319
|
-
return "requirement
|
|
319
|
+
return "requirement change specification is invalid";
|
|
320
320
|
}
|
|
321
321
|
if (new Set(clear).size !== clear.length)
|
|
322
|
-
return "clear
|
|
322
|
+
return "clear contains duplicate fields";
|
|
323
323
|
const clearNames = new Set(clear);
|
|
324
324
|
const setToClear = {
|
|
325
325
|
title: "title",
|
|
@@ -334,27 +334,27 @@ function setRequestError(mutation) {
|
|
|
334
334
|
};
|
|
335
335
|
for (const [name] of setEntries) {
|
|
336
336
|
if (clearNames.has(setToClear[name])) {
|
|
337
|
-
return `${setToClear[name]}
|
|
337
|
+
return `${setToClear[name]} cannot be specified in both set and clear`;
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
340
|
if (clearNames.has("tags") && (addTags.length > 0 || removeTags.length > 0)) {
|
|
341
|
-
return "clear tags
|
|
341
|
+
return "clear tags cannot be combined with add/remove tags";
|
|
342
342
|
}
|
|
343
343
|
if (clearNames.has("requires") &&
|
|
344
344
|
(upsertRequirements.length > 0 || removeRequirements.length > 0)) {
|
|
345
|
-
return "clear requires
|
|
345
|
+
return "clear requires cannot be combined with upsert/remove requirements";
|
|
346
346
|
}
|
|
347
347
|
const removedTags = new Set(removeTags);
|
|
348
348
|
if (addTags.some((tag) => removedTags.has(tag))) {
|
|
349
|
-
return "
|
|
349
|
+
return "the same tag cannot be specified in both add and remove";
|
|
350
350
|
}
|
|
351
351
|
const removedResources = new Set(removeRequirements);
|
|
352
352
|
if (upsertRequirements.some(({ resourceId }) => removedResources.has(resourceId))) {
|
|
353
|
-
return "
|
|
353
|
+
return "the same resource cannot be specified in both upsert and remove";
|
|
354
354
|
}
|
|
355
355
|
const upsertIds = upsertRequirements.map(({ resourceId }) => resourceId);
|
|
356
356
|
if (new Set(upsertIds).size !== upsertIds.length) {
|
|
357
|
-
return "upsert
|
|
357
|
+
return "upsert requirements contain duplicate resources";
|
|
358
358
|
}
|
|
359
359
|
return undefined;
|
|
360
360
|
}
|
|
@@ -608,7 +608,7 @@ export function planTaskMutationEdits(text, document, mutation) {
|
|
|
608
608
|
if (entity !== undefined) {
|
|
609
609
|
return {
|
|
610
610
|
edits: [],
|
|
611
|
-
diagnostic: mutationDiagnostic("PTMUT-304", `entity ID ${mutation.id}
|
|
611
|
+
diagnostic: mutationDiagnostic("PTMUT-304", `entity ID ${mutation.id} is already in use`, entity),
|
|
612
612
|
};
|
|
613
613
|
}
|
|
614
614
|
return addTaskPlan(text, mutation);
|
|
@@ -616,13 +616,13 @@ export function planTaskMutationEdits(text, document, mutation) {
|
|
|
616
616
|
if (entity === undefined) {
|
|
617
617
|
return {
|
|
618
618
|
edits: [],
|
|
619
|
-
diagnostic: mutationDiagnostic("PTMUT-302", `task ${mutation.id}
|
|
619
|
+
diagnostic: mutationDiagnostic("PTMUT-302", `task ${mutation.id} does not exist`),
|
|
620
620
|
};
|
|
621
621
|
}
|
|
622
622
|
if (entity.kind !== "task") {
|
|
623
623
|
return {
|
|
624
624
|
edits: [],
|
|
625
|
-
diagnostic: mutationDiagnostic("PTMUT-303", `entity ${mutation.id}
|
|
625
|
+
diagnostic: mutationDiagnostic("PTMUT-303", `entity ${mutation.id} is not a task`, entity),
|
|
626
626
|
};
|
|
627
627
|
}
|
|
628
628
|
const lines = splitPhysicalLines(text);
|