perttool 0.4.0 → 0.5.1

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 (246) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/README.md +107 -34
  3. package/dist/actuals/lifecycle.d.ts +101 -0
  4. package/dist/actuals/lifecycle.d.ts.map +1 -0
  5. package/dist/actuals/lifecycle.js +329 -0
  6. package/dist/actuals/lifecycle.js.map +1 -0
  7. package/dist/actuals/source.d.ts +36 -0
  8. package/dist/actuals/source.d.ts.map +1 -0
  9. package/dist/actuals/source.js +119 -0
  10. package/dist/actuals/source.js.map +1 -0
  11. package/dist/analysis/temporal-deadline.d.ts +2 -2
  12. package/dist/analysis/temporal-deadline.d.ts.map +1 -1
  13. package/dist/analysis/temporal-deadline.js.map +1 -1
  14. package/dist/analysis/temporal-precedence.d.ts +2 -2
  15. package/dist/analysis/temporal-precedence.d.ts.map +1 -1
  16. package/dist/analysis/temporal-precedence.js +2 -0
  17. package/dist/analysis/temporal-precedence.js.map +1 -1
  18. package/dist/analysis/temporal-resource.d.ts +2 -2
  19. package/dist/analysis/temporal-resource.d.ts.map +1 -1
  20. package/dist/analysis/temporal-resource.js +2 -0
  21. package/dist/analysis/temporal-resource.js.map +1 -1
  22. package/dist/application/analyze.d.ts +1 -0
  23. package/dist/application/analyze.d.ts.map +1 -1
  24. package/dist/application/analyze.js +38 -29
  25. package/dist/application/analyze.js.map +1 -1
  26. package/dist/application/check.d.ts +3 -0
  27. package/dist/application/check.d.ts.map +1 -1
  28. package/dist/application/check.js +17 -1
  29. package/dist/application/check.js.map +1 -1
  30. package/dist/application/contract6-actuals.d.ts +24 -0
  31. package/dist/application/contract6-actuals.d.ts.map +1 -0
  32. package/dist/application/contract6-actuals.js +51 -0
  33. package/dist/application/contract6-actuals.js.map +1 -0
  34. package/dist/application/contract6-mutation.d.ts +18 -0
  35. package/dist/application/contract6-mutation.d.ts.map +1 -0
  36. package/dist/application/contract6-mutation.js +173 -0
  37. package/dist/application/contract6-mutation.js.map +1 -0
  38. package/dist/application/contract6-projection.d.ts +9 -0
  39. package/dist/application/contract6-projection.d.ts.map +1 -0
  40. package/dist/application/contract6-projection.js +105 -0
  41. package/dist/application/contract6-projection.js.map +1 -0
  42. package/dist/application/init.d.ts +1 -1
  43. package/dist/application/init.js +3 -3
  44. package/dist/application/project.js +2 -2
  45. package/dist/application/target-actuals-advance.d.ts +12 -0
  46. package/dist/application/target-actuals-advance.d.ts.map +1 -0
  47. package/dist/application/target-actuals-advance.js +113 -0
  48. package/dist/application/target-actuals-advance.js.map +1 -0
  49. package/dist/application/target-actuals-analysis.d.ts +76 -0
  50. package/dist/application/target-actuals-analysis.d.ts.map +1 -0
  51. package/dist/application/target-actuals-analysis.js +250 -0
  52. package/dist/application/target-actuals-analysis.js.map +1 -0
  53. package/dist/application/target-actuals-mutation.d.ts +28 -0
  54. package/dist/application/target-actuals-mutation.d.ts.map +1 -0
  55. package/dist/application/target-actuals-mutation.js +404 -0
  56. package/dist/application/target-actuals-mutation.js.map +1 -0
  57. package/dist/application/target-actuals-write.d.ts +7 -0
  58. package/dist/application/target-actuals-write.d.ts.map +1 -0
  59. package/dist/application/target-actuals-write.js +37 -0
  60. package/dist/application/target-actuals-write.js.map +1 -0
  61. package/dist/application/target-governance-init.d.ts +3 -3
  62. package/dist/application/target-governance-init.d.ts.map +1 -1
  63. package/dist/application/target-governance-init.js +20 -10
  64. package/dist/application/target-governance-init.js.map +1 -1
  65. package/dist/application/target-governance-project.d.ts +4 -4
  66. package/dist/application/target-governance-project.d.ts.map +1 -1
  67. package/dist/application/target-governance-project.js +4 -2
  68. package/dist/application/target-governance-project.js.map +1 -1
  69. package/dist/application/target-governance-write.d.ts +8 -0
  70. package/dist/application/target-governance-write.d.ts.map +1 -1
  71. package/dist/application/target-governance-write.js +1 -1
  72. package/dist/application/target-governance-write.js.map +1 -1
  73. package/dist/application/target-mutate.d.ts +3 -1
  74. package/dist/application/target-mutate.d.ts.map +1 -1
  75. package/dist/application/target-mutate.js +34 -2
  76. package/dist/application/target-mutate.js.map +1 -1
  77. package/dist/application/target-project-history.d.ts +18 -0
  78. package/dist/application/target-project-history.d.ts.map +1 -0
  79. package/dist/application/target-project-history.js +279 -0
  80. package/dist/application/target-project-history.js.map +1 -0
  81. package/dist/application/target-temporal-analysis.d.ts +7 -1
  82. package/dist/application/target-temporal-analysis.d.ts.map +1 -1
  83. package/dist/application/target-temporal-analysis.js +10 -8
  84. package/dist/application/target-temporal-analysis.js.map +1 -1
  85. package/dist/application/target-temporal-input.d.ts +6 -4
  86. package/dist/application/target-temporal-input.d.ts.map +1 -1
  87. package/dist/application/target-temporal-input.js +10 -1
  88. package/dist/application/target-temporal-input.js.map +1 -1
  89. package/dist/application/target-unit-migration-candidate.d.ts +2 -2
  90. package/dist/application/target-unit-migration-candidate.d.ts.map +1 -1
  91. package/dist/application/target-unit-migration-candidate.js +21 -10
  92. package/dist/application/target-unit-migration-candidate.js.map +1 -1
  93. package/dist/application/target-unit-migration-request.d.ts +4 -4
  94. package/dist/application/target-unit-migration-request.d.ts.map +1 -1
  95. package/dist/application/target-unit-migration-request.js +6 -4
  96. package/dist/application/target-unit-migration-request.js.map +1 -1
  97. package/dist/application/target-unit-migration-result.d.ts +5 -5
  98. package/dist/application/target-unit-migration-result.d.ts.map +1 -1
  99. package/dist/application/target-unit-migration-result.js +1 -1
  100. package/dist/application/target-unit-migration-result.js.map +1 -1
  101. package/dist/application/target-velocity-observation.d.ts +11 -0
  102. package/dist/application/target-velocity-observation.d.ts.map +1 -0
  103. package/dist/application/target-velocity-observation.js +201 -0
  104. package/dist/application/target-velocity-observation.js.map +1 -0
  105. package/dist/application/unit-migration.d.ts +2 -2
  106. package/dist/application/unit-migration.d.ts.map +1 -1
  107. package/dist/application/unit-migration.js +2 -2
  108. package/dist/cli.js +309 -45
  109. package/dist/cli.js.map +1 -1
  110. package/dist/command/actuals-discovery.d.ts +26 -0
  111. package/dist/command/actuals-discovery.d.ts.map +1 -0
  112. package/dist/command/actuals-discovery.js +328 -0
  113. package/dist/command/actuals-discovery.js.map +1 -0
  114. package/dist/command/actuals-usage.d.ts +22 -0
  115. package/dist/command/actuals-usage.d.ts.map +1 -0
  116. package/dist/command/actuals-usage.js +122 -0
  117. package/dist/command/actuals-usage.js.map +1 -0
  118. package/dist/formatter/source-formatter.d.ts +3 -3
  119. package/dist/formatter/source-formatter.d.ts.map +1 -1
  120. package/dist/formatter/source-formatter.js +53 -5
  121. package/dist/formatter/source-formatter.js.map +1 -1
  122. package/dist/formatter/target-source-formatter.d.ts +2 -1
  123. package/dist/formatter/target-source-formatter.d.ts.map +1 -1
  124. package/dist/formatter/target-source-formatter.js +18 -2
  125. package/dist/formatter/target-source-formatter.js.map +1 -1
  126. package/dist/governance/authority.d.ts +7 -3
  127. package/dist/governance/authority.d.ts.map +1 -1
  128. package/dist/governance/authority.js.map +1 -1
  129. package/dist/governance/source.d.ts +2 -2
  130. package/dist/governance/source.d.ts.map +1 -1
  131. package/dist/governance/source.js.map +1 -1
  132. package/dist/help/actuals-guide.d.ts +10 -0
  133. package/dist/help/actuals-guide.d.ts.map +1 -0
  134. package/dist/help/actuals-guide.js +23 -0
  135. package/dist/help/actuals-guide.js.map +1 -0
  136. package/dist/help/guide.d.ts +1 -1
  137. package/dist/help/guide.d.ts.map +1 -1
  138. package/dist/help/registry.d.ts.map +1 -1
  139. package/dist/help/registry.js +97 -7
  140. package/dist/help/registry.js.map +1 -1
  141. package/dist/history/git-probe.d.ts +56 -0
  142. package/dist/history/git-probe.d.ts.map +1 -0
  143. package/dist/history/git-probe.js +574 -0
  144. package/dist/history/git-probe.js.map +1 -0
  145. package/dist/history/project-history.d.ts +112 -0
  146. package/dist/history/project-history.d.ts.map +1 -0
  147. package/dist/history/project-history.js +786 -0
  148. package/dist/history/project-history.js.map +1 -0
  149. package/dist/history/velocity-observation.d.ts +69 -0
  150. package/dist/history/velocity-observation.d.ts.map +1 -0
  151. package/dist/history/velocity-observation.js +604 -0
  152. package/dist/history/velocity-observation.js.map +1 -0
  153. package/dist/index.d.ts +21 -10
  154. package/dist/index.d.ts.map +1 -1
  155. package/dist/index.js +10 -5
  156. package/dist/index.js.map +1 -1
  157. package/dist/io/target-safe-write.d.ts +4 -1
  158. package/dist/io/target-safe-write.d.ts.map +1 -1
  159. package/dist/io/target-safe-write.js +19 -1
  160. package/dist/io/target-safe-write.js.map +1 -1
  161. package/dist/migration/conversion.d.ts +1 -1
  162. package/dist/migration/conversion.d.ts.map +1 -1
  163. package/dist/migration/grammar-boundary.d.ts +1 -1
  164. package/dist/migration/grammar-boundary.d.ts.map +1 -1
  165. package/dist/migration/grammar-boundary.js +11 -3
  166. package/dist/migration/grammar-boundary.js.map +1 -1
  167. package/dist/migration/request.d.ts +5 -5
  168. package/dist/migration/request.d.ts.map +1 -1
  169. package/dist/migration/request.js +15 -2
  170. package/dist/migration/request.js.map +1 -1
  171. package/dist/model/calendar.d.ts +2 -0
  172. package/dist/model/calendar.d.ts.map +1 -1
  173. package/dist/model/calendar.js +19 -0
  174. package/dist/model/calendar.js.map +1 -1
  175. package/dist/model/declaration-fields.d.ts +8 -0
  176. package/dist/model/declaration-fields.d.ts.map +1 -1
  177. package/dist/model/declaration-fields.js +13 -0
  178. package/dist/model/declaration-fields.js.map +1 -1
  179. package/dist/model/exact-person-hours-source.d.ts +2 -0
  180. package/dist/model/exact-person-hours-source.d.ts.map +1 -0
  181. package/dist/model/exact-person-hours-source.js +10 -0
  182. package/dist/model/exact-person-hours-source.js.map +1 -0
  183. package/dist/model/syntax.d.ts +23 -8
  184. package/dist/model/syntax.d.ts.map +1 -1
  185. package/dist/model/syntax.js.map +1 -1
  186. package/dist/mutation/actuals.d.ts +17 -0
  187. package/dist/mutation/actuals.d.ts.map +1 -0
  188. package/dist/mutation/actuals.js +90 -0
  189. package/dist/mutation/actuals.js.map +1 -0
  190. package/dist/mutation/advance.d.ts +9 -3
  191. package/dist/mutation/advance.d.ts.map +1 -1
  192. package/dist/mutation/advance.js +41 -12
  193. package/dist/mutation/advance.js.map +1 -1
  194. package/dist/mutation/entity-editor.d.ts +2 -2
  195. package/dist/mutation/entity-editor.d.ts.map +1 -1
  196. package/dist/mutation/entity-editor.js.map +1 -1
  197. package/dist/mutation/project.d.ts +2 -0
  198. package/dist/mutation/project.d.ts.map +1 -1
  199. package/dist/mutation/project.js +13 -4
  200. package/dist/mutation/project.js.map +1 -1
  201. package/dist/mutation/source.d.ts +3 -3
  202. package/dist/mutation/source.d.ts.map +1 -1
  203. package/dist/mutation/source.js.map +1 -1
  204. package/dist/parser/document-parser.d.ts +8 -1
  205. package/dist/parser/document-parser.d.ts.map +1 -1
  206. package/dist/parser/document-parser.js +151 -23
  207. package/dist/parser/document-parser.js.map +1 -1
  208. package/dist/recommendation/override-types.d.ts +2 -2
  209. package/dist/recommendation/override.d.ts +2 -2
  210. package/dist/recommendation/override.d.ts.map +1 -1
  211. package/dist/recommendation/override.js +2 -2
  212. package/dist/recommendation/override.js.map +1 -1
  213. package/dist/schema/registry.d.ts +36 -0
  214. package/dist/schema/registry.d.ts.map +1 -0
  215. package/dist/schema/registry.js +156 -0
  216. package/dist/schema/registry.js.map +1 -0
  217. package/dist/semantic/target-validator.d.ts +13 -2
  218. package/dist/semantic/target-validator.d.ts.map +1 -1
  219. package/dist/semantic/target-validator.js +46 -2
  220. package/dist/semantic/target-validator.js.map +1 -1
  221. package/dist/semantic/validator.d.ts +4 -1
  222. package/dist/semantic/validator.d.ts.map +1 -1
  223. package/dist/semantic/validator.js +152 -6
  224. package/dist/semantic/validator.js.map +1 -1
  225. package/dist/version.d.ts +1 -1
  226. package/dist/version.js +1 -1
  227. package/package.json +7 -3
  228. package/schemas/Perttool.AgentGuidanceResult.v1.schema.json +152 -0
  229. package/schemas/Perttool.AnalysisResult.v4.schema.json +124 -0
  230. package/schemas/Perttool.CheckResult.v3.schema.json +159 -0
  231. package/schemas/Perttool.CliError.v1.schema.json +83 -0
  232. package/schemas/Perttool.CommandHelpResult.v1.schema.json +165 -0
  233. package/schemas/Perttool.Common.v1.schema.json +508 -0
  234. package/schemas/Perttool.ExportResult.v1.schema.json +96 -0
  235. package/schemas/Perttool.FormatResult.v1.schema.json +82 -0
  236. package/schemas/Perttool.GuideResult.v1.schema.json +104 -0
  237. package/schemas/Perttool.ImportResult.v1.schema.json +111 -0
  238. package/schemas/Perttool.InitResult.v1.schema.json +70 -0
  239. package/schemas/Perttool.MutationResult.v3.schema.json +143 -0
  240. package/schemas/Perttool.NextResult.v5.schema.json +139 -0
  241. package/schemas/Perttool.OverrideDecision.v1.schema.json +170 -0
  242. package/schemas/Perttool.ProjectHistoryResult.v1.schema.json +139 -0
  243. package/schemas/Perttool.ProjectResult.v3.schema.json +144 -0
  244. package/schemas/Perttool.SchemaResult.v1.schema.json +84 -0
  245. package/schemas/Perttool.UnitMigrationResult.v3.schema.json +205 -0
  246. package/schemas/Perttool.VelocityObservationResult.v1.schema.json +102 -0
