perttool 0.1.0-alpha.2

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 (176) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE +21 -0
  3. package/README.md +134 -0
  4. package/dist/analysis/graph.d.ts +41 -0
  5. package/dist/analysis/graph.d.ts.map +1 -0
  6. package/dist/analysis/graph.js +199 -0
  7. package/dist/analysis/graph.js.map +1 -0
  8. package/dist/analysis/precedence.d.ts +52 -0
  9. package/dist/analysis/precedence.d.ts.map +1 -0
  10. package/dist/analysis/precedence.js +187 -0
  11. package/dist/analysis/precedence.js.map +1 -0
  12. package/dist/analysis/resource.d.ts +96 -0
  13. package/dist/analysis/resource.d.ts.map +1 -0
  14. package/dist/analysis/resource.js +522 -0
  15. package/dist/analysis/resource.js.map +1 -0
  16. package/dist/application/analyze.d.ts +32 -0
  17. package/dist/application/analyze.d.ts.map +1 -0
  18. package/dist/application/analyze.js +144 -0
  19. package/dist/application/analyze.js.map +1 -0
  20. package/dist/application/check.d.ts +24 -0
  21. package/dist/application/check.d.ts.map +1 -0
  22. package/dist/application/check.js +43 -0
  23. package/dist/application/check.js.map +1 -0
  24. package/dist/application/format.d.ts +21 -0
  25. package/dist/application/format.d.ts.map +1 -0
  26. package/dist/application/format.js +52 -0
  27. package/dist/application/format.js.map +1 -0
  28. package/dist/application/mutate.d.ts +4 -0
  29. package/dist/application/mutate.d.ts.map +1 -0
  30. package/dist/application/mutate.js +175 -0
  31. package/dist/application/mutate.js.map +1 -0
  32. package/dist/application/next.d.ts +86 -0
  33. package/dist/application/next.d.ts.map +1 -0
  34. package/dist/application/next.js +310 -0
  35. package/dist/application/next.js.map +1 -0
  36. package/dist/cli.d.ts +3 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +2103 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/conversion/mermaid-import.d.ts +26 -0
  41. package/dist/conversion/mermaid-import.d.ts.map +1 -0
  42. package/dist/conversion/mermaid-import.js +655 -0
  43. package/dist/conversion/mermaid-import.js.map +1 -0
  44. package/dist/conversion/mermaid.d.ts +38 -0
  45. package/dist/conversion/mermaid.d.ts.map +1 -0
  46. package/dist/conversion/mermaid.js +362 -0
  47. package/dist/conversion/mermaid.js.map +1 -0
  48. package/dist/editing/unified-diff.d.ts +7 -0
  49. package/dist/editing/unified-diff.d.ts.map +1 -0
  50. package/dist/editing/unified-diff.js +81 -0
  51. package/dist/editing/unified-diff.js.map +1 -0
  52. package/dist/formatter/source-formatter.d.ts +17 -0
  53. package/dist/formatter/source-formatter.d.ts.map +1 -0
  54. package/dist/formatter/source-formatter.js +210 -0
  55. package/dist/formatter/source-formatter.js.map +1 -0
  56. package/dist/help/registry.d.ts +37 -0
  57. package/dist/help/registry.d.ts.map +1 -0
  58. package/dist/help/registry.js +657 -0
  59. package/dist/help/registry.js.map +1 -0
  60. package/dist/index.d.ts +44 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +23 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/io/document-file.d.ts +9 -0
  65. package/dist/io/document-file.d.ts.map +1 -0
  66. package/dist/io/document-file.js +19 -0
  67. package/dist/io/document-file.js.map +1 -0
  68. package/dist/io/safe-write.d.ts +33 -0
  69. package/dist/io/safe-write.d.ts.map +1 -0
  70. package/dist/io/safe-write.js +280 -0
  71. package/dist/io/safe-write.js.map +1 -0
  72. package/dist/model/diagnostics.d.ts +43 -0
  73. package/dist/model/diagnostics.d.ts.map +1 -0
  74. package/dist/model/diagnostics.js +47 -0
  75. package/dist/model/diagnostics.js.map +1 -0
  76. package/dist/model/rational.d.ts +21 -0
  77. package/dist/model/rational.d.ts.map +1 -0
  78. package/dist/model/rational.js +84 -0
  79. package/dist/model/rational.js.map +1 -0
  80. package/dist/model/syntax.d.ts +67 -0
  81. package/dist/model/syntax.d.ts.map +1 -0
  82. package/dist/model/syntax.js +15 -0
  83. package/dist/model/syntax.js.map +1 -0
  84. package/dist/model/units.d.ts +18 -0
  85. package/dist/model/units.d.ts.map +1 -0
  86. package/dist/model/units.js +29 -0
  87. package/dist/model/units.js.map +1 -0
  88. package/dist/mutation/advance.d.ts +26 -0
  89. package/dist/mutation/advance.d.ts.map +1 -0
  90. package/dist/mutation/advance.js +261 -0
  91. package/dist/mutation/advance.js.map +1 -0
  92. package/dist/mutation/diagnostics.d.ts +10 -0
  93. package/dist/mutation/diagnostics.d.ts.map +1 -0
  94. package/dist/mutation/diagnostics.js +10 -0
  95. package/dist/mutation/diagnostics.js.map +1 -0
  96. package/dist/mutation/entity-editor.d.ts +16 -0
  97. package/dist/mutation/entity-editor.d.ts.map +1 -0
  98. package/dist/mutation/entity-editor.js +103 -0
  99. package/dist/mutation/entity-editor.js.map +1 -0
  100. package/dist/mutation/milestone.d.ts +5 -0
  101. package/dist/mutation/milestone.d.ts.map +1 -0
  102. package/dist/mutation/milestone.js +194 -0
  103. package/dist/mutation/milestone.js.map +1 -0
  104. package/dist/mutation/resource.d.ts +5 -0
  105. package/dist/mutation/resource.d.ts.map +1 -0
  106. package/dist/mutation/resource.js +145 -0
  107. package/dist/mutation/resource.js.map +1 -0
  108. package/dist/mutation/source.d.ts +22 -0
  109. package/dist/mutation/source.d.ts.map +1 -0
  110. package/dist/mutation/source.js +155 -0
  111. package/dist/mutation/source.js.map +1 -0
  112. package/dist/mutation/task.d.ts +10 -0
  113. package/dist/mutation/task.d.ts.map +1 -0
  114. package/dist/mutation/task.js +644 -0
  115. package/dist/mutation/task.js.map +1 -0
  116. package/dist/mutation/text-edits.d.ts +8 -0
  117. package/dist/mutation/text-edits.d.ts.map +1 -0
  118. package/dist/mutation/text-edits.js +33 -0
  119. package/dist/mutation/text-edits.js.map +1 -0
  120. package/dist/mutation/types.d.ts +153 -0
  121. package/dist/mutation/types.d.ts.map +1 -0
  122. package/dist/mutation/types.js +2 -0
  123. package/dist/mutation/types.js.map +1 -0
  124. package/dist/parser/document-parser.d.ts +6 -0
  125. package/dist/parser/document-parser.d.ts.map +1 -0
  126. package/dist/parser/document-parser.js +735 -0
  127. package/dist/parser/document-parser.js.map +1 -0
  128. package/dist/recommendation/explanation-types.d.ts +226 -0
  129. package/dist/recommendation/explanation-types.d.ts.map +1 -0
  130. package/dist/recommendation/explanation-types.js +2 -0
  131. package/dist/recommendation/explanation-types.js.map +1 -0
  132. package/dist/recommendation/explanation-validation.d.ts +4 -0
  133. package/dist/recommendation/explanation-validation.d.ts.map +1 -0
  134. package/dist/recommendation/explanation-validation.js +745 -0
  135. package/dist/recommendation/explanation-validation.js.map +1 -0
  136. package/dist/recommendation/explanation-values.d.ts +7 -0
  137. package/dist/recommendation/explanation-values.d.ts.map +1 -0
  138. package/dist/recommendation/explanation-values.js +283 -0
  139. package/dist/recommendation/explanation-values.js.map +1 -0
  140. package/dist/recommendation/explanation.d.ts +8 -0
  141. package/dist/recommendation/explanation.d.ts.map +1 -0
  142. package/dist/recommendation/explanation.js +1022 -0
  143. package/dist/recommendation/explanation.js.map +1 -0
  144. package/dist/recommendation/failure.d.ts +3 -0
  145. package/dist/recommendation/failure.d.ts.map +1 -0
  146. package/dist/recommendation/failure.js +4 -0
  147. package/dist/recommendation/failure.js.map +1 -0
  148. package/dist/recommendation/json.d.ts +3 -0
  149. package/dist/recommendation/json.d.ts.map +1 -0
  150. package/dist/recommendation/json.js +252 -0
  151. package/dist/recommendation/json.js.map +1 -0
  152. package/dist/recommendation/override-types.d.ts +117 -0
  153. package/dist/recommendation/override-types.d.ts.map +1 -0
  154. package/dist/recommendation/override-types.js +2 -0
  155. package/dist/recommendation/override-types.js.map +1 -0
  156. package/dist/recommendation/override.d.ts +7 -0
  157. package/dist/recommendation/override.d.ts.map +1 -0
  158. package/dist/recommendation/override.js +717 -0
  159. package/dist/recommendation/override.js.map +1 -0
  160. package/dist/recommendation/ranking.d.ts +7 -0
  161. package/dist/recommendation/ranking.d.ts.map +1 -0
  162. package/dist/recommendation/ranking.js +391 -0
  163. package/dist/recommendation/ranking.js.map +1 -0
  164. package/dist/recommendation/types.d.ts +83 -0
  165. package/dist/recommendation/types.d.ts.map +1 -0
  166. package/dist/recommendation/types.js +2 -0
  167. package/dist/recommendation/types.js.map +1 -0
  168. package/dist/semantic/validator.d.ts +4 -0
  169. package/dist/semantic/validator.d.ts.map +1 -0
  170. package/dist/semantic/validator.js +490 -0
  171. package/dist/semantic/validator.js.map +1 -0
  172. package/dist/version.d.ts +2 -0
  173. package/dist/version.d.ts.map +1 -0
  174. package/dist/version.js +2 -0
  175. package/dist/version.js.map +1 -0
  176. package/package.json +61 -0
