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.
- package/CHANGELOG.md +63 -1
- package/README.md +107 -34
- package/dist/actuals/lifecycle.d.ts +101 -0
- package/dist/actuals/lifecycle.d.ts.map +1 -0
- package/dist/actuals/lifecycle.js +329 -0
- package/dist/actuals/lifecycle.js.map +1 -0
- package/dist/actuals/source.d.ts +36 -0
- package/dist/actuals/source.d.ts.map +1 -0
- package/dist/actuals/source.js +119 -0
- package/dist/actuals/source.js.map +1 -0
- package/dist/analysis/temporal-deadline.d.ts +2 -2
- package/dist/analysis/temporal-deadline.d.ts.map +1 -1
- package/dist/analysis/temporal-deadline.js.map +1 -1
- package/dist/analysis/temporal-precedence.d.ts +2 -2
- package/dist/analysis/temporal-precedence.d.ts.map +1 -1
- package/dist/analysis/temporal-precedence.js +2 -0
- package/dist/analysis/temporal-precedence.js.map +1 -1
- package/dist/analysis/temporal-resource.d.ts +2 -2
- package/dist/analysis/temporal-resource.d.ts.map +1 -1
- package/dist/analysis/temporal-resource.js +2 -0
- package/dist/analysis/temporal-resource.js.map +1 -1
- package/dist/application/analyze.d.ts +1 -0
- package/dist/application/analyze.d.ts.map +1 -1
- package/dist/application/analyze.js +38 -29
- package/dist/application/analyze.js.map +1 -1
- package/dist/application/check.d.ts +3 -0
- package/dist/application/check.d.ts.map +1 -1
- package/dist/application/check.js +17 -1
- package/dist/application/check.js.map +1 -1
- package/dist/application/contract6-actuals.d.ts +24 -0
- package/dist/application/contract6-actuals.d.ts.map +1 -0
- package/dist/application/contract6-actuals.js +51 -0
- package/dist/application/contract6-actuals.js.map +1 -0
- package/dist/application/contract6-mutation.d.ts +18 -0
- package/dist/application/contract6-mutation.d.ts.map +1 -0
- package/dist/application/contract6-mutation.js +173 -0
- package/dist/application/contract6-mutation.js.map +1 -0
- package/dist/application/contract6-projection.d.ts +9 -0
- package/dist/application/contract6-projection.d.ts.map +1 -0
- package/dist/application/contract6-projection.js +105 -0
- package/dist/application/contract6-projection.js.map +1 -0
- package/dist/application/init.d.ts +1 -1
- package/dist/application/init.js +3 -3
- package/dist/application/project.js +2 -2
- package/dist/application/target-actuals-advance.d.ts +12 -0
- package/dist/application/target-actuals-advance.d.ts.map +1 -0
- package/dist/application/target-actuals-advance.js +113 -0
- package/dist/application/target-actuals-advance.js.map +1 -0
- package/dist/application/target-actuals-analysis.d.ts +76 -0
- package/dist/application/target-actuals-analysis.d.ts.map +1 -0
- package/dist/application/target-actuals-analysis.js +250 -0
- package/dist/application/target-actuals-analysis.js.map +1 -0
- package/dist/application/target-actuals-mutation.d.ts +28 -0
- package/dist/application/target-actuals-mutation.d.ts.map +1 -0
- package/dist/application/target-actuals-mutation.js +404 -0
- package/dist/application/target-actuals-mutation.js.map +1 -0
- package/dist/application/target-actuals-write.d.ts +7 -0
- package/dist/application/target-actuals-write.d.ts.map +1 -0
- package/dist/application/target-actuals-write.js +37 -0
- package/dist/application/target-actuals-write.js.map +1 -0
- package/dist/application/target-governance-init.d.ts +3 -3
- package/dist/application/target-governance-init.d.ts.map +1 -1
- package/dist/application/target-governance-init.js +20 -10
- package/dist/application/target-governance-init.js.map +1 -1
- package/dist/application/target-governance-project.d.ts +4 -4
- package/dist/application/target-governance-project.d.ts.map +1 -1
- package/dist/application/target-governance-project.js +4 -2
- package/dist/application/target-governance-project.js.map +1 -1
- package/dist/application/target-governance-write.d.ts +8 -0
- package/dist/application/target-governance-write.d.ts.map +1 -1
- package/dist/application/target-governance-write.js +1 -1
- package/dist/application/target-governance-write.js.map +1 -1
- package/dist/application/target-mutate.d.ts +3 -1
- package/dist/application/target-mutate.d.ts.map +1 -1
- package/dist/application/target-mutate.js +34 -2
- package/dist/application/target-mutate.js.map +1 -1
- package/dist/application/target-project-history.d.ts +18 -0
- package/dist/application/target-project-history.d.ts.map +1 -0
- package/dist/application/target-project-history.js +279 -0
- package/dist/application/target-project-history.js.map +1 -0
- package/dist/application/target-temporal-analysis.d.ts +7 -1
- package/dist/application/target-temporal-analysis.d.ts.map +1 -1
- package/dist/application/target-temporal-analysis.js +10 -8
- package/dist/application/target-temporal-analysis.js.map +1 -1
- package/dist/application/target-temporal-input.d.ts +6 -4
- package/dist/application/target-temporal-input.d.ts.map +1 -1
- package/dist/application/target-temporal-input.js +10 -1
- package/dist/application/target-temporal-input.js.map +1 -1
- package/dist/application/target-unit-migration-candidate.d.ts +2 -2
- package/dist/application/target-unit-migration-candidate.d.ts.map +1 -1
- package/dist/application/target-unit-migration-candidate.js +21 -10
- package/dist/application/target-unit-migration-candidate.js.map +1 -1
- package/dist/application/target-unit-migration-request.d.ts +4 -4
- package/dist/application/target-unit-migration-request.d.ts.map +1 -1
- package/dist/application/target-unit-migration-request.js +6 -4
- package/dist/application/target-unit-migration-request.js.map +1 -1
- package/dist/application/target-unit-migration-result.d.ts +5 -5
- package/dist/application/target-unit-migration-result.d.ts.map +1 -1
- package/dist/application/target-unit-migration-result.js +1 -1
- package/dist/application/target-unit-migration-result.js.map +1 -1
- package/dist/application/target-velocity-observation.d.ts +11 -0
- package/dist/application/target-velocity-observation.d.ts.map +1 -0
- package/dist/application/target-velocity-observation.js +201 -0
- package/dist/application/target-velocity-observation.js.map +1 -0
- package/dist/application/unit-migration.d.ts +2 -2
- package/dist/application/unit-migration.d.ts.map +1 -1
- package/dist/application/unit-migration.js +2 -2
- package/dist/cli.js +309 -45
- package/dist/cli.js.map +1 -1
- package/dist/command/actuals-discovery.d.ts +26 -0
- package/dist/command/actuals-discovery.d.ts.map +1 -0
- package/dist/command/actuals-discovery.js +328 -0
- package/dist/command/actuals-discovery.js.map +1 -0
- package/dist/command/actuals-usage.d.ts +22 -0
- package/dist/command/actuals-usage.d.ts.map +1 -0
- package/dist/command/actuals-usage.js +122 -0
- package/dist/command/actuals-usage.js.map +1 -0
- package/dist/formatter/source-formatter.d.ts +3 -3
- package/dist/formatter/source-formatter.d.ts.map +1 -1
- package/dist/formatter/source-formatter.js +53 -5
- package/dist/formatter/source-formatter.js.map +1 -1
- package/dist/formatter/target-source-formatter.d.ts +2 -1
- package/dist/formatter/target-source-formatter.d.ts.map +1 -1
- package/dist/formatter/target-source-formatter.js +18 -2
- package/dist/formatter/target-source-formatter.js.map +1 -1
- package/dist/governance/authority.d.ts +7 -3
- package/dist/governance/authority.d.ts.map +1 -1
- package/dist/governance/authority.js.map +1 -1
- package/dist/governance/source.d.ts +2 -2
- package/dist/governance/source.d.ts.map +1 -1
- package/dist/governance/source.js.map +1 -1
- package/dist/help/actuals-guide.d.ts +10 -0
- package/dist/help/actuals-guide.d.ts.map +1 -0
- package/dist/help/actuals-guide.js +23 -0
- package/dist/help/actuals-guide.js.map +1 -0
- package/dist/help/guide.d.ts +1 -1
- package/dist/help/guide.d.ts.map +1 -1
- package/dist/help/registry.d.ts.map +1 -1
- package/dist/help/registry.js +97 -7
- package/dist/help/registry.js.map +1 -1
- package/dist/history/git-probe.d.ts +56 -0
- package/dist/history/git-probe.d.ts.map +1 -0
- package/dist/history/git-probe.js +574 -0
- package/dist/history/git-probe.js.map +1 -0
- package/dist/history/project-history.d.ts +112 -0
- package/dist/history/project-history.d.ts.map +1 -0
- package/dist/history/project-history.js +786 -0
- package/dist/history/project-history.js.map +1 -0
- package/dist/history/velocity-observation.d.ts +69 -0
- package/dist/history/velocity-observation.d.ts.map +1 -0
- package/dist/history/velocity-observation.js +604 -0
- package/dist/history/velocity-observation.js.map +1 -0
- package/dist/index.d.ts +21 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/io/target-safe-write.d.ts +4 -1
- package/dist/io/target-safe-write.d.ts.map +1 -1
- package/dist/io/target-safe-write.js +19 -1
- package/dist/io/target-safe-write.js.map +1 -1
- package/dist/migration/conversion.d.ts +1 -1
- package/dist/migration/conversion.d.ts.map +1 -1
- package/dist/migration/grammar-boundary.d.ts +1 -1
- package/dist/migration/grammar-boundary.d.ts.map +1 -1
- package/dist/migration/grammar-boundary.js +11 -3
- package/dist/migration/grammar-boundary.js.map +1 -1
- package/dist/migration/request.d.ts +5 -5
- package/dist/migration/request.d.ts.map +1 -1
- package/dist/migration/request.js +15 -2
- package/dist/migration/request.js.map +1 -1
- package/dist/model/calendar.d.ts +2 -0
- package/dist/model/calendar.d.ts.map +1 -1
- package/dist/model/calendar.js +19 -0
- package/dist/model/calendar.js.map +1 -1
- package/dist/model/declaration-fields.d.ts +8 -0
- package/dist/model/declaration-fields.d.ts.map +1 -1
- package/dist/model/declaration-fields.js +13 -0
- package/dist/model/declaration-fields.js.map +1 -1
- package/dist/model/exact-person-hours-source.d.ts +2 -0
- package/dist/model/exact-person-hours-source.d.ts.map +1 -0
- package/dist/model/exact-person-hours-source.js +10 -0
- package/dist/model/exact-person-hours-source.js.map +1 -0
- package/dist/model/syntax.d.ts +23 -8
- package/dist/model/syntax.d.ts.map +1 -1
- package/dist/model/syntax.js.map +1 -1
- package/dist/mutation/actuals.d.ts +17 -0
- package/dist/mutation/actuals.d.ts.map +1 -0
- package/dist/mutation/actuals.js +90 -0
- package/dist/mutation/actuals.js.map +1 -0
- package/dist/mutation/advance.d.ts +9 -3
- package/dist/mutation/advance.d.ts.map +1 -1
- package/dist/mutation/advance.js +41 -12
- package/dist/mutation/advance.js.map +1 -1
- package/dist/mutation/entity-editor.d.ts +2 -2
- package/dist/mutation/entity-editor.d.ts.map +1 -1
- package/dist/mutation/entity-editor.js.map +1 -1
- package/dist/mutation/project.d.ts +2 -0
- package/dist/mutation/project.d.ts.map +1 -1
- package/dist/mutation/project.js +13 -4
- package/dist/mutation/project.js.map +1 -1
- package/dist/mutation/source.d.ts +3 -3
- package/dist/mutation/source.d.ts.map +1 -1
- package/dist/mutation/source.js.map +1 -1
- package/dist/parser/document-parser.d.ts +8 -1
- package/dist/parser/document-parser.d.ts.map +1 -1
- package/dist/parser/document-parser.js +151 -23
- package/dist/parser/document-parser.js.map +1 -1
- package/dist/recommendation/override-types.d.ts +2 -2
- package/dist/recommendation/override.d.ts +2 -2
- package/dist/recommendation/override.d.ts.map +1 -1
- package/dist/recommendation/override.js +2 -2
- package/dist/recommendation/override.js.map +1 -1
- package/dist/schema/registry.d.ts +36 -0
- package/dist/schema/registry.d.ts.map +1 -0
- package/dist/schema/registry.js +156 -0
- package/dist/schema/registry.js.map +1 -0
- package/dist/semantic/target-validator.d.ts +13 -2
- package/dist/semantic/target-validator.d.ts.map +1 -1
- package/dist/semantic/target-validator.js +46 -2
- package/dist/semantic/target-validator.js.map +1 -1
- package/dist/semantic/validator.d.ts +4 -1
- package/dist/semantic/validator.d.ts.map +1 -1
- package/dist/semantic/validator.js +152 -6
- package/dist/semantic/validator.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -3
- package/schemas/Perttool.AgentGuidanceResult.v1.schema.json +152 -0
- package/schemas/Perttool.AnalysisResult.v4.schema.json +124 -0
- package/schemas/Perttool.CheckResult.v3.schema.json +159 -0
- package/schemas/Perttool.CliError.v1.schema.json +83 -0
- package/schemas/Perttool.CommandHelpResult.v1.schema.json +165 -0
- package/schemas/Perttool.Common.v1.schema.json +508 -0
- package/schemas/Perttool.ExportResult.v1.schema.json +96 -0
- package/schemas/Perttool.FormatResult.v1.schema.json +82 -0
- package/schemas/Perttool.GuideResult.v1.schema.json +104 -0
- package/schemas/Perttool.ImportResult.v1.schema.json +111 -0
- package/schemas/Perttool.InitResult.v1.schema.json +70 -0
- package/schemas/Perttool.MutationResult.v3.schema.json +143 -0
- package/schemas/Perttool.NextResult.v5.schema.json +139 -0
- package/schemas/Perttool.OverrideDecision.v1.schema.json +170 -0
- package/schemas/Perttool.ProjectHistoryResult.v1.schema.json +139 -0
- package/schemas/Perttool.ProjectResult.v3.schema.json +144 -0
- package/schemas/Perttool.SchemaResult.v1.schema.json +84 -0
- package/schemas/Perttool.UnitMigrationResult.v3.schema.json +205 -0
- 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;
|
|
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 {
|
|
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 ([
|
|
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:
|
|
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
|