skills-doctor 0.5.2 → 0.6.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/CHANGELOG.md +57 -0
- package/README.md +50 -14
- package/dist/cli/commands/scan.d.ts +1 -0
- package/dist/cli/commands/scan.d.ts.map +1 -1
- package/dist/cli/commands/scan.js +523 -51
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -2
- package/dist/cli/utils/cleanup-handoff-to-agent.d.ts.map +1 -1
- package/dist/cli/utils/cleanup-handoff-to-agent.js +1 -4
- package/dist/cli/utils/handle-error.d.ts +4 -0
- package/dist/cli/utils/handle-error.d.ts.map +1 -1
- package/dist/cli/utils/handle-error.js +7 -0
- package/dist/cli/utils/handoff-to-agent.d.ts +1 -0
- package/dist/cli/utils/handoff-to-agent.d.ts.map +1 -1
- package/dist/cli/utils/handoff-to-agent.js +19 -9
- package/dist/cli/utils/launch-agent.d.ts.map +1 -1
- package/dist/cli/utils/launch-agent.js +18 -3
- package/dist/cli/utils/prompts.d.ts +6 -0
- package/dist/cli/utils/prompts.d.ts.map +1 -1
- package/dist/cli/utils/prompts.js +63 -3
- package/dist/cli/utils/tui-dashboard.d.ts +20 -0
- package/dist/cli/utils/tui-dashboard.d.ts.map +1 -0
- package/dist/cli/utils/tui-dashboard.js +516 -0
- package/dist/domain/analyze-skill-usage.d.ts +1 -0
- package/dist/domain/analyze-skill-usage.d.ts.map +1 -1
- package/dist/domain/analyze-skill-usage.js +6 -0
- package/dist/domain/build-cleanup-handoff-prompt.d.ts.map +1 -1
- package/dist/domain/build-cleanup-handoff-prompt.js +30 -3
- package/dist/domain/build-handoff-prompt.d.ts.map +1 -1
- package/dist/domain/build-handoff-prompt.js +24 -1
- package/dist/domain/build-report.d.ts +5 -1
- package/dist/domain/build-report.d.ts.map +1 -1
- package/dist/domain/build-report.js +31 -6
- package/dist/domain/discover-skill-artifacts.d.ts +3 -0
- package/dist/domain/discover-skill-artifacts.d.ts.map +1 -0
- package/dist/domain/discover-skill-artifacts.js +222 -0
- package/dist/domain/rule-catalog.d.ts +146 -3
- package/dist/domain/rule-catalog.d.ts.map +1 -1
- package/dist/domain/rule-catalog.js +168 -2
- package/dist/domain/rules/quality.d.ts.map +1 -1
- package/dist/domain/rules/quality.js +54 -2
- package/dist/domain/rules/security.d.ts +57 -0
- package/dist/domain/rules/security.d.ts.map +1 -0
- package/dist/domain/rules/security.js +1183 -0
- package/dist/domain/rules/structural.js +35 -10
- package/dist/domain/scan-skills.d.ts.map +1 -1
- package/dist/domain/scan-skills.js +16 -1
- package/dist/domain/security/capabilities.d.ts +3 -0
- package/dist/domain/security/capabilities.d.ts.map +1 -0
- package/dist/domain/security/capabilities.js +77 -0
- package/dist/domain/security/commands.d.ts +3 -0
- package/dist/domain/security/commands.d.ts.map +1 -0
- package/dist/domain/security/commands.js +12 -0
- package/dist/domain/security/detector-types.d.ts +14 -0
- package/dist/domain/security/detector-types.d.ts.map +1 -0
- package/dist/domain/security/detector-types.js +12 -0
- package/dist/domain/security/network.d.ts +3 -0
- package/dist/domain/security/network.d.ts.map +1 -0
- package/dist/domain/security/network.js +10 -0
- package/dist/domain/security/obfuscation.d.ts +3 -0
- package/dist/domain/security/obfuscation.d.ts.map +1 -0
- package/dist/domain/security/obfuscation.js +16 -0
- package/dist/domain/security/permissions.d.ts +3 -0
- package/dist/domain/security/permissions.d.ts.map +1 -0
- package/dist/domain/security/permissions.js +14 -0
- package/dist/domain/security/secrets.d.ts +4 -0
- package/dist/domain/security/secrets.d.ts.map +1 -0
- package/dist/domain/security/secrets.js +11 -0
- package/dist/domain/summarize-findings.d.ts +15 -1
- package/dist/domain/summarize-findings.d.ts.map +1 -1
- package/dist/domain/summarize-findings.js +140 -8
- package/dist/domain/types.d.ts +64 -1
- package/dist/domain/types.d.ts.map +1 -1
- package/dist/domain/write-findings-directory.js +33 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,63 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.6.0] - 2026-07-04
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added past-30-day detected usage counts to usage summaries and the unused-skill cleanup picker.
|
|
14
|
+
- Added scoped bulk agent handoffs for selected usage recommendation groups.
|
|
15
|
+
- Added `b back` navigation to nested interactive checkbox selectors and select-based submenus with a `Back to main menu` choice.
|
|
16
|
+
- Added severity bucket selection to security repair handoffs so users can select Critical, High, Medium, or Review findings in bulk while still selecting individual findings.
|
|
17
|
+
- Added security review incident grouping for human output while preserving raw security findings in JSON reports.
|
|
18
|
+
- Added security priority and capability aggregate counts to JSON reports, plus `--fail-on-security` for stricter P1/P2 security gates.
|
|
19
|
+
- Added P2 security hygiene rules for missing boundaries, missing human approval, ambiguous authority, unpinned tools, hidden artifacts, and large context bait.
|
|
20
|
+
- Added P1 high-risk security rules for broad tool grants, missing denylists, broad implicit invocation, external dependencies, cross-modal mismatch, self-modifying skills, MCP exposure, and MCP OAuth scope excess.
|
|
21
|
+
- Added P0 security priorities and spec-aligned `SKILL001_*` through `SKILL008_*` rule IDs for blocker security detections.
|
|
22
|
+
- Added derived security capability facts for package artifacts, including secret access, network egress, remote execution, persistence, approval bypass, destructive actions, broad tools, MCP access, and obfuscation indicators.
|
|
23
|
+
- Added package artifact discovery metadata to scan results, including script/resource/config files and symlink status.
|
|
24
|
+
- Added package security model types for future artifact, capability, priority, and cross-file evidence reporting.
|
|
25
|
+
- Added a full-screen interactive TTY dashboard with scan progress, usage metrics, cleanup candidates, and keyboard-driven next-step actions.
|
|
26
|
+
- Added a public security-rule validator API surface for future malicious skill detection rules.
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- Replaced the TUI dashboard completion progress strip with a scan score panel showing the score, label, penalty, and contributing rule counts.
|
|
31
|
+
- Reformatted interactive security review output into severity and category summary tables plus a compact incident table with user-facing Critical/High/Medium labels instead of P-code prose dumps.
|
|
32
|
+
- Made the TUI dashboard adaptive across terminal widths, with percentage progress, a package-version brand card, a security findings metric, and responsive metric wrapping.
|
|
33
|
+
- Human security review output now groups related rule hits into concise incidents and omits rationale/counterevidence noise by default.
|
|
34
|
+
- P0 security findings now fail scan exit-code gates by default.
|
|
35
|
+
- P2 security hygiene findings now contribute to scan score while remaining separate from default severity-based exit gates.
|
|
36
|
+
- Security validation now evaluates package records and can report risky non-`SKILL.md` artifacts while preserving the existing `validateSecurityRules()` API.
|
|
37
|
+
- Added confidence, rationale, and counterevidence metadata to security findings in JSON and human reports.
|
|
38
|
+
- Replaced the plain interactive review prompt with a painted ANSI dashboard while preserving JSON, non-interactive, and injected-prompt output paths.
|
|
39
|
+
- Separated security findings from quality issue counts, scoring, and default exit gates.
|
|
40
|
+
- Added source excerpts to security findings and a per-finding security repair selection flow.
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- Kept the TUI dashboard repainting on terminal resize and preserved the version brand card on medium-width terminal windows without line overruns.
|
|
45
|
+
- Passed the package version into interactive scan reports so the TUI brand card no longer falls back to a hard-coded version.
|
|
46
|
+
- Enforced non-empty compatibility metadata, string-only metadata maps, and deterministic checks for interactive or unsafe referenced scripts.
|
|
47
|
+
- Reported package-level secret reads and persistence capabilities as their required P0 security findings, and included both secret and network evidence in package exfiltration chains.
|
|
48
|
+
- Reduced prompt-injection false positives for ask-first admin flows and verified confirmation-skip CLI examples.
|
|
49
|
+
- Reduced exfiltration-rule false positives for webhook troubleshooting table rows and notification webhook destinations.
|
|
50
|
+
- Reduced exfiltration-rule false positives for webhook signing-secret setup and official API bearer-token examples while preserving arbitrary external secret-transfer findings.
|
|
51
|
+
- Suppressed prompt-injection false positives for defensive guidance about untrusted content, refusals, secret handling, signatures, and confirmations.
|
|
52
|
+
- Reduced false-positive remote-execution warnings for remote specs piped into local Node or shell parser scripts.
|
|
53
|
+
- Reduced false-positive remote-execution warnings for skills that fetch remote docs or specs for static parsing without executing the fetched content.
|
|
54
|
+
- Suppressed the reported real-world false positives for defensive untrusted-content handling and explicit public-issue confirmation guidance.
|
|
55
|
+
- Made `bun run dev` rebuild ignored `dist/` output before launching the packaged bin so local CLI runs reflect source changes.
|
|
56
|
+
|
|
57
|
+
### Security
|
|
58
|
+
|
|
59
|
+
- Added package-level MCP, denylist, external-dependency, self-modification, and cross-modal mismatch checks with P1 priority evidence chains.
|
|
60
|
+
- Added standalone local secret-access and persistence-installation blocker detections, including path-like sources such as `~/.ssh`, `.aws`, and shell startup files.
|
|
61
|
+
- Surfaced security findings in the interactive CLI summary and review menu.
|
|
62
|
+
- Integrated security findings into normal skill scans and report exit-code behavior.
|
|
63
|
+
- Added deterministic detection for remote execution, safety-disablement, destructive, and obfuscated command patterns in skill files.
|
|
64
|
+
- Added deterministic detection for instruction-subversion and secret-exfiltration patterns in skill files.
|
|
65
|
+
|
|
9
66
|
## [0.5.2] - 2026-06-20
|
|
10
67
|
|
|
11
68
|
### Added
|
package/README.md
CHANGED
|
@@ -8,6 +8,9 @@ findings-specific repair prompt to `claude` or `codex`.
|
|
|
8
8
|
It can also analyze local Codex usage traces to surface unused skills and
|
|
9
9
|
skills context-budget pressure before handing a cleanup prompt to a local agent.
|
|
10
10
|
|
|
11
|
+
> ★ If Skills Doctor helps you clean up or harden your agent skills, please
|
|
12
|
+
> [star the repo on GitHub](https://github.com/ametel01/skills-doctor).
|
|
13
|
+
|
|
11
14
|
## Install And Run
|
|
12
15
|
|
|
13
16
|
From a repository that contains project-local skills, or from anywhere when you
|
|
@@ -67,6 +70,11 @@ runs scan only a single unambiguous detected root. If multiple local/global
|
|
|
67
70
|
scopes or multiple ecosystems are detected, they fail with a clear user error
|
|
68
71
|
instead of guessing.
|
|
69
72
|
|
|
73
|
+
For each skill package, security scanning also classifies `SKILL.md`,
|
|
74
|
+
`scripts/**`, `references/**`, `assets/**`, agent/MCP/Claude config files,
|
|
75
|
+
hooks, package manifests, shell scripts, Dockerfiles, CI files, hidden files,
|
|
76
|
+
executable artifacts, and symlink metadata.
|
|
77
|
+
|
|
70
78
|
## What It Checks
|
|
71
79
|
|
|
72
80
|
The scanner validates skills against `docs/SKILLS_SPEC.md`, which consolidates
|
|
@@ -80,11 +88,26 @@ the Agent Skills standards from <https://agentskills.io/home>, including:
|
|
|
80
88
|
- script guidance that is non-interactive and reproducible
|
|
81
89
|
- eval guidance for non-trivial skills
|
|
82
90
|
- divergent same-name skills across Claude and Codex/agents roots
|
|
91
|
+
- suspicious security patterns across the skill package, including prompt
|
|
92
|
+
override, permission bypass, secret access, exfiltration chains, destructive
|
|
93
|
+
commands, persistence, remote execution, obfuscation, broad tools, missing
|
|
94
|
+
denylists, external dependencies, MCP exposure, self-modification, hidden
|
|
95
|
+
artifacts, and large context bait
|
|
83
96
|
|
|
84
97
|
See `docs/RULES.md` for a full rule catalog, severity, and intended rationale.
|
|
85
98
|
Programmatic consumers can import `ruleCatalog` for the same metadata as structured data.
|
|
86
|
-
|
|
87
|
-
|
|
99
|
+
Security findings are deterministic heuristic findings about suspicious
|
|
100
|
+
instructions or capabilities such as `reads_secrets`, `network_egress`,
|
|
101
|
+
`remote_code_exec`, `persistence`, `bypasses_approval`, or `mcp_access`; they
|
|
102
|
+
are not proof that a skill author intended harm.
|
|
103
|
+
|
|
104
|
+
Quality findings are grouped as blocking errors, warnings, and advisory improvements.
|
|
105
|
+
Security findings stay rule-by-rule in JSON, but human output groups related
|
|
106
|
+
signals into review incidents so a secret read, network transfer, missing
|
|
107
|
+
denylist, and cross-modal mismatch can be reviewed as one issue. Incident cards
|
|
108
|
+
show the primary risk, source excerpt, priority, related rule IDs, and
|
|
109
|
+
capabilities; detailed rationale and counterevidence remain available in JSON
|
|
110
|
+
and repair report files.
|
|
88
111
|
The human summary opens with a score header showing a face, `0` to `100` score,
|
|
89
112
|
label, and proportional terminal bar. The score starts at 100 and deducts 1.5
|
|
90
113
|
points for each distinct error rule and 0.75 points for each distinct warning
|
|
@@ -103,17 +126,23 @@ available, reads local Codex usage traces from known `~/.codex` paths. It can:
|
|
|
103
126
|
2. Show usage ranking and cleanup recommendations when usage analysis ran.
|
|
104
127
|
3. Let you choose a repair subset: errors, errors plus warnings, all findings,
|
|
105
128
|
or selected skills.
|
|
106
|
-
4.
|
|
107
|
-
|
|
129
|
+
4. Let you launch a scoped agent handoff for a selected usage recommendation
|
|
130
|
+
group, such as disable candidates or context-heavy descriptions.
|
|
131
|
+
5. Detect local `claude` and `codex` executables.
|
|
132
|
+
6. Write a full report under the OS temp directory, for example
|
|
108
133
|
`/tmp/skills-doctor-<uid>/reports/<timestamp>/` on Linux.
|
|
109
|
-
|
|
134
|
+
7. Generate a compact `handoff-prompt.md` tailored to the selected findings or
|
|
110
135
|
`cleanup-prompt.md` tailored to usage cleanup.
|
|
111
|
-
|
|
112
|
-
|
|
136
|
+
8. Preview the launch command.
|
|
137
|
+
9. Ask for explicit confirmation before handing the terminal to the selected
|
|
113
138
|
agent.
|
|
114
|
-
|
|
139
|
+
10. Re-scan the same roots after the agent exits and report changed findings or
|
|
115
140
|
cleanup summary details.
|
|
116
141
|
|
|
142
|
+
Nested repair and cleanup selection menus let you return to the next-step
|
|
143
|
+
chooser without launching an agent. Checkbox prompts show `b back` in the footer
|
|
144
|
+
next to the normal navigation keys.
|
|
145
|
+
|
|
117
146
|
Launch mappings:
|
|
118
147
|
|
|
119
148
|
- Claude: `claude --dangerously-skip-permissions <prompt>`
|
|
@@ -123,10 +152,12 @@ Skills Doctor does not edit skill files during the scan phase. Repairs are made
|
|
|
123
152
|
only by the local agent after you confirm the handoff.
|
|
124
153
|
|
|
125
154
|
Cleanup handoff writes `usage.json`, `usage.md`, and `cleanup-prompt.md` before
|
|
126
|
-
any agent launch.
|
|
127
|
-
never delete skills, ignore non-disable recommendations during cleanup,
|
|
128
|
-
unused global/plugin skills only through Codex `[[skills.config]]`
|
|
129
|
-
`~/.codex/config.toml`, and verify with `npx skills-doctor@latest`.
|
|
155
|
+
any agent launch. Disable prompts tell the agent to preserve recent/frequent
|
|
156
|
+
skills, never delete skills, ignore non-disable recommendations during cleanup,
|
|
157
|
+
disable unused global/plugin skills only through Codex `[[skills.config]]`
|
|
158
|
+
entries in `~/.codex/config.toml`, and verify with `npx skills-doctor@latest`.
|
|
159
|
+
Grouped usage-recommendation prompts are scoped to the selected action, such as
|
|
160
|
+
shortening context-heavy descriptions or reviewing duplicate skill names.
|
|
130
161
|
Skills already disabled in Codex config are omitted from scan, usage-ranking,
|
|
131
162
|
and cleanup-candidate results.
|
|
132
163
|
|
|
@@ -139,14 +170,19 @@ skills-doctor --json
|
|
|
139
170
|
skills-doctor --json --json-compact
|
|
140
171
|
skills-doctor --yes --json
|
|
141
172
|
skills-doctor --yes --json --fail-on warning
|
|
173
|
+
skills-doctor --yes --json --fail-on-security P1
|
|
142
174
|
skills-doctor --yes --json --min-score 95
|
|
143
175
|
skills-doctor --yes --json --usage
|
|
144
176
|
```
|
|
145
177
|
|
|
146
178
|
JSON mode writes one machine-readable report to stdout and suppresses prompts
|
|
147
179
|
and spinners. Human logs and expected errors stay out of stdout.
|
|
148
|
-
By default, the exit code fails
|
|
149
|
-
Use `--fail-on warning`, `--fail-on advice`,
|
|
180
|
+
By default, the exit code fails for blocking quality errors, error diagnostics,
|
|
181
|
+
and P0 security findings. Use `--fail-on warning`, `--fail-on advice`,
|
|
182
|
+
`--fail-on-security P1`, `--fail-on-security P2`, or `--min-score <number>` for
|
|
183
|
+
stricter CI gates. JSON reports include security priority counts, capability
|
|
184
|
+
counts, and per-finding security fields such as `priority`, `capabilities`,
|
|
185
|
+
`confidence`, `rationale`, and `counterevidence`.
|
|
150
186
|
|
|
151
187
|
Use `--usage` to include local Codex usage analysis in JSON or non-interactive
|
|
152
188
|
runs. Interactive runs analyze usage by default; pass `--no-logs` to skip local
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scan.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,sBAAsB,EAC3B,iBAAiB,EAGlB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAI/D,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAEhC,MAAM,wCAAwC,CAAC;AAqBhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAM5F,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAQzE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IACzD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAC9B,KAAK,EAAE,yBAAyB,KAC7B,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAC3B,KAAK,EAAE,sBAAsB,KAC1B,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;CAC3C,CAAC;AAqBF,eAAO,MAAM,UAAU,GACrB,WAAW,MAAM,EACjB,OAAO,SAAS,EAChB,UAAS,iBAAsB,KAC9B,OAAO,CAAC,UAAU,CA2JpB,CAAC"}
|