@@ -0,0 +1,328 @@
1
+ import { TOOL_VERSION } from "../version.js";
2
+ import { TARGET_GOVERNANCE_COMMAND_REGISTRY, getTargetGovernanceCommandDiscovery, renderTargetGovernanceCommandHelpResult, serializeTargetGovernanceCommandHelpResult, targetGovernanceCommandDescriptorToJson, targetGovernanceCommandHelpResultToJson, } from "./target-governance-discovery.js";
3
+ function valueOption(name, valueType, config = {}) {
4
+ return Object.freeze({
5
+ name,
6
+ kind: "value",
7
+ valueType,
8
+ required: config.required ?? false,
9
+ repeatable: config.repeatable ?? false,
10
+ defaultValue: null,
11
+ enumValues: Object.freeze([...(config.enumValues ?? [])]),
12
+ conflicts: Object.freeze([]),
13
+ requires: Object.freeze([]),
14
+ sharedGroup: config.sharedGroup ?? null,
15
+ description: config.description ?? null,
16
+ spelling: Object.freeze({
17
+ cli: `--${name}`,
18
+ dsl: null,
19
+ json: name.replaceAll("-", "_"),
20
+ }),
21
+ });
22
+ }
23
+ const governanceOptions = Object.freeze([
24
+ valueOption("actor", "principal-id", {
25
+ sharedGroup: "governance",
26
+ description: "Caller principal evaluated against the pre-change owner and delegates.",
27
+ }),
28
+ valueOption("accepted-by-owner", "principal-id", {
29
+ repeatable: true,
30
+ sharedGroup: "governance",
31
+ description: "Caller assertion that the named effective owner was consulted.",
32
+ }),
33
+ ]);
34
+ function contract6Schemas(schemas) {
35
+ return Object.freeze(schemas.map((schema) => schema === "Perttool.CheckResult.v2"
36
+ ? "Perttool.CheckResult.v3"
37
+ : schema === "Perttool.AnalysisResult.v3"
38
+ ? "Perttool.AnalysisResult.v4"
39
+ : schema === "Perttool.NextResult.v4"
40
+ ? "Perttool.NextResult.v5"
41
+ : schema === "Perttool.MutationResult.v2"
42
+ ? "Perttool.MutationResult.v3"
43
+ : schema === "Perttool.UnitMigrationResult.v2"
44
+ ? "Perttool.UnitMigrationResult.v3"
45
+ : schema));
46
+ }
47
+ function contract6Descriptor(descriptor) {
48
+ const lifecycleFinish = descriptor.operation === "task.finish";
49
+ const lifecycleOptions = lifecycleFinish
50
+ ? [
51
+ valueOption("at", "date-time"),
52
+ valueOption("event-id", "identifier"),
53
+ valueOption("active-time", "hours"),
54
+ valueOption("effort", "person-hours"),
55
+ ...governanceOptions,
56
+ ]
57
+ : [];
58
+ const projectionIndex = descriptor.options.findIndex(({ sharedGroup }) => sharedGroup === "preview" ||
59
+ sharedGroup === "write" ||
60
+ sharedGroup === "diagnostics" ||
61
+ sharedGroup === "result");
62
+ const options = lifecycleOptions.length === 0
63
+ ? descriptor.options
64
+ : Object.freeze(projectionIndex < 0
65
+ ? [...descriptor.options, ...lifecycleOptions]
66
+ : [
67
+ ...descriptor.options.slice(0, projectionIndex),
68
+ ...lifecycleOptions,
69
+ ...descriptor.options.slice(projectionIndex),
70
+ ]);
71
+ return Object.freeze({
72
+ ...descriptor,
73
+ contractVersion: 6,
74
+ options,
75
+ resultSchemas: contract6Schemas(descriptor.resultSchemas),
76
+ });
77
+ }
78
+ const base = TARGET_GOVERNANCE_COMMAND_REGISTRY.map(contract6Descriptor);
79
+ const finish = base.find(({ operation }) => operation === "task.finish");
80
+ const projectShow = base.find(({ operation }) => operation === "project.show");
81
+ const help = base.find(({ operation }) => operation === "help");
82
+ if (finish === undefined || projectShow === undefined || help === undefined) {
83
+ throw new Error("Contract 6 descriptor bases are unavailable");
84
+ }
85
+ const finishBase = finish;
86
+ const projectShowBase = projectShow;
87
+ const helpBase = help;
88
+ const schemaDescriptor = Object.freeze({
89
+ ...helpBase,
90
+ path: Object.freeze(["schema"]),
91
+ operation: "schema",
92
+ summary: "Lists and resolves bundled JSON Schema artifacts.",
93
+ operands: Object.freeze([
94
+ Object.freeze({
95
+ name: "schema-id",
96
+ valueType: "schema-id",
97
+ required: false,
98
+ position: 0,
99
+ }),
100
+ ]),
101
+ resultSchemas: Object.freeze([
102
+ "Perttool.SchemaResult.v1",
103
+ "Perttool.CliError.v1",
104
+ ]),
105
+ exitStatuses: Object.freeze([
106
+ Object.freeze({
107
+ code: 0,
108
+ meaning: "Successful JSON Schema lookup.",
109
+ }),
110
+ Object.freeze({
111
+ code: 1,
112
+ meaning: "Unknown JSON Schema identity.",
113
+ }),
114
+ Object.freeze({
115
+ code: 2,
116
+ meaning: "CLI usage error.",
117
+ }),
118
+ Object.freeze({
119
+ code: 70,
120
+ meaning: "Internal invariant or programmer error.",
121
+ }),
122
+ ]),
123
+ examples: Object.freeze([
124
+ Object.freeze({
125
+ id: "catalog",
126
+ invocation: "perttool schema --format json",
127
+ summary: "Return the complete bundled result-schema catalog.",
128
+ }),
129
+ Object.freeze({
130
+ id: "result",
131
+ invocation: "perttool schema Perttool.NextResult.v5 --format json",
132
+ summary: "Return one bundled JSON Schema artifact.",
133
+ }),
134
+ ]),
135
+ });
136
+ function lifecycleDescriptor(action) {
137
+ const domainOptions = [
138
+ valueOption("at", "date-time", { required: true }),
139
+ valueOption("event-id", "identifier"),
140
+ ...(action === "suspend"
141
+ ? [valueOption("reason", "text")]
142
+ : []),
143
+ ...governanceOptions,
144
+ ];
145
+ const projectionOptions = finishBase.options.filter(({ sharedGroup, name }) => sharedGroup !== "governance" &&
146
+ name !== "at" &&
147
+ name !== "event-id" &&
148
+ name !== "active-time" &&
149
+ name !== "effort");
150
+ return Object.freeze({
151
+ ...finishBase,
152
+ path: Object.freeze(["task", action]),
153
+ operation: `task.${action}`,
154
+ summary: action === "start"
155
+ ? "Previews starting one task with explicit evidence."
156
+ : action === "suspend"
157
+ ? "Previews suspending one active task with explicit evidence."
158
+ : "Previews resuming one suspended task with explicit evidence.",
159
+ options: Object.freeze([...domainOptions, ...projectionOptions]),
160
+ resultSchemas: Object.freeze([
161
+ "Perttool.MutationResult.v3",
162
+ "Perttool.CliError.v1",
163
+ ]),
164
+ examples: Object.freeze([
165
+ Object.freeze({
166
+ id: action,
167
+ invocation: `perttool task ${action} plan.pert BUILD --at 2026-07-29T09:00:00+09:00 --diff`,
168
+ summary: `Preview task ${action} with an explicit event time.`,
169
+ }),
170
+ ]),
171
+ });
172
+ }
173
+ const fileOperand = Object.freeze({
174
+ name: "file",
175
+ valueType: "path",
176
+ required: true,
177
+ position: 0,
178
+ });
179
+ function readDescriptor(action) {
180
+ const observation = action === "observe-velocity";
181
+ const projectionOptions = projectShowBase.options.filter(({ sharedGroup }) => sharedGroup === "diagnostics" || sharedGroup === "result");
182
+ return Object.freeze({
183
+ ...projectShowBase,
184
+ path: Object.freeze(["project", action]),
185
+ operation: `project.${action}`,
186
+ summary: observation
187
+ ? "Observes exact project performance without changing declared velocity."
188
+ : "Reconstructs task actuals from first-parent Git history.",
189
+ operands: Object.freeze([fileOperand]),
190
+ options: Object.freeze([
191
+ valueOption("rev", "git-revision"),
192
+ valueOption("task", "task-id", { repeatable: true }),
193
+ ...(observation
194
+ ? [
195
+ valueOption("evidence", "evidence-class", {
196
+ enumValues: ["declared", "git-recorded", "all"],
197
+ }),
198
+ ]
199
+ : []),
200
+ ...projectionOptions,
201
+ ]),
202
+ stdin: Object.freeze({
203
+ document: false,
204
+ artifact: false,
205
+ request: false,
206
+ mutuallyExclusive: false,
207
+ }),
208
+ resultSchemas: Object.freeze([
209
+ observation
210
+ ? "Perttool.VelocityObservationResult.v1"
211
+ : "Perttool.ProjectHistoryResult.v1",
212
+ "Perttool.CliError.v1",
213
+ ]),
214
+ examples: Object.freeze([
215
+ Object.freeze({
216
+ id: action,
217
+ invocation: `perttool project ${action} plan.pert --task BUILD --format json`,
218
+ summary: observation
219
+ ? "Observe declared actuals for one task."
220
+ : "Inspect first-parent history for one task.",
221
+ }),
222
+ ]),
223
+ });
224
+ }
225
+ export const ACTUALS_COMMAND_REGISTRY = Object.freeze(base.flatMap((descriptor) => {
226
+ if (descriptor.operation === "help") {
227
+ return [descriptor, schemaDescriptor];
228
+ }
229
+ if (descriptor.operation === "project.show") {
230
+ return [
231
+ descriptor,
232
+ readDescriptor("history"),
233
+ readDescriptor("observe-velocity"),
234
+ ];
235
+ }
236
+ if (descriptor.operation === "task.finish") {
237
+ return [
238
+ lifecycleDescriptor("start"),
239
+ lifecycleDescriptor("suspend"),
240
+ lifecycleDescriptor("resume"),
241
+ descriptor,
242
+ ];
243
+ }
244
+ return [descriptor];
245
+ }));
246
+ const baseCatalog = getTargetGovernanceCommandDiscovery({
247
+ resource: null,
248
+ action: null,
249
+ });
250
+ if (!baseCatalog.ok) {
251
+ throw new Error("Contract 5 command catalog is unavailable");
252
+ }
253
+ const resourceSummaries = Object.freeze(baseCatalog.resources.map((resource) => Object.freeze({
254
+ ...resource,
255
+ actions: Object.freeze(ACTUALS_COMMAND_REGISTRY
256
+ .filter(({ path }) => path.length === 2 && path[0] === resource.name)
257
+ .map(({ path }) => path[1])
258
+ .sort()),
259
+ })));
260
+ const commandsByPath = new Map(ACTUALS_COMMAND_REGISTRY.map((descriptor) => [
261
+ descriptor.path.join("\0"),
262
+ descriptor,
263
+ ]));
264
+ function helpDiagnostic(code, message, query) {
265
+ return Object.freeze({
266
+ code,
267
+ severity: "error",
268
+ message,
269
+ data: Object.freeze({
270
+ resource: query.resource,
271
+ action: query.action,
272
+ }),
273
+ });
274
+ }
275
+ function helpResult(query, resources, commands, diagnostics) {
276
+ return Object.freeze({
277
+ schemaVersion: "Perttool.CommandHelpResult.v1",
278
+ cliContractVersion: 6,
279
+ toolVersion: TOOL_VERSION,
280
+ operation: "help",
281
+ ok: diagnostics.length === 0,
282
+ query: Object.freeze({ ...query }),
283
+ resources: Object.freeze([...resources]),
284
+ commands: Object.freeze([...commands]),
285
+ diagnostics: Object.freeze([...diagnostics]),
286
+ });
287
+ }
288
+ export function getActualsCommandDiscovery(query) {
289
+ if (query.resource === null) {
290
+ return query.action === null
291
+ ? helpResult(query, resourceSummaries, ACTUALS_COMMAND_REGISTRY, [])
292
+ : helpResult(query, [], [], [helpDiagnostic("PTHLP-002", "a command action requires a resource", query)]);
293
+ }
294
+ if (query.action === null) {
295
+ const topLevel = commandsByPath.get(query.resource);
296
+ if (topLevel !== undefined && topLevel.path.length === 1) {
297
+ return helpResult(query, [], [topLevel], []);
298
+ }
299
+ const resource = resourceSummaries.find(({ name }) => name === query.resource);
300
+ return resource === undefined
301
+ ? helpResult(query, [], [], [helpDiagnostic("PTHLP-002", `unknown command resource or top-level command: ${query.resource}`, query)])
302
+ : helpResult(query, [resource], ACTUALS_COMMAND_REGISTRY.filter(({ path }) => path.length === 2 && path[0] === query.resource), []);
303
+ }
304
+ const resource = resourceSummaries.find(({ name }) => name === query.resource);
305
+ if (resource === undefined) {
306
+ return helpResult(query, [], [], [helpDiagnostic("PTHLP-002", `unknown command resource: ${query.resource}`, query)]);
307
+ }
308
+ const command = commandsByPath.get(`${query.resource}\0${query.action}`);
309
+ return command === undefined
310
+ ? helpResult(query, [], [], [helpDiagnostic("PTHLP-003", `unknown action ${query.action} for command resource ${query.resource}`, query)])
311
+ : helpResult(query, [resource], [command], []);
312
+ }
313
+ export function actualsCommandDescriptorToJson(descriptor) {
314
+ return targetGovernanceCommandDescriptorToJson(descriptor);
315
+ }
316
+ export function actualsCommandRegistryToJson() {
317
+ return ACTUALS_COMMAND_REGISTRY.map(actualsCommandDescriptorToJson);
318
+ }
319
+ export function serializeActualsCommandHelpResult(value) {
320
+ return serializeTargetGovernanceCommandHelpResult(value);
321
+ }
322
+ export function actualsCommandHelpResultToJson(value) {
323
+ return targetGovernanceCommandHelpResultToJson(value);
324
+ }
325
+ export function renderActualsCommandHelpResult(value) {
326
+ return renderTargetGovernanceCommandHelpResult(value).replace("perttool command catalog (CLI Contract 5)", "perttool command catalog (CLI Contract 6)");
327
+ }
328
+ //# sourceMappingURL=actuals-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actuals-discovery.js","sourceRoot":"","sources":["../../src/command/actuals-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { GovernanceRequestInput } from "../governance/types.js";
2
+ import type { CommandOptionOccurrence, CommandUsageError } from "./usage.js";
3
+ import { renderCommandUsageError } from "./usage.js";
4
+ import { type ActualsCommandDescriptor } from "./actuals-discovery.js";
5
+ export interface ActualsValidCommandInvocation {
6
+ readonly ok: true;
7
+ readonly descriptor: ActualsCommandDescriptor;
8
+ readonly helpAlias: boolean;
9
+ readonly operands: readonly string[];
10
+ readonly options: readonly CommandOptionOccurrence[];
11
+ }
12
+ export interface ActualsInvalidCommandInvocation {
13
+ readonly ok: false;
14
+ readonly error: CommandUsageError;
15
+ }
16
+ export type ActualsCommandInvocationValidation = ActualsValidCommandInvocation | ActualsInvalidCommandInvocation;
17
+ export declare function validateActualsCommandInvocation(argv: readonly string[]): ActualsCommandInvocationValidation;
18
+ export declare function governanceRequestFromActualsInvocation(invocation: ActualsValidCommandInvocation): GovernanceRequestInput;
19
+ export declare function actualsCommandUsageErrorToJson(error: CommandUsageError): Readonly<Record<string, unknown>>;
20
+ export declare function serializeActualsCommandUsageError(error: CommandUsageError): string;
21
+ export { renderCommandUsageError as renderActualsCommandUsageError };
22
+ //# sourceMappingURL=actuals-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actuals-usage.d.ts","sourceRoot":"","sources":["../../src/command/actuals-usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAGV,uBAAuB,EACvB,iBAAiB,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAEL,uBAAuB,EAExB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,wBAAwB,CAAC;AAYhC,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACtD;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,MAAM,kCAAkC,GAC1C,6BAA6B,GAC7B,+BAA+B,CAAC;AAoIpC,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,kCAAkC,CAYpC;AAED,wBAAgB,sCAAsC,CACpD,UAAU,EAAE,6BAA6B,GACxC,sBAAsB,CAwBxB;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,iBAAiB,GACvB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAEnC;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAER;AAED,OAAO,EAAE,uBAAuB,IAAI,8BAA8B,EAAE,CAAC"}
@@ -0,0 +1,122 @@
1
+ import { commandUsageErrorToJsonForContract, renderCommandUsageError, validateCommandInvocationAgainstRegistry, } from "./usage.js";
2
+ import { ACTUALS_COMMAND_REGISTRY, } from "./actuals-discovery.js";
3
+ const principalPattern = /^[A-Za-z][A-Za-z0-9_-]*$/;
4
+ const principalListPattern = /^\[[ \t]*(?:[A-Za-z][A-Za-z0-9_-]*(?:[ \t]*,[ \t]*[A-Za-z][A-Za-z0-9_-]*)*)?[ \t]*\]$/;
5
+ const projectGovernanceOptionNames = new Set([
6
+ "goal-owner",
7
+ "goal-delegates",
8
+ "dag-owner",
9
+ "dag-delegates",
10
+ ]);
11
+ function helpTarget(descriptor) {
12
+ return descriptor.path.length === 1
13
+ ? Object.freeze({
14
+ resource: descriptor.path[0],
15
+ action: null,
16
+ })
17
+ : Object.freeze({
18
+ resource: descriptor.path[0],
19
+ action: descriptor.path[1],
20
+ });
21
+ }
22
+ function invalid(descriptor, kind, message, token) {
23
+ return {
24
+ ok: false,
25
+ error: Object.freeze({
26
+ code: "PTCLI-001",
27
+ kind,
28
+ message,
29
+ operation: descriptor.operation,
30
+ token,
31
+ helpTarget: helpTarget(descriptor),
32
+ suggestion: null,
33
+ }),
34
+ };
35
+ }
36
+ function principalList(value) {
37
+ if (!principalListPattern.test(value))
38
+ return null;
39
+ const interior = value.slice(1, -1).trim();
40
+ if (interior === "")
41
+ return Object.freeze([]);
42
+ const principals = interior.split(",").map((item) => item.trim());
43
+ return new Set(principals).size === principals.length
44
+ ? Object.freeze(principals)
45
+ : null;
46
+ }
47
+ function validateValues(invocation) {
48
+ const optionByName = new Map(invocation.descriptor.options.map((option) => [
49
+ option.name,
50
+ option,
51
+ ]));
52
+ const occurrencesByName = new Map();
53
+ const seenAcceptedOwners = new Set();
54
+ for (const occurrence of invocation.options) {
55
+ const entries = occurrencesByName.get(occurrence.name) ?? [];
56
+ entries.push(occurrence);
57
+ occurrencesByName.set(occurrence.name, entries);
58
+ const descriptor = optionByName.get(occurrence.name);
59
+ if (descriptor === undefined || occurrence.value === null)
60
+ continue;
61
+ if (descriptor.valueType === "principal-id" &&
62
+ !principalPattern.test(occurrence.value)) {
63
+ return invalid(invocation.descriptor, "invalid_option_value", `option --${occurrence.name} requires an ASCII principal ID`, occurrence.value);
64
+ }
65
+ if (occurrence.name === "accepted-by-owner") {
66
+ if (seenAcceptedOwners.has(occurrence.value)) {
67
+ return invalid(invocation.descriptor, "duplicate_option", `option --accepted-by-owner repeats principal ${occurrence.value}`, occurrence.value);
68
+ }
69
+ seenAcceptedOwners.add(occurrence.value);
70
+ }
71
+ if (descriptor.valueType === "principal-list" &&
72
+ principalList(occurrence.value) === null) {
73
+ return invalid(invocation.descriptor, "invalid_option_value", `option --${occurrence.name} requires a duplicate-free bracketed principal list`, occurrence.value);
74
+ }
75
+ }
76
+ if (invocation.descriptor.operation === "project.init" &&
77
+ invocation.options.some(({ name }) => projectGovernanceOptionNames.has(name))) {
78
+ const version = occurrencesByName.get("version")?.[0];
79
+ if (version !== undefined &&
80
+ version.value !== "4" &&
81
+ version.value !== "5") {
82
+ return invalid(invocation.descriptor, "option_conflict", "project init governance options conflict with an explicit version other than 4 or 5", version.value);
83
+ }
84
+ }
85
+ const selectedTasks = occurrencesByName.get("task")?.map(({ value }) => value) ?? [];
86
+ if (new Set(selectedTasks).size !== selectedTasks.length) {
87
+ return invalid(invocation.descriptor, "duplicate_option", "option --task repeats a task ID", selectedTasks.find((value, index) => selectedTasks.indexOf(value) !== index) ?? null);
88
+ }
89
+ return invocation;
90
+ }
91
+ export function validateActualsCommandInvocation(argv) {
92
+ const validation = validateCommandInvocationAgainstRegistry(argv, ACTUALS_COMMAND_REGISTRY);
93
+ if (!validation.ok)
94
+ return validation;
95
+ return validateValues({
96
+ ...validation,
97
+ descriptor: validation.descriptor,
98
+ });
99
+ }
100
+ export function governanceRequestFromActualsInvocation(invocation) {
101
+ if (!invocation.descriptor.options.some(({ sharedGroup }) => sharedGroup === "governance")) {
102
+ throw new TypeError(`${invocation.descriptor.operation} has no governance assertion group`);
103
+ }
104
+ const actor = invocation.options.find(({ name }) => name === "actor")?.value ?? null;
105
+ const acceptedByOwner = invocation.options
106
+ .filter(({ name }) => name === "accepted-by-owner")
107
+ .map(({ value }) => value);
108
+ const persist = invocation.options.some(({ name }) => name === "write" || name === "out");
109
+ return Object.freeze({
110
+ intent: persist ? "persist" : "preview",
111
+ actor,
112
+ acceptedByOwner: Object.freeze(acceptedByOwner),
113
+ });
114
+ }
115
+ export function actualsCommandUsageErrorToJson(error) {
116
+ return commandUsageErrorToJsonForContract(error, 6);
117
+ }
118
+ export function serializeActualsCommandUsageError(error) {
119
+ return `${JSON.stringify(actualsCommandUsageErrorToJson(error), null, 2)}\n`;
120
+ }
121
+ export { renderCommandUsageError as renderActualsCommandUsageError };
122
+ //# sourceMappingURL=actuals-usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actuals-usage.js","sourceRoot":"","sources":["../../src/command/actuals-usage.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { type CheckOptions } from "../application/check.js";
2
2
  import type { Diagnostic } from "../model/diagnostics.js";
