specky-sdd 3.7.2 → 3.7.3
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 +47 -0
- package/README.md +4 -0
- package/apm-policy.yml +41 -0
- package/apm.lock.yaml +71 -0
- package/apm.yml +29 -2
- package/dist/cli/commands/apm.d.ts +2 -0
- package/dist/cli/commands/apm.d.ts.map +1 -0
- package/dist/cli/commands/apm.js +139 -0
- package/dist/cli/commands/apm.js.map +1 -0
- package/dist/cli/index.js +10 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/lib/apm/lock.d.ts +23 -0
- package/dist/cli/lib/apm/lock.d.ts.map +1 -0
- package/dist/cli/lib/apm/lock.js +90 -0
- package/dist/cli/lib/apm/lock.js.map +1 -0
- package/dist/cli/lib/apm/manifest.d.ts +31 -0
- package/dist/cli/lib/apm/manifest.d.ts.map +1 -0
- package/dist/cli/lib/apm/manifest.js +65 -0
- package/dist/cli/lib/apm/manifest.js.map +1 -0
- package/dist/cli/lib/apm/policy.d.ts +23 -0
- package/dist/cli/lib/apm/policy.d.ts.map +1 -0
- package/dist/cli/lib/apm/policy.js +85 -0
- package/dist/cli/lib/apm/policy.js.map +1 -0
- package/dist/cli/lib/asset-copier.d.ts.map +1 -1
- package/dist/cli/lib/asset-copier.js +8 -126
- package/dist/cli/lib/asset-copier.js.map +1 -1
- package/dist/cli/lib/harness/compilers/claude.d.ts +10 -0
- package/dist/cli/lib/harness/compilers/claude.d.ts.map +1 -0
- package/dist/cli/lib/harness/compilers/claude.js +29 -0
- package/dist/cli/lib/harness/compilers/claude.js.map +1 -0
- package/dist/cli/lib/harness/compilers/common.d.ts +14 -0
- package/dist/cli/lib/harness/compilers/common.d.ts.map +1 -0
- package/dist/cli/lib/harness/compilers/common.js +43 -0
- package/dist/cli/lib/harness/compilers/common.js.map +1 -0
- package/dist/cli/lib/harness/compilers/copilot.d.ts +10 -0
- package/dist/cli/lib/harness/compilers/copilot.d.ts.map +1 -0
- package/dist/cli/lib/harness/compilers/copilot.js +32 -0
- package/dist/cli/lib/harness/compilers/copilot.js.map +1 -0
- package/dist/cli/lib/harness/index.d.ts +12 -0
- package/dist/cli/lib/harness/index.d.ts.map +1 -0
- package/dist/cli/lib/harness/index.js +18 -0
- package/dist/cli/lib/harness/index.js.map +1 -0
- package/dist/cli/lib/harness/tool-map.d.ts +15 -0
- package/dist/cli/lib/harness/tool-map.d.ts.map +1 -0
- package/dist/cli/lib/harness/tool-map.js +92 -0
- package/dist/cli/lib/harness/tool-map.js.map +1 -0
- package/dist/cli/lib/harness/types.d.ts +42 -0
- package/dist/cli/lib/harness/types.d.ts.map +1 -0
- package/dist/cli/lib/harness/types.js +12 -0
- package/dist/cli/lib/harness/types.js.map +1 -0
- package/dist/cli/lib/paths.d.ts +1 -0
- package/dist/cli/lib/paths.d.ts.map +1 -1
- package/dist/cli/lib/paths.js +1 -0
- package/dist/cli/lib/paths.js.map +1 -1
- package/package.json +5 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,53 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- APM governance commands: `specky apm validate`, `specky apm lock`, `specky apm verify-lock`, `specky apm policy`, `specky apm audit`, and `specky apm sbom`.
|
|
13
|
+
- `apm-policy.yml` and `apm.lock.yaml` package governance files. The lock pins SHA256 hashes for packaged primitives and the policy enforces MCP allowlists, allowed hook events, and per-harness tool-name isolation.
|
|
14
|
+
- Harness compiler registry (`src/cli/lib/harness`) and APM governance modules (`src/cli/lib/apm`) with regression coverage.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- `npm run build` now checks `apm.yml` name/version parity with `package.json` before compiling.
|
|
19
|
+
- `npm pack --dry-run` now includes `apm.yml`, `apm.lock.yaml`, `apm-policy.yml`, and the compiled `specky apm` command/modules.
|
|
20
|
+
|
|
21
|
+
## [3.7.2] - 2026-07-06
|
|
22
|
+
|
|
23
|
+
Platform-native primitive generation for GitHub Copilot and Claude Code.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- `.apm` primitive source is now GitHub Copilot-native: agents use VS Code tool ids such as `search`, `agent`, and namespaced Specky MCP tools like `specky/sdd_get_status`; prompts use `agent: agent` frontmatter.
|
|
28
|
+
- `specky install --ide=claude` now transforms the shared source into Claude-native primitives at install time: agents use `Read`, `Glob`, `Grep`, `Task`, and `mcp__specky__sdd_*`; slash commands omit Copilot-only `agent:` metadata; Claude rules use `paths` instead of `applyTo`.
|
|
29
|
+
- `specky install --ide=copilot` keeps Copilot-native syntax in `.github/agents` and `.github/prompts` instead of copying Claude-style tool names.
|
|
30
|
+
|
|
31
|
+
### Added
|
|
32
|
+
|
|
33
|
+
- Primitive audit coverage for Copilot-native tool names, namespaced Specky MCP tool ids, and prompt `agent:` frontmatter.
|
|
34
|
+
- Regression tests proving Copilot and Claude installs generate different platform-correct agent, prompt, and instruction frontmatter.
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
- GitHub Copilot agents no longer receive Claude-only tool names such as `Read`, `Glob`, `Grep`, or `Task`.
|
|
39
|
+
- Claude Code agents no longer receive Copilot-only tool names such as `search`, `agent`, or `specky/sdd_*`.
|
|
40
|
+
|
|
41
|
+
## [3.7.1] - 2026-07-04
|
|
42
|
+
|
|
43
|
+
GitHub Copilot primitive metadata and hook cleanup.
|
|
44
|
+
|
|
45
|
+
### Changed
|
|
46
|
+
|
|
47
|
+
- Normalized Specky Agent Skill names to lowercase kebab-case matching their folder names.
|
|
48
|
+
- Added agent-mode prompt metadata and corrected reset-phase guidance to use checkpoint restore tools.
|
|
49
|
+
- Reduced native mutating tools in agents where Specky MCP tools perform the artifact writes.
|
|
50
|
+
|
|
51
|
+
### Fixed
|
|
52
|
+
|
|
53
|
+
- Copilot instruction file now has `applyTo: '**'` frontmatter.
|
|
54
|
+
- Fixed branch-validator/session hooks to read `current_phase` and string phase names.
|
|
55
|
+
- Prevented Copilot hook manifests from falling back to unresolved Claude plugin paths.
|
|
56
|
+
|
|
10
57
|
## [3.7.0] - 2026-07-03
|
|
11
58
|
|
|
12
59
|
Update awareness: users of old versions now find out — without the server ever
|
package/README.md
CHANGED
|
@@ -115,6 +115,10 @@ npx specky install --ide=copilot
|
|
|
115
115
|
|
|
116
116
|
The CLI installs 13 agents, 22 prompts, 8 skills, 16 hooks, the MCP server registration (`.mcp.json` + `.vscode/mcp.json`, pinned to the installed version), and pre-authorizes a **least-privilege** set of tools — the Specky MCP tools plus scoped `git`/`npm`/`npx` and file editing. It does **not** pre-authorize arbitrary shell, `rm`, or network access; those still prompt. Run `specky doctor` anytime to validate integrity and config.
|
|
117
117
|
|
|
118
|
+
Starting in v3.7.2, generated assets are platform-native. `specky install --ide=copilot` writes GitHub Copilot agents/prompts with VS Code tool names such as `search`, `agent`, and `specky/sdd_get_status`, plus prompt `agent: agent` frontmatter. `specky install --ide=claude` writes Claude Code agents/commands with `Read`, `Glob`, `Grep`, `Task`, and `mcp__specky__sdd_get_status`, with Copilot-only prompt metadata removed.
|
|
119
|
+
|
|
120
|
+
Specky also has an APM governance layer for enterprise package control. `apm.yml` declares the package primitives, targets, and MCP runtime; `apm.lock.yaml` pins primitive hashes; `apm-policy.yml` enforces MCP and tool-name policy. Maintainers and CI can run `specky apm validate`, `specky apm policy`, `specky apm verify-lock`, and `specky apm sbom` before publishing or installing.
|
|
121
|
+
|
|
118
122
|
Full walkthroughs per OS, offline install, and CLI reference: [docs/INSTALL.md](docs/INSTALL.md) · [docs/CLI.md](docs/CLI.md).
|
|
119
123
|
|
|
120
124
|
|
package/apm-policy.yml
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# apm-policy.yml — enterprise governance policy for Specky primitive packaging.
|
|
2
|
+
#
|
|
3
|
+
# Enforced by `specky apm policy check` (and in CI via .github/workflows).
|
|
4
|
+
# The goal is least-privilege, reproducible, harness-isolated primitives.
|
|
5
|
+
|
|
6
|
+
schemaVersion: 1
|
|
7
|
+
|
|
8
|
+
# Package sources that may be installed/trusted.
|
|
9
|
+
allowedSources:
|
|
10
|
+
- github.com/paulasilvatech/specky
|
|
11
|
+
- registry.npmjs.org/specky-sdd
|
|
12
|
+
|
|
13
|
+
# MCP governance. Only these servers may be declared in apm.yml, and
|
|
14
|
+
# transitive MCP servers are not auto-trusted.
|
|
15
|
+
mcp:
|
|
16
|
+
allowTransitive: false
|
|
17
|
+
allowedServers:
|
|
18
|
+
- specky
|
|
19
|
+
|
|
20
|
+
# Hook governance. Hook manifests may only register these event types.
|
|
21
|
+
hooks:
|
|
22
|
+
allowedEvents:
|
|
23
|
+
- SessionStart
|
|
24
|
+
- UserPromptSubmit
|
|
25
|
+
- PreToolUse
|
|
26
|
+
- PostToolUse
|
|
27
|
+
- Stop
|
|
28
|
+
|
|
29
|
+
# Per-target tool-name isolation. Compiled output for one harness must never
|
|
30
|
+
# contain another harness's native tool tokens.
|
|
31
|
+
targets:
|
|
32
|
+
github-copilot:
|
|
33
|
+
forbidToolTokens:
|
|
34
|
+
- Read
|
|
35
|
+
- Glob
|
|
36
|
+
- Grep
|
|
37
|
+
- Task
|
|
38
|
+
- mcp__specky__
|
|
39
|
+
claude-code:
|
|
40
|
+
forbidToolTokens:
|
|
41
|
+
- "specky/"
|
package/apm.lock.yaml
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Generated by `specky apm lock`. Do not edit by hand.
|
|
2
|
+
schemaVersion: 1
|
|
3
|
+
package:
|
|
4
|
+
name: specky-sdd
|
|
5
|
+
version: 3.7.3
|
|
6
|
+
primitives:
|
|
7
|
+
.apm/agents/design-architect.agent.md: sha256:b96b16fe04f68afb3b6c656a492603f143527ebe82089a9d4c0d2111f4446836
|
|
8
|
+
.apm/agents/implementer.agent.md: sha256:f78ffbbb4c4a69abb8b0c0158aea914ababd0036c51d7ed77138c21cd3d40979
|
|
9
|
+
.apm/agents/quality-reviewer.agent.md: sha256:deab4a84577f3256f87b7de7a48ff66093996e47570e134cf6cfa3a3d15db902
|
|
10
|
+
.apm/agents/release-engineer.agent.md: sha256:2e895fcfc3f5b42f7c58e3162e3f2b6dfcbeaa1be3b4f0d1f2bf3205bb447c70
|
|
11
|
+
.apm/agents/requirements-engineer.agent.md: sha256:d36a6e95a5612e4a38a1d77f03d3d654ad5c429edfdd01dc1847763cae2d69e3
|
|
12
|
+
.apm/agents/research-analyst.agent.md: sha256:2d9aee79aa46afd5c68f1bf154df3d4b84f313d8249a05b2ad41afa1a7c4822c
|
|
13
|
+
.apm/agents/sdd-clarify.agent.md: sha256:01b2322ba93d76aaf7e2268a90d08c8e0df220a679ec9817164ca71c47ade7fd
|
|
14
|
+
.apm/agents/sdd-init.agent.md: sha256:d674022d21c1c4f60f4cdc6fee7136ecb6f931b523377ed5b1263be284b9c434
|
|
15
|
+
.apm/agents/spec-engineer.agent.md: sha256:a51bfd89b823ba1f107e2c1b4cc56d016ab2f30cdba5881f3374d65556b5d273
|
|
16
|
+
.apm/agents/specky-onboarding.agent.md: sha256:061c2338b2ccafdbb8a41f33d8a6fbc191d5c0e17798057d28c1d4aa5e0a1ed8
|
|
17
|
+
.apm/agents/specky-orchestrator.agent.md: sha256:685753cfd1b70fc4ca26295242606e1f4c20689edae439d246071e447f72b71b
|
|
18
|
+
.apm/agents/task-planner.agent.md: sha256:b6db870691b87efd29ce3836fefe54f0a2f8324f6fc13edf6e7523dab8fd66c8
|
|
19
|
+
.apm/agents/test-verifier.agent.md: sha256:206eb184709ed53f5a35cfa6ab7c1943856a3da2e9310c10a4906ba267f318f3
|
|
20
|
+
.apm/hooks/scripts/artifact-validator.sh: sha256:0575406bbaa8e17a30407c6c1cdde20ffcaf13d2f7af784f7552d0c9766ce7b9
|
|
21
|
+
.apm/hooks/scripts/auto-checkpoint.sh: sha256:503e13b517dfe32ca2e96bcf3a8c36186bd0cde5c8f2e8a9bdda72117449f1dc
|
|
22
|
+
.apm/hooks/scripts/branch-validator.sh: sha256:06cf44594387a5b9088db7c92c2bcb7f4fddd8f96a87cb6815614c593108a5f6
|
|
23
|
+
.apm/hooks/scripts/cognitive-debt-alert.sh: sha256:4808b0d4686605861e209011115d000b2f1137d321f81fc49f17ed47db2f4dbe
|
|
24
|
+
.apm/hooks/scripts/drift-monitor.sh: sha256:5229c55640c521740391e5b4aeae87b332ab66f8d74fc697fc3d0f3972681da1
|
|
25
|
+
.apm/hooks/scripts/ears-validator.sh: sha256:58afda3b30ddc883d89122dc39a740bcde4d8ec43b96826aa03c0d9bf242a9d0
|
|
26
|
+
.apm/hooks/scripts/lgtm-gate.sh: sha256:7bfde5bb0d7ae29164b280634c5829d9c43580c7e4edeab13868aeba42f5571f
|
|
27
|
+
.apm/hooks/scripts/metrics-dashboard.sh: sha256:05dc1bf7a97eeaf1165851428dc2dadaabc7f368359e6cfe53cfa5362d5e4835
|
|
28
|
+
.apm/hooks/scripts/phase-gate.sh: sha256:5c7ddbba01f6444feb649e6f954689d9885835dfe25dabfa58efb6b604434cfc
|
|
29
|
+
.apm/hooks/scripts/pipeline-guard.sh: sha256:2137418c06fa94c99cc4182caad35736c559e90df26d78d56a4b449c183d78b7
|
|
30
|
+
.apm/hooks/scripts/release-gate.sh: sha256:8d1a3ab57bf73618e7c03eef9e3d6ab148e48e350b9ec374c07ef4ac6bc23bcf
|
|
31
|
+
.apm/hooks/scripts/security-scan.sh: sha256:dc8f58757064b6b1d469a2d14fed4e2dd7395f92c421ba88c36fced6f9babf38
|
|
32
|
+
.apm/hooks/scripts/session-banner.sh: sha256:618dece6577abb20591be9f2b9c5a910c4ff382e07fcdc43a40499e0d5474b5d
|
|
33
|
+
.apm/hooks/scripts/spec-quality.sh: sha256:c9f4b0a4356077e55ca39301af0d6c4ec2a96c47b29e31735f614176a4bfbc47
|
|
34
|
+
.apm/hooks/scripts/spec-sync.sh: sha256:5a72c59829ef2c484bc26b6cf413fb233ef54962ea736deed77d7db7afc62e7b
|
|
35
|
+
.apm/hooks/scripts/task-tracer.sh: sha256:2c9eab6dcb0fd24c5326ff799f69b71e64f9fc1b8622040a0687dde895494552
|
|
36
|
+
.apm/hooks/sdd-hooks.json: sha256:363939df17a54b8361ca6c0eb4e2fdd4637e79a36ad04ed948ebed5e59c1868f
|
|
37
|
+
.apm/instructions/copilot-instructions.instructions.md: sha256:57378a57344403f16e37221981414b0febe1b7719a874115be6caf746c840a0a
|
|
38
|
+
.apm/prompts/specky-api.prompt.md: sha256:8fe67a5c3eb5a9e5e3e886d1f146b337a76276ff91ad7cb57e304268d9bd4065
|
|
39
|
+
.apm/prompts/specky-brownfield.prompt.md: sha256:b5979f957ff630ca64f35d8e8d82f8685ee24047f53eecfba9e8d59e1c514da0
|
|
40
|
+
.apm/prompts/specky-check-drift.prompt.md: sha256:f3a04b00ef10167cbd1cdcf63f8b8595d3bc8196d107b48963f8b123f711f3af
|
|
41
|
+
.apm/prompts/specky-clarify.prompt.md: sha256:caaf14ffc4cd738323ecf76355286eb1537a3b1005f05f5829a8c37e3ce7c0cf
|
|
42
|
+
.apm/prompts/specky-debug-hook.prompt.md: sha256:f3b8bb30b841a764a497b51ab75dedea26b74ba022b67aae911f79504b7aac2a
|
|
43
|
+
.apm/prompts/specky-deploy.prompt.md: sha256:acbb188902f203815cddb15f36c1c47a9f2e2ffd9de836ba50a85a75b12cfbb6
|
|
44
|
+
.apm/prompts/specky-design.prompt.md: sha256:745dd294d7a1eeb47f3f6e46d682614d26fcc99fa147501f31a0f29e1b9f07d6
|
|
45
|
+
.apm/prompts/specky-from-figma.prompt.md: sha256:0ba1d4d4a9ced39ea89bae8fa98ae3449c2d973510e9a6cf80e3cfe9f29b1fce
|
|
46
|
+
.apm/prompts/specky-from-meeting.prompt.md: sha256:6c3c237f86e3bc786b490cb71e2e29964e073fbc95b15b77cc48436cd6e4b215
|
|
47
|
+
.apm/prompts/specky-greenfield.prompt.md: sha256:c981a25c67b06ee7a031298ca1e49184f324e0cfe636b66aa7f6c07d1b11cf37
|
|
48
|
+
.apm/prompts/specky-implement.prompt.md: sha256:7c9392a4bb24a1f88778a5c603cf5f851dfefb10d9577338cb8f2e72a3795b33
|
|
49
|
+
.apm/prompts/specky-migration.prompt.md: sha256:462aef852d5d59f65a09d576b387797f5671a08ef85f4154f4f55d506de142af
|
|
50
|
+
.apm/prompts/specky-onboarding.prompt.md: sha256:41e623d0730f7e9bfe5c30569149a4f7ecc925a256645b2b30eee058ffa1c5fc
|
|
51
|
+
.apm/prompts/specky-orchestrate.prompt.md: sha256:8b40cc61bed8f85103c0bf6ea5ff4fa4741b0b8af6a18ec71dc8a049434cf62e
|
|
52
|
+
.apm/prompts/specky-pipeline-status.prompt.md: sha256:aa0f65c88a190b02532125acef55174559d997ad0deb3336577fb61b7e7f6fed
|
|
53
|
+
.apm/prompts/specky-release.prompt.md: sha256:db9c58674fe8288b839f7768b3b786746c1c6c1c81650cfe6e157883db7c7954
|
|
54
|
+
.apm/prompts/specky-research.prompt.md: sha256:5d45a1aa5e343b382dcb0879f42f0b1a29a25f8fb2ce2877e0afc7d9f808378e
|
|
55
|
+
.apm/prompts/specky-reset-phase.prompt.md: sha256:81218d63f7d8fdd8b7b9de8e8115f180ced3086dc4bc0853c46268ce335361de
|
|
56
|
+
.apm/prompts/specky-resolve-conflict.prompt.md: sha256:785a60f9515f13a601e421049aeac1b519f65db6c83fdce061df9e19f1f5947f
|
|
57
|
+
.apm/prompts/specky-specify.prompt.md: sha256:0c5e0cb14e360efda2272e7cbd9ff314b1960e75fecc0e9e30137fa8b30fc3c5
|
|
58
|
+
.apm/prompts/specky-tasks.prompt.md: sha256:f1a5848d162feb11e1c09da373fc3c6941720ba38a8d6a531b3bb03999bf29c3
|
|
59
|
+
.apm/prompts/specky-verify.prompt.md: sha256:2d2ebd12276078445a50a16d2775f207eca20ca9a4118d56391a95df86b7e0ee
|
|
60
|
+
.apm/skills/implementer/SKILL.md: sha256:7afc5a235cd25c9757aa91653157291cc755bd9938e83a2d58068cbdb684ecbd
|
|
61
|
+
.apm/skills/release-engineer/SKILL.md: sha256:b52f5081d546e63de1becf53c67dbbf11b4848b94e31144951cb347a9e1c0157
|
|
62
|
+
.apm/skills/research-analyst/SKILL.md: sha256:b3346101b1784f173fda50731d81fb5831f6c9d28f8af58a7527fc167af739d0
|
|
63
|
+
.apm/skills/sdd-markdown-standard/SKILL.md: sha256:0d5f59773d1c965c5daf7e91638fe0019e593261eda2ab29c9dec82c00ee8d5b
|
|
64
|
+
.apm/skills/sdd-pipeline/references/ears-notation.md: sha256:580dc051802750904ef409b9f89873ad250326bc17c992bd53366b3b1a04f1c5
|
|
65
|
+
.apm/skills/sdd-pipeline/references/model-routing.md: sha256:6ca9bd5cde2a8d227c795d37c4d43b712dd183c10d5d87b987514b494f7c28f3
|
|
66
|
+
.apm/skills/sdd-pipeline/SKILL.md: sha256:7a8173d9882cafa303f35881fc88cc5482b97a287618dcb851959b704895340a
|
|
67
|
+
.apm/skills/specky-onboarding/SKILL.md: sha256:cdfb2dfaeb74d6ee33eee4773a80f00c0fc263c288853d3b6a966ce00b0fa442
|
|
68
|
+
.apm/skills/specky-orchestrator/SKILL.md: sha256:66af8f8fb882f70e2484d74bff974942f346874e957bbee520994804a2edd734
|
|
69
|
+
.apm/skills/test-verifier/SKILL.md: sha256:b0d3f66271508ab8015b6145dbc85906143662d2841685b55c177adbea7c2a78
|
|
70
|
+
apm-policy.yml: sha256:c7af3a9a0f73dc7addd88f92df93d93f1726aceb1671b298d0e397919ac5bf19
|
|
71
|
+
apm.yml: sha256:270e785f7a586c9c3f5c9839cf8b5b40c120a9558acec2f880dfd21ef7962503
|
package/apm.yml
CHANGED
|
@@ -1,9 +1,36 @@
|
|
|
1
1
|
name: specky-sdd
|
|
2
|
-
version: 3.7.
|
|
2
|
+
version: 3.7.3
|
|
3
3
|
description: "Agentic Spec-Driven Development — 10-phase pipeline with 58 MCP tools, 13 agents, 22 prompts, 8 skills, 16 hooks, EARS notation, model routing, and enterprise security"
|
|
4
4
|
author: Paula Silva
|
|
5
5
|
license: MIT
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
# Harness targets this package compiles to. Each target is rendered from the
|
|
8
|
+
# single canonical primitive source below via a Specky harness compiler
|
|
9
|
+
# (src/cli/lib/harness). `specky install --ide=<target>` and
|
|
10
|
+
# `specky compile --target=<target>` produce that harness's native layout.
|
|
11
|
+
targets:
|
|
12
|
+
- github-copilot
|
|
13
|
+
- claude-code
|
|
14
|
+
|
|
15
|
+
# Canonical, harness-agnostic primitive source. Authored once and compiled per
|
|
16
|
+
# target — never hand-edited per harness.
|
|
17
|
+
primitives:
|
|
18
|
+
agents: .apm/agents
|
|
19
|
+
prompts: .apm/prompts
|
|
20
|
+
skills: .apm/skills
|
|
21
|
+
instructions: .apm/instructions
|
|
22
|
+
hooks: .apm/hooks
|
|
23
|
+
|
|
24
|
+
# MCP runtime that backs the `specky/sdd_*` (Copilot) and `mcp__specky__sdd_*`
|
|
25
|
+
# (Claude) tool ids referenced by the primitives above.
|
|
26
|
+
mcp:
|
|
27
|
+
servers:
|
|
28
|
+
- name: specky
|
|
29
|
+
registry: false
|
|
30
|
+
transport: stdio
|
|
31
|
+
command: npx
|
|
32
|
+
args: ["-y", "specky-sdd@latest", "serve"]
|
|
33
|
+
tools: ["sdd_*"]
|
|
7
34
|
|
|
8
35
|
dependencies:
|
|
9
36
|
mcp:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apm.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/apm.ts"],"names":[],"mappings":"AAgHA,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAwCjD"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/apm.ts — `specky apm <subcommand>` governance surface.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* validate Validate apm.yml against on-disk primitives + package.json.
|
|
6
|
+
* lock Write apm.lock.yaml with a sha256 for every primitive.
|
|
7
|
+
* verify-lock Recompute hashes and diff against apm.lock.yaml.
|
|
8
|
+
* policy Enforce apm-policy.yml (MCP allowlist, hooks, tool isolation).
|
|
9
|
+
* audit Run the primitive frontmatter audit.
|
|
10
|
+
* sbom Emit a CycloneDX SBOM of the packaged primitives.
|
|
11
|
+
*/
|
|
12
|
+
import { writeFileSync } from "node:fs";
|
|
13
|
+
import { spawnSync } from "node:child_process";
|
|
14
|
+
import { resolve } from "node:path";
|
|
15
|
+
import { packageRoot } from "../lib/paths.js";
|
|
16
|
+
import { validateManifest, loadManifest } from "../lib/apm/manifest.js";
|
|
17
|
+
import { generateLock, serializeLock, lockPath, verifyLock, } from "../lib/apm/lock.js";
|
|
18
|
+
import { checkPolicy } from "../lib/apm/policy.js";
|
|
19
|
+
function print(result) {
|
|
20
|
+
for (const w of result.warnings)
|
|
21
|
+
console.warn(` ⚠️ ${w}`);
|
|
22
|
+
for (const e of result.errors)
|
|
23
|
+
console.error(` ❌ ${e}`);
|
|
24
|
+
}
|
|
25
|
+
function runValidate(pkgRoot) {
|
|
26
|
+
const result = validateManifest(pkgRoot);
|
|
27
|
+
print(result);
|
|
28
|
+
if (result.ok) {
|
|
29
|
+
const m = loadManifest(pkgRoot);
|
|
30
|
+
console.log(`✅ apm.yml valid — ${m.name}@${m.version}, targets: ${m.targets.join(", ")}`);
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
return 2;
|
|
34
|
+
}
|
|
35
|
+
function runLock(pkgRoot, dryRun) {
|
|
36
|
+
const lock = generateLock(pkgRoot);
|
|
37
|
+
const count = Object.keys(lock.primitives).length;
|
|
38
|
+
if (dryRun) {
|
|
39
|
+
console.log(`ℹ️ apm lock (dry-run): ${count} primitives would be hashed`);
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
writeFileSync(lockPath(pkgRoot), serializeLock(lock), "utf8");
|
|
43
|
+
console.log(`✅ Wrote apm.lock.yaml — ${count} primitives (${lock.package.name}@${lock.package.version})`);
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
46
|
+
function runVerifyLock(pkgRoot) {
|
|
47
|
+
const result = verifyLock(pkgRoot);
|
|
48
|
+
if (result.error) {
|
|
49
|
+
console.error(` ❌ ${result.error}`);
|
|
50
|
+
return 2;
|
|
51
|
+
}
|
|
52
|
+
if (result.ok) {
|
|
53
|
+
console.log("✅ apm.lock.yaml matches the primitive source");
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
for (const f of result.changed)
|
|
57
|
+
console.error(` ✏️ changed: ${f}`);
|
|
58
|
+
for (const f of result.missing)
|
|
59
|
+
console.error(` ➖ missing: ${f}`);
|
|
60
|
+
for (const f of result.extra)
|
|
61
|
+
console.error(` ➕ untracked: ${f}`);
|
|
62
|
+
console.error("❌ Lock verification failed — run `specky apm lock` to update");
|
|
63
|
+
return 2;
|
|
64
|
+
}
|
|
65
|
+
function runPolicy(pkgRoot) {
|
|
66
|
+
const result = checkPolicy(pkgRoot);
|
|
67
|
+
print(result);
|
|
68
|
+
if (result.ok) {
|
|
69
|
+
console.log("✅ apm-policy.yml checks passed");
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
return 2;
|
|
73
|
+
}
|
|
74
|
+
function runAudit(pkgRoot) {
|
|
75
|
+
const res = spawnSync(process.execPath, [resolve(pkgRoot, "scripts/audit-agent-frontmatter.mjs")], { stdio: "inherit", cwd: pkgRoot });
|
|
76
|
+
return res.status ?? 1;
|
|
77
|
+
}
|
|
78
|
+
function runSbom(pkgRoot) {
|
|
79
|
+
const lock = generateLock(pkgRoot);
|
|
80
|
+
const sbom = {
|
|
81
|
+
bomFormat: "CycloneDX",
|
|
82
|
+
specVersion: "1.5",
|
|
83
|
+
version: 1,
|
|
84
|
+
metadata: {
|
|
85
|
+
timestamp: new Date().toISOString(),
|
|
86
|
+
component: {
|
|
87
|
+
type: "application",
|
|
88
|
+
name: lock.package.name,
|
|
89
|
+
version: lock.package.version,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
components: Object.entries(lock.primitives).map(([path, hash]) => ({
|
|
93
|
+
type: "file",
|
|
94
|
+
name: path,
|
|
95
|
+
hashes: [{ alg: "SHA-256", content: hash.replace(/^sha256:/, "") }],
|
|
96
|
+
})),
|
|
97
|
+
};
|
|
98
|
+
console.log(JSON.stringify(sbom, null, 2));
|
|
99
|
+
return 0;
|
|
100
|
+
}
|
|
101
|
+
export function apmCommand(argv) {
|
|
102
|
+
const pkgRoot = packageRoot();
|
|
103
|
+
const sub = argv[0];
|
|
104
|
+
const rest = argv.slice(1);
|
|
105
|
+
const dryRun = rest.includes("--dry-run");
|
|
106
|
+
switch (sub) {
|
|
107
|
+
case "validate":
|
|
108
|
+
return runValidate(pkgRoot);
|
|
109
|
+
case "lock":
|
|
110
|
+
return runLock(pkgRoot, dryRun);
|
|
111
|
+
case "verify-lock":
|
|
112
|
+
return runVerifyLock(pkgRoot);
|
|
113
|
+
case "policy":
|
|
114
|
+
// `specky apm policy` or `specky apm policy check`
|
|
115
|
+
return runPolicy(pkgRoot);
|
|
116
|
+
case "audit":
|
|
117
|
+
return runAudit(pkgRoot);
|
|
118
|
+
case "sbom":
|
|
119
|
+
return runSbom(pkgRoot);
|
|
120
|
+
case "help":
|
|
121
|
+
case undefined:
|
|
122
|
+
console.log([
|
|
123
|
+
"specky apm <subcommand>",
|
|
124
|
+
"",
|
|
125
|
+
" validate Validate apm.yml against primitives + package.json",
|
|
126
|
+
" lock Write apm.lock.yaml (sha256 per primitive)",
|
|
127
|
+
" verify-lock Diff the primitive source against apm.lock.yaml",
|
|
128
|
+
" policy Enforce apm-policy.yml (MCP, hooks, tool isolation)",
|
|
129
|
+
" audit Run the primitive frontmatter audit",
|
|
130
|
+
" sbom Emit a CycloneDX SBOM of packaged primitives",
|
|
131
|
+
].join("\n"));
|
|
132
|
+
return 0;
|
|
133
|
+
default:
|
|
134
|
+
console.error(`Unknown apm subcommand: ${sub}`);
|
|
135
|
+
console.error("Run `specky apm help` for usage.");
|
|
136
|
+
return 1;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=apm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apm.js","sourceRoot":"","sources":["../../../src/cli/commands/apm.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* specky status
|
|
9
9
|
* specky upgrade
|
|
10
10
|
* specky hooks <list|test|run NAME>
|
|
11
|
+
* specky apm <validate|lock|verify-lock|policy|audit|sbom>
|
|
11
12
|
* specky serve [--http] [--port=N] [--profile=enterprise]
|
|
12
13
|
* specky --version | -v
|
|
13
14
|
* specky --help | -h
|
|
@@ -65,6 +66,10 @@ Commands:
|
|
|
65
66
|
hooks <list|test|run NAME>
|
|
66
67
|
Manage installed hooks
|
|
67
68
|
|
|
69
|
+
apm <validate|lock|verify-lock|policy|audit|sbom>
|
|
70
|
+
Validate APM manifest, lock primitives, enforce
|
|
71
|
+
governance policy, and export primitive SBOM
|
|
72
|
+
|
|
68
73
|
serve Start the MCP server (stdio by default)
|
|
69
74
|
--http HTTP streaming transport
|
|
70
75
|
--port=<N> HTTP port (default 3200)
|
|
@@ -113,6 +118,10 @@ async function dispatch(command, rest) {
|
|
|
113
118
|
const action = (positional[0] ?? "list");
|
|
114
119
|
return runHooks({ action, name: positional[1] });
|
|
115
120
|
}
|
|
121
|
+
case "apm": {
|
|
122
|
+
const { apmCommand } = await import("./commands/apm.js");
|
|
123
|
+
return apmCommand(positional);
|
|
124
|
+
}
|
|
116
125
|
case "serve": {
|
|
117
126
|
const { runServe } = await import("./commands/serve.js");
|
|
118
127
|
const portFlag = flags["port"];
|
|
@@ -176,7 +185,7 @@ async function main() {
|
|
|
176
185
|
const isLegacyBin = binName === "specky-sdd" || binName.endsWith("specky-sdd");
|
|
177
186
|
// Legacy back-compat: `specky-sdd` with no subcommand OR with --http maps to serve
|
|
178
187
|
const knownCommands = new Set([
|
|
179
|
-
"install", "init", "doctor", "status", "upgrade", "hooks", "serve",
|
|
188
|
+
"install", "init", "doctor", "status", "upgrade", "hooks", "apm", "serve",
|
|
180
189
|
"help", "--help", "-h", "--version", "-v",
|
|
181
190
|
]);
|
|
182
191
|
const firstArg = args[0];
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const LOCK_SCHEMA_VERSION = 1;
|
|
2
|
+
export interface ApmLock {
|
|
3
|
+
schemaVersion: number;
|
|
4
|
+
package: {
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
};
|
|
8
|
+
primitives: Record<string, string>;
|
|
9
|
+
}
|
|
10
|
+
/** Compute the sorted `.apm` + governance manifest hash map for a package root. */
|
|
11
|
+
export declare function hashPrimitives(pkgRoot: string): Record<string, string>;
|
|
12
|
+
export declare function generateLock(pkgRoot: string): ApmLock;
|
|
13
|
+
export declare function serializeLock(lock: ApmLock): string;
|
|
14
|
+
export declare function lockPath(pkgRoot: string): string;
|
|
15
|
+
export interface VerifyResult {
|
|
16
|
+
ok: boolean;
|
|
17
|
+
missing: string[];
|
|
18
|
+
changed: string[];
|
|
19
|
+
extra: string[];
|
|
20
|
+
error?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function verifyLock(pkgRoot: string): VerifyResult;
|
|
23
|
+
//# sourceMappingURL=lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/apm/lock.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,WAAW,OAAO;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAiBD,mFAAmF;AACnF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWtE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CASrD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CA8BxD"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* apm/lock.ts — reproducible lockfile for the canonical primitive source.
|
|
3
|
+
*
|
|
4
|
+
* `apm lock` records a sha256 for every file under `.apm/`, plus apm.yml and
|
|
5
|
+
* apm-policy.yml, into apm.lock.yaml. `apm verify-lock` recomputes and diffs,
|
|
6
|
+
* so any drift between the committed primitives/governance files and the
|
|
7
|
+
* lockfile — a hand-edit, a partial upgrade, a corrupted install — is caught
|
|
8
|
+
* deterministically.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { readFileSync, readdirSync, statSync, existsSync } from "node:fs";
|
|
12
|
+
import { relative, resolve } from "node:path";
|
|
13
|
+
import { parse, stringify } from "yaml";
|
|
14
|
+
import { sourcePaths } from "../paths.js";
|
|
15
|
+
export const LOCK_SCHEMA_VERSION = 1;
|
|
16
|
+
function walkFiles(dir) {
|
|
17
|
+
if (!existsSync(dir))
|
|
18
|
+
return [];
|
|
19
|
+
const out = [];
|
|
20
|
+
for (const name of readdirSync(dir)) {
|
|
21
|
+
const full = resolve(dir, name);
|
|
22
|
+
if (statSync(full).isDirectory())
|
|
23
|
+
out.push(...walkFiles(full));
|
|
24
|
+
else
|
|
25
|
+
out.push(full);
|
|
26
|
+
}
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
function sha256(file) {
|
|
30
|
+
return `sha256:${createHash("sha256").update(readFileSync(file)).digest("hex")}`;
|
|
31
|
+
}
|
|
32
|
+
/** Compute the sorted `.apm` + governance manifest hash map for a package root. */
|
|
33
|
+
export function hashPrimitives(pkgRoot) {
|
|
34
|
+
const { apmDir, apmYml, apmPolicyYml } = sourcePaths(pkgRoot);
|
|
35
|
+
const files = [...walkFiles(apmDir)];
|
|
36
|
+
if (existsSync(apmYml))
|
|
37
|
+
files.push(apmYml);
|
|
38
|
+
if (existsSync(apmPolicyYml))
|
|
39
|
+
files.push(apmPolicyYml);
|
|
40
|
+
const map = {};
|
|
41
|
+
for (const file of files.sort((a, b) => a.localeCompare(b))) {
|
|
42
|
+
map[relative(pkgRoot, file)] = sha256(file);
|
|
43
|
+
}
|
|
44
|
+
return map;
|
|
45
|
+
}
|
|
46
|
+
export function generateLock(pkgRoot) {
|
|
47
|
+
const pkg = JSON.parse(readFileSync(resolve(pkgRoot, "package.json"), "utf8"));
|
|
48
|
+
return {
|
|
49
|
+
schemaVersion: LOCK_SCHEMA_VERSION,
|
|
50
|
+
package: { name: pkg.name, version: pkg.version },
|
|
51
|
+
primitives: hashPrimitives(pkgRoot),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function serializeLock(lock) {
|
|
55
|
+
return `# Generated by \`specky apm lock\`. Do not edit by hand.\n${stringify(lock)}`;
|
|
56
|
+
}
|
|
57
|
+
export function lockPath(pkgRoot) {
|
|
58
|
+
return resolve(pkgRoot, "apm.lock.yaml");
|
|
59
|
+
}
|
|
60
|
+
export function verifyLock(pkgRoot) {
|
|
61
|
+
const path = lockPath(pkgRoot);
|
|
62
|
+
if (!existsSync(path)) {
|
|
63
|
+
return {
|
|
64
|
+
ok: false,
|
|
65
|
+
missing: [],
|
|
66
|
+
changed: [],
|
|
67
|
+
extra: [],
|
|
68
|
+
error: "apm.lock.yaml not found — run `specky apm lock`",
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const locked = parse(readFileSync(path, "utf8"));
|
|
72
|
+
const current = hashPrimitives(pkgRoot);
|
|
73
|
+
const lockedPrimitives = locked.primitives ?? {};
|
|
74
|
+
const missing = [];
|
|
75
|
+
const changed = [];
|
|
76
|
+
for (const [file, hash] of Object.entries(lockedPrimitives)) {
|
|
77
|
+
if (!(file in current))
|
|
78
|
+
missing.push(file);
|
|
79
|
+
else if (current[file] !== hash)
|
|
80
|
+
changed.push(file);
|
|
81
|
+
}
|
|
82
|
+
const extra = Object.keys(current).filter((f) => !(f in lockedPrimitives));
|
|
83
|
+
return {
|
|
84
|
+
ok: missing.length === 0 && changed.length === 0 && extra.length === 0,
|
|
85
|
+
missing: missing.sort(),
|
|
86
|
+
changed: changed.sort(),
|
|
87
|
+
extra: extra.sort(),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lock.js","sourceRoot":"","sources":["../../../../src/cli/lib/apm/lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface ApmMcpServer {
|
|
2
|
+
name: string;
|
|
3
|
+
transport?: string;
|
|
4
|
+
command?: string;
|
|
5
|
+
args?: string[];
|
|
6
|
+
tools?: string[];
|
|
7
|
+
registry?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface ApmManifest {
|
|
10
|
+
name: string;
|
|
11
|
+
version: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
targets: string[];
|
|
14
|
+
primitives: Record<string, string>;
|
|
15
|
+
mcp?: {
|
|
16
|
+
servers?: ApmMcpServer[];
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare function loadManifest(pkgRoot: string): ApmManifest;
|
|
20
|
+
export interface ValidationResult {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
errors: string[];
|
|
23
|
+
warnings: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate the APM manifest: required fields, version parity with
|
|
27
|
+
* package.json, declared primitive paths exist, targets are non-empty, and at
|
|
28
|
+
* least one MCP server is declared.
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateManifest(pkgRoot: string): ValidationResult;
|
|
31
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/apm/manifest.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,GAAG,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC;CACtC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAMzD;AAED,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,CAmDlE"}
|