@dewtech/dare-cli 2.17.0 → 3.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 +98 -3
- package/dist/__tests__/confidence.test.d.ts +2 -0
- package/dist/__tests__/confidence.test.d.ts.map +1 -0
- package/dist/__tests__/confidence.test.js +73 -0
- package/dist/__tests__/confidence.test.js.map +1 -0
- package/dist/__tests__/datamodel.test.d.ts +2 -0
- package/dist/__tests__/datamodel.test.d.ts.map +1 -0
- package/dist/__tests__/datamodel.test.js +131 -0
- package/dist/__tests__/datamodel.test.js.map +1 -0
- package/dist/__tests__/dna-detector.test.d.ts +2 -0
- package/dist/__tests__/dna-detector.test.d.ts.map +1 -0
- package/dist/__tests__/dna-detector.test.js +97 -0
- package/dist/__tests__/dna-detector.test.js.map +1 -0
- package/dist/__tests__/dna-facts.test.d.ts +2 -0
- package/dist/__tests__/dna-facts.test.d.ts.map +1 -0
- package/dist/__tests__/dna-facts.test.js +44 -0
- package/dist/__tests__/dna-facts.test.js.map +1 -0
- package/dist/__tests__/graph-renderer.test.d.ts +2 -0
- package/dist/__tests__/graph-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/graph-renderer.test.js +85 -0
- package/dist/__tests__/graph-renderer.test.js.map +1 -0
- package/dist/__tests__/migration.test.d.ts +2 -0
- package/dist/__tests__/migration.test.d.ts.map +1 -0
- package/dist/__tests__/migration.test.js +77 -0
- package/dist/__tests__/migration.test.js.map +1 -0
- package/dist/__tests__/module-detector.test.d.ts +2 -0
- package/dist/__tests__/module-detector.test.d.ts.map +1 -0
- package/dist/__tests__/module-detector.test.js +83 -0
- package/dist/__tests__/module-detector.test.js.map +1 -0
- package/dist/__tests__/refine.test.js +49 -49
- package/dist/__tests__/reverse-facts.test.d.ts +2 -0
- package/dist/__tests__/reverse-facts.test.d.ts.map +1 -0
- package/dist/__tests__/reverse-facts.test.js +78 -0
- package/dist/__tests__/reverse-facts.test.js.map +1 -0
- package/dist/__tests__/review.test.js +38 -38
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +32 -3
- package/dist/bin/dare.js.map +1 -1
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/dag.d.ts.map +1 -1
- package/dist/commands/dag.js +43 -79
- package/dist/commands/dag.js.map +1 -1
- package/dist/commands/dna.d.ts +3 -0
- package/dist/commands/dna.d.ts.map +1 -0
- package/dist/commands/dna.js +69 -0
- package/dist/commands/dna.js.map +1 -0
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +101 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/new.d.ts +16 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +103 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/reverse.d.ts +3 -0
- package/dist/commands/reverse.d.ts.map +1 -0
- package/dist/commands/reverse.js +201 -0
- package/dist/commands/reverse.js.map +1 -0
- package/dist/commands/welcome.d.ts +14 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +29 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/skills/commands/add.d.ts +23 -0
- package/dist/skills/commands/add.d.ts.map +1 -0
- package/dist/skills/commands/add.js +206 -0
- package/dist/skills/commands/add.js.map +1 -0
- package/dist/skills/commands/info.d.ts +14 -0
- package/dist/skills/commands/info.d.ts.map +1 -0
- package/dist/skills/commands/info.js +99 -0
- package/dist/skills/commands/info.js.map +1 -0
- package/dist/skills/commands/list.d.ts +19 -0
- package/dist/skills/commands/list.d.ts.map +1 -0
- package/dist/skills/commands/list.js +163 -0
- package/dist/skills/commands/list.js.map +1 -0
- package/dist/skills/commands/publish.d.ts +56 -0
- package/dist/skills/commands/publish.d.ts.map +1 -0
- package/dist/skills/commands/publish.js +272 -0
- package/dist/skills/commands/publish.js.map +1 -0
- package/dist/skills/commands/remove.d.ts +19 -0
- package/dist/skills/commands/remove.d.ts.map +1 -0
- package/dist/skills/commands/remove.js +96 -0
- package/dist/skills/commands/remove.js.map +1 -0
- package/dist/skills/commands/update.d.ts +31 -0
- package/dist/skills/commands/update.d.ts.map +1 -0
- package/dist/skills/commands/update.js +132 -0
- package/dist/skills/commands/update.js.map +1 -0
- package/dist/skills/index.d.ts +22 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +33 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/manifest.d.ts +54 -0
- package/dist/skills/manifest.d.ts.map +1 -0
- package/dist/skills/manifest.js +162 -0
- package/dist/skills/manifest.js.map +1 -0
- package/dist/skills/registry-local.d.ts +67 -0
- package/dist/skills/registry-local.d.ts.map +1 -0
- package/dist/skills/registry-local.js +130 -0
- package/dist/skills/registry-local.js.map +1 -0
- package/dist/skills/registry-mock.json +109 -0
- package/dist/skills/registry-remote.d.ts +110 -0
- package/dist/skills/registry-remote.d.ts.map +1 -0
- package/dist/skills/registry-remote.js +246 -0
- package/dist/skills/registry-remote.js.map +1 -0
- package/dist/skills/registry.d.ts +49 -0
- package/dist/skills/registry.d.ts.map +1 -0
- package/dist/skills/registry.js +94 -0
- package/dist/skills/registry.js.map +1 -0
- package/dist/skills/tests/manifest.spec.d.ts +8 -0
- package/dist/skills/tests/manifest.spec.d.ts.map +1 -0
- package/dist/skills/tests/manifest.spec.js +176 -0
- package/dist/skills/tests/manifest.spec.js.map +1 -0
- package/dist/skills/tests/publish.spec.d.ts +12 -0
- package/dist/skills/tests/publish.spec.d.ts.map +1 -0
- package/dist/skills/tests/publish.spec.js +276 -0
- package/dist/skills/tests/publish.spec.js.map +1 -0
- package/dist/skills/tests/registry-local.spec.d.ts +8 -0
- package/dist/skills/tests/registry-local.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry-local.spec.js +231 -0
- package/dist/skills/tests/registry-local.spec.js.map +1 -0
- package/dist/skills/tests/registry.spec.d.ts +7 -0
- package/dist/skills/tests/registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/registry.spec.js +58 -0
- package/dist/skills/tests/registry.spec.js.map +1 -0
- package/dist/skills/tests/remote-registry.spec.d.ts +9 -0
- package/dist/skills/tests/remote-registry.spec.d.ts.map +1 -0
- package/dist/skills/tests/remote-registry.spec.js +357 -0
- package/dist/skills/tests/remote-registry.spec.js.map +1 -0
- package/dist/skills/tests/update.spec.d.ts +9 -0
- package/dist/skills/tests/update.spec.d.ts.map +1 -0
- package/dist/skills/tests/update.spec.js +166 -0
- package/dist/skills/tests/update.spec.js.map +1 -0
- package/dist/utils/banner.d.ts +28 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +77 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/banner.spec.d.ts +5 -0
- package/dist/utils/banner.spec.d.ts.map +1 -0
- package/dist/utils/banner.spec.js +253 -0
- package/dist/utils/banner.spec.js.map +1 -0
- package/dist/utils/confidence.d.ts +41 -0
- package/dist/utils/confidence.d.ts.map +1 -0
- package/dist/utils/confidence.js +101 -0
- package/dist/utils/confidence.js.map +1 -0
- package/dist/utils/datamodel.d.ts +41 -0
- package/dist/utils/datamodel.d.ts.map +1 -0
- package/dist/utils/datamodel.js +535 -0
- package/dist/utils/datamodel.js.map +1 -0
- package/dist/utils/dna-detector.d.ts +61 -0
- package/dist/utils/dna-detector.d.ts.map +1 -0
- package/dist/utils/dna-detector.js +354 -0
- package/dist/utils/dna-detector.js.map +1 -0
- package/dist/utils/dna-facts.d.ts +13 -0
- package/dist/utils/dna-facts.d.ts.map +1 -0
- package/dist/utils/dna-facts.js +109 -0
- package/dist/utils/dna-facts.js.map +1 -0
- package/dist/utils/excalidraw-renderer.d.ts +11 -71
- package/dist/utils/excalidraw-renderer.d.ts.map +1 -1
- package/dist/utils/excalidraw-renderer.js +29 -162
- package/dist/utils/excalidraw-renderer.js.map +1 -1
- package/dist/utils/graph-renderer.d.ts +115 -0
- package/dist/utils/graph-renderer.d.ts.map +1 -0
- package/dist/utils/graph-renderer.js +216 -0
- package/dist/utils/graph-renderer.js.map +1 -0
- package/dist/utils/migration.d.ts +64 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +183 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/module-detector.d.ts +46 -0
- package/dist/utils/module-detector.d.ts.map +1 -0
- package/dist/utils/module-detector.js +348 -0
- package/dist/utils/module-detector.js.map +1 -0
- package/dist/utils/project-generator.js +252 -252
- package/dist/utils/reverse-facts.d.ts +50 -0
- package/dist/utils/reverse-facts.d.ts.map +1 -0
- package/dist/utils/reverse-facts.js +291 -0
- package/dist/utils/reverse-facts.js.map +1 -0
- package/dist/utils/stack-bootstrap.js +371 -371
- package/package.json +8 -3
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +48 -48
- package/templates/backend/node-nestjs/.env.example +9 -9
- package/templates/backend/node-nestjs/nest-cli.json +8 -8
- package/templates/backend/node-nestjs/package.json +50 -50
- package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
- package/templates/backend/node-nestjs/src/app.module.ts +15 -15
- package/templates/backend/node-nestjs/src/app.service.ts +8 -8
- package/templates/backend/node-nestjs/src/main.ts +24 -24
- package/templates/backend/node-nestjs/tsconfig.json +21 -21
- package/templates/backend/php-laravel/.env.example +22 -22
- package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
- package/templates/backend/php-laravel/composer.json +40 -40
- package/templates/backend/python-fastapi/.env.example +4 -4
- package/templates/backend/python-fastapi/app/api/router.py +8 -8
- package/templates/backend/python-fastapi/app/core/config.py +20 -20
- package/templates/backend/python-fastapi/main.py +35 -35
- package/templates/backend/python-fastapi/requirements.txt +13 -13
- package/templates/backend/rust-axum/.env.example +3 -3
- package/templates/backend/rust-axum/Cargo.toml +23 -23
- package/templates/backend/rust-axum/src/errors.rs +30 -30
- package/templates/backend/rust-axum/src/main.rs +32 -32
- package/templates/backend/rust-axum/src/routes.rs +6 -6
- package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
- package/templates/frontend/leptos-csr/Cargo.toml +16 -16
- package/templates/frontend/leptos-csr/Trunk.toml +10 -10
- package/templates/frontend/leptos-csr/index.html +11 -11
- package/templates/frontend/leptos-csr/src/lib.rs +20 -20
- package/templates/frontend/leptos-csr/style/main.scss +19 -19
- package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
- package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
- package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
- package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
- package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
- package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
- package/templates/frontend/react/index.html +12 -12
- package/templates/frontend/react/package.json +35 -35
- package/templates/frontend/react/src/App.tsx +25 -25
- package/templates/frontend/react/src/main.tsx +9 -9
- package/templates/frontend/vue/package.json +32 -32
- package/templates/frontend/vue/src/App.vue +7 -7
- package/templates/frontend/vue/src/main.ts +10 -10
- package/templates/frontend/vue/src/router/index.ts +14 -14
- package/templates/frontend/vue/src/views/HomeView.vue +6 -6
- package/templates/hooks/pre-commit-dare-validate +24 -24
- package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -0
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -0
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -0
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -0
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -0
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -0
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -0
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -0
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -0
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -0
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -0
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -0
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -0
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -0
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -0
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -0
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -0
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -0
- package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -0
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -0
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -0
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -0
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -0
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -0
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -0
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -0
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -0
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -0
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -0
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -0
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -0
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -0
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
- package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
- package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
- package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
- package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -0
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -0
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -0
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -0
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -0
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -0
- package/templates/ide/claude/.claude/settings.example.json +35 -35
- package/templates/ide/claude/CLAUDE.md +146 -146
- package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/claude/templates/DESIGN-template.md +129 -129
- package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/cursor/.cursor/commands/dag-viz.md +139 -0
- package/templates/ide/cursor/.cursor/commands/generate-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/generate-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/generate-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/refine-task.md +107 -107
- package/templates/ide/cursor/.cursor/commands/review-task.md +91 -91
- package/templates/ide/cursor/.cursor/commands/run-dag.md +110 -110
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -0
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -0
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -0
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -0
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -0
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -0
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -0
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -0
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -0
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -0
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -0
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -0
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -0
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -0
- package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
- package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
- package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
- package/templates/shared/docker-compose.yml +41 -41
- package/dist/__tests__/dag-runner/adapters.test.d.ts +0 -2
- package/dist/__tests__/dag-runner/adapters.test.d.ts.map +0 -1
- package/dist/__tests__/dag-runner/adapters.test.js +0 -134
- package/dist/__tests__/dag-runner/adapters.test.js.map +0 -1
- package/dist/dag-runner/adapters/antigravity.d.ts +0 -6
- package/dist/dag-runner/adapters/antigravity.d.ts.map +0 -1
- package/dist/dag-runner/adapters/antigravity.js +0 -54
- package/dist/dag-runner/adapters/antigravity.js.map +0 -1
- package/dist/dag-runner/adapters/claude.d.ts +0 -6
- package/dist/dag-runner/adapters/claude.d.ts.map +0 -1
- package/dist/dag-runner/adapters/claude.js +0 -48
- package/dist/dag-runner/adapters/claude.js.map +0 -1
- package/dist/dag-runner/adapters/cursor.d.ts +0 -6
- package/dist/dag-runner/adapters/cursor.d.ts.map +0 -1
- package/dist/dag-runner/adapters/cursor.js +0 -58
- package/dist/dag-runner/adapters/cursor.js.map +0 -1
- package/dist/dag-runner/adapters/index.d.ts +0 -46
- package/dist/dag-runner/adapters/index.d.ts.map +0 -1
- package/dist/dag-runner/adapters/index.js +0 -55
- package/dist/dag-runner/adapters/index.js.map +0 -1
- package/dist/dag-runner/utils/timeout.d.ts +0 -27
- package/dist/dag-runner/utils/timeout.d.ts.map +0 -1
- package/dist/dag-runner/utils/timeout.js +0 -55
- package/dist/dag-runner/utils/timeout.js.map +0 -1
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remote registry client and resolver for the DARE skill registry.
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - `RemoteRegistry` — HTTP client for the Vercel Functions backend
|
|
6
|
+
* - `RegistryResolver` — combina remote + local + mock em ordem de prioridade
|
|
7
|
+
*
|
|
8
|
+
* Priority: Remote (if online) → Local (~/.dare/registry/) → Mock (offline)
|
|
9
|
+
*
|
|
10
|
+
* @module skills/registry-remote
|
|
11
|
+
*/
|
|
12
|
+
import { registry as mockRegistry } from './registry.js';
|
|
13
|
+
import { LocalRegistry } from './registry-local.js';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// RemoteRegistry
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
/**
|
|
18
|
+
* HTTP client for the DARE registry backend (Vercel Functions).
|
|
19
|
+
*
|
|
20
|
+
* All network calls use `AbortController` with a configurable timeout.
|
|
21
|
+
*/
|
|
22
|
+
export class RemoteRegistry {
|
|
23
|
+
constructor(baseUrl = 'https://dare-registry.vercel.app', timeoutMs = 3000) {
|
|
24
|
+
this._baseUrl = baseUrl.replace(/\/$/, '');
|
|
25
|
+
this._timeoutMs = timeoutMs;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Lists all skills from the remote registry.
|
|
29
|
+
* Returns an empty array on network failure.
|
|
30
|
+
*
|
|
31
|
+
* @throws Never — failures are returned as empty array.
|
|
32
|
+
*/
|
|
33
|
+
async list(options = {}) {
|
|
34
|
+
const url = new URL(`${this._baseUrl}/api/skills`);
|
|
35
|
+
if (options.keyword)
|
|
36
|
+
url.searchParams.set('keyword', options.keyword);
|
|
37
|
+
if (options.author)
|
|
38
|
+
url.searchParams.set('author', options.author);
|
|
39
|
+
const response = await this._fetch(url.toString());
|
|
40
|
+
const data = await response.json();
|
|
41
|
+
return data.skills ?? [];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Fetches details for a single skill by name.
|
|
45
|
+
* Returns `null` when not found (404) or on network failure.
|
|
46
|
+
*/
|
|
47
|
+
async find(name) {
|
|
48
|
+
const url = `${this._baseUrl}/api/skills/${encodeURIComponent(name)}`;
|
|
49
|
+
const response = await this._fetch(url);
|
|
50
|
+
if (response.status === 404)
|
|
51
|
+
return null;
|
|
52
|
+
if (!response.ok)
|
|
53
|
+
return null;
|
|
54
|
+
const data = await response.json();
|
|
55
|
+
return data.latest ?? null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Publishes a skill to the remote registry.
|
|
59
|
+
*
|
|
60
|
+
* @param skillName - The skill name (used in the URL path)
|
|
61
|
+
* @param payload - Skill metadata
|
|
62
|
+
* @param token - Bearer token for authentication
|
|
63
|
+
* @throws Error if the request fails or returns a non-2xx status.
|
|
64
|
+
*/
|
|
65
|
+
async publish(skillName, payload, token) {
|
|
66
|
+
const url = `${this._baseUrl}/api/publish/${encodeURIComponent(skillName)}`;
|
|
67
|
+
const response = await this._fetch(url, {
|
|
68
|
+
method: 'POST',
|
|
69
|
+
headers: {
|
|
70
|
+
'Content-Type': 'application/json',
|
|
71
|
+
'Authorization': `Bearer ${token}`,
|
|
72
|
+
},
|
|
73
|
+
body: JSON.stringify(payload),
|
|
74
|
+
});
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
let detail = `HTTP ${response.status}`;
|
|
77
|
+
try {
|
|
78
|
+
const err = await response.json();
|
|
79
|
+
detail = err.detail ?? err.title ?? detail;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// ignore
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`Remote publish failed: ${detail}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Checks connectivity to the registry by fetching the skills list.
|
|
89
|
+
* Returns `true` if the registry responds with a 2xx status.
|
|
90
|
+
*/
|
|
91
|
+
async isOnline() {
|
|
92
|
+
try {
|
|
93
|
+
const url = `${this._baseUrl}/api/skills`;
|
|
94
|
+
const response = await this._fetch(url);
|
|
95
|
+
return response.ok;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// ---- private ---------------------------------------------------------------
|
|
102
|
+
async _fetch(url, init) {
|
|
103
|
+
const controller = new AbortController();
|
|
104
|
+
const timer = setTimeout(() => controller.abort(), this._timeoutMs);
|
|
105
|
+
try {
|
|
106
|
+
const response = await fetch(url, { ...init, signal: controller.signal });
|
|
107
|
+
return response;
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
clearTimeout(timer);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// RegistryResolver
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
/**
|
|
118
|
+
* Combines remote, local, and mock registries with priority fallback.
|
|
119
|
+
*
|
|
120
|
+
* Priority order:
|
|
121
|
+
* 1. Remote (if available and online — timeout = 3s)
|
|
122
|
+
* 2. Local (`~/.dare/registry/`)
|
|
123
|
+
* 3. Mock (bundled JSON fallback)
|
|
124
|
+
*
|
|
125
|
+
* Skills from higher-priority sources overwrite those with the same
|
|
126
|
+
* `name@version` from lower-priority sources.
|
|
127
|
+
*/
|
|
128
|
+
export class RegistryResolver {
|
|
129
|
+
constructor(remote, local) {
|
|
130
|
+
this._remote = remote ?? new RemoteRegistry();
|
|
131
|
+
this._local = local ?? new LocalRegistry();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Returns all skills with source annotations.
|
|
135
|
+
* Falls back automatically if remote is offline.
|
|
136
|
+
*/
|
|
137
|
+
async list() {
|
|
138
|
+
const map = new Map();
|
|
139
|
+
// 1. Mock (lowest priority — add first so it can be overwritten)
|
|
140
|
+
for (const s of mockRegistry.loadAll()) {
|
|
141
|
+
map.set(`${s.name}@${s.version}`, { ...s, source: 'mock' });
|
|
142
|
+
}
|
|
143
|
+
// 2. Local (overlays mock)
|
|
144
|
+
for (const s of this._local.list()) {
|
|
145
|
+
map.set(`${s.name}@${s.version}`, {
|
|
146
|
+
name: s.name,
|
|
147
|
+
version: s.version,
|
|
148
|
+
description: s.description,
|
|
149
|
+
author: s.author,
|
|
150
|
+
license: s.license,
|
|
151
|
+
homepage: s.homepage ?? '',
|
|
152
|
+
repository: s.repository ?? '',
|
|
153
|
+
keywords: s.keywords ?? [],
|
|
154
|
+
dependencies: {},
|
|
155
|
+
published_at: s.published_at ?? '',
|
|
156
|
+
size_kb: s.size_kb ?? 0,
|
|
157
|
+
source: 'local',
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// 3. Remote (highest priority — overlays local and mock)
|
|
161
|
+
try {
|
|
162
|
+
const remoteSkills = await this._remote.list();
|
|
163
|
+
for (const s of remoteSkills) {
|
|
164
|
+
map.set(`${s.name}@${s.version}`, {
|
|
165
|
+
name: s.name,
|
|
166
|
+
version: s.version,
|
|
167
|
+
description: s.description,
|
|
168
|
+
author: s.author,
|
|
169
|
+
license: s.license,
|
|
170
|
+
homepage: s.homepage ?? '',
|
|
171
|
+
repository: '',
|
|
172
|
+
keywords: s.keywords,
|
|
173
|
+
dependencies: s.dependencies,
|
|
174
|
+
published_at: s.publishedAt,
|
|
175
|
+
size_kb: 0,
|
|
176
|
+
source: 'remote',
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Remote offline — local/mock fallback already in map
|
|
182
|
+
}
|
|
183
|
+
return Array.from(map.values());
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Finds a single skill by name.
|
|
187
|
+
* Uses remote first, then local, then mock.
|
|
188
|
+
*/
|
|
189
|
+
async find(name) {
|
|
190
|
+
// Try remote first
|
|
191
|
+
try {
|
|
192
|
+
const remote = await this._remote.find(name);
|
|
193
|
+
if (remote) {
|
|
194
|
+
return {
|
|
195
|
+
name: remote.name,
|
|
196
|
+
version: remote.version,
|
|
197
|
+
description: remote.description,
|
|
198
|
+
author: remote.author,
|
|
199
|
+
license: remote.license,
|
|
200
|
+
homepage: remote.homepage ?? '',
|
|
201
|
+
repository: '',
|
|
202
|
+
keywords: remote.keywords,
|
|
203
|
+
dependencies: remote.dependencies,
|
|
204
|
+
published_at: remote.publishedAt,
|
|
205
|
+
size_kb: 0,
|
|
206
|
+
source: 'remote',
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// fallthrough to local
|
|
212
|
+
}
|
|
213
|
+
// Try local
|
|
214
|
+
const local = this._local.find(name);
|
|
215
|
+
if (local) {
|
|
216
|
+
return {
|
|
217
|
+
name: local.name,
|
|
218
|
+
version: local.version,
|
|
219
|
+
description: local.description,
|
|
220
|
+
author: local.author,
|
|
221
|
+
license: local.license,
|
|
222
|
+
homepage: local.homepage ?? '',
|
|
223
|
+
repository: local.repository ?? '',
|
|
224
|
+
keywords: local.keywords ?? [],
|
|
225
|
+
dependencies: {},
|
|
226
|
+
published_at: local.published_at ?? '',
|
|
227
|
+
size_kb: local.size_kb ?? 0,
|
|
228
|
+
source: 'local',
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
// Fallback to mock
|
|
232
|
+
const mock = mockRegistry.findByName(name);
|
|
233
|
+
if (mock) {
|
|
234
|
+
return { ...mock, source: 'mock' };
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
// Singleton instances
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
/** Shared remote registry client. */
|
|
243
|
+
export const remoteRegistry = new RemoteRegistry();
|
|
244
|
+
/** Shared resolver (remote → local → mock). */
|
|
245
|
+
export const registryResolver = new RegistryResolver();
|
|
246
|
+
//# sourceMappingURL=registry-remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-remote.js","sourceRoot":"","sources":["../../src/skills/registry-remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry client — mock implementation backed by a local JSON file.
|
|
3
|
+
*
|
|
4
|
+
* When the real HTTP registry (`registry.dare-method.dev`) is available,
|
|
5
|
+
* replace `loadAll()` and `findByName()` with fetch calls.
|
|
6
|
+
* The rest of the skill commands depend only on this interface, so the
|
|
7
|
+
* swap will be transparent to them.
|
|
8
|
+
*
|
|
9
|
+
* @module skills/registry
|
|
10
|
+
*/
|
|
11
|
+
export interface RegistrySkill {
|
|
12
|
+
name: string;
|
|
13
|
+
version: string;
|
|
14
|
+
description: string;
|
|
15
|
+
author: string;
|
|
16
|
+
license: string;
|
|
17
|
+
homepage: string;
|
|
18
|
+
repository: string;
|
|
19
|
+
keywords: string[];
|
|
20
|
+
/** Map of skill name → semver range */
|
|
21
|
+
dependencies: Record<string, string>;
|
|
22
|
+
published_at: string;
|
|
23
|
+
size_kb: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class Registry {
|
|
26
|
+
private _data;
|
|
27
|
+
/**
|
|
28
|
+
* Returns all skills known to the registry.
|
|
29
|
+
* Result is cached in-memory for the lifetime of the process.
|
|
30
|
+
*/
|
|
31
|
+
loadAll(): RegistrySkill[];
|
|
32
|
+
/**
|
|
33
|
+
* Looks up a skill by exact name.
|
|
34
|
+
* Returns `undefined` when not found.
|
|
35
|
+
*/
|
|
36
|
+
findByName(name: string): RegistrySkill | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Returns the list of (transitive) dependencies for a skill in
|
|
39
|
+
* topological install order (deepest dependency first).
|
|
40
|
+
*
|
|
41
|
+
* Throws when a dependency is not in the registry.
|
|
42
|
+
* Throws on circular dependency chains.
|
|
43
|
+
*/
|
|
44
|
+
resolveDependencies(skillName: string): RegistrySkill[];
|
|
45
|
+
private _getData;
|
|
46
|
+
}
|
|
47
|
+
/** Singleton instance used by all skill commands. */
|
|
48
|
+
export declare const registry: Registry;
|
|
49
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAUD,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAA6B;IAE1C;;;OAGG;IACH,OAAO,IAAI,aAAa,EAAE;IAI1B;;;OAGG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAInD;;;;;;OAMG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,EAAE;IAuCvD,OAAO,CAAC,QAAQ;CAqBjB;AAED,qDAAqD;AACrD,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry client — mock implementation backed by a local JSON file.
|
|
3
|
+
*
|
|
4
|
+
* When the real HTTP registry (`registry.dare-method.dev`) is available,
|
|
5
|
+
* replace `loadAll()` and `findByName()` with fetch calls.
|
|
6
|
+
* The rest of the skill commands depend only on this interface, so the
|
|
7
|
+
* swap will be transparent to them.
|
|
8
|
+
*
|
|
9
|
+
* @module skills/registry
|
|
10
|
+
*/
|
|
11
|
+
import { createRequire } from 'module';
|
|
12
|
+
import { fileURLToPath } from 'url';
|
|
13
|
+
import fs from 'fs-extra';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
// Registry
|
|
17
|
+
// ---------------------------------------------------------------------------
|
|
18
|
+
export class Registry {
|
|
19
|
+
constructor() {
|
|
20
|
+
this._data = null;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Returns all skills known to the registry.
|
|
24
|
+
* Result is cached in-memory for the lifetime of the process.
|
|
25
|
+
*/
|
|
26
|
+
loadAll() {
|
|
27
|
+
return this._getData().skills;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Looks up a skill by exact name.
|
|
31
|
+
* Returns `undefined` when not found.
|
|
32
|
+
*/
|
|
33
|
+
findByName(name) {
|
|
34
|
+
return this._getData().skills.find((s) => s.name === name);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns the list of (transitive) dependencies for a skill in
|
|
38
|
+
* topological install order (deepest dependency first).
|
|
39
|
+
*
|
|
40
|
+
* Throws when a dependency is not in the registry.
|
|
41
|
+
* Throws on circular dependency chains.
|
|
42
|
+
*/
|
|
43
|
+
resolveDependencies(skillName) {
|
|
44
|
+
const resolved = [];
|
|
45
|
+
const visited = new Set();
|
|
46
|
+
const inStack = new Set();
|
|
47
|
+
const visit = (name) => {
|
|
48
|
+
if (visited.has(name))
|
|
49
|
+
return;
|
|
50
|
+
if (inStack.has(name)) {
|
|
51
|
+
throw new Error(`Circular dependency detected: "${name}" is already in the resolution stack.`);
|
|
52
|
+
}
|
|
53
|
+
const skill = this.findByName(name);
|
|
54
|
+
if (!skill) {
|
|
55
|
+
throw new Error(`Dependency "${name}" not found in the registry. Cannot resolve.`);
|
|
56
|
+
}
|
|
57
|
+
inStack.add(name);
|
|
58
|
+
for (const depName of Object.keys(skill.dependencies)) {
|
|
59
|
+
visit(depName);
|
|
60
|
+
}
|
|
61
|
+
inStack.delete(name);
|
|
62
|
+
visited.add(name);
|
|
63
|
+
resolved.push(skill);
|
|
64
|
+
};
|
|
65
|
+
visit(skillName);
|
|
66
|
+
// Remove the skill itself — return only its dependencies.
|
|
67
|
+
return resolved.filter((s) => s.name !== skillName);
|
|
68
|
+
}
|
|
69
|
+
// ---- private -------------------------------------------------------------
|
|
70
|
+
_getData() {
|
|
71
|
+
if (!this._data) {
|
|
72
|
+
// Resolve relative to the *source* file so this works both in:
|
|
73
|
+
// - `tsx` (runs from src/skills/)
|
|
74
|
+
// - `node dist/` (compiled JS lands in dist/skills/)
|
|
75
|
+
// Both layouts keep registry-mock.json in the same directory as this
|
|
76
|
+
// file, so __dirname-equivalent resolution always works.
|
|
77
|
+
const dir = path.dirname(fileURLToPath(import.meta.url));
|
|
78
|
+
const jsonPath = path.join(dir, 'registry-mock.json');
|
|
79
|
+
if (!fs.pathExistsSync(jsonPath)) {
|
|
80
|
+
// Fallback: try createRequire (works in some bundler environments)
|
|
81
|
+
const require = createRequire(import.meta.url);
|
|
82
|
+
this._data = require('./registry-mock.json');
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const raw = fs.readFileSync(jsonPath, 'utf-8');
|
|
86
|
+
this._data = JSON.parse(raw);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return this._data;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Singleton instance used by all skill commands. */
|
|
93
|
+
export const registry = new Registry();
|
|
94
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.spec.d.ts","sourceRoot":"","sources":["../../../src/skills/tests/manifest.spec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for ManifestReader and ManifestWriter.
|
|
3
|
+
*
|
|
4
|
+
* Uses the filesystem exclusively via temp directories — no network, no
|
|
5
|
+
* external dependencies.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import os from 'os';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { ManifestReader, ManifestWriter } from '../manifest.js';
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
// Helpers
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
let tmpDir;
|
|
16
|
+
const manifestRelPath = '.dare/skills.yml';
|
|
17
|
+
function manifestAbs() {
|
|
18
|
+
return path.join(tmpDir, manifestRelPath);
|
|
19
|
+
}
|
|
20
|
+
async function writeRaw(content) {
|
|
21
|
+
await fs.ensureDir(path.dirname(manifestAbs()));
|
|
22
|
+
await fs.writeFile(manifestAbs(), content, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Setup / Teardown
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
beforeEach(async () => {
|
|
28
|
+
tmpDir = path.join(os.tmpdir(), `dare-manifest-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
29
|
+
await fs.ensureDir(tmpDir);
|
|
30
|
+
});
|
|
31
|
+
afterEach(async () => {
|
|
32
|
+
await fs.remove(tmpDir).catch(() => undefined);
|
|
33
|
+
});
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// ManifestReader
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
describe('ManifestReader', () => {
|
|
38
|
+
const reader = new ManifestReader();
|
|
39
|
+
it('exists() returns false when manifest is absent', () => {
|
|
40
|
+
expect(reader.exists(tmpDir)).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
it('exists() returns true when manifest is present', async () => {
|
|
43
|
+
await writeRaw('skills: []');
|
|
44
|
+
expect(reader.exists(tmpDir)).toBe(true);
|
|
45
|
+
});
|
|
46
|
+
it('read() throws when manifest is absent', () => {
|
|
47
|
+
expect(() => reader.read(tmpDir)).toThrow('Manifest not found');
|
|
48
|
+
});
|
|
49
|
+
it('read() parses a minimal valid manifest', async () => {
|
|
50
|
+
await writeRaw(`
|
|
51
|
+
skills:
|
|
52
|
+
- name: dare-ax
|
|
53
|
+
version: "1.0.0"
|
|
54
|
+
enabled: true
|
|
55
|
+
`);
|
|
56
|
+
const manifest = reader.read(tmpDir);
|
|
57
|
+
expect(manifest.skills).toHaveLength(1);
|
|
58
|
+
expect(manifest.skills[0]).toMatchObject({ name: 'dare-ax', version: '1.0.0', enabled: true });
|
|
59
|
+
});
|
|
60
|
+
it('read() parses dependsOn field', async () => {
|
|
61
|
+
await writeRaw(`
|
|
62
|
+
skills:
|
|
63
|
+
- name: dare-llm-integration
|
|
64
|
+
version: "1.0.0"
|
|
65
|
+
enabled: true
|
|
66
|
+
dependsOn:
|
|
67
|
+
- dare-ax
|
|
68
|
+
`);
|
|
69
|
+
const manifest = reader.read(tmpDir);
|
|
70
|
+
expect(manifest.skills[0]?.dependsOn).toEqual(['dare-ax']);
|
|
71
|
+
});
|
|
72
|
+
it('read() throws on malformed YAML', async () => {
|
|
73
|
+
await writeRaw('skills: !!binary bad!!');
|
|
74
|
+
expect(() => reader.read(tmpDir)).toThrow();
|
|
75
|
+
});
|
|
76
|
+
it('read() throws when skills is not an array', async () => {
|
|
77
|
+
await writeRaw('skills: "oops"');
|
|
78
|
+
expect(() => reader.read(tmpDir)).toThrow("'skills' must be an array");
|
|
79
|
+
});
|
|
80
|
+
it('read() throws when a skill entry is missing name', async () => {
|
|
81
|
+
await writeRaw(`
|
|
82
|
+
skills:
|
|
83
|
+
- version: "1.0.0"
|
|
84
|
+
enabled: true
|
|
85
|
+
`);
|
|
86
|
+
expect(() => reader.read(tmpDir)).toThrow('name must be a non-empty string');
|
|
87
|
+
});
|
|
88
|
+
it('read() throws when a skill entry is missing version', async () => {
|
|
89
|
+
await writeRaw(`
|
|
90
|
+
skills:
|
|
91
|
+
- name: dare-ax
|
|
92
|
+
enabled: true
|
|
93
|
+
`);
|
|
94
|
+
expect(() => reader.read(tmpDir)).toThrow('version must be a non-empty string');
|
|
95
|
+
});
|
|
96
|
+
it('readOrEmpty() returns empty manifest when file is absent', () => {
|
|
97
|
+
const manifest = reader.readOrEmpty(tmpDir);
|
|
98
|
+
expect(manifest.skills).toEqual([]);
|
|
99
|
+
});
|
|
100
|
+
it('readOrEmpty() returns parsed manifest when file exists', async () => {
|
|
101
|
+
await writeRaw('skills:\n - name: dare-ax\n version: "1.0.0"\n enabled: true\n');
|
|
102
|
+
const manifest = reader.readOrEmpty(tmpDir);
|
|
103
|
+
expect(manifest.skills).toHaveLength(1);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
// ---------------------------------------------------------------------------
|
|
107
|
+
// ManifestWriter
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
describe('ManifestWriter', () => {
|
|
110
|
+
const writer = new ManifestWriter();
|
|
111
|
+
const reader = new ManifestReader();
|
|
112
|
+
it('write() creates .dare directory if absent', () => {
|
|
113
|
+
expect(fs.pathExistsSync(path.join(tmpDir, '.dare'))).toBe(false);
|
|
114
|
+
writer.write(tmpDir, { skills: [] });
|
|
115
|
+
expect(fs.pathExistsSync(path.join(tmpDir, '.dare'))).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
it('write() creates skills.yml with header comment', () => {
|
|
118
|
+
writer.write(tmpDir, { skills: [] });
|
|
119
|
+
const content = fs.readFileSync(manifestAbs(), 'utf-8');
|
|
120
|
+
expect(content).toContain('Managed by DARE CLI');
|
|
121
|
+
});
|
|
122
|
+
it('write() round-trips a skill entry', () => {
|
|
123
|
+
const entry = { name: 'dare-ax', version: '1.0.0', enabled: true };
|
|
124
|
+
writer.write(tmpDir, { skills: [entry] });
|
|
125
|
+
const manifest = reader.read(tmpDir);
|
|
126
|
+
expect(manifest.skills[0]).toMatchObject(entry);
|
|
127
|
+
});
|
|
128
|
+
it('write() round-trips dependsOn', () => {
|
|
129
|
+
const entry = {
|
|
130
|
+
name: 'dare-llm',
|
|
131
|
+
version: '1.0.0',
|
|
132
|
+
enabled: true,
|
|
133
|
+
dependsOn: ['dare-ax'],
|
|
134
|
+
};
|
|
135
|
+
writer.write(tmpDir, { skills: [entry] });
|
|
136
|
+
const manifest = reader.read(tmpDir);
|
|
137
|
+
expect(manifest.skills[0]?.dependsOn).toEqual(['dare-ax']);
|
|
138
|
+
});
|
|
139
|
+
it('addSkill() creates manifest from scratch and adds entry', () => {
|
|
140
|
+
writer.addSkill(tmpDir, { name: 'dare-ax', version: '1.0.0', enabled: true });
|
|
141
|
+
const manifest = reader.read(tmpDir);
|
|
142
|
+
expect(manifest.skills).toHaveLength(1);
|
|
143
|
+
expect(manifest.skills[0]?.name).toBe('dare-ax');
|
|
144
|
+
});
|
|
145
|
+
it('addSkill() appends to existing manifest', () => {
|
|
146
|
+
writer.addSkill(tmpDir, { name: 'dare-ax', version: '1.0.0', enabled: true });
|
|
147
|
+
writer.addSkill(tmpDir, { name: 'dare-layered-design', version: '1.0.0', enabled: true });
|
|
148
|
+
const manifest = reader.read(tmpDir);
|
|
149
|
+
expect(manifest.skills).toHaveLength(2);
|
|
150
|
+
});
|
|
151
|
+
it('addSkill() replaces an existing entry by name (upsert)', () => {
|
|
152
|
+
writer.addSkill(tmpDir, { name: 'dare-ax', version: '1.0.0', enabled: true });
|
|
153
|
+
writer.addSkill(tmpDir, { name: 'dare-ax', version: '1.1.0', enabled: true });
|
|
154
|
+
const manifest = reader.read(tmpDir);
|
|
155
|
+
expect(manifest.skills).toHaveLength(1);
|
|
156
|
+
expect(manifest.skills[0]?.version).toBe('1.1.0');
|
|
157
|
+
});
|
|
158
|
+
it('removeSkill() removes an existing skill', () => {
|
|
159
|
+
writer.addSkill(tmpDir, { name: 'dare-ax', version: '1.0.0', enabled: true });
|
|
160
|
+
writer.addSkill(tmpDir, { name: 'dare-llm', version: '1.0.0', enabled: true });
|
|
161
|
+
writer.removeSkill(tmpDir, 'dare-ax');
|
|
162
|
+
const manifest = reader.read(tmpDir);
|
|
163
|
+
expect(manifest.skills).toHaveLength(1);
|
|
164
|
+
expect(manifest.skills[0]?.name).toBe('dare-llm');
|
|
165
|
+
});
|
|
166
|
+
it('removeSkill() is a no-op when skill is absent', () => {
|
|
167
|
+
writer.addSkill(tmpDir, { name: 'dare-ax', version: '1.0.0', enabled: true });
|
|
168
|
+
writer.removeSkill(tmpDir, 'nonexistent');
|
|
169
|
+
const manifest = reader.read(tmpDir);
|
|
170
|
+
expect(manifest.skills).toHaveLength(1);
|
|
171
|
+
});
|
|
172
|
+
it('removeSkill() works on empty project (no manifest yet) — no-op', () => {
|
|
173
|
+
expect(() => writer.removeSkill(tmpDir, 'dare-ax')).not.toThrow();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=manifest.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.spec.js","sourceRoot":"","sources":["../../../src/skills/tests/manifest.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for `dare skill publish`.
|
|
3
|
+
*
|
|
4
|
+
* Tests cover:
|
|
5
|
+
* - readAndValidateSkillYml validation logic
|
|
6
|
+
* - collectFiles file collection logic
|
|
7
|
+
* - MIT license enforcement (D-001)
|
|
8
|
+
* - dry-run behaviour (no files written)
|
|
9
|
+
* - successful publish writes files and updates index
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=publish.spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.spec.d.ts","sourceRoot":"","sources":["../../../src/skills/tests/publish.spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|