3
- import type { DeclarationKind, DocumentNode } from "../model/syntax.js";
3
+ import type { DeclarationKind, DocumentNode, TargetDeclarationKind } from "../model/syntax.js";
4
4
  import { type TextEdit } from "../mutation/text-edits.js";
5
5
  export type { TextEdit } from "../mutation/text-edits.js";
6
6
  export interface FormatOptions extends CheckOptions {
@@ -16,13 +16,13 @@ export interface FormatResult {
16
16
  }
17
17
  export interface FormatValidation {
18
18
  readonly ok: boolean;
19
- readonly document: DocumentNode | null;
19
+ readonly document: DocumentNode<TargetDeclarationKind> | null;
20
20
  readonly documentId: string | null;
21
21
  readonly diagnostics: readonly Diagnostic[];
22
22
  readonly diagnosticsTruncated: boolean;
23
23
  }
24
24
  export interface SourceFormatProfile {
25
- readonly fieldOrder: Readonly<Record<DeclarationKind, readonly string[]>>;
25
+ readonly fieldOrder: Readonly<Record<DeclarationKind, readonly string[]>> & Partial<Readonly<Record<"work_event", readonly string[]>>>;
26
26
  }
27
27
  export declare function formatValidatedSource(text: string, checked: FormatValidation, validateCandidate: (candidate: string) => FormatValidation, profile: SourceFormatProfile): FormatResult;
28
28
  export declare function formatDocument(text: string, options?: FormatOptions): FormatResult;
@@ -1 +1 @@
1
- {"version":3,"file":"source-formatter.d.ts","sourceRoot":"","sources":["../../src/formatter/source-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAI1D,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAOb,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,aAAc,SAAQ,YAAY;CAAG;AAEtD,MAAM,WAAW,YAAY;IAC3B,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,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,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;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;CAC3E;AAyKD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,EAC1D,OAAO,EAAE,mBAAmB,GAC3B,YAAY,CAoHd;AAgBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAOtF"}
1
+ {"version":3,"file":"source-formatter.d.ts","sourceRoot":"","sources":["../../src/formatter/source-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAU1D,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EASZ,qBAAqB,EAEtB,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAGL,KAAK,QAAQ,EACd,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,aAAc,SAAQ,YAAY;CAAG;AAEtD,MAAM,WAAW,YAAY;IAC3B,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,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,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;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;IAC9D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EACjB,QAAQ,CAAC,MAAM,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,GAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;CAChE;AAqOD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,gBAAgB,EACzB,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,gBAAgB,EAC1D,OAAO,EAAE,mBAAmB,GAC3B,YAAY,CAsHd;AAgBD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,CAOtF"}
@@ -1,6 +1,9 @@
1
1
  import { checkDocument } from "../application/check.js";
2
- import { TARGET_GRAMMAR_4_DECLARATION_FIELD_ORDER, } from "../model/declaration-fields.js";
2
+ import { canonicalizeEventDateTimeSourceToken, } from "../model/calendar.js";
3
+ import { canonicalizeExactPersonHoursSourceToken, } from "../model/exact-person-hours-source.js";
4
+ import { TARGET_GRAMMAR_5_DECLARATION_FIELD_ORDER, } from "../model/declaration-fields.js";
3
5
  import { serializeExactDurationSource, } from "../model/exact-duration-source.js";
6
+ import { rational } from "../model/rational.js";
4
7
  import { applyTextEdits, normalizeTextEdits, } from "../mutation/text-edits.js";
5
8
  const bareTagPattern = /^[A-Za-z][A-Za-z0-9_-]*$/;
6
9
  function splitPhysicalLines(text) {
@@ -80,6 +83,34 @@ function isDurationFractionValue(value) {
80
83
  function isExactDurationValue(value) {
81
84
  return isDurationValue(value) || isDurationFractionValue(value);
82
85
  }
86
+ function isPersonHoursValue(value) {
87
+ return (typeof value === "object" &&
88
+ value !== null &&
89
+ "digits" in value &&
90
+ typeof value.digits === "bigint" &&
91
+ "scale" in value &&
92
+ typeof value.scale === "number" &&
93
+ "suffix" in value &&
94
+ value.suffix === "ph");
95
+ }
96
+ function isPersonHoursFractionValue(value) {
97
+ return (typeof value === "object" &&
98
+ value !== null &&
99
+ "numerator" in value &&
100
+ typeof value.numerator === "bigint" &&
101
+ "denominator" in value &&
102
+ typeof value.denominator === "bigint" &&
103
+ value.denominator > 0n &&
104
+ "suffix" in value &&
105
+ value.suffix === "ph");
106
+ }
107
+ function canonicalPersonHours(value) {
108
+ const canonical = canonicalizeExactPersonHoursSourceToken(value.text);
109
+ if (canonical === null) {
110
+ throw new Error("validated person-hours value is not canonicalizable");
111
+ }
112
+ return canonical;
113
+ }
83
114
  function isVelocityValue(value) {
84
115
  return (typeof value === "object" &&
85
116
  value !== null &&
@@ -94,14 +125,31 @@ function canonicalFieldValue(field) {
94
125
  if (["title", "description", "owner", "source", "blocked_reason", "reason"].includes(field.name)) {
95
126
  return typeof field.value === "string" ? JSON.stringify(field.value) : undefined;
96
127
  }
97
- if (["version", "capacity", "priority"].includes(field.name)) {
128
+ if (["version", "capacity", "priority", "model"].includes(field.name)) {
98
129
  return typeof field.value === "number" ? String(field.value) : undefined;
99
130
  }
100
- if (["duration", "critical_epsilon", "target_duration", "optimistic", "most_likely", "pessimistic"].includes(field.name)) {
131
+ if ([
132
+ "duration",
133
+ "critical_epsilon",
134
+ "target_duration",
135
+ "optimistic",
136
+ "most_likely",
137
+ "pessimistic",
138
+ "planned_value",
139
+ "active_time",
140
+ ].includes(field.name)) {
101
141
  return isExactDurationValue(field.value)
102
142
  ? canonicalDuration(field.value)
103
143
  : undefined;
104
144
  }
145
+ if (field.name === "effort" &&
146
+ (isPersonHoursValue(field.value) ||
147
+ isPersonHoursFractionValue(field.value))) {
148
+ return canonicalPersonHours(field.value);
149
+ }
150
+ if (field.name === "occurred_at" && typeof field.rawValue === "string") {
151
+ return canonicalizeEventDateTimeSourceToken(field.rawValue) ?? undefined;
152
+ }
105
153
  if (field.name === "velocity") {
106
154
  return isVelocityValue(field.value)
107
155
  ? `${canonicalDuration(field.value.points)}/${canonicalDuration(field.value.period)}`
@@ -155,7 +203,7 @@ export function formatValidatedSource(text, checked, validateCandidate, profile)
155
203
  const lineEnding = majorLineEnding(text);
156
204
  const edits = [];
157
205
  for (const declaration of checked.document.declarations) {
158
- const knownFields = new Set(profile.fieldOrder[declaration.kind]);
206
+ const knownFields = new Set(profile.fieldOrder[declaration.kind] ?? []);
159
207
  pushEdit(edits, text, {
160
208
  startOffset: declaration.headerSpan.start.offset,
161
209
  endOffset: declaration.headerSpan.end.offset,
@@ -258,6 +306,6 @@ function activeValidation(text, options) {
258
306
  };
259
307
  }
260
308
  export function formatDocument(text, options = {}) {
261
- return formatValidatedSource(text, activeValidation(text, options), (candidate) => activeValidation(candidate, options), { fieldOrder: TARGET_GRAMMAR_4_DECLARATION_FIELD_ORDER });
309
+ return formatValidatedSource(text, activeValidation(text, options), (candidate) => activeValidation(candidate, options), { fieldOrder: TARGET_GRAMMAR_5_DECLARATION_FIELD_ORDER });
262
310
  }
263
311
  //# sourceMappingURL=source-formatter.js.map