kyro-ai 3.2.2 → 3.3.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/.claude-plugin/plugin.json +4 -2
- package/README.md +14 -1
- package/WORKFLOW.yaml +1 -1
- package/agents/orchestrator.md +3 -3
- package/commands/status.md +2 -2
- package/dist/cli/app.d.ts.map +1 -1
- package/dist/cli/app.js +9 -0
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/artifacts/json.d.ts +8 -0
- package/dist/cli/artifacts/json.d.ts.map +1 -0
- package/dist/cli/artifacts/json.js +18 -0
- package/dist/cli/artifacts/json.js.map +1 -0
- package/dist/cli/artifacts/paths.d.ts +9 -0
- package/dist/cli/artifacts/paths.d.ts.map +1 -0
- package/dist/cli/artifacts/paths.js +36 -0
- package/dist/cli/artifacts/paths.js.map +1 -0
- package/dist/cli/artifacts/schema.d.ts +102 -0
- package/dist/cli/artifacts/schema.d.ts.map +1 -0
- package/dist/cli/artifacts/schema.js +157 -0
- package/dist/cli/artifacts/schema.js.map +1 -0
- package/dist/cli/commands/artifact-doctor.d.ts +8 -0
- package/dist/cli/commands/artifact-doctor.d.ts.map +1 -0
- package/dist/cli/commands/artifact-doctor.js +246 -0
- package/dist/cli/commands/artifact-doctor.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +5 -2
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/repair.d.ts +4 -0
- package/dist/cli/commands/repair.d.ts.map +1 -0
- package/dist/cli/commands/repair.js +271 -0
- package/dist/cli/commands/repair.js.map +1 -0
- package/dist/cli/commands/scope.d.ts +2 -0
- package/dist/cli/commands/scope.d.ts.map +1 -0
- package/dist/cli/commands/scope.js +113 -0
- package/dist/cli/commands/scope.js.map +1 -0
- package/dist/cli/commands/token-audit.d.ts.map +1 -1
- package/dist/cli/commands/token-audit.js +124 -2
- package/dist/cli/commands/token-audit.js.map +1 -1
- package/dist/cli/commands/tui.js +3 -3
- package/dist/cli/commands/tui.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +35 -2
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/options.d.ts.map +1 -1
- package/dist/cli/options.js +17 -0
- package/dist/cli/options.js.map +1 -1
- package/dist/cli/types.d.ts +2 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/docs/cli.md +35 -2
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/kyro.json +11 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/DEBT.summary.json +12 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/RE-ENTRY-PROMPTS.md +1 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/ROADMAP.md +4 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/ROADMAP.summary.json +15 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/index.json +15 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.md +8 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.summary.json +16 -0
- package/fixtures/artifact-integrity/active-sprint-missing/.agents/kyro/scopes/demo/state.json +11 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/kyro.json +11 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/DEBT.summary.json +12 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/RE-ENTRY-PROMPTS.md +1 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/ROADMAP.md +4 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/ROADMAP.summary.json +15 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/index.json +15 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.md +8 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.summary.json +16 -0
- package/fixtures/artifact-integrity/invalid-state/.agents/kyro/scopes/demo/state.json +10 -0
- package/fixtures/artifact-integrity/missing-summary/.agents/kyro/kyro.json +11 -0
- package/fixtures/artifact-integrity/missing-summary/.agents/kyro/scopes/demo/RE-ENTRY-PROMPTS.md +1 -0
- package/fixtures/artifact-integrity/missing-summary/.agents/kyro/scopes/demo/ROADMAP.md +4 -0
- package/fixtures/artifact-integrity/missing-summary/.agents/kyro/scopes/demo/index.json +15 -0
- package/fixtures/artifact-integrity/missing-summary/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.md +8 -0
- package/fixtures/artifact-integrity/missing-summary/.agents/kyro/scopes/demo/state.json +11 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/kyro.json +11 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/DEBT.summary.json +12 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/RE-ENTRY-PROMPTS.md +1 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/ROADMAP.md +4 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/ROADMAP.summary.json +15 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/index.json +15 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.md +8 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.summary.json +16 -0
- package/fixtures/artifact-integrity/stale-summary/.agents/kyro/scopes/demo/state.json +11 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/kyro.json +11 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/DEBT.summary.json +12 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/RE-ENTRY-PROMPTS.md +1 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/ROADMAP.md +4 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/ROADMAP.summary.json +15 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/index.json +15 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.md +8 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/phases/SPRINT-001-demo.summary.json +16 -0
- package/fixtures/artifact-integrity/valid/.agents/kyro/scopes/demo/state.json +11 -0
- package/package.json +6 -2
- package/scripts/check-artifact-fixtures.mjs +56 -0
- package/skills/sprint-forge/SKILL.md +2 -2
- package/skills/sprint-forge/assets/README.md +15 -4
- package/skills/sprint-forge/assets/fixtures/subcommands-and-reports.sizingDecision.json +17 -0
- package/skills/sprint-forge/assets/helpers/analysis/audit.md +18 -0
- package/skills/sprint-forge/assets/helpers/analysis/bugfix.md +19 -0
- package/skills/sprint-forge/assets/helpers/analysis/feature.md +28 -0
- package/skills/sprint-forge/assets/helpers/analysis/new-project.md +18 -0
- package/skills/sprint-forge/assets/helpers/analysis/refactor.md +18 -0
- package/skills/sprint-forge/assets/helpers/analysis/tech-debt.md +18 -0
- package/skills/sprint-forge/assets/modes/INIT.md +33 -64
- package/skills/sprint-forge/assets/templates/PROJECT-README.md +16 -60
- package/skills/sprint-forge/assets/templates/REENTRY-PROMPTS.md +18 -87
- package/skills/sprint-forge/assets/templates/ROADMAP.md +16 -65
- package/skills/sprint-forge/assets/templates/ROADMAP.summary.json +9 -0
- package/skills/sprint-forge/assets/templates/index.json +9 -0
- package/skills/sprint-forge/assets/helpers/analysis-guide.md +0 -207
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kyro-ai",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"description": "Claude Code adapter for Kyro, a portable sprint workflow kit for AI coding agents",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "SynapSync",
|
|
@@ -36,5 +36,7 @@
|
|
|
36
36
|
"agents": [
|
|
37
37
|
"./agents/orchestrator.md"
|
|
38
38
|
],
|
|
39
|
-
"commands": [
|
|
39
|
+
"commands": [
|
|
40
|
+
"./commands/"
|
|
41
|
+
]
|
|
40
42
|
}
|
package/README.md
CHANGED
|
@@ -166,7 +166,7 @@ Common usage:
|
|
|
166
166
|
|
|
167
167
|
```bash
|
|
168
168
|
kyro install --agent opencode,codex --scope workspace --yes
|
|
169
|
-
kyro doctor
|
|
169
|
+
kyro doctor --tokens --artifacts
|
|
170
170
|
kyro sync --agent codex --dry-run
|
|
171
171
|
kyro uninstall --dry-run
|
|
172
172
|
```
|
|
@@ -184,6 +184,19 @@ There is intentionally no `generic` adapter. Cross-agent instructions belong in
|
|
|
184
184
|
|
|
185
185
|
---
|
|
186
186
|
|
|
187
|
+
|
|
188
|
+
## Artifact Integrity
|
|
189
|
+
|
|
190
|
+
Kyro treats the repo as the system of record. Validate and repair the knowledge contract with:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
kyro doctor --artifacts
|
|
194
|
+
kyro repair --kyro-scope <scope> --yes
|
|
195
|
+
kyro scope inspect <scope>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
`repair` only rebuilds JSON routing/summaries from existing Markdown evidence; it does not rewrite user-authored Markdown.
|
|
199
|
+
|
|
187
200
|
## Core Workflow
|
|
188
201
|
|
|
189
202
|
Kyro has three stable workflow intents:
|
package/WORKFLOW.yaml
CHANGED
package/agents/orchestrator.md
CHANGED
|
@@ -98,15 +98,15 @@ The `skills` declaration in frontmatter is metadata only — it does NOT auto-in
|
|
|
98
98
|
|
|
99
99
|
1. Read `skills/sprint-forge/SKILL.md` — sprint-forge orchestration logic, critical rules, mode detection, capabilities matrix
|
|
100
100
|
2. Load mode-gated assets based on the current phase:
|
|
101
|
-
- **INIT phase**: Read `skills/sprint-forge/assets/modes/INIT.md`, `skills/sprint-forge/assets/helpers/analysis
|
|
101
|
+
- **INIT phase**: Read `skills/sprint-forge/assets/modes/INIT.md`, then exactly one routed `skills/sprint-forge/assets/helpers/analysis/{workType}.md` helper
|
|
102
102
|
- **SPRINT phase**: Read `skills/sprint-forge/assets/modes/SPRINT.md`, `skills/sprint-forge/assets/helpers/sprint-generator.md`, `skills/sprint-forge/assets/helpers/debt-tracker.md`, `skills/sprint-forge/assets/helpers/reentry-generator.md`
|
|
103
103
|
- **STATUS phase**: Read `skills/sprint-forge/assets/modes/STATUS.md`, `skills/sprint-forge/assets/helpers/debt-tracker.md`
|
|
104
104
|
3. Load templates **on-demand** as each workflow step references them (not upfront)
|
|
105
105
|
|
|
106
106
|
**Helpers** (loaded on-demand per phase):
|
|
107
107
|
|
|
108
|
-
1. Read `skills/sprint-forge/assets/helpers/analyzer.md` — work type detection
|
|
109
|
-
2. Read `skills/sprint-forge/assets/helpers/analysis
|
|
108
|
+
1. Read `skills/sprint-forge/assets/helpers/analyzer.md` — work type detection when INIT cannot classify the request cheaply
|
|
109
|
+
2. Read one `skills/sprint-forge/assets/helpers/analysis/{workType}.md` helper — work-type analysis and sizing signals (INIT phase)
|
|
110
110
|
3. Read `skills/sprint-forge/assets/helpers/reviewer.md` — checklist tiers, validation commands, output format (SPRINT phase)
|
|
111
111
|
|
|
112
112
|
**All skill paths are relative to the workflow root (the plugin installation directory).**
|
package/commands/status.md
CHANGED
|
@@ -12,13 +12,13 @@ Report Kyro progress without loading all sprint Markdown by default.
|
|
|
12
12
|
1. Read `.agents/kyro/kyro.json`.
|
|
13
13
|
2. Resolve scope from `$ARGUMENTS`, `activeScope`, or `.agents/kyro/scopes/`.
|
|
14
14
|
3. Read `.agents/kyro/scopes/{scope}/state.json` and `index.json` first.
|
|
15
|
-
4. Prefer `ROADMAP.summary.json`, `SPRINT-*.summary.json`, and `DEBT.summary.json` when present.
|
|
15
|
+
4. Prefer `ROADMAP.summary.json`, `SPRINT-*.summary.json`, and `DEBT.summary.json` when present. Use `sizingDecision` from summaries to explain sprint count without opening roadmap Markdown.
|
|
16
16
|
|
|
17
17
|
## Route
|
|
18
18
|
|
|
19
19
|
| Request | Load next |
|
|
20
20
|
|---------|-----------|
|
|
21
|
-
| `brief` or empty | Summaries only; open Markdown only for missing critical fields. |
|
|
21
|
+
| `brief` or empty | Summaries only; include sprint count rationale from `sizingDecision`; open Markdown only for missing critical fields. |
|
|
22
22
|
| `full` | `skills/sprint-forge/assets/modes/STATUS.md`, then summaries, then Markdown fallbacks. |
|
|
23
23
|
| `debt` | `skills/sprint-forge/assets/helpers/debt-tracker.md` plus debt summary/table. |
|
|
24
24
|
| `debt-add`, `debt-resolve`, `debt-escalate` | `debt-tracker.md`, then update Markdown and summaries. |
|
package/dist/cli/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":"AASA,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD5C"}
|
package/dist/cli/app.js
CHANGED
|
@@ -4,6 +4,8 @@ exports.runCli = runCli;
|
|
|
4
4
|
const doctor_1 = require("./commands/doctor");
|
|
5
5
|
const install_1 = require("./commands/install");
|
|
6
6
|
const tui_1 = require("./commands/tui");
|
|
7
|
+
const repair_1 = require("./commands/repair");
|
|
8
|
+
const scope_1 = require("./commands/scope");
|
|
7
9
|
const uninstall_1 = require("./commands/uninstall");
|
|
8
10
|
const help_1 = require("./help");
|
|
9
11
|
const options_1 = require("./options");
|
|
@@ -21,6 +23,10 @@ async function runCli() {
|
|
|
21
23
|
console.log((0, help_1.readPackageVersion)());
|
|
22
24
|
return;
|
|
23
25
|
}
|
|
26
|
+
if (command === 'scope') {
|
|
27
|
+
(0, scope_1.runScopeCommand)(args);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
24
30
|
const options = (0, options_1.parseOptions)(args);
|
|
25
31
|
if (options.help) {
|
|
26
32
|
(0, help_1.printCommandHelp)(command);
|
|
@@ -33,6 +39,9 @@ async function runCli() {
|
|
|
33
39
|
case 'doctor':
|
|
34
40
|
(0, doctor_1.doctor)(options);
|
|
35
41
|
break;
|
|
42
|
+
case 'repair':
|
|
43
|
+
await (0, repair_1.repair)(options);
|
|
44
|
+
break;
|
|
36
45
|
case 'sync':
|
|
37
46
|
(0, install_1.sync)(options);
|
|
38
47
|
break;
|
package/dist/cli/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.ts"],"names":[],"mappings":";;AASA,wBAiDC;AA1DD,8CAA2C;AAC3C,gDAAmD;AACnD,wCAAwC;AACxC,8CAA2C;AAC3C,4CAAmD;AACnD,oDAAiD;AACjD,iCAAyE;AACzE,uCAAyC;AAElC,KAAK,UAAU,MAAM;IAC1B,MAAM,CAAC,OAAO,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtD,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACxC,MAAM,IAAA,YAAM,GAAE,CAAC;QACf,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACnE,IAAA,gBAAS,GAAE,CAAC;QACZ,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,IAAA,yBAAkB,GAAE,CAAC,CAAC;QAClC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,IAAA,uBAAgB,EAAC,OAAO,CAAC,CAAC;QAC1B,OAAO;IACT,CAAC;IAED,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,SAAS;YACZ,IAAA,iBAAO,EAAC,OAAO,CAAC,CAAC;YACjB,MAAM;QACR,KAAK,QAAQ;YACX,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC;YAChB,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC;YACtB,MAAM;QACR,KAAK,MAAM;YACT,IAAA,cAAI,EAAC,OAAO,CAAC,CAAC;YACd,MAAM;QACR,KAAK,WAAW;YACd,IAAA,qBAAS,EAAC,OAAO,CAAC,CAAC;YACnB,MAAM;QACR;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,oBAAoB,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../../src/cli/artifacts/json.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAU3D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readJsonSafely = readJsonSafely;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const fs_1 = require("../fs");
|
|
6
|
+
function readJsonSafely(path) {
|
|
7
|
+
const absolutePath = (0, fs_1.resolveManagedPath)(path);
|
|
8
|
+
if (!(0, node_fs_1.existsSync)(absolutePath)) {
|
|
9
|
+
return { path, exists: false, value: null, error: null };
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
return { path, exists: true, value: JSON.parse((0, node_fs_1.readFileSync)(absolutePath, 'utf-8')), error: null };
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
return { path, exists: true, value: null, error: error instanceof Error ? error.message : String(error) };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/cli/artifacts/json.ts"],"names":[],"mappings":";;AAUA,wCAUC;AApBD,qCAAmD;AACnD,8BAA2C;AAS3C,SAAgB,cAAc,CAAC,IAAY;IACzC,MAAM,YAAY,GAAG,IAAA,uBAAkB,EAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAA,oBAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAA,sBAAY,EAAC,YAAY,EAAE,OAAO,CAAC,CAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAChH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare function scopeRoot(scope: string): string;
|
|
2
|
+
export declare function scopeStatePath(scope: string): string;
|
|
3
|
+
export declare function scopeIndexPath(scope: string): string;
|
|
4
|
+
export declare function roadmapPath(scope: string): string;
|
|
5
|
+
export declare function roadmapSummaryPath(scope: string): string;
|
|
6
|
+
export declare function debtSummaryPath(scope: string): string;
|
|
7
|
+
export declare function phasesPath(scope: string): string;
|
|
8
|
+
export declare function projectStatePath(): string;
|
|
9
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/cli/artifacts/paths.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scopeRoot = scopeRoot;
|
|
4
|
+
exports.scopeStatePath = scopeStatePath;
|
|
5
|
+
exports.scopeIndexPath = scopeIndexPath;
|
|
6
|
+
exports.roadmapPath = roadmapPath;
|
|
7
|
+
exports.roadmapSummaryPath = roadmapSummaryPath;
|
|
8
|
+
exports.debtSummaryPath = debtSummaryPath;
|
|
9
|
+
exports.phasesPath = phasesPath;
|
|
10
|
+
exports.projectStatePath = projectStatePath;
|
|
11
|
+
const constants_1 = require("../constants");
|
|
12
|
+
function scopeRoot(scope) {
|
|
13
|
+
return `${constants_1.ARTIFACT_ROOT}/${scope}`;
|
|
14
|
+
}
|
|
15
|
+
function scopeStatePath(scope) {
|
|
16
|
+
return `${scopeRoot(scope)}/state.json`;
|
|
17
|
+
}
|
|
18
|
+
function scopeIndexPath(scope) {
|
|
19
|
+
return `${scopeRoot(scope)}/index.json`;
|
|
20
|
+
}
|
|
21
|
+
function roadmapPath(scope) {
|
|
22
|
+
return `${scopeRoot(scope)}/ROADMAP.md`;
|
|
23
|
+
}
|
|
24
|
+
function roadmapSummaryPath(scope) {
|
|
25
|
+
return `${scopeRoot(scope)}/ROADMAP.summary.json`;
|
|
26
|
+
}
|
|
27
|
+
function debtSummaryPath(scope) {
|
|
28
|
+
return `${scopeRoot(scope)}/DEBT.summary.json`;
|
|
29
|
+
}
|
|
30
|
+
function phasesPath(scope) {
|
|
31
|
+
return `${scopeRoot(scope)}/phases`;
|
|
32
|
+
}
|
|
33
|
+
function projectStatePath() {
|
|
34
|
+
return constants_1.KYRO_STATE_PATH;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/cli/artifacts/paths.ts"],"names":[],"mappings":";;AAEA,8BAEC;AAED,wCAEC;AAED,wCAEC;AAED,kCAEC;AAED,gDAEC;AAED,0CAEC;AAED,gCAEC;AAED,4CAEC;AAhCD,4CAA8D;AAE9D,SAAgB,SAAS,CAAC,KAAa;IACrC,OAAO,GAAG,yBAAa,IAAI,KAAK,EAAE,CAAC;AACrC,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;AAC1C,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;AAC1C,CAAC;AAED,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,aAAa,CAAC;AAC1C,CAAC;AAED,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,uBAAuB,CAAC;AACpD,CAAC;AAED,SAAgB,eAAe,CAAC,KAAa;IAC3C,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,oBAAoB,CAAC;AACjD,CAAC;AAED,SAAgB,UAAU,CAAC,KAAa;IACtC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;AACtC,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,2BAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { KyroProjectState } from '../types';
|
|
2
|
+
export declare const KYRO_SCOPE_STATUS: {
|
|
3
|
+
readonly PLANNING: "planning";
|
|
4
|
+
readonly ACTIVE: "active";
|
|
5
|
+
readonly COMPLETED: "completed";
|
|
6
|
+
readonly BLOCKED: "blocked";
|
|
7
|
+
};
|
|
8
|
+
export type KyroScopeStatus = (typeof KYRO_SCOPE_STATUS)[keyof typeof KYRO_SCOPE_STATUS];
|
|
9
|
+
export interface ValidationIssue {
|
|
10
|
+
path: string;
|
|
11
|
+
field: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}
|
|
14
|
+
export interface KyroScopeState {
|
|
15
|
+
schemaVersion: 1;
|
|
16
|
+
scope: string;
|
|
17
|
+
status: string;
|
|
18
|
+
activeSprint: string | null;
|
|
19
|
+
currentPhase: string;
|
|
20
|
+
nextAction: string;
|
|
21
|
+
roadmapPath: string;
|
|
22
|
+
sprintsPath: string;
|
|
23
|
+
lastUpdated: string;
|
|
24
|
+
}
|
|
25
|
+
export interface SizingDecisionSummary {
|
|
26
|
+
recommendedSprintCount: number;
|
|
27
|
+
riskLevel: string;
|
|
28
|
+
rationale: string;
|
|
29
|
+
splitTriggers: string[];
|
|
30
|
+
whyNotFewer: string;
|
|
31
|
+
whyNotMore: string;
|
|
32
|
+
sprintProofs: string[];
|
|
33
|
+
}
|
|
34
|
+
export interface RelevantArtifactPaths {
|
|
35
|
+
roadmap: string;
|
|
36
|
+
roadmapSummary: string;
|
|
37
|
+
sprints: string;
|
|
38
|
+
reentry: string;
|
|
39
|
+
}
|
|
40
|
+
export interface KyroScopeIndex {
|
|
41
|
+
schemaVersion: 1;
|
|
42
|
+
scope: string;
|
|
43
|
+
roadmapSummary: string;
|
|
44
|
+
activeSprintSummary: string | null;
|
|
45
|
+
openDebtCount: number;
|
|
46
|
+
nextTask: string | null;
|
|
47
|
+
sizingDecision?: SizingDecisionSummary;
|
|
48
|
+
relevantArtifactPaths: RelevantArtifactPaths;
|
|
49
|
+
lastUpdated: string;
|
|
50
|
+
}
|
|
51
|
+
export interface RoadmapSummary {
|
|
52
|
+
schemaVersion: 1;
|
|
53
|
+
scope: string;
|
|
54
|
+
status: string;
|
|
55
|
+
summary: string;
|
|
56
|
+
plannedSprintCount: number;
|
|
57
|
+
completedSprintCount: number;
|
|
58
|
+
adaptationCount: number;
|
|
59
|
+
sizingDecision?: SizingDecisionSummary;
|
|
60
|
+
nextRecommendedAction: string;
|
|
61
|
+
openDecisions: string[];
|
|
62
|
+
relevantArtifactPaths: string[];
|
|
63
|
+
lastUpdated: string;
|
|
64
|
+
}
|
|
65
|
+
export interface SprintSummary {
|
|
66
|
+
schemaVersion: 1;
|
|
67
|
+
scope: string;
|
|
68
|
+
sprint: string;
|
|
69
|
+
status: string;
|
|
70
|
+
completedTasks: number;
|
|
71
|
+
blockedTasks: number;
|
|
72
|
+
carryOverTasks: number;
|
|
73
|
+
nextRecommendedAction: string;
|
|
74
|
+
nextTask: string | null;
|
|
75
|
+
openDecisions: string[];
|
|
76
|
+
filesTouched: string[];
|
|
77
|
+
debtDeltas: unknown[];
|
|
78
|
+
sourceMarkdown: string;
|
|
79
|
+
lastUpdated: string;
|
|
80
|
+
}
|
|
81
|
+
export interface DebtSummary {
|
|
82
|
+
schemaVersion: 1;
|
|
83
|
+
scope: string;
|
|
84
|
+
open: number;
|
|
85
|
+
inProgress: number;
|
|
86
|
+
resolved: number;
|
|
87
|
+
deferred: number;
|
|
88
|
+
critical: number;
|
|
89
|
+
oldestOpenItem: string | null;
|
|
90
|
+
sourceMarkdown: string | null;
|
|
91
|
+
lastUpdated: string;
|
|
92
|
+
}
|
|
93
|
+
export declare function validateProjectStateShape(value: unknown, path: string): ValidationIssue[];
|
|
94
|
+
export declare function validateScopeState(value: unknown, path: string): ValidationIssue[];
|
|
95
|
+
export declare function validateScopeIndex(value: unknown, path: string): ValidationIssue[];
|
|
96
|
+
export declare function validateRoadmapSummary(value: unknown, path: string): ValidationIssue[];
|
|
97
|
+
export declare function validateSprintSummary(value: unknown, path: string): ValidationIssue[];
|
|
98
|
+
export declare function validateDebtSummary(value: unknown, path: string): ValidationIssue[];
|
|
99
|
+
export declare function asProjectState(value: unknown): KyroProjectState | null;
|
|
100
|
+
export declare function asScopeState(value: unknown): KyroScopeState | null;
|
|
101
|
+
export declare function asScopeIndex(value: unknown): KyroScopeIndex | null;
|
|
102
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/cli/artifacts/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KYRO_SCOPE_STATUS = void 0;
|
|
4
|
+
exports.validateProjectStateShape = validateProjectStateShape;
|
|
5
|
+
exports.validateScopeState = validateScopeState;
|
|
6
|
+
exports.validateScopeIndex = validateScopeIndex;
|
|
7
|
+
exports.validateRoadmapSummary = validateRoadmapSummary;
|
|
8
|
+
exports.validateSprintSummary = validateSprintSummary;
|
|
9
|
+
exports.validateDebtSummary = validateDebtSummary;
|
|
10
|
+
exports.asProjectState = asProjectState;
|
|
11
|
+
exports.asScopeState = asScopeState;
|
|
12
|
+
exports.asScopeIndex = asScopeIndex;
|
|
13
|
+
exports.KYRO_SCOPE_STATUS = {
|
|
14
|
+
PLANNING: 'planning',
|
|
15
|
+
ACTIVE: 'active',
|
|
16
|
+
COMPLETED: 'completed',
|
|
17
|
+
BLOCKED: 'blocked',
|
|
18
|
+
};
|
|
19
|
+
function validateProjectStateShape(value, path) {
|
|
20
|
+
const issues = [];
|
|
21
|
+
if (!isRecord(value))
|
|
22
|
+
return [{ path, field: '<root>', message: 'must be an object' }];
|
|
23
|
+
requireLiteral(value, 'schemaVersion', 1, path, issues);
|
|
24
|
+
requireString(value, 'artifactRoot', path, issues);
|
|
25
|
+
requireStringArray(value, 'scopes', path, issues);
|
|
26
|
+
requireNullableString(value, 'activeScope', path, issues);
|
|
27
|
+
requireString(value, 'runtimeVersion', path, issues);
|
|
28
|
+
requireString(value, 'runtimePath', path, issues);
|
|
29
|
+
if (!Array.isArray(value.installedAdapters))
|
|
30
|
+
issues.push({ path, field: 'installedAdapters', message: 'must be an array' });
|
|
31
|
+
return issues;
|
|
32
|
+
}
|
|
33
|
+
function validateScopeState(value, path) {
|
|
34
|
+
const issues = [];
|
|
35
|
+
if (!isRecord(value))
|
|
36
|
+
return [{ path, field: '<root>', message: 'must be an object' }];
|
|
37
|
+
requireLiteral(value, 'schemaVersion', 1, path, issues);
|
|
38
|
+
requireString(value, 'scope', path, issues);
|
|
39
|
+
requireString(value, 'status', path, issues);
|
|
40
|
+
requireNullableString(value, 'activeSprint', path, issues);
|
|
41
|
+
requireString(value, 'currentPhase', path, issues);
|
|
42
|
+
requireString(value, 'nextAction', path, issues);
|
|
43
|
+
requireString(value, 'roadmapPath', path, issues);
|
|
44
|
+
requireString(value, 'sprintsPath', path, issues);
|
|
45
|
+
requireString(value, 'lastUpdated', path, issues);
|
|
46
|
+
return issues;
|
|
47
|
+
}
|
|
48
|
+
function validateScopeIndex(value, path) {
|
|
49
|
+
const issues = [];
|
|
50
|
+
if (!isRecord(value))
|
|
51
|
+
return [{ path, field: '<root>', message: 'must be an object' }];
|
|
52
|
+
requireLiteral(value, 'schemaVersion', 1, path, issues);
|
|
53
|
+
requireString(value, 'scope', path, issues);
|
|
54
|
+
requireString(value, 'roadmapSummary', path, issues);
|
|
55
|
+
requireNullableString(value, 'activeSprintSummary', path, issues);
|
|
56
|
+
requireNumber(value, 'openDebtCount', path, issues);
|
|
57
|
+
requireNullableString(value, 'nextTask', path, issues);
|
|
58
|
+
if (!isRecord(value.relevantArtifactPaths)) {
|
|
59
|
+
issues.push({ path, field: 'relevantArtifactPaths', message: 'must be an object' });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
requireString(value.relevantArtifactPaths, 'roadmap', path, issues, 'relevantArtifactPaths.roadmap');
|
|
63
|
+
requireString(value.relevantArtifactPaths, 'roadmapSummary', path, issues, 'relevantArtifactPaths.roadmapSummary');
|
|
64
|
+
requireString(value.relevantArtifactPaths, 'sprints', path, issues, 'relevantArtifactPaths.sprints');
|
|
65
|
+
requireString(value.relevantArtifactPaths, 'reentry', path, issues, 'relevantArtifactPaths.reentry');
|
|
66
|
+
}
|
|
67
|
+
requireString(value, 'lastUpdated', path, issues);
|
|
68
|
+
return issues;
|
|
69
|
+
}
|
|
70
|
+
function validateRoadmapSummary(value, path) {
|
|
71
|
+
const issues = [];
|
|
72
|
+
if (!isRecord(value))
|
|
73
|
+
return [{ path, field: '<root>', message: 'must be an object' }];
|
|
74
|
+
requireLiteral(value, 'schemaVersion', 1, path, issues);
|
|
75
|
+
requireString(value, 'scope', path, issues);
|
|
76
|
+
requireString(value, 'status', path, issues);
|
|
77
|
+
requireString(value, 'summary', path, issues);
|
|
78
|
+
requireNumber(value, 'plannedSprintCount', path, issues);
|
|
79
|
+
requireNumber(value, 'completedSprintCount', path, issues);
|
|
80
|
+
requireNumber(value, 'adaptationCount', path, issues);
|
|
81
|
+
requireString(value, 'nextRecommendedAction', path, issues);
|
|
82
|
+
requireStringArray(value, 'openDecisions', path, issues);
|
|
83
|
+
requireStringArray(value, 'relevantArtifactPaths', path, issues);
|
|
84
|
+
requireString(value, 'lastUpdated', path, issues);
|
|
85
|
+
return issues;
|
|
86
|
+
}
|
|
87
|
+
function validateSprintSummary(value, path) {
|
|
88
|
+
const issues = [];
|
|
89
|
+
if (!isRecord(value))
|
|
90
|
+
return [{ path, field: '<root>', message: 'must be an object' }];
|
|
91
|
+
requireLiteral(value, 'schemaVersion', 1, path, issues);
|
|
92
|
+
requireString(value, 'scope', path, issues);
|
|
93
|
+
requireString(value, 'sprint', path, issues);
|
|
94
|
+
requireString(value, 'status', path, issues);
|
|
95
|
+
requireNumber(value, 'completedTasks', path, issues);
|
|
96
|
+
requireNumber(value, 'blockedTasks', path, issues);
|
|
97
|
+
requireNumber(value, 'carryOverTasks', path, issues);
|
|
98
|
+
requireString(value, 'nextRecommendedAction', path, issues);
|
|
99
|
+
requireNullableString(value, 'nextTask', path, issues);
|
|
100
|
+
requireStringArray(value, 'openDecisions', path, issues);
|
|
101
|
+
requireStringArray(value, 'filesTouched', path, issues);
|
|
102
|
+
if (!Array.isArray(value.debtDeltas))
|
|
103
|
+
issues.push({ path, field: 'debtDeltas', message: 'must be an array' });
|
|
104
|
+
requireString(value, 'sourceMarkdown', path, issues);
|
|
105
|
+
requireString(value, 'lastUpdated', path, issues);
|
|
106
|
+
return issues;
|
|
107
|
+
}
|
|
108
|
+
function validateDebtSummary(value, path) {
|
|
109
|
+
const issues = [];
|
|
110
|
+
if (!isRecord(value))
|
|
111
|
+
return [{ path, field: '<root>', message: 'must be an object' }];
|
|
112
|
+
requireLiteral(value, 'schemaVersion', 1, path, issues);
|
|
113
|
+
requireString(value, 'scope', path, issues);
|
|
114
|
+
requireNumber(value, 'open', path, issues);
|
|
115
|
+
requireNumber(value, 'inProgress', path, issues);
|
|
116
|
+
requireNumber(value, 'resolved', path, issues);
|
|
117
|
+
requireNumber(value, 'deferred', path, issues);
|
|
118
|
+
requireNumber(value, 'critical', path, issues);
|
|
119
|
+
requireNullableString(value, 'oldestOpenItem', path, issues);
|
|
120
|
+
requireNullableString(value, 'sourceMarkdown', path, issues);
|
|
121
|
+
requireString(value, 'lastUpdated', path, issues);
|
|
122
|
+
return issues;
|
|
123
|
+
}
|
|
124
|
+
function asProjectState(value) {
|
|
125
|
+
return validateProjectStateShape(value, '.agents/kyro/kyro.json').length === 0 ? value : null;
|
|
126
|
+
}
|
|
127
|
+
function asScopeState(value) {
|
|
128
|
+
return validateScopeState(value, 'state.json').length === 0 ? value : null;
|
|
129
|
+
}
|
|
130
|
+
function asScopeIndex(value) {
|
|
131
|
+
return validateScopeIndex(value, 'index.json').length === 0 ? value : null;
|
|
132
|
+
}
|
|
133
|
+
function requireLiteral(record, key, expected, path, issues) {
|
|
134
|
+
if (record[key] !== expected)
|
|
135
|
+
issues.push({ path, field: key, message: `must be ${String(expected)}` });
|
|
136
|
+
}
|
|
137
|
+
function requireString(record, key, path, issues, field = key) {
|
|
138
|
+
if (typeof record[key] !== 'string')
|
|
139
|
+
issues.push({ path, field, message: 'must be a string' });
|
|
140
|
+
}
|
|
141
|
+
function requireNullableString(record, key, path, issues) {
|
|
142
|
+
if (record[key] !== null && typeof record[key] !== 'string')
|
|
143
|
+
issues.push({ path, field: key, message: 'must be a string or null' });
|
|
144
|
+
}
|
|
145
|
+
function requireNumber(record, key, path, issues) {
|
|
146
|
+
if (typeof record[key] !== 'number' || Number.isNaN(record[key]))
|
|
147
|
+
issues.push({ path, field: key, message: 'must be a number' });
|
|
148
|
+
}
|
|
149
|
+
function requireStringArray(record, key, path, issues) {
|
|
150
|
+
if (!Array.isArray(record[key]) || !record[key].every((item) => typeof item === 'string')) {
|
|
151
|
+
issues.push({ path, field: key, message: 'must be an array of strings' });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function isRecord(value) {
|
|
155
|
+
return typeof value === 'object' && value !== null;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/cli/artifacts/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CheckResult } from '../types';
|
|
2
|
+
export interface ArtifactAuditOptions {
|
|
3
|
+
kyroScope: string | null;
|
|
4
|
+
}
|
|
5
|
+
export declare function runArtifactAuditChecks(options: ArtifactAuditOptions): CheckResult[];
|
|
6
|
+
export declare function inspectScope(scope: string): CheckResult[];
|
|
7
|
+
export declare function listScopeNames(): string[];
|
|
8
|
+
//# sourceMappingURL=artifact-doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/artifact-doctor.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAQD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,GAAG,WAAW,EAAE,CA6BnF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAEzD;AAED,wBAAgB,cAAc,IAAI,MAAM,EAAE,CAUzC"}
|