@dailephd/my-dev-kit-orchestrator 1.0.0
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/README.md +295 -0
- package/dist/artifactChecker.d.ts +31 -0
- package/dist/artifactChecker.d.ts.map +1 -0
- package/dist/artifactChecker.js +341 -0
- package/dist/artifactChecker.js.map +1 -0
- package/dist/artifactLifecycle.d.ts +30 -0
- package/dist/artifactLifecycle.d.ts.map +1 -0
- package/dist/artifactLifecycle.js +176 -0
- package/dist/artifactLifecycle.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/check.d.ts +3 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +494 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/export.d.ts +16 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +248 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +59 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +101 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/mark.d.ts +3 -0
- package/dist/commands/mark.d.ts.map +1 -0
- package/dist/commands/mark.js +139 -0
- package/dist/commands/mark.js.map +1 -0
- package/dist/commands/prompt.d.ts +3 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +198 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/commands/start.d.ts +3 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +100 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +191 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/contractChecker.d.ts +53 -0
- package/dist/contractChecker.d.ts.map +1 -0
- package/dist/contractChecker.js +319 -0
- package/dist/contractChecker.js.map +1 -0
- package/dist/correctionRouter.d.ts +37 -0
- package/dist/correctionRouter.d.ts.map +1 -0
- package/dist/correctionRouter.js +142 -0
- package/dist/correctionRouter.js.map +1 -0
- package/dist/correctionState.d.ts +16 -0
- package/dist/correctionState.d.ts.map +1 -0
- package/dist/correctionState.js +64 -0
- package/dist/correctionState.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/judgeParser.d.ts +16 -0
- package/dist/judgeParser.d.ts.map +1 -0
- package/dist/judgeParser.js +52 -0
- package/dist/judgeParser.js.map +1 -0
- package/dist/program.d.ts +3 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +33 -0
- package/dist/program.js.map +1 -0
- package/dist/promptChecker.d.ts +27 -0
- package/dist/promptChecker.d.ts.map +1 -0
- package/dist/promptChecker.js +152 -0
- package/dist/promptChecker.js.map +1 -0
- package/dist/promptGenerator.d.ts +12 -0
- package/dist/promptGenerator.d.ts.map +1 -0
- package/dist/promptGenerator.js +2556 -0
- package/dist/promptGenerator.js.map +1 -0
- package/dist/run.d.ts +30 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +141 -0
- package/dist/run.js.map +1 -0
- package/dist/stageDetector.d.ts +29 -0
- package/dist/stageDetector.d.ts.map +1 -0
- package/dist/stageDetector.js +161 -0
- package/dist/stageDetector.js.map +1 -0
- package/dist/traceChecker.d.ts +46 -0
- package/dist/traceChecker.d.ts.map +1 -0
- package/dist/traceChecker.js +257 -0
- package/dist/traceChecker.js.map +1 -0
- package/dist/traceModel.d.ts +7 -0
- package/dist/traceModel.d.ts.map +1 -0
- package/dist/traceModel.js +37 -0
- package/dist/traceModel.js.map +1 -0
- package/dist/traceParser.d.ts +27 -0
- package/dist/traceParser.d.ts.map +1 -0
- package/dist/traceParser.js +102 -0
- package/dist/traceParser.js.map +1 -0
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/workflows.d.ts +16 -0
- package/dist/workflows.d.ts.map +1 -0
- package/dist/workflows.js +170 -0
- package/dist/workflows.js.map +1 -0
- package/dist/workspace.d.ts +13 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +70 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +62 -0
package/README.md
ADDED
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
# my-dev-kit-orchestrator
|
|
2
|
+
|
|
3
|
+
`my-dev-kit-orchestrator` is a CLI-first workflow shell for design-first software development with coding agents.
|
|
4
|
+
|
|
5
|
+
It is for teams or individual developers who want a coding agent to work through a bounded sequence of design, pseudocode, testing, implementation, and verification steps instead of jumping straight from a raw request to code.
|
|
6
|
+
|
|
7
|
+
## Capabilities
|
|
8
|
+
|
|
9
|
+
`v0.1.0` provided the workflow shell:
|
|
10
|
+
|
|
11
|
+
- a small CLI command surface
|
|
12
|
+
- five workflow modes: `feature`, `repair`, `test`, `refactor`, `harden`
|
|
13
|
+
- local run folders under `.my-dev-kit-orchestrator/runs/`
|
|
14
|
+
- stage-specific prompt generation
|
|
15
|
+
- plain-text prompt and artifact files
|
|
16
|
+
- simple stage advancement based on expected artifact file existence
|
|
17
|
+
|
|
18
|
+
`v0.6.0` adds judge correction routing and trace-aware workflow recovery:
|
|
19
|
+
|
|
20
|
+
- judge verdict parser: reads `Verdict:` and `Recommended next stage:` from `judge-report.txt`
|
|
21
|
+
- supported verdicts: `PASS`, `DESIGN_INCOMPLETE`, `PSEUDOCODE_INCOMPLETE`, `IMPLEMENTATION_MISMATCH`, `TEST_COVERAGE_INCOMPLETE`, `ARCHITECTURE_MISMATCH`, `NEED_VERIFICATION`, `NEED_CONTEXT`, `SCOPE_VIOLATION`, `BLOCKED`
|
|
22
|
+
- deterministic routing table maps each non-PASS verdict to a correction stage
|
|
23
|
+
- `status` command shows a Judge correction section when a judge report is present (verdict, routed stage, warnings)
|
|
24
|
+
- `prompt` command selects the routed correction stage and generates a bounded correction-stage prompt
|
|
25
|
+
- correction prompts include the judge report, prior stage inputs, and design-map when present
|
|
26
|
+
- `SCOPE_VIOLATION` and `BLOCKED` verdicts produce a blocked state - no correction stage is routed
|
|
27
|
+
- unknown verdicts fail the parser instead of being guessed
|
|
28
|
+
- `check --trace` and `check --design-map` suggest a correction stage for each trace issue
|
|
29
|
+
- trace-aware correction suggestions are deterministic: missing `BEH-NNN` target → suggest `behavior-model`, missing `PSE-NNN` → suggest `pseudocode-packet`, etc.
|
|
30
|
+
- correction routing is a prompt-generation aid, not an autonomous repair runtime
|
|
31
|
+
- `src/judgeParser.ts`: `parseJudgeReport`, `isValidVerdict`, `JUDGE_VERDICTS`, `JudgeVerdict`
|
|
32
|
+
- `src/correctionRouter.ts`: `routeJudgeVerdict`, `parseAndRoute`, `CORRECTABLE_STAGES`, `CorrectionRouteResult`
|
|
33
|
+
- `src/correctionState.ts`: `readCorrectionState`, `isCorrectionActive`
|
|
34
|
+
- see [docs/ARTIFACTS.md](docs/ARTIFACTS.md) and [docs/USAGE.md](docs/USAGE.md) for correction routing usage
|
|
35
|
+
|
|
36
|
+
`v0.5.0` adds design trace IDs and trace link checking:
|
|
37
|
+
|
|
38
|
+
- `check --trace`: deterministic trace link checker across all run artifacts
|
|
39
|
+
- `check --design-map`: checks the DesignMap artifact (required sections + trace links)
|
|
40
|
+
- `check --strict --trace` / `check --strict --design-map`: promote warns to failures
|
|
41
|
+
- `trace-check-results.json` persists trace check results per run
|
|
42
|
+
- `status` command shows a trace check summary when results are available
|
|
43
|
+
- `src/traceModel.ts`: `TRACE_PREFIXES`, `TRACE_ID_RE`, `isValidTraceId`, `isMalformedTraceId`
|
|
44
|
+
- `src/traceParser.ts`: `parseTraceIds`, `parseTraceLinks`, `findMalformedTraceIds`, `findDuplicateIds`, `findOrphanIds`, `findMissingLinkTargets`, `parseTrace`
|
|
45
|
+
- `src/traceChecker.ts`: `parseDeclaredTraceIds` (skips link lines to avoid false negatives), `checkArtifactTrace`, `checkAllTraces`, `checkDesignMapTrace`
|
|
46
|
+
- `DesignMap` artifact kind added to section registry with 18 required sections
|
|
47
|
+
- Trace IDs are optional guidance in `behavior-model`, `pseudocode-packet`, and `test-strategy` prompts
|
|
48
|
+
- `judge` prompt requests trace link review when trace IDs are present
|
|
49
|
+
- check codes: `TRACE_MALFORMED_ID`, `TRACE_DUPLICATE_ID`, `TRACE_ORPHAN_ID`, `TRACE_MISSING_LINK_TARGET`
|
|
50
|
+
- canonical trace ID format: `PREFIX-NNN` (3+ zero-padded digits; prefix one of `REQ|CTX|BEH|INV|TRN|PSE|TST|IMP|VER|RISK`)
|
|
51
|
+
- see [docs/ARTIFACTS.md](docs/ARTIFACTS.md) for trace check codes and DesignMap sections
|
|
52
|
+
|
|
53
|
+
`v0.4.0` adds artifact content checks and prompt quality checks:
|
|
54
|
+
|
|
55
|
+
- `check` command: `my-dev-kit-orchestrator check [--artifact <name>] [--prompts] [--strict]`
|
|
56
|
+
- deterministic text-based checks for required sections in each artifact kind
|
|
57
|
+
- check codes: `MISSING_FILE`, `MISSING_SECTION`, `EMPTY_SECTION`, `PLACEHOLDER_CONTENT`, `STATUS_MISMATCH` (artifacts); `PROMPT_MISSING_FILE`, `PROMPT_EMPTY`, `PROMPT_MISSING_STAGE_HEADER`, `PROMPT_MISSING_TASK_SECTION`, `PROMPT_MISSING_OUTPUT_ARTIFACT`, `PROMPT_PLACEHOLDER` (prompts)
|
|
58
|
+
- `artifact-check-results.json` persists check results per run
|
|
59
|
+
- `status` command shows a content check summary when results are available
|
|
60
|
+
- `--strict` mode exits 1 on any `warn` in addition to `fail`
|
|
61
|
+
- see [docs/ARTIFACTS.md](docs/ARTIFACTS.md) for check codes and result schema
|
|
62
|
+
|
|
63
|
+
`v0.3.0` adds artifact lifecycle and resume states:
|
|
64
|
+
|
|
65
|
+
- artifact lifecycle states: `missing`, `incomplete`, `blocked`, `complete`, `stale`
|
|
66
|
+
- `artifact-state.json` per run persists manual lifecycle state
|
|
67
|
+
- stale artifact detection when upstream artifacts change
|
|
68
|
+
- `status` shows lifecycle state for each artifact with reason for blocked/incomplete/stale
|
|
69
|
+
- `prompt` progression respects incomplete, blocked, and stale states
|
|
70
|
+
- `mark` command for manual lifecycle state updates: `mark <artifact-name> --state <state> [--reason]`
|
|
71
|
+
- backward compatible: existing runs without `artifact-state.json` use file-existence behavior
|
|
72
|
+
|
|
73
|
+
`v0.2.1` adds extraction mode:
|
|
74
|
+
|
|
75
|
+
- `--mode extraction` for transferring a bounded feature, workflow, or subsystem from an existing source repository into a new or separate target repository
|
|
76
|
+
- `--source <path>` and `--target <path>` options required for extraction runs
|
|
77
|
+
- the source repository is used for inspection and evidence only; the target repository is where the extracted workflow is implemented, tested, verified, and reported
|
|
78
|
+
- source and target `.my-dev-kit` index directories are kept separate
|
|
79
|
+
- extraction-specific 14-stage workflow with artifact gates before implementation begins: `SourceWorkflowMap`, `SourceToTargetPortingMap`, `DoNotPortList`, `GoldenBehaviorContract`, and `TargetArchitectureProposal`
|
|
80
|
+
- run artifacts placed under the target repository by default
|
|
81
|
+
- cross-platform support verified in the GitHub Actions OS matrix on Ubuntu, Windows, and macOS
|
|
82
|
+
- see [docs/WORKFLOWS.md](docs/WORKFLOWS.md) for the full extraction workflow and [docs/ARTIFACTS.md](docs/ARTIFACTS.md) for artifact contracts
|
|
83
|
+
|
|
84
|
+
`v0.2.0` added graph-guided architecture context support:
|
|
85
|
+
|
|
86
|
+
- architecture-context stage prompt now guides the coding agent through graph-guided context acquisition with `my-dev-kit`
|
|
87
|
+
- generated prompt includes the full retrieval sequence, retrieval evidence report template, and ArchitectureContextPacket template
|
|
88
|
+
- `status` command shows supporting report presence for the architecture-context stage
|
|
89
|
+
- stage progression remains based on required artifact presence only
|
|
90
|
+
|
|
91
|
+
The CLI owns workflow order and prompt generation. Each run advances as the expected artifact files appear on disk.
|
|
92
|
+
|
|
93
|
+
## How it works with my-dev-kit
|
|
94
|
+
|
|
95
|
+
`my-dev-kit` and `my-dev-kit-orchestrator` have different responsibilities.
|
|
96
|
+
|
|
97
|
+
- `my-dev-kit` retrieves bounded project context through graph-guided architecture context workflows such as indexing, search, lookup, slice generation, source retrieval, and optional semantic inspection
|
|
98
|
+
- `my-dev-kit-orchestrator` organizes the staged design-to-code workflow after context acquisition
|
|
99
|
+
- the coding agent records retrieval evidence in `reports/architecture-context-retrieval-report.txt`
|
|
100
|
+
- the coding agent synthesizes that evidence into `artifacts/architecture-context-packet.txt`
|
|
101
|
+
- downstream stages consume the ArchitectureContextPacket rather than raw retrieval output
|
|
102
|
+
|
|
103
|
+
See [ARCHITECTURE.md](docs/ARCHITECTURE.md), [docs/WORKFLOWS.md](docs/WORKFLOWS.md), and [docs/ARTIFACTS.md](docs/ARTIFACTS.md) for the detailed design.
|
|
104
|
+
|
|
105
|
+
## Non-goals (current release)
|
|
106
|
+
|
|
107
|
+
`my-dev-kit-orchestrator` does not include in v0.6.0:
|
|
108
|
+
|
|
109
|
+
- full JSON schema validation or Zod/AJV enforcement
|
|
110
|
+
- LLM-based artifact judging or semantic artifact grading
|
|
111
|
+
- automatic artifact rewriting or correction loops
|
|
112
|
+
- automatic judge routing
|
|
113
|
+
- automatic code modification after a judge failure
|
|
114
|
+
- automatic code-to-symbol tracing or AST-level dependency graph tracing
|
|
115
|
+
- test coverage instrumentation
|
|
116
|
+
- LLM-based trace inference or judge inference
|
|
117
|
+
- automatic coding-agent execution
|
|
118
|
+
- automatic `my-dev-kit` command execution
|
|
119
|
+
- design-map visualization
|
|
120
|
+
- direct LLM-provider execution
|
|
121
|
+
- multi-agent runtime
|
|
122
|
+
- extra low-level CLI commands beyond the current surface
|
|
123
|
+
|
|
124
|
+
Architecture-context prompts may suggest use of `my-dev-kit` when it is available, but `my-dev-kit-orchestrator` does not run `my-dev-kit` automatically.
|
|
125
|
+
|
|
126
|
+
## Command surface
|
|
127
|
+
|
|
128
|
+
```text
|
|
129
|
+
my-dev-kit-orchestrator init
|
|
130
|
+
my-dev-kit-orchestrator start "<request>"
|
|
131
|
+
my-dev-kit-orchestrator start --mode <feature|repair|test|refactor|harden|extraction> "<request>"
|
|
132
|
+
my-dev-kit-orchestrator status
|
|
133
|
+
my-dev-kit-orchestrator status --run <run-id>
|
|
134
|
+
my-dev-kit-orchestrator prompt
|
|
135
|
+
my-dev-kit-orchestrator prompt <stage>
|
|
136
|
+
my-dev-kit-orchestrator prompt <stage> --run <run-id>
|
|
137
|
+
my-dev-kit-orchestrator list
|
|
138
|
+
my-dev-kit-orchestrator list --mode <mode>
|
|
139
|
+
my-dev-kit-orchestrator mark <artifact-name> --state <incomplete|blocked|complete> [--reason "<reason>"]
|
|
140
|
+
my-dev-kit-orchestrator check
|
|
141
|
+
my-dev-kit-orchestrator check --artifact <stage-name|filename>
|
|
142
|
+
my-dev-kit-orchestrator check --prompts
|
|
143
|
+
my-dev-kit-orchestrator check --strict
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Common flags:
|
|
147
|
+
|
|
148
|
+
- `--root <path>`: use a specific project root
|
|
149
|
+
- `--mode <mode>`: choose the workflow mode for `start`
|
|
150
|
+
- `--name <run-name>`: use a readable suffix in the run ID
|
|
151
|
+
- `--run <run-id>`: target a specific run for `status` or `prompt`
|
|
152
|
+
- `--output-dir <path>`: write runs outside the default workspace
|
|
153
|
+
|
|
154
|
+
## Quick start
|
|
155
|
+
|
|
156
|
+
1. Install dependencies and build the CLI:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
npm install
|
|
160
|
+
npm run build
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
2. Initialize the workspace in your project:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
node dist/cli.js init
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
3. Start a workflow run:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
node dist/cli.js start "add audit logging to the export command"
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
4. Print the next stage prompt:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
node dist/cli.js prompt
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
5. Paste the prompt into your coding tool of choice and save the returned artifact into the run folder.
|
|
182
|
+
|
|
183
|
+
6. Continue stage by stage:
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
node dist/cli.js status
|
|
187
|
+
node dist/cli.js prompt
|
|
188
|
+
node dist/cli.js list
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
If you link the package locally, you can use the installed command directly:
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
npm link
|
|
195
|
+
my-dev-kit-orchestrator --help
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Supported modes
|
|
199
|
+
|
|
200
|
+
### `feature`
|
|
201
|
+
|
|
202
|
+
Use for new behavior or intentional behavior changes.
|
|
203
|
+
|
|
204
|
+
Stage order:
|
|
205
|
+
`request-brief -> architecture-context -> behavior-model -> pseudocode-packet -> test-strategy -> implementation -> test-implementation -> verification -> judge -> final-report`
|
|
206
|
+
|
|
207
|
+
### `repair`
|
|
208
|
+
|
|
209
|
+
Use when observed behavior diverges from intended design.
|
|
210
|
+
|
|
211
|
+
Stage order:
|
|
212
|
+
`observed-behavior-report -> architecture-context -> behavior-trace -> divergence-report -> correction-design -> regression-test-strategy -> implementation -> test-implementation -> verification -> judge -> final-report`
|
|
213
|
+
|
|
214
|
+
### `test`
|
|
215
|
+
|
|
216
|
+
Use for behavior-derived test design or test implementation for existing behavior.
|
|
217
|
+
|
|
218
|
+
Stage order:
|
|
219
|
+
`test-target-brief -> architecture-context -> behavior-reconstruction -> pseudocode-summary -> test-strategy -> test-implementation -> verification -> judge -> final-report`
|
|
220
|
+
|
|
221
|
+
### `refactor`
|
|
222
|
+
|
|
223
|
+
Use for structure changes that must preserve behavior.
|
|
224
|
+
|
|
225
|
+
Stage order:
|
|
226
|
+
`refactor-brief -> architecture-context -> existing-behavior-map -> preserved-invariant-list -> compatibility-test-strategy -> refactor-pseudocode-packet -> implementation -> test-implementation -> verification -> judge -> final-report`
|
|
227
|
+
|
|
228
|
+
### `harden`
|
|
229
|
+
|
|
230
|
+
Use for validation, guard, resilience, and failure-handling work.
|
|
231
|
+
|
|
232
|
+
Stage order:
|
|
233
|
+
`hardening-brief -> architecture-context -> assumption-report -> failure-mode-matrix -> guard-pseudocode-packet -> resilience-test-strategy -> implementation -> test-implementation -> verification -> judge -> final-report`
|
|
234
|
+
|
|
235
|
+
### `extraction`
|
|
236
|
+
|
|
237
|
+
Use for transferring a bounded feature, workflow, subsystem, or behavior from an existing source repository into a new or separate target repository.
|
|
238
|
+
|
|
239
|
+
Requires `--source <path>` (source repo, read-only evidence) and `--target <path>` (target repo, implementation destination).
|
|
240
|
+
|
|
241
|
+
Stage order:
|
|
242
|
+
`request-brief -> source-architecture-context -> source-workflow-map -> porting-map -> golden-behavior-contract -> target-architecture -> behavior-model -> pseudocode-packet -> test-strategy -> implementation -> test-implementation -> verification -> judge -> final-report`
|
|
243
|
+
|
|
244
|
+
See [docs/WORKFLOWS.md](docs/WORKFLOWS.md) and [docs/ARTIFACTS.md](docs/ARTIFACTS.md) for the full extraction workflow and artifact contracts.
|
|
245
|
+
|
|
246
|
+
## Run folder layout
|
|
247
|
+
|
|
248
|
+
Each run lives under `.my-dev-kit-orchestrator/runs/<run-id>/`.
|
|
249
|
+
|
|
250
|
+
```text
|
|
251
|
+
.my-dev-kit-orchestrator/
|
|
252
|
+
config.json
|
|
253
|
+
runs/
|
|
254
|
+
<run-id>/
|
|
255
|
+
00-request.txt
|
|
256
|
+
run.json
|
|
257
|
+
prompts/
|
|
258
|
+
artifacts/
|
|
259
|
+
reports/
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Key files and folders:
|
|
263
|
+
|
|
264
|
+
- `00-request.txt`: the original request passed to `start`
|
|
265
|
+
- `run.json`: run metadata, mode, and ordered stage definitions
|
|
266
|
+
- `prompts/`: generated stage prompt files such as `01-request-brief.prompt.txt`
|
|
267
|
+
- `artifacts/`: stage outputs such as `request-brief.txt` and `pseudocode-packet.txt`
|
|
268
|
+
- `reports/`: reserved run folder for report-oriented outputs and future expansion
|
|
269
|
+
|
|
270
|
+
The next stage is determined by the first expected artifact file that is missing for the current workflow.
|
|
271
|
+
|
|
272
|
+
## Install, build, test
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
npm install
|
|
276
|
+
npm run build
|
|
277
|
+
npx tsc --noEmit
|
|
278
|
+
npm test
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Optional local lint check:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
npm run lint
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Documentation
|
|
288
|
+
|
|
289
|
+
- [ARCHITECTURE.md](docs/ARCHITECTURE.md)
|
|
290
|
+
- [docs/USAGE.md](docs/USAGE.md)
|
|
291
|
+
- [docs/WORKFLOWS.md](docs/WORKFLOWS.md)
|
|
292
|
+
- [docs/ARTIFACTS.md](docs/ARTIFACTS.md)
|
|
293
|
+
- [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md)
|
|
294
|
+
- [CHANGELOG.md](CHANGELOG.md)
|
|
295
|
+
- [ROADMAP.md](docs/ROADMAP.md)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ArtifactStateFile } from './artifactLifecycle';
|
|
2
|
+
import { RunMetadata } from './run';
|
|
3
|
+
export type CheckSeverity = 'pass' | 'warn' | 'fail';
|
|
4
|
+
export interface ArtifactCheckIssue {
|
|
5
|
+
code: string;
|
|
6
|
+
severity: CheckSeverity;
|
|
7
|
+
message: string;
|
|
8
|
+
section?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ArtifactCheckResult {
|
|
11
|
+
artifactFile: string;
|
|
12
|
+
artifactKind: string;
|
|
13
|
+
issues: ArtifactCheckIssue[];
|
|
14
|
+
passed: boolean;
|
|
15
|
+
checkedAt: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SectionRequirements {
|
|
18
|
+
required: string[];
|
|
19
|
+
}
|
|
20
|
+
export declare function resolveArtifactKind(stageName: string): string | undefined;
|
|
21
|
+
export declare function getArtifactSectionRequirements(artifactKind: string): SectionRequirements | undefined;
|
|
22
|
+
export interface ParsedArtifact {
|
|
23
|
+
sections: Map<string, string>;
|
|
24
|
+
rawContent: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function parseArtifact(content: string): ParsedArtifact;
|
|
27
|
+
export declare function isPlaceholderContent(content: string): boolean;
|
|
28
|
+
export declare function hasStatusMismatch(artifactStatus: string | undefined, lifecycleState: string | undefined): boolean;
|
|
29
|
+
export declare function checkArtifact(runFolder: string, artifactFile: string, stageName: string, stateFile: ArtifactStateFile): ArtifactCheckResult;
|
|
30
|
+
export declare function checkAllArtifacts(meta: RunMetadata, stateFile: ArtifactStateFile): ArtifactCheckResult[];
|
|
31
|
+
//# sourceMappingURL=artifactChecker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifactChecker.d.ts","sourceRoot":"","sources":["../src/artifactChecker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAIpC,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AA6JD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzE;AAED,wBAAgB,8BAA8B,CAC5C,YAAY,EAAE,MAAM,GACnB,mBAAmB,GAAG,SAAS,CAEjC;AAQD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA8B7D;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ7D;AAID,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,GAAG,SAAS,GACjC,OAAO,CAQT;AAID,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,iBAAiB,GAC3B,mBAAmB,CAyErB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,iBAAiB,GAC3B,mBAAmB,EAAE,CASvB"}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.resolveArtifactKind = resolveArtifactKind;
|
|
37
|
+
exports.getArtifactSectionRequirements = getArtifactSectionRequirements;
|
|
38
|
+
exports.parseArtifact = parseArtifact;
|
|
39
|
+
exports.isPlaceholderContent = isPlaceholderContent;
|
|
40
|
+
exports.hasStatusMismatch = hasStatusMismatch;
|
|
41
|
+
exports.checkArtifact = checkArtifact;
|
|
42
|
+
exports.checkAllArtifacts = checkAllArtifacts;
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
const SECTION_REGISTRY = {
|
|
46
|
+
RequestBrief: {
|
|
47
|
+
required: [
|
|
48
|
+
'Artifact',
|
|
49
|
+
'Workflow mode',
|
|
50
|
+
'Original request',
|
|
51
|
+
'Requested change',
|
|
52
|
+
'Target area',
|
|
53
|
+
'User-visible or external behavior',
|
|
54
|
+
'Constraints',
|
|
55
|
+
'Non-goals',
|
|
56
|
+
'Success criteria',
|
|
57
|
+
'Ambiguity or missing information',
|
|
58
|
+
'Expected next stage',
|
|
59
|
+
'Status',
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
ArchitectureContextPacket: {
|
|
63
|
+
required: [
|
|
64
|
+
'Artifact',
|
|
65
|
+
'Workflow mode',
|
|
66
|
+
'Project root',
|
|
67
|
+
'Relevant files',
|
|
68
|
+
'Relevant symbols',
|
|
69
|
+
'Status',
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
BehaviorModel: {
|
|
73
|
+
required: [
|
|
74
|
+
'Artifact',
|
|
75
|
+
'Workflow mode',
|
|
76
|
+
'Status',
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
PseudocodePacket: {
|
|
80
|
+
required: [
|
|
81
|
+
'Artifact',
|
|
82
|
+
'Workflow mode',
|
|
83
|
+
'Status',
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
TestStrategyPacket: {
|
|
87
|
+
required: [
|
|
88
|
+
'Artifact',
|
|
89
|
+
'Workflow mode',
|
|
90
|
+
'Status',
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
ImplementationReport: {
|
|
94
|
+
required: [
|
|
95
|
+
'Artifact',
|
|
96
|
+
'Workflow mode',
|
|
97
|
+
'Status',
|
|
98
|
+
],
|
|
99
|
+
},
|
|
100
|
+
TestImplementationReport: {
|
|
101
|
+
required: [
|
|
102
|
+
'Artifact',
|
|
103
|
+
'Workflow mode',
|
|
104
|
+
'Status',
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
VerificationReport: {
|
|
108
|
+
required: [
|
|
109
|
+
'Artifact',
|
|
110
|
+
'Workflow mode',
|
|
111
|
+
'Status',
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
JudgeReport: {
|
|
115
|
+
required: [
|
|
116
|
+
'Artifact',
|
|
117
|
+
'Workflow mode',
|
|
118
|
+
'Verdict',
|
|
119
|
+
'Status',
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
FinalReport: {
|
|
123
|
+
required: [
|
|
124
|
+
'Artifact',
|
|
125
|
+
'Workflow mode',
|
|
126
|
+
'Run ID',
|
|
127
|
+
'Status',
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
DesignMap: {
|
|
131
|
+
required: [
|
|
132
|
+
'Artifact',
|
|
133
|
+
'DesignMap',
|
|
134
|
+
'Workflow mode',
|
|
135
|
+
'Inputs used',
|
|
136
|
+
'Trace ID registry',
|
|
137
|
+
'Requirement links',
|
|
138
|
+
'Context links',
|
|
139
|
+
'Behavior links',
|
|
140
|
+
'Invariant links',
|
|
141
|
+
'Transition links',
|
|
142
|
+
'Pseudocode links',
|
|
143
|
+
'Test responsibility links',
|
|
144
|
+
'Implementation links',
|
|
145
|
+
'Verification links',
|
|
146
|
+
'Risk links',
|
|
147
|
+
'Orphan or missing links',
|
|
148
|
+
'Trace gaps',
|
|
149
|
+
'Status',
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
// ─── Artifact kind resolver ───────────────────────────────────────────────────
|
|
154
|
+
const STAGE_TO_KIND = {
|
|
155
|
+
// core
|
|
156
|
+
'request-brief': 'RequestBrief',
|
|
157
|
+
'architecture-context': 'ArchitectureContextPacket',
|
|
158
|
+
'behavior-model': 'BehaviorModel',
|
|
159
|
+
'pseudocode-packet': 'PseudocodePacket',
|
|
160
|
+
'test-strategy': 'TestStrategyPacket',
|
|
161
|
+
'implementation': 'ImplementationReport',
|
|
162
|
+
'test-implementation': 'TestImplementationReport',
|
|
163
|
+
'verification': 'VerificationReport',
|
|
164
|
+
'judge': 'JudgeReport',
|
|
165
|
+
'final-report': 'FinalReport',
|
|
166
|
+
// repair-specific
|
|
167
|
+
'observed-behavior-report': 'ObservedBehaviorReport',
|
|
168
|
+
'behavior-trace': 'BehaviorTrace',
|
|
169
|
+
'divergence-report': 'DivergenceReport',
|
|
170
|
+
'correction-design': 'CorrectionDesign',
|
|
171
|
+
'regression-test-strategy': 'RegressionTestStrategy',
|
|
172
|
+
// test-specific
|
|
173
|
+
'test-target-brief': 'TestTargetBrief',
|
|
174
|
+
'behavior-reconstruction': 'BehaviorReconstruction',
|
|
175
|
+
'pseudocode-summary': 'PseudocodeSummary',
|
|
176
|
+
// refactor-specific
|
|
177
|
+
'refactor-brief': 'RefactorBrief',
|
|
178
|
+
'existing-behavior-map': 'ExistingBehaviorMap',
|
|
179
|
+
'preserved-invariant-list': 'PreservedInvariantList',
|
|
180
|
+
'compatibility-test-strategy': 'CompatibilityTestStrategy',
|
|
181
|
+
'refactor-pseudocode-packet': 'RefactorPseudocodePacket',
|
|
182
|
+
// harden-specific
|
|
183
|
+
'hardening-brief': 'HardeningBrief',
|
|
184
|
+
'assumption-report': 'AssumptionReport',
|
|
185
|
+
'failure-mode-matrix': 'FailureModeMatrix',
|
|
186
|
+
'guard-pseudocode-packet': 'GuardPseudocodePacket',
|
|
187
|
+
'resilience-test-strategy': 'ResilienceTestStrategy',
|
|
188
|
+
// extraction-specific
|
|
189
|
+
'source-architecture-context': 'SourceArchitectureContextPacket',
|
|
190
|
+
'source-workflow-map': 'SourceWorkflowMap',
|
|
191
|
+
'porting-map': 'PortingMap',
|
|
192
|
+
'golden-behavior-contract': 'GoldenBehaviorContract',
|
|
193
|
+
'target-architecture': 'TargetArchitectureProposal',
|
|
194
|
+
// design trace
|
|
195
|
+
'design-map': 'DesignMap',
|
|
196
|
+
};
|
|
197
|
+
function resolveArtifactKind(stageName) {
|
|
198
|
+
return STAGE_TO_KIND[stageName];
|
|
199
|
+
}
|
|
200
|
+
function getArtifactSectionRequirements(artifactKind) {
|
|
201
|
+
return SECTION_REGISTRY[artifactKind];
|
|
202
|
+
}
|
|
203
|
+
// ─── Text artifact parser ─────────────────────────────────────────────────────
|
|
204
|
+
// Matches section headers: line starting with capital letter, alphanumeric/space/special, colon.
|
|
205
|
+
// Examples: "Artifact:", "Workflow mode:", "Run ID:", "User-visible or external behavior:"
|
|
206
|
+
const SECTION_HEADER_RE = /^([A-Z][A-Za-z0-9 ()/-]{0,79}):\s*(.*)$/;
|
|
207
|
+
function parseArtifact(content) {
|
|
208
|
+
const sections = new Map();
|
|
209
|
+
const lines = content.split('\n');
|
|
210
|
+
let currentKey = null;
|
|
211
|
+
const accumulator = [];
|
|
212
|
+
const flushSection = () => {
|
|
213
|
+
if (currentKey !== null) {
|
|
214
|
+
sections.set(currentKey, accumulator.join('\n').trim());
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
for (const line of lines) {
|
|
218
|
+
const match = SECTION_HEADER_RE.exec(line);
|
|
219
|
+
if (match) {
|
|
220
|
+
flushSection();
|
|
221
|
+
currentKey = match[1].trim();
|
|
222
|
+
accumulator.length = 0;
|
|
223
|
+
const inline = match[2].trim();
|
|
224
|
+
if (inline) {
|
|
225
|
+
accumulator.push(inline);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
else if (currentKey !== null) {
|
|
229
|
+
accumulator.push(line);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
flushSection();
|
|
233
|
+
return { sections, rawContent: content };
|
|
234
|
+
}
|
|
235
|
+
// ─── Placeholder detection ────────────────────────────────────────────────────
|
|
236
|
+
const PLACEHOLDER_MARKERS = ['TODO', 'PLACEHOLDER', '[TBD]', '[TODO]'];
|
|
237
|
+
const CONTENT_MIN_LENGTH = 80;
|
|
238
|
+
function isPlaceholderContent(content) {
|
|
239
|
+
const stripped = content.replace(/\s/g, '');
|
|
240
|
+
if (stripped.length < CONTENT_MIN_LENGTH)
|
|
241
|
+
return true;
|
|
242
|
+
for (const marker of PLACEHOLDER_MARKERS) {
|
|
243
|
+
if (content.includes(marker))
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
if (/^\s*\.{3,}\s*$/.test(content))
|
|
247
|
+
return true;
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
// ─── Status mismatch detection ────────────────────────────────────────────────
|
|
251
|
+
function hasStatusMismatch(artifactStatus, lifecycleState) {
|
|
252
|
+
if (!artifactStatus || !lifecycleState)
|
|
253
|
+
return false;
|
|
254
|
+
// Take only the first line of Status field; agents may write extra content below it
|
|
255
|
+
const artStatus = (artifactStatus.split(/[\n\r]/)[0] ?? '').toLowerCase().trim();
|
|
256
|
+
const lcState = lifecycleState.toLowerCase().trim();
|
|
257
|
+
if ((artStatus === 'blocked' || artStatus === 'incomplete') && lcState === 'complete')
|
|
258
|
+
return true;
|
|
259
|
+
if (artStatus === 'complete' && (lcState === 'blocked' || lcState === 'incomplete'))
|
|
260
|
+
return true;
|
|
261
|
+
return false;
|
|
262
|
+
}
|
|
263
|
+
// ─── Check runner ─────────────────────────────────────────────────────────────
|
|
264
|
+
function checkArtifact(runFolder, artifactFile, stageName, stateFile) {
|
|
265
|
+
const fullPath = path.join(runFolder, artifactFile);
|
|
266
|
+
const artifactKind = resolveArtifactKind(stageName) ?? 'Unknown';
|
|
267
|
+
const checkedAt = new Date().toISOString();
|
|
268
|
+
const issues = [];
|
|
269
|
+
if (!fs.existsSync(fullPath)) {
|
|
270
|
+
return {
|
|
271
|
+
artifactFile,
|
|
272
|
+
artifactKind,
|
|
273
|
+
issues: [
|
|
274
|
+
{
|
|
275
|
+
code: 'MISSING_FILE',
|
|
276
|
+
severity: 'fail',
|
|
277
|
+
message: `Artifact file does not exist: ${artifactFile}`,
|
|
278
|
+
},
|
|
279
|
+
],
|
|
280
|
+
passed: false,
|
|
281
|
+
checkedAt,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
const content = fs.readFileSync(fullPath, 'utf8');
|
|
285
|
+
const parsed = parseArtifact(content);
|
|
286
|
+
if (isPlaceholderContent(content)) {
|
|
287
|
+
issues.push({
|
|
288
|
+
code: 'PLACEHOLDER_CONTENT',
|
|
289
|
+
severity: 'warn',
|
|
290
|
+
message: 'Artifact appears to be a placeholder or is suspiciously short',
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
const requirements = getArtifactSectionRequirements(artifactKind);
|
|
294
|
+
if (requirements) {
|
|
295
|
+
for (const section of requirements.required) {
|
|
296
|
+
if (!parsed.sections.has(section)) {
|
|
297
|
+
issues.push({
|
|
298
|
+
code: 'MISSING_SECTION',
|
|
299
|
+
severity: 'fail',
|
|
300
|
+
message: `Required section "${section}" is not present`,
|
|
301
|
+
section,
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
const sectionContent = parsed.sections.get(section) ?? '';
|
|
306
|
+
if (!sectionContent.trim()) {
|
|
307
|
+
issues.push({
|
|
308
|
+
code: 'EMPTY_SECTION',
|
|
309
|
+
severity: 'warn',
|
|
310
|
+
message: `Required section "${section}" is present but empty`,
|
|
311
|
+
section,
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
const artifactStatus = parsed.sections.get('Status');
|
|
317
|
+
const stateRecord = stateFile.artifacts[artifactFile];
|
|
318
|
+
const lifecycleState = stateRecord?.state;
|
|
319
|
+
if (hasStatusMismatch(artifactStatus, lifecycleState)) {
|
|
320
|
+
issues.push({
|
|
321
|
+
code: 'STATUS_MISMATCH',
|
|
322
|
+
severity: 'warn',
|
|
323
|
+
message: `Artifact Status field "${artifactStatus}" does not match lifecycle state "${lifecycleState}"`,
|
|
324
|
+
section: 'Status',
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const passed = !issues.some((i) => i.severity === 'fail');
|
|
329
|
+
return { artifactFile, artifactKind, issues, passed, checkedAt };
|
|
330
|
+
}
|
|
331
|
+
function checkAllArtifacts(meta, stateFile) {
|
|
332
|
+
const results = [];
|
|
333
|
+
for (const stage of meta.stages) {
|
|
334
|
+
results.push(checkArtifact(meta.runFolder, stage.artifactFile, stage.name, stateFile));
|
|
335
|
+
for (const additional of stage.additionalArtifactFiles ?? []) {
|
|
336
|
+
results.push(checkArtifact(meta.runFolder, additional, stage.name, stateFile));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return results;
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=artifactChecker.js.map
|