@@ -0,0 +1,490 @@
1
+ import { compareStableStrings, hasErrors, sortDiagnostics, } from "../model/diagnostics.js";
2
+ import { compareDurations, fieldNamed, fieldsNamed, isZeroDuration, } from "../model/syntax.js";
3
+ const reservedWords = new Set([
4
+ "project",
5
+ "resource",
6
+ "milestone",
7
+ "task",
8
+ "gate",
9
+ "version",
10
+ "title",
11
+ "description",
12
+ "as_of",
13
+ "duration_unit",
14
+ "velocity",
15
+ "finish",
16
+ "critical_epsilon",
17
+ "target_duration",
18
+ "state",
19
+ "tags",
20
+ "duration",
21
+ "estimate",
22
+ "optimistic",
23
+ "most_likely",
24
+ "pessimistic",
25
+ "status",
26
+ "priority",
27
+ "owner",
28
+ "blocked_reason",
29
+ "source",
30
+ "reason",
31
+ "capacity",
32
+ "requires",
33
+ "planned",
34
+ "reached",
35
+ "active",
36
+ "blocked",
37
+ "done",
38
+ "day",
39
+ "hour",
40
+ "point",
41
+ ]);
42
+ function makeDiagnostic(code, severity, message, diagnosticSpan, helpTopic, entityId, related) {
43
+ return {
44
+ code,
45
+ severity,
46
+ message,
47
+ span: diagnosticSpan,
48
+ helpTopic,
49
+ ...(entityId === undefined ? {} : { entityId }),
50
+ ...(related === undefined || related.length === 0 ? {} : { related }),
51
+ };
52
+ }
53
+ function zeroSpan(document) {
54
+ return {
55
+ start: { offset: 0, line: 0, column: 0 },
56
+ end: { offset: document.text.length === 0 ? 0 : 1, line: 0, column: document.text.length === 0 ? 0 : 1 },
57
+ };
58
+ }
59
+ function requireField(declaration, fieldName, diagnostics) {
60
+ const fields = fieldsNamed(declaration, fieldName);
61
+ if (fields.length === 0) {
62
+ diagnostics.push(makeDiagnostic("PTSEM-101", "error", `${declaration.kind} ${declaration.id}にrequired field ${fieldName}がありません`, declaration.idSpan, `syntax.${declaration.kind}`, declaration.id));
63
+ return undefined;
64
+ }
65
+ return fields[0];
66
+ }
67
+ function validateDuplicateFields(declaration, diagnostics) {
68
+ const firstByName = new Map();
69
+ for (const field of declaration.fields) {
70
+ const first = firstByName.get(field.name);
71
+ if (first === undefined) {
72
+ firstByName.set(field.name, field);
73
+ continue;
74
+ }
75
+ diagnostics.push(makeDiagnostic("PTSEM-102", "error", `${declaration.kind} ${declaration.id}でfield ${field.name}が重複しています`, field.span, `syntax.${declaration.kind}`, declaration.id, [{ message: "最初のfield", span: first.span }]));
76
+ }
77
+ }
78
+ function durationValue(field) {
79
+ if (field === undefined || typeof field.value !== "object" || field.value === null) {
80
+ return undefined;
81
+ }
82
+ return "digits" in field.value && "suffix" in field.value
83
+ ? field.value
84
+ : undefined;
85
+ }
86
+ function velocityValue(field) {
87
+ if (field === undefined || typeof field.value !== "object" || field.value === null) {
88
+ return undefined;
89
+ }
90
+ return "points" in field.value && "period" in field.value
91
+ ? field.value
92
+ : undefined;
93
+ }
94
+ function validateNonemptyText(declaration, fieldName, diagnostics) {
95
+ const field = fieldNamed(declaration, fieldName);
96
+ if (field !== undefined && typeof field.value === "string" && field.value.length === 0) {
97
+ diagnostics.push(makeDiagnostic("PTSEM-106", "error", `${fieldName}は空にできません`, field.valueSpan, `syntax.${declaration.kind}`, declaration.id));
98
+ }
99
+ }
100
+ function validateTags(declaration, diagnostics) {
101
+ const field = fieldNamed(declaration, "tags");
102
+ if (field === undefined || !Array.isArray(field.value))
103
+ return;
104
+ const seen = new Set();
105
+ for (const tag of field.value) {
106
+ if (typeof tag !== "string")
107
+ continue;
108
+ if (seen.has(tag)) {
109
+ diagnostics.push(makeDiagnostic("PTSEM-107", "error", `tag ${tag}が重複しています`, field.valueSpan, "syntax.tags", declaration.id));
110
+ return;
111
+ }
112
+ seen.add(tag);
113
+ }
114
+ }
115
+ function isValidIsoDate(raw) {
116
+ const dateMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(raw);
117
+ if (dateMatch !== null) {
118
+ const year = Number(dateMatch[1]);
119
+ const month = Number(dateMatch[2]);
120
+ const day = Number(dateMatch[3]);
121
+ const date = new Date(Date.UTC(year, month - 1, day));
122
+ return (date.getUTCFullYear() === year &&
123
+ date.getUTCMonth() === month - 1 &&
124
+ date.getUTCDate() === day);
125
+ }
126
+ return (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/.test(raw) &&
127
+ !Number.isNaN(Date.parse(raw)));
128
+ }
129
+ function validateFieldConstraints(document, diagnostics) {
130
+ const projects = document.declarations.filter((declaration) => declaration.kind === "project");
131
+ if (projects.length === 0) {
132
+ diagnostics.push(makeDiagnostic("PTSEM-101", "error", "project declarationがありません", zeroSpan(document), "syntax.project"));
133
+ }
134
+ if (projects.length > 1) {
135
+ const first = projects[0];
136
+ for (const project of projects.slice(1)) {
137
+ diagnostics.push(makeDiagnostic("PTSEM-201", "error", "project declarationはexactly oneです", project.idSpan, "syntax.project", project.id, [{ message: "最初のproject", span: first.idSpan }]));
138
+ }
139
+ }
140
+ const firstDeclaration = document.declarations[0];
141
+ if (firstDeclaration !== undefined && firstDeclaration.kind !== "project") {
142
+ diagnostics.push(makeDiagnostic("PTDSL-003", "error", "projectは最初のdeclarationでなければなりません", firstDeclaration.idSpan, "syntax.top-level", firstDeclaration.id));
143
+ }
144
+ for (const declaration of document.declarations) {
145
+ validateDuplicateFields(declaration, diagnostics);
146
+ validateTags(declaration, diagnostics);
147
+ validateNonemptyText(declaration, "title", diagnostics);
148
+ validateNonemptyText(declaration, "description", diagnostics);
149
+ if (declaration.kind === "project") {
150
+ const title = requireField(declaration, "title", diagnostics);
151
+ const durationUnit = requireField(declaration, "duration_unit", diagnostics);
152
+ const velocityField = fieldNamed(declaration, "velocity");
153
+ const velocity = velocityValue(velocityField);
154
+ requireField(declaration, "finish", diagnostics);
155
+ const version = fieldNamed(declaration, "version");
156
+ if (version !== undefined && version.value !== 1) {
157
+ diagnostics.push(makeDiagnostic("PTSEM-108", "error", "grammar version 1だけを受理します", version.valueSpan, "syntax.project", declaration.id));
158
+ }
159
+ const asOf = fieldNamed(declaration, "as_of");
160
+ if (asOf !== undefined && typeof asOf.value === "string" && !isValidIsoDate(asOf.value)) {
161
+ diagnostics.push(makeDiagnostic("PTDSL-008", "error", "as_ofが有効なISO date/date-timeではありません", asOf.valueSpan, "syntax.project", declaration.id));
162
+ }
163
+ const criticalEpsilon = durationValue(fieldNamed(declaration, "critical_epsilon"));
164
+ const targetDuration = durationValue(fieldNamed(declaration, "target_duration"));
165
+ if (targetDuration !== undefined && isZeroDuration(targetDuration)) {
166
+ diagnostics.push(makeDiagnostic("PTSEM-104", "error", "target_durationは0より大きくしてください", fieldNamed(declaration, "target_duration").valueSpan, "syntax.duration", declaration.id));
167
+ }
168
+ void title;
169
+ void criticalEpsilon;
170
+ if (durationUnit !== undefined &&
171
+ (durationUnit.value === "day" ||
172
+ durationUnit.value === "hour" ||
173
+ durationUnit.value === "point")) {
174
+ const expectedSuffix = durationUnit.value === "day" ? "d" : durationUnit.value === "hour" ? "h" : "p";
175
+ for (const candidate of document.declarations) {
176
+ for (const field of candidate.fields) {
177
+ const values = field.children ?? [field];
178
+ for (const valueField of values) {
179
+ const value = durationValue(valueField);
180
+ if (value !== undefined && value.suffix !== expectedSuffix) {
181
+ diagnostics.push(makeDiagnostic("PTSEM-105", "error", `project unit ${durationUnit.value}とduration suffixが一致しません`, valueField.valueSpan, "syntax.duration", candidate.id));
182
+ }
183
+ }
184
+ }
185
+ }
186
+ if (durationUnit.value === "point" && velocityField === undefined) {
187
+ diagnostics.push(makeDiagnostic("PTSEM-111", "error", "duration_unit pointにはvelocityが必要です", durationUnit.valueSpan, "syntax.velocity", declaration.id));
188
+ }
189
+ if (velocity !== undefined) {
190
+ if (isZeroDuration(velocity.points) || isZeroDuration(velocity.period)) {
191
+ diagnostics.push(makeDiagnostic("PTSEM-111", "error", "velocityのPoint量と期間量は0より大きくしてください", velocityField.valueSpan, "syntax.velocity", declaration.id));
192
+ }
193
+ if (durationUnit.value !== "point" &&
194
+ velocity.period.suffix !== expectedSuffix) {
195
+ diagnostics.push(makeDiagnostic("PTSEM-111", "error", `project unit ${durationUnit.value}とvelocity期間suffixが一致しません`, velocityField.valueSpan, "syntax.velocity", declaration.id));
196
+ }
197
+ }
198
+ }
199
+ }
200
+ if (declaration.kind === "resource") {
201
+ requireField(declaration, "title", diagnostics);
202
+ const capacity = requireField(declaration, "capacity", diagnostics);
203
+ if (capacity !== undefined && typeof capacity.value === "number" && capacity.value < 1) {
204
+ diagnostics.push(makeDiagnostic("PTSEM-109", "error", "resource capacityは1以上です", capacity.valueSpan, "syntax.resource", declaration.id));
205
+ }
206
+ }
207
+ if (declaration.kind === "milestone") {
208
+ requireField(declaration, "title", diagnostics);
209
+ }
210
+ if (declaration.kind === "task") {
211
+ requireField(declaration, "title", diagnostics);
212
+ const durations = fieldsNamed(declaration, "duration");
213
+ const estimates = fieldsNamed(declaration, "estimate");
214
+ if (durations.length + estimates.length !== 1) {
215
+ diagnostics.push(makeDiagnostic("PTSEM-103", "error", "taskはdurationまたはestimateのどちらかexactly oneを必要とします", declaration.idSpan, "syntax.task", declaration.id));
216
+ }
217
+ const duration = durationValue(durations[0]);
218
+ if (duration !== undefined && isZeroDuration(duration)) {
219
+ diagnostics.push(makeDiagnostic("PTSEM-104", "error", "task durationは0より大きくしてください", durations[0].valueSpan, "syntax.duration", declaration.id));
220
+ }
221
+ const estimate = estimates[0];
222
+ if (estimate !== undefined) {
223
+ const children = estimate.children ?? [];
224
+ for (const name of ["optimistic", "most_likely", "pessimistic"]) {
225
+ const matching = children.filter((child) => child.name === name);
226
+ if (matching.length !== 1) {
227
+ diagnostics.push(makeDiagnostic(matching.length === 0 ? "PTSEM-101" : "PTSEM-102", "error", `estimate ${name}はexactly one必要です`, estimate.span, "syntax.estimate", declaration.id));
228
+ }
229
+ }
230
+ const optimistic = durationValue(children.find((child) => child.name === "optimistic"));
231
+ const mostLikely = durationValue(children.find((child) => child.name === "most_likely"));
232
+ const pessimistic = durationValue(children.find((child) => child.name === "pessimistic"));
233
+ if (optimistic !== undefined &&
234
+ mostLikely !== undefined &&
235
+ pessimistic !== undefined &&
236
+ (compareDurations(optimistic, mostLikely) > 0 ||
237
+ compareDurations(mostLikely, pessimistic) > 0 ||
238
+ isZeroDuration(pessimistic))) {
239
+ diagnostics.push(makeDiagnostic("PTSEM-104", "error", "estimateはoptimistic <= most_likely <= pessimisticかつpessimistic > 0を満たしてください", estimate.span, "syntax.estimate", declaration.id));
240
+ }
241
+ }
242
+ const status = fieldNamed(declaration, "status")?.value ?? "planned";
243
+ const blockedReason = fieldNamed(declaration, "blocked_reason");
244
+ if ((status === "blocked") !== (blockedReason !== undefined)) {
245
+ diagnostics.push(makeDiagnostic("PTSEM-103", "error", "blocked_reasonはstatus=blockedの場合だけ必須です", blockedReason?.span ?? fieldNamed(declaration, "status")?.span ?? declaration.idSpan, "syntax.task", declaration.id));
246
+ }
247
+ validateNonemptyText(declaration, "blocked_reason", diagnostics);
248
+ const requirements = fieldNamed(declaration, "requires");
249
+ if (requirements !== undefined && Array.isArray(requirements.value)) {
250
+ if (requirements.value.length === 0) {
251
+ diagnostics.push(makeDiagnostic("PTSEM-101", "error", "requires blockは1件以上必要です", requirements.span, "syntax.task", declaration.id));
252
+ }
253
+ const seen = new Map();
254
+ for (const requirement of requirements.value) {
255
+ const first = seen.get(requirement.resourceId);
256
+ if (first !== undefined) {
257
+ diagnostics.push(makeDiagnostic("PTSEM-110", "error", `resource requirement ${requirement.resourceId}が重複しています`, requirement.resourceSpan, "syntax.task", declaration.id, [{ message: "最初のrequirement", span: first.resourceSpan }]));
258
+ }
259
+ else {
260
+ seen.set(requirement.resourceId, requirement);
261
+ }
262
+ if (requirement.units < 1) {
263
+ diagnostics.push(makeDiagnostic("PTSEM-109", "error", "requirement unitsは1以上です", requirement.unitsSpan, "syntax.resource", declaration.id));
264
+ }
265
+ }
266
+ }
267
+ }
268
+ if (declaration.kind === "gate") {
269
+ requireField(declaration, "reason", diagnostics);
270
+ validateNonemptyText(declaration, "reason", diagnostics);
271
+ }
272
+ }
273
+ }
274
+ function validateGraph(document, diagnostics) {
275
+ const firstById = new Map();
276
+ for (const declaration of document.declarations) {
277
+ if (reservedWords.has(declaration.id)) {
278
+ diagnostics.push(makeDiagnostic("PTSEM-202", "error", `reserved word ${declaration.id}はentity IDに使用できません`, declaration.idSpan, "syntax", declaration.id));
279
+ }
280
+ const first = firstById.get(declaration.id);
281
+ if (first !== undefined) {
282
+ diagnostics.push(makeDiagnostic("PTSEM-201", "error", `entity ID ${declaration.id}が重複しています`, declaration.idSpan, "errors", declaration.id, [{ message: "最初のdeclaration", span: first.idSpan }]));
283
+ }
284
+ else {
285
+ firstById.set(declaration.id, declaration);
286
+ }
287
+ }
288
+ if (hasErrors(diagnostics))
289
+ return;
290
+ const project = document.declarations.find((declaration) => declaration.kind === "project");
291
+ const milestones = new Map(document.declarations
292
+ .filter((declaration) => declaration.kind === "milestone")
293
+ .map((declaration) => [declaration.id, declaration]));
294
+ const resources = new Map(document.declarations
295
+ .filter((declaration) => declaration.kind === "resource")
296
+ .map((declaration) => [declaration.id, declaration]));
297
+ const edges = document.declarations
298
+ .filter((declaration) => declaration.kind === "task" || declaration.kind === "gate")
299
+ .map((declaration) => ({
300
+ declaration,
301
+ id: declaration.id,
302
+ source: declaration.from,
303
+ target: declaration.to,
304
+ }));
305
+ const finishField = fieldNamed(project, "finish");
306
+ const finish = finishField.value;
307
+ const finishEntity = firstById.get(finish);
308
+ if (finishEntity === undefined) {
309
+ diagnostics.push(makeDiagnostic("PTSEM-203", "error", `project.finish ${finish}が未定義です`, finishField.valueSpan, "syntax.project", project.id));
310
+ }
311
+ else if (finishEntity.kind !== "milestone") {
312
+ diagnostics.push(makeDiagnostic("PTSEM-205", "error", `project.finish ${finish}はmilestoneではありません`, finishField.valueSpan, "syntax.project", project.id));
313
+ }
314
+ for (const edge of edges) {
315
+ for (const [endpoint, endpointSpan] of [
316
+ [edge.source, edge.declaration.fromSpan],
317
+ [edge.target, edge.declaration.toSpan],
318
+ ]) {
319
+ const entity = firstById.get(endpoint);
320
+ if (entity === undefined) {
321
+ diagnostics.push(makeDiagnostic("PTSEM-204", "error", `endpoint ${endpoint}が未定義です`, endpointSpan, `syntax.${edge.declaration.kind}`, edge.id));
322
+ }
323
+ else if (entity.kind !== "milestone") {
324
+ diagnostics.push(makeDiagnostic("PTSEM-205", "error", `endpoint ${endpoint}はmilestoneではありません`, endpointSpan, `syntax.${edge.declaration.kind}`, edge.id));
325
+ }
326
+ }
327
+ if (edge.source === edge.target) {
328
+ diagnostics.push(makeDiagnostic("PTDAG-201", "error", `edge ${edge.id}はself-loopです`, edge.declaration.arrowSpan, "errors", edge.id));
329
+ }
330
+ }
331
+ for (const task of document.declarations.filter((declaration) => declaration.kind === "task")) {
332
+ const requirements = fieldNamed(task, "requires")?.value;
333
+ if (!Array.isArray(requirements))
334
+ continue;
335
+ for (const requirement of requirements) {
336
+ const entity = firstById.get(requirement.resourceId);
337
+ if (entity === undefined) {
338
+ diagnostics.push(makeDiagnostic("PTSEM-206", "error", `resource ${requirement.resourceId}が未定義です`, requirement.resourceSpan, "syntax.resource", task.id));
339
+ }
340
+ else if (entity.kind !== "resource") {
341
+ diagnostics.push(makeDiagnostic("PTSEM-207", "error", `${requirement.resourceId}はresourceではありません`, requirement.resourceSpan, "syntax.resource", task.id));
342
+ }
343
+ else {
344
+ const capacity = fieldNamed(entity, "capacity").value;
345
+ if (requirement.units > capacity) {
346
+ diagnostics.push(makeDiagnostic("PTSEM-208", "error", `requirement ${requirement.units}がcapacity ${capacity}を超えています`, requirement.unitsSpan, "syntax.resource", task.id));
347
+ }
348
+ }
349
+ }
350
+ }
351
+ if (hasErrors(diagnostics))
352
+ return;
353
+ const outgoing = new Map();
354
+ const incoming = new Map();
355
+ for (const milestone of milestones.keys()) {
356
+ outgoing.set(milestone, []);
357
+ incoming.set(milestone, []);
358
+ }
359
+ for (const edge of edges) {
360
+ outgoing.get(edge.source).push(edge);
361
+ incoming.get(edge.target).push(edge);
362
+ }
363
+ for (const list of [...outgoing.values(), ...incoming.values()]) {
364
+ list.sort((left, right) => compareStableStrings(left.id, right.id));
365
+ }
366
+ const indegree = new Map([...milestones.keys()].map((id) => [id, incoming.get(id).length]));
367
+ const available = [...indegree].filter(([, degree]) => degree === 0).map(([id]) => id).sort();
368
+ let processed = 0;
369
+ while (available.length > 0) {
370
+ const milestone = available.shift();
371
+ processed += 1;
372
+ for (const edge of outgoing.get(milestone)) {
373
+ const next = indegree.get(edge.target) - 1;
374
+ indegree.set(edge.target, next);
375
+ if (next === 0) {
376
+ available.push(edge.target);
377
+ available.sort(compareStableStrings);
378
+ }
379
+ }
380
+ }
381
+ if (processed !== milestones.size) {
382
+ const cycleEdge = edges
383
+ .filter((edge) => (indegree.get(edge.source) ?? 0) > 0 && (indegree.get(edge.target) ?? 0) > 0)
384
+ .sort((left, right) => compareStableStrings(left.id, right.id))[0];
385
+ diagnostics.push(makeDiagnostic("PTDAG-202", "error", "directed cycleを検出しました", cycleEdge?.declaration.headerSpan ?? project.idSpan, "errors", cycleEdge?.id));
386
+ return;
387
+ }
388
+ if (finishEntity?.kind === "milestone" && outgoing.get(finish).length > 0) {
389
+ const firstOutgoing = outgoing.get(finish)[0];
390
+ diagnostics.push(makeDiagnostic("PTDAG-203", "error", `finish milestone ${finish}にoutgoing edgeがあります`, firstOutgoing.declaration.headerSpan, "errors", firstOutgoing.id));
391
+ }
392
+ if (finishEntity?.kind === "milestone") {
393
+ const canReachFinish = new Set([finish]);
394
+ const queue = [finish];
395
+ while (queue.length > 0) {
396
+ const target = queue.shift();
397
+ for (const edge of incoming.get(target)) {
398
+ if (!canReachFinish.has(edge.source)) {
399
+ canReachFinish.add(edge.source);
400
+ queue.push(edge.source);
401
+ }
402
+ }
403
+ }
404
+ for (const milestone of milestones.values()) {
405
+ if (!canReachFinish.has(milestone.id)) {
406
+ diagnostics.push(makeDiagnostic("PTDAG-204", "error", `milestone ${milestone.id}はfinishへ到達できません`, milestone.idSpan, "errors", milestone.id));
407
+ }
408
+ }
409
+ }
410
+ const explicitReached = new Set([...milestones.values()]
411
+ .filter((milestone) => fieldNamed(milestone, "state")?.value === "reached")
412
+ .map((milestone) => milestone.id));
413
+ for (const milestone of milestones.values()) {
414
+ if (incoming.get(milestone.id).length === 0 && !explicitReached.has(milestone.id)) {
415
+ diagnostics.push(makeDiagnostic("PTDAG-205", "error", `root milestone ${milestone.id}はstate reachedでなければなりません`, fieldNamed(milestone, "state")?.valueSpan ?? milestone.idSpan, "errors", milestone.id));
416
+ }
417
+ }
418
+ if (hasErrors(diagnostics))
419
+ return;
420
+ const reached = new Set(explicitReached);
421
+ const satisfied = (edge) => {
422
+ if (!reached.has(edge.source))
423
+ return false;
424
+ if (edge.declaration.kind === "gate")
425
+ return true;
426
+ return (fieldNamed(edge.declaration, "status")?.value ?? "planned") === "done";
427
+ };
428
+ let changed = true;
429
+ while (changed) {
430
+ changed = false;
431
+ for (const milestone of milestones.values()) {
432
+ if (reached.has(milestone.id))
433
+ continue;
434
+ const edgesIn = incoming.get(milestone.id);
435
+ if (edgesIn.length > 0 && edgesIn.every(satisfied)) {
436
+ reached.add(milestone.id);
437
+ changed = true;
438
+ }
439
+ }
440
+ }
441
+ for (const milestoneId of explicitReached) {
442
+ const edgesIn = incoming.get(milestoneId);
443
+ if (edgesIn.length > 0 && !edgesIn.every(satisfied)) {
444
+ const milestone = milestones.get(milestoneId);
445
+ diagnostics.push(makeDiagnostic("PTDAG-206", "error", `reached milestone ${milestoneId}にunsatisfied incoming edgeがあります`, fieldNamed(milestone, "state")?.valueSpan ?? milestone.idSpan, "errors", milestoneId));
446
+ }
447
+ }
448
+ for (const task of document.declarations.filter((declaration) => declaration.kind === "task")) {
449
+ const status = fieldNamed(task, "status")?.value ?? "planned";
450
+ if ((status === "active" || status === "done") && !reached.has(task.from)) {
451
+ diagnostics.push(makeDiagnostic("PTDAG-207", "error", `${status} task ${task.id}のsourceがreachedではありません`, fieldNamed(task, "status")?.valueSpan ?? task.idSpan, "errors", task.id));
452
+ }
453
+ }
454
+ for (const milestoneId of [...reached].sort()) {
455
+ const milestone = milestones.get(milestoneId);
456
+ if (!explicitReached.has(milestoneId)) {
457
+ diagnostics.push(makeDiagnostic("PTDAG-208", "warning", `milestone ${milestoneId}はclosureでreachedです。advanceを検討してください`, milestone.idSpan, "workflows", milestoneId));
458
+ }
459
+ }
460
+ for (const resource of resources.values()) {
461
+ const capacity = fieldNamed(resource, "capacity").value;
462
+ const activeTasks = [];
463
+ let usage = 0;
464
+ for (const task of document.declarations.filter((declaration) => declaration.kind === "task")) {
465
+ if ((fieldNamed(task, "status")?.value ?? "planned") !== "active")
466
+ continue;
467
+ const requirements = fieldNamed(task, "requires")?.value;
468
+ if (!Array.isArray(requirements))
469
+ continue;
470
+ const requirement = requirements.find((candidate) => candidate.resourceId === resource.id);
471
+ if (requirement !== undefined) {
472
+ usage += requirement.units;
473
+ activeTasks.push(task);
474
+ }
475
+ }
476
+ if (usage > capacity) {
477
+ diagnostics.push(makeDiagnostic("PTRES-201", "error", `active usage ${usage}がresource ${resource.id} capacity ${capacity}を超えています`, fieldNamed(resource, "capacity").valueSpan, "analysis.resources", resource.id, activeTasks.map((task) => ({ message: `active task ${task.id}`, span: task.idSpan }))));
478
+ }
479
+ }
480
+ }
481
+ export function validateDocument(document, parseDiagnostics = []) {
482
+ const diagnostics = [...parseDiagnostics];
483
+ if (hasErrors(diagnostics))
484
+ return sortDiagnostics(diagnostics);
485
+ validateFieldConstraints(document, diagnostics);
486
+ if (!hasErrors(diagnostics))
487
+ validateGraph(document, diagnostics);
488
+ return sortDiagnostics(diagnostics);
489
+ }
490
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/semantic/validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const TOOL_VERSION = "0.1.0-alpha.2";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export const TOOL_VERSION = "0.1.0-alpha.2";
2
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "perttool",
3
+ "version": "0.1.0-alpha.2",
4
+ "description": "Document-based PERT/CPM and resource scheduling CLI",
5
+ "keywords": [
6
+ "pert",
7
+ "cpm",
8
+ "dag",
9
+ "task-management",
10
+ "cli"
11
+ ],
12
+ "homepage": "https://github.com/mako10k/perttool#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/mako10k/perttool/issues"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/mako10k/perttool.git"
19
+ },
20
+ "license": "MIT",
21
+ "publishConfig": {
22
+ "access": "public",
23
+ "registry": "https://registry.npmjs.org/",
24
+ "tag": "alpha"
25
+ },
26
+ "type": "module",
27
+ "files": [
28
+ "dist",
29
+ "CHANGELOG.md"
30
+ ],
31
+ "bin": {
32
+ "perttool": "dist/cli.js"
33
+ },
34
+ "main": "./dist/index.js",
35
+ "types": "./dist/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/index.d.ts",
39
+ "import": "./dist/index.js"
40
+ }
41
+ },
42
+ "engines": {
43
+ "node": ">=24"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc -p tsconfig.json",
47
+ "prepare": "npm run build",
48
+ "typecheck": "tsc -p tsconfig.json --noEmit",
49
+ "test": "npm run build && node --test test/*.test.mjs",
50
+ "test:e2e": "npm run build && node --test test/e2e.test.mjs",
51
+ "check:docs": "bash scripts/check-docs.sh",
52
+ "check:link": "bash scripts/check-npm-link.sh",
53
+ "check:package": "bash scripts/check-package.sh",
54
+ "check:self-use": "bash scripts/check-self-use.sh",
55
+ "check": "npm run typecheck && npm test && npm run check:docs && npm run check:self-use && npm run check:link && npm run check:package"
56
+ },
57
+ "devDependencies": {
58
+ "@types/node": "24.13.3",
59
+ "typescript": "7.0.2"
60
+ }
61
+ }