@topogram/cli 0.3.64 → 0.3.66
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/package.json +1 -1
- package/src/adoption/plan/index.js +716 -0
- package/src/adoption/plan.js +12 -703
- package/src/adoption/reporting.js +1 -1
- package/src/agent-brief.js +7 -21
- package/src/agent-ops/query-builders/auth.js +375 -0
- package/src/agent-ops/query-builders/change-risk/change-plan.js +123 -0
- package/src/agent-ops/query-builders/change-risk/import-plan.js +49 -0
- package/src/agent-ops/query-builders/change-risk/maintained.js +286 -0
- package/src/agent-ops/query-builders/change-risk/review-packets.js +123 -0
- package/src/agent-ops/query-builders/change-risk/risk.js +189 -0
- package/src/agent-ops/query-builders/change-risk.js +25 -0
- package/src/agent-ops/query-builders/common.js +149 -0
- package/src/agent-ops/query-builders/maintained-risk.js +539 -0
- package/src/agent-ops/query-builders/maintained-shared.js +120 -0
- package/src/agent-ops/query-builders/multi-agent.js +547 -0
- package/src/agent-ops/query-builders/projection-impacts.js +514 -0
- package/src/agent-ops/query-builders/work-packets.js +417 -0
- package/src/agent-ops/query-builders/workflow-context-shared.js +300 -0
- package/src/agent-ops/query-builders/workflow-context.js +398 -0
- package/src/agent-ops/query-builders/workflow-presets-core.js +677 -0
- package/src/agent-ops/query-builders/workflow-presets.js +341 -0
- package/src/agent-ops/query-builders.d.ts +26 -26
- package/src/agent-ops/query-builders.js +42 -5021
- package/src/archive/jsonl.js +2 -2
- package/src/archive/resolver-bridge.js +1 -1
- package/src/archive/unarchive.js +2 -1
- package/src/catalog/constants.js +10 -0
- package/src/catalog/copy.js +65 -0
- package/src/catalog/diagnostics.js +15 -0
- package/src/catalog/entries.js +42 -0
- package/src/catalog/files.js +67 -0
- package/src/catalog/provenance.js +123 -0
- package/src/catalog/source.js +150 -0
- package/src/catalog/validation.js +252 -0
- package/src/catalog.d.ts +2 -0
- package/src/catalog.js +18 -746
- package/src/cli/command-parsers/project.js +3 -0
- package/src/cli/command-parsers/shared.js +1 -1
- package/src/cli/commands/agent.js +2 -2
- package/src/cli/commands/catalog/check.js +31 -0
- package/src/cli/commands/catalog/copy.js +59 -0
- package/src/cli/commands/catalog/doctor.js +248 -0
- package/src/cli/commands/catalog/help.js +21 -0
- package/src/cli/commands/catalog/list.js +52 -0
- package/src/cli/commands/catalog/runner.js +92 -0
- package/src/cli/commands/catalog/shared.js +17 -0
- package/src/cli/commands/catalog/show.js +134 -0
- package/src/cli/commands/catalog.js +30 -615
- package/src/cli/commands/check.js +3 -3
- package/src/cli/commands/doctor.js +2 -9
- package/src/cli/commands/generator-policy/package-info.js +162 -0
- package/src/cli/commands/generator-policy/payloads.js +372 -0
- package/src/cli/commands/generator-policy/printers.js +159 -0
- package/src/cli/commands/generator-policy/runner.js +81 -0
- package/src/cli/commands/generator-policy/shared.js +39 -0
- package/src/cli/commands/generator-policy.js +15 -783
- package/src/cli/commands/import/adopt.js +170 -0
- package/src/cli/commands/import/check.js +91 -0
- package/src/cli/commands/import/diff.js +84 -0
- package/src/cli/commands/import/help.js +47 -0
- package/src/cli/commands/import/paths.js +269 -0
- package/src/cli/commands/import/plan.js +292 -0
- package/src/cli/commands/import/refresh.js +471 -0
- package/src/cli/commands/import/status-history.js +196 -0
- package/src/cli/commands/import/workspace.js +233 -0
- package/src/cli/commands/import.js +33 -1732
- package/src/cli/commands/migrate.js +153 -0
- package/src/cli/commands/package/constants.js +17 -0
- package/src/cli/commands/package/doctor.js +240 -0
- package/src/cli/commands/package/help.js +27 -0
- package/src/cli/commands/package/lockfile.js +135 -0
- package/src/cli/commands/package/npm.js +97 -0
- package/src/cli/commands/package/reporting.js +35 -0
- package/src/cli/commands/package/runner.js +33 -0
- package/src/cli/commands/package/shared.js +9 -0
- package/src/cli/commands/package/update-cli.js +252 -0
- package/src/cli/commands/package/versions.js +35 -0
- package/src/cli/commands/package.js +29 -813
- package/src/cli/commands/query/change-plan.js +68 -0
- package/src/cli/commands/query/definitions.js +202 -0
- package/src/cli/commands/query/import-adopt.js +121 -0
- package/src/cli/commands/query/runner/artifacts.js +102 -0
- package/src/cli/commands/query/runner/boundaries.js +211 -0
- package/src/cli/commands/query/runner/change.js +182 -0
- package/src/cli/commands/query/runner/import-adopt.js +111 -0
- package/src/cli/commands/query/runner/index.js +31 -0
- package/src/cli/commands/query/runner/output.js +12 -0
- package/src/cli/commands/query/runner/workflow.js +241 -0
- package/src/cli/commands/query/runner.js +3 -0
- package/src/cli/commands/query/workflow-context.js +5 -0
- package/src/cli/commands/query/workspace.js +270 -0
- package/src/cli/commands/query.js +9 -1300
- package/src/cli/commands/source.js +3 -12
- package/src/cli/commands/template/baseline.js +100 -0
- package/src/cli/commands/template/check.js +467 -0
- package/src/cli/commands/template/constants.js +8 -0
- package/src/cli/commands/template/diagnostics.js +26 -0
- package/src/cli/commands/template/help.js +28 -0
- package/src/cli/commands/template/lifecycle.js +404 -0
- package/src/cli/commands/template/list-show.js +287 -0
- package/src/cli/commands/template/policy.js +422 -0
- package/src/cli/commands/template/shared.js +127 -0
- package/src/cli/commands/template/updates.js +352 -0
- package/src/cli/commands/template-runner.js +6 -6
- package/src/cli/commands/template.js +41 -2143
- package/src/cli/commands/trust.js +1 -1
- package/src/cli/commands/workflow.js +6 -1
- package/src/cli/dispatcher.js +6 -1
- package/src/cli/help.js +15 -14
- package/src/cli/migration-guidance.js +1 -1
- package/src/cli/output-safety.js +2 -1
- package/src/cli/path-normalization.js +3 -13
- package/src/generator/api/contracts.js +497 -0
- package/src/generator/api/metadata.js +221 -0
- package/src/generator/api/openapi.js +559 -0
- package/src/generator/api/schema.js +124 -0
- package/src/generator/api/types.d.ts +98 -0
- package/src/generator/api.js +3 -1195
- package/src/generator/context/domain-page.js +1 -1
- package/src/generator/context/shared/domain-sdlc.js +282 -0
- package/src/generator/context/shared/maintained-boundary.js +665 -0
- package/src/generator/context/shared/metrics.js +85 -0
- package/src/generator/context/shared/primitives.js +64 -0
- package/src/generator/context/shared/relationships.js +453 -0
- package/src/generator/context/shared/summaries.js +263 -0
- package/src/generator/context/shared/types.d.ts +207 -0
- package/src/generator/context/shared.d.ts +42 -0
- package/src/generator/context/shared.js +80 -1390
- package/src/generator/context/slice/core.js +397 -0
- package/src/generator/context/slice/sdlc.js +417 -0
- package/src/generator/context/slice/ui-packets.js +183 -0
- package/src/generator/context/slice.js +2 -859
- package/src/generator/context/task-mode.js +2 -2
- package/src/generator/registry/index.js +507 -0
- package/src/generator/registry.js +18 -504
- package/src/generator/runtime/environment/index.js +666 -0
- package/src/generator/runtime/environment.js +4 -666
- package/src/generator/runtime/runtime-check/index.js +554 -0
- package/src/generator/runtime/runtime-check.js +4 -554
- package/src/generator/runtime/shared/index.js +572 -0
- package/src/generator/runtime/shared.js +19 -570
- package/src/generator/sdlc/doc-page.js +1 -1
- package/src/generator/shared.d.ts +2 -0
- package/src/generator/surfaces/databases/lifecycle-shared.js +1 -1
- package/src/generator/surfaces/native/swiftui-templates/README.generated.md +1 -1
- package/src/generator/surfaces/shared.d.ts +3 -0
- package/src/generator/widget-conformance/behavior-report.js +258 -0
- package/src/generator/widget-conformance/checks.js +371 -0
- package/src/generator/widget-conformance/projection-context.js +200 -0
- package/src/generator/widget-conformance/report.js +166 -0
- package/src/generator/widget-conformance/types.d.ts +121 -0
- package/src/generator/widget-conformance.js +3 -824
- package/src/import/core/context.d.ts +3 -0
- package/src/import/core/context.js +5 -7
- package/src/import/core/contracts.d.ts +1 -0
- package/src/import/core/registry.d.ts +4 -0
- package/src/import/core/runner/candidates.js +337 -0
- package/src/import/core/runner/options.js +22 -0
- package/src/import/core/runner/reports.js +51 -0
- package/src/import/core/runner/run.js +79 -0
- package/src/import/core/runner/tracks.js +150 -0
- package/src/import/core/runner/ui-drafts.js +393 -0
- package/src/import/core/runner.js +3 -698
- package/src/import/core/shared/api-routes.js +221 -0
- package/src/import/core/shared/candidates.js +97 -0
- package/src/import/core/shared/files.js +177 -0
- package/src/import/core/shared/next-app.js +389 -0
- package/src/import/core/shared/types.d.ts +51 -0
- package/src/import/core/shared/ui-routes.js +230 -0
- package/src/import/core/shared.js +60 -861
- package/src/new-project/constants.js +128 -0
- package/src/new-project/create.js +90 -0
- package/src/new-project/json.js +28 -0
- package/src/new-project/metadata.js +96 -0
- package/src/new-project/package-spec.js +161 -0
- package/src/new-project/project-files.js +351 -0
- package/src/new-project/template-policy.js +269 -0
- package/src/new-project/template-resolution.js +370 -0
- package/src/new-project/template-snapshots.js +442 -0
- package/src/new-project/template-updates.js +512 -0
- package/src/new-project/types.d.ts +83 -0
- package/src/new-project.js +6 -2277
- package/src/parser.d.ts +87 -1
- package/src/parser.js +118 -0
- package/src/policy/review-boundaries.d.ts +15 -0
- package/src/project-config/index.js +591 -0
- package/src/project-config.js +19 -561
- package/src/resolver/enrich/acceptance-criterion.js +2 -0
- package/src/resolver/enrich/bug.js +2 -0
- package/src/resolver/enrich/pitch.js +2 -0
- package/src/resolver/enrich/requirement.js +2 -0
- package/src/resolver/enrich/task.js +2 -0
- package/src/resolver/index.js +19 -2089
- package/src/resolver/normalize.js +384 -1
- package/src/resolver/plans.js +168 -0
- package/src/resolver/projections-api.js +494 -0
- package/src/resolver/projections-db.js +133 -0
- package/src/resolver/projections-ui.js +317 -0
- package/src/resolver/shapes.js +251 -0
- package/src/resolver/shared.js +278 -0
- package/src/resolver/widgets.js +132 -0
- package/src/sdlc/adopt.js +6 -5
- package/src/sdlc/paths.js +3 -5
- package/src/sdlc/scaffold.js +2 -1
- package/src/template-trust/constants.js +62 -0
- package/src/template-trust/content.js +258 -0
- package/src/template-trust/diff.js +92 -0
- package/src/template-trust/policy.js +61 -0
- package/src/template-trust/record.js +90 -0
- package/src/template-trust/status.js +182 -0
- package/src/template-trust.js +24 -687
- package/src/text-helpers.d.ts +1 -0
- package/src/topogram-types.d.ts +69 -0
- package/src/validator/common.js +488 -0
- package/src/validator/data-model.js +237 -0
- package/src/validator/docs.js +167 -0
- package/src/validator/expressions.js +146 -1
- package/src/validator/index.d.ts +23 -0
- package/src/validator/index.js +32 -3585
- package/src/validator/kinds.d.ts +41 -0
- package/src/validator/kinds.js +2 -0
- package/src/validator/model-helpers.js +46 -0
- package/src/validator/per-kind/acceptance-criterion.js +5 -0
- package/src/validator/per-kind/bug.js +6 -0
- package/src/validator/per-kind/domain.js +15 -2
- package/src/validator/per-kind/pitch.js +7 -0
- package/src/validator/per-kind/requirement.js +5 -0
- package/src/validator/per-kind/task.js +7 -0
- package/src/validator/per-kind/widget.js +14 -0
- package/src/validator/projections/api-http-async.js +410 -0
- package/src/validator/projections/api-http-authz.js +88 -0
- package/src/validator/projections/api-http-core.js +205 -0
- package/src/validator/projections/api-http-policies.js +339 -0
- package/src/validator/projections/api-http-responses.js +233 -0
- package/src/validator/projections/api-http.js +44 -0
- package/src/validator/projections/db.js +353 -0
- package/src/validator/projections/generator-defaults.js +45 -0
- package/src/validator/projections/helpers.js +87 -0
- package/src/validator/projections/ui-helpers.js +214 -0
- package/src/validator/projections/ui-navigation.js +344 -0
- package/src/validator/projections/ui-structure.js +364 -0
- package/src/validator/projections/ui-widgets.js +493 -0
- package/src/validator/projections/ui.js +46 -0
- package/src/validator/registry.js +48 -1
- package/src/validator/utils.d.ts +20 -0
- package/src/validator/utils.js +115 -12
- package/src/widget-behavior.d.ts +1 -0
- package/src/workflows/import-app/api/collect.js +221 -0
- package/src/workflows/import-app/api/openapi.js +257 -0
- package/src/workflows/import-app/api/routes.js +327 -0
- package/src/workflows/import-app/api/sources.js +22 -0
- package/src/workflows/import-app/api.js +2 -797
- package/src/workflows/reconcile/adoption-plan/build.js +212 -0
- package/src/workflows/reconcile/adoption-plan/dependencies.js +75 -0
- package/src/workflows/reconcile/adoption-plan/outputs.js +153 -0
- package/src/workflows/reconcile/adoption-plan/paths.js +58 -0
- package/src/workflows/reconcile/adoption-plan/projection-patches.js +177 -0
- package/src/workflows/reconcile/adoption-plan/reasons.js +107 -0
- package/src/workflows/reconcile/adoption-plan.js +30 -740
- package/src/workflows/reconcile/auth/closures.js +115 -0
- package/src/workflows/reconcile/auth/formatters.js +142 -0
- package/src/workflows/reconcile/auth/inference.js +330 -0
- package/src/workflows/reconcile/auth/roles.js +122 -0
- package/src/workflows/reconcile/auth.js +35 -690
- package/src/workflows/reconcile/bundle-core/index.js +600 -0
- package/src/workflows/reconcile/bundle-core.js +12 -598
- package/src/workflows/reconcile/candidate-model.js +18 -2
- package/src/workflows/reconcile/canonical-surface.js +1 -1
- package/src/workflows/reconcile/impacts/adoption-plan.js +196 -0
- package/src/workflows/reconcile/impacts/indexes.js +105 -0
- package/src/workflows/reconcile/impacts/patches.js +252 -0
- package/src/workflows/reconcile/impacts/reports.js +80 -0
- package/src/workflows/reconcile/impacts.js +14 -623
- package/src/workflows/reconcile/renderers.js +41 -6
- package/src/workflows/shared.js +5 -11
- package/src/workspace-docs.d.ts +29 -0
- package/src/workspace-paths.js +328 -0
package/src/parser.d.ts
CHANGED
|
@@ -1 +1,87 @@
|
|
|
1
|
-
|
|
1
|
+
import type { TopogramDoc } from "./workspace-docs.js";
|
|
2
|
+
|
|
3
|
+
export interface ParserPosition {
|
|
4
|
+
line: number;
|
|
5
|
+
column: number;
|
|
6
|
+
offset: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface LexerToken {
|
|
10
|
+
type: string;
|
|
11
|
+
value: string;
|
|
12
|
+
start: ParserPosition;
|
|
13
|
+
end: ParserPosition;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface AstLocation {
|
|
17
|
+
file: string;
|
|
18
|
+
start: ParserPosition;
|
|
19
|
+
end: ParserPosition;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface AstScalar {
|
|
23
|
+
type: "string" | "symbol";
|
|
24
|
+
value: string;
|
|
25
|
+
loc: AstLocation;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface AstList {
|
|
29
|
+
type: "list";
|
|
30
|
+
items: AstValue[];
|
|
31
|
+
loc: AstLocation;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface AstSequence {
|
|
35
|
+
type: "sequence";
|
|
36
|
+
items: AstValue[];
|
|
37
|
+
loc: AstLocation;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface AstBlock {
|
|
41
|
+
type: "block";
|
|
42
|
+
entries: AstBlockEntry[];
|
|
43
|
+
loc: AstLocation;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type AstValue = AstScalar | AstList | AstSequence | AstBlock;
|
|
47
|
+
|
|
48
|
+
export interface AstBlockEntry {
|
|
49
|
+
type: "block_entry";
|
|
50
|
+
items: AstValue[];
|
|
51
|
+
loc: AstLocation;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export interface AstField {
|
|
55
|
+
type: "field";
|
|
56
|
+
key: string;
|
|
57
|
+
value: AstValue;
|
|
58
|
+
loc: AstLocation;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export interface AstStatement {
|
|
62
|
+
type: "statement";
|
|
63
|
+
kind: string;
|
|
64
|
+
id: string;
|
|
65
|
+
from: AstScalar | null;
|
|
66
|
+
fields: AstField[];
|
|
67
|
+
loc: AstLocation;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface AstDocument {
|
|
71
|
+
type: "document";
|
|
72
|
+
file: string;
|
|
73
|
+
statements: AstStatement[];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface WorkspaceAst {
|
|
77
|
+
type: "workspace";
|
|
78
|
+
root: string;
|
|
79
|
+
files: AstDocument[];
|
|
80
|
+
docs: TopogramDoc[];
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function lex(source: string, filePath?: string): LexerToken[];
|
|
84
|
+
export function parseSource(source: string, filePath?: string): AstDocument;
|
|
85
|
+
export function parseFile(filePath: string): AstDocument;
|
|
86
|
+
export function collectTopogramFiles(inputPath: string): string[];
|
|
87
|
+
export function parsePath(root: string): WorkspaceAst;
|
package/src/parser.js
CHANGED
|
@@ -1,31 +1,76 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
|
|
1
3
|
import fs from "node:fs";
|
|
2
4
|
import path from "node:path";
|
|
3
5
|
import { parseDocsPath } from "./workspace-docs.js";
|
|
4
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {{ line: number, column: number, offset: number }} ParserPosition
|
|
9
|
+
* @typedef {{ type: string, value: string, start: ParserPosition, end: ParserPosition }} LexerToken
|
|
10
|
+
* @typedef {{ file: string, start: ParserPosition, end: ParserPosition }} AstLocation
|
|
11
|
+
* @typedef {{ type: "string" | "symbol", value: string, loc: AstLocation }} AstScalar
|
|
12
|
+
* @typedef {{ type: "list", items: AstValue[], loc: AstLocation }} AstList
|
|
13
|
+
* @typedef {{ type: "sequence", items: AstValue[], loc: AstLocation }} AstSequence
|
|
14
|
+
* @typedef {{ type: "block", entries: AstBlockEntry[], loc: AstLocation }} AstBlock
|
|
15
|
+
* @typedef {AstScalar | AstList | AstSequence | AstBlock} AstValue
|
|
16
|
+
* @typedef {{ type: "block_entry", items: AstValue[], loc: AstLocation }} AstBlockEntry
|
|
17
|
+
* @typedef {{ type: "field", key: string, value: AstValue, loc: AstLocation }} AstField
|
|
18
|
+
* @typedef {{ type: "statement", kind: string, id: string, from: AstScalar | null, fields: AstField[], loc: AstLocation }} AstStatement
|
|
19
|
+
* @typedef {{ type: "document", file: string, statements: AstStatement[] }} AstDocument
|
|
20
|
+
* @typedef {{ type: "workspace", root: string, files: AstDocument[], docs: any[] }} WorkspaceAst
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {number} line
|
|
25
|
+
* @param {number} column
|
|
26
|
+
* @param {number} offset
|
|
27
|
+
* @returns {ParserPosition}
|
|
28
|
+
*/
|
|
5
29
|
function createPos(line, column, offset) {
|
|
6
30
|
return { line, column, offset };
|
|
7
31
|
}
|
|
8
32
|
|
|
33
|
+
/**
|
|
34
|
+
* @param {string} type
|
|
35
|
+
* @param {string} value
|
|
36
|
+
* @param {ParserPosition} start
|
|
37
|
+
* @param {ParserPosition} end
|
|
38
|
+
* @returns {LexerToken}
|
|
39
|
+
*/
|
|
9
40
|
function createToken(type, value, start, end) {
|
|
10
41
|
return { type, value, start, end };
|
|
11
42
|
}
|
|
12
43
|
|
|
44
|
+
/**
|
|
45
|
+
* @param {string} filePath
|
|
46
|
+
* @param {string} message
|
|
47
|
+
* @param {LexerToken | null | undefined} token
|
|
48
|
+
* @returns {Error}
|
|
49
|
+
*/
|
|
13
50
|
function createError(filePath, message, token) {
|
|
14
51
|
const line = token?.start?.line ?? 1;
|
|
15
52
|
const column = token?.start?.column ?? 1;
|
|
16
53
|
return new Error(`${filePath}:${line}:${column} ${message}`);
|
|
17
54
|
}
|
|
18
55
|
|
|
56
|
+
/**
|
|
57
|
+
* @param {string} source
|
|
58
|
+
* @param {string} [filePath]
|
|
59
|
+
* @returns {LexerToken[]}
|
|
60
|
+
*/
|
|
19
61
|
export function lex(source, filePath = "<memory>") {
|
|
62
|
+
/** @type {LexerToken[]} */
|
|
20
63
|
const tokens = [];
|
|
21
64
|
let i = 0;
|
|
22
65
|
let line = 1;
|
|
23
66
|
let column = 1;
|
|
24
67
|
|
|
68
|
+
/** @returns {ParserPosition} */
|
|
25
69
|
function pos() {
|
|
26
70
|
return createPos(line, column, i);
|
|
27
71
|
}
|
|
28
72
|
|
|
73
|
+
/** @param {string} char */
|
|
29
74
|
function advanceChar(char) {
|
|
30
75
|
i += 1;
|
|
31
76
|
if (char === "\n") {
|
|
@@ -36,6 +81,12 @@ export function lex(source, filePath = "<memory>") {
|
|
|
36
81
|
}
|
|
37
82
|
}
|
|
38
83
|
|
|
84
|
+
/**
|
|
85
|
+
* @param {string} type
|
|
86
|
+
* @param {string} value
|
|
87
|
+
* @param {ParserPosition} start
|
|
88
|
+
* @param {ParserPosition} end
|
|
89
|
+
*/
|
|
39
90
|
function push(type, value, start, end) {
|
|
40
91
|
tokens.push(createToken(type, value, start, end));
|
|
41
92
|
}
|
|
@@ -166,31 +217,48 @@ export function lex(source, filePath = "<memory>") {
|
|
|
166
217
|
}
|
|
167
218
|
|
|
168
219
|
class Parser {
|
|
220
|
+
/**
|
|
221
|
+
* @param {LexerToken[]} tokens
|
|
222
|
+
* @param {string} filePath
|
|
223
|
+
*/
|
|
169
224
|
constructor(tokens, filePath) {
|
|
170
225
|
this.tokens = tokens;
|
|
171
226
|
this.filePath = filePath;
|
|
172
227
|
this.index = 0;
|
|
173
228
|
}
|
|
174
229
|
|
|
230
|
+
/** @returns {LexerToken} */
|
|
175
231
|
current() {
|
|
176
232
|
return this.tokens[this.index];
|
|
177
233
|
}
|
|
178
234
|
|
|
235
|
+
/** @returns {LexerToken | undefined} */
|
|
179
236
|
previous() {
|
|
180
237
|
return this.tokens[this.index - 1];
|
|
181
238
|
}
|
|
182
239
|
|
|
240
|
+
/** @returns {LexerToken} */
|
|
183
241
|
advance() {
|
|
184
242
|
const token = this.current();
|
|
185
243
|
this.index += 1;
|
|
186
244
|
return token;
|
|
187
245
|
}
|
|
188
246
|
|
|
247
|
+
/**
|
|
248
|
+
* @param {string} type
|
|
249
|
+
* @param {string} [value]
|
|
250
|
+
* @returns {boolean}
|
|
251
|
+
*/
|
|
189
252
|
check(type, value) {
|
|
190
253
|
const token = this.current();
|
|
191
254
|
return token.type === type && (value === undefined || token.value === value);
|
|
192
255
|
}
|
|
193
256
|
|
|
257
|
+
/**
|
|
258
|
+
* @param {string} type
|
|
259
|
+
* @param {string} [value]
|
|
260
|
+
* @returns {LexerToken | null}
|
|
261
|
+
*/
|
|
194
262
|
match(type, value) {
|
|
195
263
|
if (!this.check(type, value)) {
|
|
196
264
|
return null;
|
|
@@ -198,6 +266,12 @@ class Parser {
|
|
|
198
266
|
return this.advance();
|
|
199
267
|
}
|
|
200
268
|
|
|
269
|
+
/**
|
|
270
|
+
* @param {string} type
|
|
271
|
+
* @param {string | undefined} value
|
|
272
|
+
* @param {string} message
|
|
273
|
+
* @returns {LexerToken}
|
|
274
|
+
*/
|
|
201
275
|
expect(type, value, message) {
|
|
202
276
|
const token = this.current();
|
|
203
277
|
if (!this.check(type, value)) {
|
|
@@ -206,13 +280,16 @@ class Parser {
|
|
|
206
280
|
return this.advance();
|
|
207
281
|
}
|
|
208
282
|
|
|
283
|
+
/** @returns {void} */
|
|
209
284
|
skipNewlines() {
|
|
210
285
|
while (this.match("newline")) {
|
|
211
286
|
// Skip layout-only line breaks between statements and fields.
|
|
212
287
|
}
|
|
213
288
|
}
|
|
214
289
|
|
|
290
|
+
/** @returns {AstDocument} */
|
|
215
291
|
parseDocument() {
|
|
292
|
+
/** @type {AstStatement[]} */
|
|
216
293
|
const statements = [];
|
|
217
294
|
this.skipNewlines();
|
|
218
295
|
|
|
@@ -228,11 +305,13 @@ class Parser {
|
|
|
228
305
|
};
|
|
229
306
|
}
|
|
230
307
|
|
|
308
|
+
/** @returns {AstStatement} */
|
|
231
309
|
parseStatement() {
|
|
232
310
|
const kind = this.expect("word", undefined, "Expected statement kind");
|
|
233
311
|
const id = this.expect("word", undefined, "Expected statement identifier");
|
|
234
312
|
const start = kind.start;
|
|
235
313
|
|
|
314
|
+
/** @type {LexerToken | null} */
|
|
236
315
|
let from = null;
|
|
237
316
|
if (this.match("word", "from")) {
|
|
238
317
|
from = this.expect("word", undefined, "Expected identifier after 'from'");
|
|
@@ -242,6 +321,7 @@ class Parser {
|
|
|
242
321
|
this.expect("lbrace", undefined, "Expected '{' to start statement body");
|
|
243
322
|
this.skipNewlines();
|
|
244
323
|
|
|
324
|
+
/** @type {AstField[]} */
|
|
245
325
|
const fields = [];
|
|
246
326
|
while (!this.check("rbrace")) {
|
|
247
327
|
fields.push(this.parseField());
|
|
@@ -260,6 +340,7 @@ class Parser {
|
|
|
260
340
|
};
|
|
261
341
|
}
|
|
262
342
|
|
|
343
|
+
/** @returns {AstField} */
|
|
263
344
|
parseField() {
|
|
264
345
|
const key = this.expect("word", undefined, "Expected field name");
|
|
265
346
|
const start = key.start;
|
|
@@ -287,9 +368,11 @@ class Parser {
|
|
|
287
368
|
};
|
|
288
369
|
}
|
|
289
370
|
|
|
371
|
+
/** @returns {AstBlock} */
|
|
290
372
|
parseBlock() {
|
|
291
373
|
const open = this.expect("lbrace", undefined, "Expected '{' to start block");
|
|
292
374
|
this.skipNewlines();
|
|
375
|
+
/** @type {AstBlockEntry[]} */
|
|
293
376
|
const entries = [];
|
|
294
377
|
|
|
295
378
|
while (!this.check("rbrace")) {
|
|
@@ -313,7 +396,12 @@ class Parser {
|
|
|
313
396
|
};
|
|
314
397
|
}
|
|
315
398
|
|
|
399
|
+
/**
|
|
400
|
+
* @param {string[]} stopTypes
|
|
401
|
+
* @returns {AstValue[]}
|
|
402
|
+
*/
|
|
316
403
|
parseSequenceUntil(stopTypes) {
|
|
404
|
+
/** @type {AstValue[]} */
|
|
317
405
|
const items = [];
|
|
318
406
|
|
|
319
407
|
while (!stopTypes.includes(this.current().type) && !this.check("eof")) {
|
|
@@ -326,6 +414,7 @@ class Parser {
|
|
|
326
414
|
return items;
|
|
327
415
|
}
|
|
328
416
|
|
|
417
|
+
/** @returns {AstValue} */
|
|
329
418
|
parseAtom() {
|
|
330
419
|
const token = this.current();
|
|
331
420
|
|
|
@@ -354,8 +443,10 @@ class Parser {
|
|
|
354
443
|
throw createError(this.filePath, `Unexpected token '${token.value || token.type}'`, token);
|
|
355
444
|
}
|
|
356
445
|
|
|
446
|
+
/** @returns {AstList} */
|
|
357
447
|
parseList() {
|
|
358
448
|
const open = this.expect("lbracket", undefined, "Expected '[' to start list");
|
|
449
|
+
/** @type {AstValue[]} */
|
|
359
450
|
const items = [];
|
|
360
451
|
|
|
361
452
|
while (!this.check("rbracket")) {
|
|
@@ -373,6 +464,10 @@ class Parser {
|
|
|
373
464
|
};
|
|
374
465
|
}
|
|
375
466
|
|
|
467
|
+
/**
|
|
468
|
+
* @param {LexerToken} token
|
|
469
|
+
* @returns {AstScalar}
|
|
470
|
+
*/
|
|
376
471
|
nodeFromToken(token) {
|
|
377
472
|
return {
|
|
378
473
|
type: "symbol",
|
|
@@ -381,6 +476,11 @@ class Parser {
|
|
|
381
476
|
};
|
|
382
477
|
}
|
|
383
478
|
|
|
479
|
+
/**
|
|
480
|
+
* @param {ParserPosition} start
|
|
481
|
+
* @param {ParserPosition} end
|
|
482
|
+
* @returns {AstLocation}
|
|
483
|
+
*/
|
|
384
484
|
loc(start, end) {
|
|
385
485
|
return {
|
|
386
486
|
file: this.filePath,
|
|
@@ -390,17 +490,30 @@ class Parser {
|
|
|
390
490
|
}
|
|
391
491
|
}
|
|
392
492
|
|
|
493
|
+
/**
|
|
494
|
+
* @param {string} source
|
|
495
|
+
* @param {string} [filePath]
|
|
496
|
+
* @returns {AstDocument}
|
|
497
|
+
*/
|
|
393
498
|
export function parseSource(source, filePath = "<memory>") {
|
|
394
499
|
const tokens = lex(source, filePath);
|
|
395
500
|
const parser = new Parser(tokens, filePath);
|
|
396
501
|
return parser.parseDocument();
|
|
397
502
|
}
|
|
398
503
|
|
|
504
|
+
/**
|
|
505
|
+
* @param {string} filePath
|
|
506
|
+
* @returns {AstDocument}
|
|
507
|
+
*/
|
|
399
508
|
export function parseFile(filePath) {
|
|
400
509
|
const source = fs.readFileSync(filePath, "utf8");
|
|
401
510
|
return parseSource(source, filePath);
|
|
402
511
|
}
|
|
403
512
|
|
|
513
|
+
/**
|
|
514
|
+
* @param {string} inputPath
|
|
515
|
+
* @returns {string[]}
|
|
516
|
+
*/
|
|
404
517
|
export function collectTopogramFiles(inputPath) {
|
|
405
518
|
const absolutePath = path.resolve(inputPath);
|
|
406
519
|
const stat = fs.statSync(absolutePath);
|
|
@@ -409,6 +522,7 @@ export function collectTopogramFiles(inputPath) {
|
|
|
409
522
|
return absolutePath.endsWith(".tg") ? [absolutePath] : [];
|
|
410
523
|
}
|
|
411
524
|
|
|
525
|
+
/** @type {string[]} */
|
|
412
526
|
const files = [];
|
|
413
527
|
for (const entry of fs.readdirSync(absolutePath, { withFileTypes: true })) {
|
|
414
528
|
const childPath = path.join(absolutePath, entry.name);
|
|
@@ -427,6 +541,10 @@ export function collectTopogramFiles(inputPath) {
|
|
|
427
541
|
return files.sort();
|
|
428
542
|
}
|
|
429
543
|
|
|
544
|
+
/**
|
|
545
|
+
* @param {string} inputPath
|
|
546
|
+
* @returns {WorkspaceAst}
|
|
547
|
+
*/
|
|
430
548
|
export function parsePath(inputPath) {
|
|
431
549
|
const files = collectTopogramFiles(inputPath);
|
|
432
550
|
const docs = parseDocsPath(inputPath);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export function defaultOwnershipBoundary(): any;
|
|
2
|
+
export function ownershipBoundaryForMaintainedSurface(...args: any[]): any;
|
|
3
|
+
export function reviewBoundaryForCapability(...args: any[]): any;
|
|
4
|
+
export function reviewBoundaryForEntity(...args: any[]): any;
|
|
5
|
+
export function reviewBoundaryForJourneyDoc(...args: any[]): any;
|
|
6
|
+
export function reviewBoundaryForMaintainedClassification(...args: any[]): any;
|
|
7
|
+
export function reviewBoundaryForProjection(...args: any[]): any;
|
|
8
|
+
export function reviewBoundaryForWorkflowDoc(...args: any[]): any;
|
|
9
|
+
export function reviewBoundaryForAcceptanceCriterion(...args: any[]): any;
|
|
10
|
+
export function reviewBoundaryForBug(...args: any[]): any;
|
|
11
|
+
export function reviewBoundaryForDocument(...args: any[]): any;
|
|
12
|
+
export function reviewBoundaryForDomain(...args: any[]): any;
|
|
13
|
+
export function reviewBoundaryForPitch(...args: any[]): any;
|
|
14
|
+
export function reviewBoundaryForRequirement(...args: any[]): any;
|
|
15
|
+
export function reviewBoundaryForTask(...args: any[]): any;
|