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,144 @@
1
+ import { hasErrors, limitDiagnostics, normalizeMaxDiagnostics, sortDiagnostics, } from "../model/diagnostics.js";
2
+ import { fieldNamed } from "../model/syntax.js";
3
+ import { buildResidualGraph } from "../analysis/graph.js";
4
+ import { analyzePrecedence } from "../analysis/precedence.js";
5
+ import { analyzeResources } from "../analysis/resource.js";
6
+ import { createVelocityConversion } from "../model/units.js";
7
+ import { checkDocument } from "./check.js";
8
+ function diagnostic(code, severity, message, entityId, related, helpTopic = "analysis.resources") {
9
+ return {
10
+ code,
11
+ severity,
12
+ message,
13
+ helpTopic,
14
+ ...(entityId === undefined ? {} : { entityId }),
15
+ ...(related === undefined || related.length === 0 ? {} : { related }),
16
+ };
17
+ }
18
+ function validateCapacityOverrides(graph, overrides) {
19
+ const diagnostics = [];
20
+ for (const [id] of overrides) {
21
+ if (!graph.resources.has(id)) {
22
+ diagnostics.push(diagnostic("PTSEM-206", "error", `capacity overrideのresource ${id}が未定義です`, id));
23
+ }
24
+ }
25
+ if (hasErrors(diagnostics))
26
+ return diagnostics;
27
+ const effective = new Map([...graph.resources].map(([id, resource]) => [id, overrides.get(id) ?? resource.capacity]));
28
+ for (const declaration of graph.document.declarations.filter((candidate) => candidate.kind === "task")) {
29
+ const requirements = (fieldNamed(declaration, "requires")?.value ?? []);
30
+ for (const requirement of requirements) {
31
+ if (requirement.units > effective.get(requirement.resourceId)) {
32
+ diagnostics.push({
33
+ code: "PTSEM-208",
34
+ severity: "error",
35
+ message: `requirement ${requirement.units}がwhat-if capacity ${effective.get(requirement.resourceId)}を超えています`,
36
+ entityId: declaration.id,
37
+ span: requirement.unitsSpan,
38
+ helpTopic: "analysis.resources",
39
+ });
40
+ }
41
+ }
42
+ }
43
+ for (const [id, resource] of graph.resources) {
44
+ const activeTasks = graph.document.declarations.filter((declaration) => declaration.kind === "task" && fieldNamed(declaration, "status")?.value === "active");
45
+ const usage = activeTasks.reduce((sum, task) => {
46
+ const requirements = (fieldNamed(task, "requires")?.value ?? []);
47
+ return sum + (requirements.find((requirement) => requirement.resourceId === id)?.units ?? 0);
48
+ }, 0);
49
+ if (usage > effective.get(id)) {
50
+ diagnostics.push({
51
+ code: "PTRES-202",
52
+ severity: "error",
53
+ message: `what-if capacity ${effective.get(id)}がactive usage ${usage}未満です`,
54
+ entityId: id,
55
+ span: fieldNamed(resource.declaration, "capacity").valueSpan,
56
+ helpTopic: "analysis.resources",
57
+ related: activeTasks
58
+ .filter((task) => {
59
+ const requirements = (fieldNamed(task, "requires")?.value ?? []);
60
+ return requirements.some((requirement) => requirement.resourceId === id);
61
+ })
62
+ .map((task) => ({ message: `active task ${task.id}`, span: task.idSpan })),
63
+ });
64
+ }
65
+ }
66
+ return diagnostics;
67
+ }
68
+ export function analyzeDocument(text, options = {}) {
69
+ const mode = options.mode ?? "both";
70
+ const maxPaths = options.maxPaths ?? 1;
71
+ const precision = options.precision ?? 3;
72
+ const maxDiagnostics = normalizeMaxDiagnostics(options.maxDiagnostics);
73
+ const overrides = options.capacityOverrides ?? new Map();
74
+ const checked = checkDocument(text, { maxDiagnostics });
75
+ const diagnostics = [...checked.diagnostics];
76
+ if (!checked.ok) {
77
+ return {
78
+ ok: false,
79
+ document: checked.document,
80
+ documentId: checked.documentId,
81
+ diagnostics,
82
+ diagnosticsTruncated: checked.diagnosticsTruncated,
83
+ mode,
84
+ precision,
85
+ capacityOverrides: overrides,
86
+ durationUnit: null,
87
+ velocity: null,
88
+ velocityForecast: null,
89
+ criticalEpsilon: null,
90
+ precedence: null,
91
+ resource: null,
92
+ };
93
+ }
94
+ const graph = buildResidualGraph(checked.document);
95
+ diagnostics.push(...validateCapacityOverrides(graph, overrides));
96
+ if (hasErrors(diagnostics)) {
97
+ const limited = limitDiagnostics(sortDiagnostics(diagnostics), maxDiagnostics);
98
+ return {
99
+ ok: false,
100
+ document: checked.document,
101
+ documentId: checked.documentId,
102
+ diagnostics: limited.diagnostics,
103
+ diagnosticsTruncated: checked.diagnosticsTruncated || limited.truncated,
104
+ mode,
105
+ precision,
106
+ capacityOverrides: overrides,
107
+ durationUnit: graph.durationUnit,
108
+ velocity: graph.velocity,
109
+ velocityForecast: createVelocityConversion(graph.durationUnit, graph.velocity),
110
+ criticalEpsilon: graph.criticalEpsilon,
111
+ precedence: null,
112
+ resource: null,
113
+ };
114
+ }
115
+ const internalPrecedence = analyzePrecedence(graph, maxPaths);
116
+ const resource = mode === "precedence"
117
+ ? null
118
+ : analyzeResources(graph, internalPrecedence, overrides, maxPaths);
119
+ const precedence = mode === "resource" ? null : internalPrecedence;
120
+ if (precedence?.critical.pathsTruncated === true || resource?.scheduleCritical.pathsTruncated === true) {
121
+ diagnostics.push(diagnostic("PTDAG-302", "warning", `critical path列挙をmax-paths ${maxPaths}で打ち切りました`, undefined, undefined, "analysis"));
122
+ }
123
+ if (resource?.conditionalOnBlocksResolved === true) {
124
+ diagnostics.push(diagnostic("PTRES-303", "warning", "blocked taskは時刻0で解消する条件付きresource scheduleです", resource.blockedTaskIds[0]));
125
+ }
126
+ const limited = limitDiagnostics(sortDiagnostics(diagnostics), maxDiagnostics);
127
+ return {
128
+ ok: !hasErrors(diagnostics),
129
+ document: checked.document,
130
+ documentId: checked.documentId,
131
+ diagnostics: limited.diagnostics,
132
+ diagnosticsTruncated: checked.diagnosticsTruncated || limited.truncated,
133
+ mode,
134
+ precision,
135
+ capacityOverrides: overrides,
136
+ durationUnit: graph.durationUnit,
137
+ velocity: graph.velocity,
138
+ velocityForecast: createVelocityConversion(graph.durationUnit, graph.velocity),
139
+ criticalEpsilon: graph.criticalEpsilon,
140
+ precedence,
141
+ resource,
142
+ };
143
+ }
144
+ //# sourceMappingURL=analyze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../src/application/analyze.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Diagnostic } from "../model/diagnostics.js";
2
+ import type { DocumentNode } from "../model/syntax.js";
3
+ export interface CheckSummary {
4
+ readonly resources: number;
5
+ readonly milestones: number;
6
+ readonly tasks: number;
7
+ readonly gates: number;
8
+ readonly errors: number;
9
+ readonly warnings: number;
10
+ }
11
+ export interface CheckResult {
12
+ readonly ok: boolean;
13
+ readonly document: DocumentNode;
14
+ readonly documentId: string | null;
15
+ readonly grammarVersion: number | null;
16
+ readonly diagnostics: readonly Diagnostic[];
17
+ readonly diagnosticsTruncated: boolean;
18
+ readonly summary: CheckSummary;
19
+ }
20
+ export interface CheckOptions {
21
+ readonly maxDiagnostics?: number;
22
+ }
23
+ export declare function checkDocument(text: string, options?: CheckOptions): CheckResult;
24
+ //# sourceMappingURL=check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.d.ts","sourceRoot":"","sources":["../../src/application/check.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAO1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAyCnF"}
@@ -0,0 +1,43 @@
1
+ import { countDiagnostics, hasErrors, limitDiagnostics, normalizeMaxDiagnostics, } from "../model/diagnostics.js";
2
+ import { fieldNamed } from "../model/syntax.js";
3
+ import { parseDocument } from "../parser/document-parser.js";
4
+ import { validateDocument } from "../semantic/validator.js";
5
+ export function checkDocument(text, options = {}) {
6
+ const maxDiagnostics = normalizeMaxDiagnostics(options.maxDiagnostics);
7
+ const parsed = parseDocument(text, { maxDiagnostics });
8
+ const validatedDiagnostics = validateDocument(parsed.document, parsed.diagnostics);
9
+ const limited = limitDiagnostics(validatedDiagnostics, maxDiagnostics);
10
+ const diagnostics = limited.diagnostics;
11
+ const parseFailed = parsed.diagnostics.some((diagnostic) => diagnostic.severity === "error");
12
+ const diagnosticCounts = parseFailed
13
+ ? parsed.diagnosticCounts
14
+ : countDiagnostics(validatedDiagnostics);
15
+ const project = parsed.document.declarations.find((declaration) => declaration.kind === "project");
16
+ const version = project === undefined ? undefined : fieldNamed(project, "version")?.value;
17
+ const summary = {
18
+ resources: parseFailed
19
+ ? 0
20
+ : parsed.document.declarations.filter((declaration) => declaration.kind === "resource").length,
21
+ milestones: parseFailed
22
+ ? 0
23
+ : parsed.document.declarations.filter((declaration) => declaration.kind === "milestone").length,
24
+ tasks: parseFailed
25
+ ? 0
26
+ : parsed.document.declarations.filter((declaration) => declaration.kind === "task").length,
27
+ gates: parseFailed
28
+ ? 0
29
+ : parsed.document.declarations.filter((declaration) => declaration.kind === "gate").length,
30
+ errors: diagnosticCounts.errors,
31
+ warnings: diagnosticCounts.warnings,
32
+ };
33
+ return {
34
+ ok: !hasErrors(validatedDiagnostics),
35
+ document: parsed.document,
36
+ documentId: project?.id ?? null,
37
+ grammarVersion: parseFailed ? null : typeof version === "number" ? version : 1,
38
+ diagnostics,
39
+ diagnosticsTruncated: parsed.diagnosticsTruncated || limited.truncated,
40
+ summary,
41
+ };
42
+ }
43
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/application/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type FormatOptions } from "../formatter/source-formatter.js";
2
+ import type { Diagnostic } from "../model/diagnostics.js";
3
+ import type { TextEdit } from "../mutation/text-edits.js";
4
+ export interface FormatPreviewOptions extends FormatOptions {
5
+ readonly originalLabel?: string;
6
+ readonly updatedLabel?: string;
7
+ }
8
+ export interface FormatPreviewResult {
9
+ readonly ok: boolean;
10
+ readonly documentId: string | null;
11
+ readonly changed: boolean;
12
+ readonly originalDigest: string;
13
+ readonly updatedDigest: string | null;
14
+ readonly updatedText: string | null;
15
+ readonly diff: string | null;
16
+ readonly edits: readonly TextEdit[];
17
+ readonly diagnostics: readonly Diagnostic[];
18
+ readonly diagnosticsTruncated: boolean;
19
+ }
20
+ export declare function planFormat(text: string, options?: FormatPreviewOptions): FormatPreviewResult;
21
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/application/format.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,oBAAqB,SAAQ,aAAa;IACzD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC;AAMD,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CA6CrB"}
@@ -0,0 +1,52 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createUnifiedDiff } from "../editing/unified-diff.js";
3
+ import { formatDocument, } from "../formatter/source-formatter.js";
4
+ function digest(text) {
5
+ return `sha256:${createHash("sha256").update(text, "utf8").digest("hex")}`;
6
+ }
7
+ export function planFormat(text, options = {}) {
8
+ const originalDigest = digest(text);
9
+ const formatted = formatDocument(text, {
10
+ ...(options.maxDiagnostics === undefined
11
+ ? {}
12
+ : { maxDiagnostics: options.maxDiagnostics }),
13
+ });
14
+ if (!formatted.ok) {
15
+ return {
16
+ ok: false,
17
+ documentId: formatted.documentId,
18
+ changed: false,
19
+ originalDigest,
20
+ updatedDigest: null,
21
+ updatedText: null,
22
+ diff: null,
23
+ edits: [],
24
+ diagnostics: formatted.diagnostics,
25
+ diagnosticsTruncated: formatted.diagnosticsTruncated,
26
+ };
27
+ }
28
+ if (formatted.formattedText === null) {
29
+ throw new Error("successful formatter result does not contain candidate text");
30
+ }
31
+ const updatedText = formatted.formattedText;
32
+ return {
33
+ ok: true,
34
+ documentId: formatted.documentId,
35
+ changed: formatted.changed,
36
+ originalDigest,
37
+ updatedDigest: digest(updatedText),
38
+ updatedText,
39
+ diff: createUnifiedDiff(text, updatedText, {
40
+ ...(options.originalLabel === undefined
41
+ ? {}
42
+ : { originalLabel: options.originalLabel }),
43
+ ...(options.updatedLabel === undefined
44
+ ? {}
45
+ : { updatedLabel: options.updatedLabel }),
46
+ }),
47
+ edits: formatted.edits,
48
+ diagnostics: formatted.diagnostics,
49
+ diagnosticsTruncated: formatted.diagnosticsTruncated,
50
+ };
51
+ }
52
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/application/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,cAAc,GAEf,MAAM,kCAAkC,CAAC;AAsB1C,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,OAAO,GAAyB,EAAE;IAElC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE;QACrC,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;KAChD,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QAClB,OAAO;YACL,EAAE,EAAE,KAAK;YACT,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,OAAO,EAAE,KAAK;YACd,cAAc;YACd,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;YACjB,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,EAAE;YACT,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,oBAAoB,EAAE,SAAS,CAAC,oBAAoB;SACrD,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,aAAa,CAAC;IAC5C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,UAAU,EAAE,SAAS,CAAC,UAAU;QAChC,OAAO,EAAE,SAAS,CAAC,OAAO;QAC1B,cAAc;QACd,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC;QAClC,WAAW;QACX,IAAI,EAAE,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE;YACzC,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS;gBACrC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7C,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS;gBACpC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;SAC5C,CAAC;QACF,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,oBAAoB,EAAE,SAAS,CAAC,oBAAoB;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Mutation, MutationOptions, MutationResult } from "../mutation/types.js";
2
+ export declare function planMutation(text: string, mutation: Mutation, options?: MutationOptions): MutationResult;
3
+ export declare function planBatchMutation(text: string, mutation: unknown, options?: MutationOptions): MutationResult;
4
+ //# sourceMappingURL=mutate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate.d.ts","sourceRoot":"","sources":["../../src/application/mutate.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,QAAQ,EACR,eAAe,EACf,cAAc,EACf,MAAM,sBAAsB,CAAC;AA8N9B,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,EAClB,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAEhB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAEhB"}
@@ -0,0 +1,175 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createUnifiedDiff } from "../editing/unified-diff.js";
3
+ import { limitDiagnostics, normalizeMaxDiagnostics, sortDiagnostics, } from "../model/diagnostics.js";
4
+ import { applyTextEdits, normalizeTextEdits } from "../mutation/text-edits.js";
5
+ import { mutationDiagnostic } from "../mutation/diagnostics.js";
6
+ import { planMilestoneMutationEdits } from "../mutation/milestone.js";
7
+ import { planResourceMutationEdits } from "../mutation/resource.js";
8
+ import { planTaskMutationEdits } from "../mutation/task.js";
9
+ import { checkDocument } from "./check.js";
10
+ function digest(text) {
11
+ return `sha256:${createHash("sha256").update(text, "utf8").digest("hex")}`;
12
+ }
13
+ function failure(originalDigest, documentId, diagnostics, maximum, alreadyTruncated) {
14
+ const limited = limitDiagnostics(sortDiagnostics(diagnostics), maximum);
15
+ return {
16
+ ok: false,
17
+ documentId,
18
+ changed: false,
19
+ originalDigest,
20
+ updatedDigest: null,
21
+ updatedText: null,
22
+ diff: null,
23
+ edits: [],
24
+ diagnostics: limited.diagnostics,
25
+ diagnosticsTruncated: alreadyTruncated || limited.truncated,
26
+ };
27
+ }
28
+ function runtimeKind(value) {
29
+ return value !== null && typeof value === "object"
30
+ ? value["kind"]
31
+ : undefined;
32
+ }
33
+ function planAtomicMutationEdits(text, document, mutation) {
34
+ const kind = runtimeKind(mutation);
35
+ if (typeof kind === "string" && kind.startsWith("milestone.")) {
36
+ return planMilestoneMutationEdits(text, document, mutation);
37
+ }
38
+ if (typeof kind === "string" && kind.startsWith("resource.")) {
39
+ return planResourceMutationEdits(text, document, mutation);
40
+ }
41
+ return planTaskMutationEdits(text, document, mutation);
42
+ }
43
+ function batchRequestError(value) {
44
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
45
+ return "batch mutation requestがobjectではありません";
46
+ }
47
+ const request = value;
48
+ if (request["kind"] !== "batch")
49
+ return "batch mutation kindが不正です";
50
+ if (Object.keys(request).some((name) => !["kind", "mutations"].includes(name))) {
51
+ return "batch mutation requestに未対応fieldが含まれています";
52
+ }
53
+ if (!Array.isArray(request["mutations"]) || request["mutations"].length === 0) {
54
+ return "batch mutationは1件以上のatomic mutationを必要とします";
55
+ }
56
+ if (request["mutations"].some((item) => runtimeKind(item) === "batch")) {
57
+ return "batch mutationはnested batchを許可しません";
58
+ }
59
+ const ids = request["mutations"].map((item) => item !== null && typeof item === "object"
60
+ ? item["id"]
61
+ : undefined);
62
+ if (ids.some((id) => typeof id !== "string")) {
63
+ return "batch内のatomic mutationはstring idを必要とします";
64
+ }
65
+ if (new Set(ids).size !== ids.length) {
66
+ return "batch内で同じentity IDを複数回変更できません";
67
+ }
68
+ return undefined;
69
+ }
70
+ function mergeBatchInsertions(edits) {
71
+ const nonInsertions = [];
72
+ const insertions = new Map();
73
+ for (const [requestIndex, edit] of edits.entries()) {
74
+ if (edit.startOffset === edit.endOffset) {
75
+ const group = insertions.get(edit.startOffset) ?? [];
76
+ group.push({ edit, requestIndex });
77
+ insertions.set(edit.startOffset, group);
78
+ }
79
+ else {
80
+ nonInsertions.push(edit);
81
+ }
82
+ }
83
+ const mergedInsertions = [...insertions.entries()].map(([offset, group]) => {
84
+ const structuralRank = ({ edit }) => {
85
+ const withoutLeadingEndings = edit.replacement.replace(/^(?:\r?\n)*/, "");
86
+ return withoutLeadingEndings.startsWith(" ") ? 0 : 1;
87
+ };
88
+ group.sort((left, right) => structuralRank(left) - structuralRank(right) || left.requestIndex - right.requestIndex);
89
+ return {
90
+ startOffset: offset,
91
+ endOffset: offset,
92
+ replacement: group.map(({ edit }) => edit.replacement).join(""),
93
+ };
94
+ });
95
+ return [...nonInsertions, ...mergedInsertions];
96
+ }
97
+ function planAllMutationEdits(text, document, mutation) {
98
+ if (runtimeKind(mutation) !== "batch") {
99
+ return planAtomicMutationEdits(text, document, mutation);
100
+ }
101
+ const error = batchRequestError(mutation);
102
+ if (error !== undefined) {
103
+ return { edits: [], diagnostic: mutationDiagnostic("PTMUT-301", error) };
104
+ }
105
+ const batch = mutation;
106
+ const edits = [];
107
+ for (const atomic of batch.mutations) {
108
+ const planned = planAtomicMutationEdits(text, document, atomic);
109
+ if (planned.diagnostic !== undefined)
110
+ return planned;
111
+ edits.push(...planned.edits);
112
+ }
113
+ return { edits: mergeBatchInsertions(edits) };
114
+ }
115
+ function planMutationRequest(text, mutation, options = {}, batchOnly = false) {
116
+ const maximum = normalizeMaxDiagnostics(options.maxDiagnostics);
117
+ const originalDigest = digest(text);
118
+ const original = checkDocument(text, { maxDiagnostics: maximum });
119
+ if (!original.ok) {
120
+ return failure(originalDigest, original.documentId, original.diagnostics, maximum, original.diagnosticsTruncated);
121
+ }
122
+ if (batchOnly && runtimeKind(mutation) !== "batch") {
123
+ return failure(originalDigest, original.documentId, [
124
+ ...original.diagnostics,
125
+ mutationDiagnostic("PTMUT-301", "mutation applyはtop-level batch requestを必要とします"),
126
+ ], maximum, original.diagnosticsTruncated);
127
+ }
128
+ const planned = planAllMutationEdits(text, original.document, mutation);
129
+ if (planned.diagnostic !== undefined) {
130
+ return failure(originalDigest, original.documentId, [...original.diagnostics, planned.diagnostic], maximum, original.diagnosticsTruncated);
131
+ }
132
+ let edits;
133
+ try {
134
+ edits = normalizeTextEdits(text, planned.edits, "mutation");
135
+ }
136
+ catch (error) {
137
+ if (runtimeKind(mutation) !== "batch")
138
+ throw error;
139
+ return failure(originalDigest, original.documentId, [
140
+ ...original.diagnostics,
141
+ mutationDiagnostic("PTMUT-301", "batch mutationのTextEdit rangeが競合しています"),
142
+ ], maximum, original.diagnosticsTruncated);
143
+ }
144
+ const updatedText = applyTextEdits(text, edits);
145
+ const candidate = checkDocument(updatedText, { maxDiagnostics: maximum });
146
+ if (!candidate.ok) {
147
+ return failure(originalDigest, original.documentId, candidate.diagnostics, maximum, candidate.diagnosticsTruncated);
148
+ }
149
+ return {
150
+ ok: true,
151
+ documentId: original.documentId,
152
+ changed: updatedText !== text,
153
+ originalDigest,
154
+ updatedDigest: digest(updatedText),
155
+ updatedText,
156
+ diff: createUnifiedDiff(text, updatedText, {
157
+ ...(options.originalLabel === undefined
158
+ ? {}
159
+ : { originalLabel: options.originalLabel }),
160
+ ...(options.updatedLabel === undefined
161
+ ? {}
162
+ : { updatedLabel: options.updatedLabel }),
163
+ }),
164
+ edits,
165
+ diagnostics: candidate.diagnostics,
166
+ diagnosticsTruncated: candidate.diagnosticsTruncated,
167
+ };
168
+ }
169
+ export function planMutation(text, mutation, options = {}) {
170
+ return planMutationRequest(text, mutation, options);
171
+ }
172
+ export function planBatchMutation(text, mutation, options = {}) {
173
+ return planMutationRequest(text, mutation, options, true);
174
+ }
175
+ //# sourceMappingURL=mutate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../src/application/mutate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { Diagnostic } from "../model/diagnostics.js";
2
+ import type { Rational } from "../model/rational.js";
3
+ import type { DocumentNode, RequirementValue } from "../model/syntax.js";
4
+ import type { TaskStatus } from "../analysis/graph.js";
5
+ import type { DurationUnit, Velocity, VelocityConversion } from "../model/units.js";
6
+ import type { RecommendationAnalysis } from "../recommendation/explanation-types.js";
7
+ export type TaskClassification = "active" | "ready" | "blocked_now" | "upcoming";
8
+ export interface ResourceRejection {
9
+ readonly resourceId: string;
10
+ readonly capacity: number;
11
+ readonly activeUsage: number;
12
+ readonly earlierSelectedUsage: number;
13
+ readonly usedBeforeDecision: number;
14
+ readonly required: number;
15
+ readonly available: number;
16
+ readonly deficit: number;
17
+ readonly activeTaskIds: readonly string[];
18
+ readonly earlierSelectedTaskIds: readonly string[];
19
+ }
20
+ export interface UnsatisfiedEdgeExplanation {
21
+ readonly edgeId: string;
22
+ readonly kind: "task" | "gate";
23
+ readonly status: TaskStatus | null;
24
+ readonly sourceMilestoneId: string;
25
+ readonly sourceReached: boolean;
26
+ }
27
+ export interface ExplanationNode {
28
+ readonly milestoneId: string;
29
+ readonly reached: boolean;
30
+ readonly unsatisfiedEdges: readonly UnsatisfiedEdgeExplanation[];
31
+ readonly children: readonly ExplanationNode[];
32
+ readonly truncated: boolean;
33
+ }
34
+ export interface NextTask {
35
+ readonly id: string;
36
+ readonly title: string;
37
+ readonly status: TaskStatus;
38
+ readonly classification: TaskClassification;
39
+ readonly runnableNow: boolean;
40
+ readonly priority: number;
41
+ readonly owner: string | null;
42
+ readonly blockedReason: string | null;
43
+ readonly expected: Rational;
44
+ readonly totalFloat: Rational;
45
+ readonly earliestStart: Rational;
46
+ readonly forecastExpected: Rational | null;
47
+ readonly forecastTotalFloat: Rational | null;
48
+ readonly forecastEarliestStart: Rational | null;
49
+ readonly precedenceCritical: boolean;
50
+ readonly scheduleCritical: boolean;
51
+ readonly requirements: readonly RequirementValue[];
52
+ readonly resourceRejections: readonly ResourceRejection[];
53
+ readonly explanation: readonly ExplanationNode[];
54
+ }
55
+ export interface NextGroups {
56
+ readonly active: readonly string[];
57
+ readonly ready: readonly string[];
58
+ readonly runnableNow: readonly string[];
59
+ readonly blockedNow: readonly string[];
60
+ readonly upcoming: readonly string[];
61
+ }
62
+ export interface NextOptions {
63
+ readonly capacityOverrides?: ReadonlyMap<string, number>;
64
+ readonly explainDepth?: number;
65
+ readonly precision?: number;
66
+ readonly maxDiagnostics?: number;
67
+ readonly sourceDigest?: string;
68
+ }
69
+ export interface NextResultV3 {
70
+ readonly ok: boolean;
71
+ readonly document: DocumentNode;
72
+ readonly documentId: string | null;
73
+ readonly diagnostics: readonly Diagnostic[];
74
+ readonly diagnosticsTruncated: boolean;
75
+ readonly precision: number;
76
+ readonly durationUnit: DurationUnit | null;
77
+ readonly velocity: Velocity | null;
78
+ readonly velocityForecast: VelocityConversion | null;
79
+ readonly capacityOverrides: ReadonlyMap<string, number>;
80
+ readonly groups: NextGroups;
81
+ readonly tasks: readonly NextTask[];
82
+ readonly recommendation: RecommendationAnalysis | null;
83
+ }
84
+ export type NextResult = NextResultV3;
85
+ export declare function selectNextTasks(text: string, options?: NextOptions): NextResultV3;
86
+ //# sourceMappingURL=next.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../src/application/next.ts"],"names":[],"mappings":"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"}