showdar-skills 0.6.0 → 0.8.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 +62 -0
- package/MIGRATION.md +37 -0
- package/README.md +95 -0
- package/bin/showdar.js +41 -2
- package/config/custom-workflow.schema.json +57 -0
- package/config/pack.schema.json +54 -0
- package/config/project-overrides.schema.json +68 -0
- package/package.json +6 -3
- package/src/extension-catalog.js +196 -0
- package/src/project.js +239 -1
- package/src/validate-pack.js +353 -0
- package/src/validate.js +58 -0
- package/src/workflow-state.js +65 -33
- package/src/workflow-trace.js +184 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,68 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
6
|
|
|
7
|
+
## [0.8.0]
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Local extension packs: static declarative directories (`pack.json` metadata only, no content hash) installed from a local directory or workspace-relative path.
|
|
12
|
+
- Custom workflows composed from built-in primitive stages (`vendor-name` IDs), with canonical skip reasons/policies and the frozen completion contract.
|
|
13
|
+
- Immutable deterministic extension catalog snapshots (`createExtensionCatalog`): no global registry, input-order independent, duplicate/collision rejecting.
|
|
14
|
+
- Pack-local and project-local profiles; the six built-in profiles remain primitive-only and immutable.
|
|
15
|
+
- User-owned `.showdar/overrides.json` for descriptions, discovery hints, guidance, custom-workflow policy refinement, and new project profiles.
|
|
16
|
+
- CLI: `showdar add-pack <path>`, `showdar remove-pack <name>`, `showdar add-workflow <path>`, `showdar init --pack <path>`, `showdar list --extensions`.
|
|
17
|
+
- Full-tree pack hashing: Showdar computes SHA-256 over the validated source tree at install and records it in `.showdar.json` (`extensions.packs[].hash`); docs-only edits change the hash as source identity, not as a behavior claim.
|
|
18
|
+
- Opt-in custom workflow evaluation (`npm run eval:custom-workflows`); never part of `npm run eval` or the release gate.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Workflow-state APIs accept an optional explicit extension-catalog context; omitted context preserves built-in behavior exactly. State schema stays `schemaVersion: 1`.
|
|
23
|
+
- Trace projection accepts `input.extensionCatalog` as validation context only; event types, envelope, and ordering are unchanged.
|
|
24
|
+
- Manifest v2 gains an optional additive `extensions` object (`packs[]`, `customWorkflows[]`, `overrides` metadata). Existing manifests without it remain valid.
|
|
25
|
+
|
|
26
|
+
### Security
|
|
27
|
+
|
|
28
|
+
- Built-in workflow policy (stages, required stages, skips, completion, identity) and built-in profile definitions are protected and non-overrideable.
|
|
29
|
+
- Recursive structured authority-key rejection (`primaryCapability`, `authorizedAction`, `mutationPermission`, `routeAuthority` and all canonical `FORBIDDEN_AUTHORITY_KEYS`); ordinary prose is not censored.
|
|
30
|
+
- Path/symlink/ownership protection on pack install, removal, and override reads; foreign files are never silently overwritten or deleted.
|
|
31
|
+
- Local-only source model: no network, Git, npm/registry, or executable hooks. Tarball, URL, and Git pack sources are rejected in 0.8.
|
|
32
|
+
- Extensions cannot create capabilities, grant authority, modify Phase 6G, mutate built-ins, or execute code.
|
|
33
|
+
|
|
34
|
+
### Migration
|
|
35
|
+
|
|
36
|
+
- No migration required. Existing 0.7 installs, manifests (v2), checkpoints (schemaVersion 1), profiles, and adapters work unchanged. Extensions and overrides are opt-in; no mandatory action for existing users.
|
|
37
|
+
|
|
38
|
+
## [0.7.0]
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- Deterministic workflow trace projection (`src/workflow-trace.js`): pure
|
|
43
|
+
state-diff observation over workflow transitions with 10 closed semantic
|
|
44
|
+
event types, no timestamps, no authority content, and no automatic
|
|
45
|
+
persistence.
|
|
46
|
+
- Workflow benchmark scenario schema and loader
|
|
47
|
+
(`benchmark/schema/workflow-scenario.schema.json`,
|
|
48
|
+
`benchmark/lib/workflow-scenario-loader.js`).
|
|
49
|
+
- Deterministic workflow benchmark corpus
|
|
50
|
+
(`benchmark/scenarios/workflows/`, 16 scenarios): exact-match M1–M10
|
|
51
|
+
invariants covering selection, skip policy, verification preservation,
|
|
52
|
+
stale-resume blocking, authority invariance, and completion.
|
|
53
|
+
- `npm run eval:workflows` driver
|
|
54
|
+
(`scripts/workflow-observability-eval.mjs`).
|
|
55
|
+
|
|
56
|
+
### Changed
|
|
57
|
+
|
|
58
|
+
- `npm run eval` now runs retrieval evaluation (`eval:retrieval`) followed
|
|
59
|
+
by workflow evaluation (`eval:workflows`); release evaluation blocks on
|
|
60
|
+
exact workflow invariants.
|
|
61
|
+
- `npm run check` remains test/validate/package correctness only.
|
|
62
|
+
|
|
63
|
+
### Safety
|
|
64
|
+
|
|
65
|
+
- Traces contain normalized semantic data only (IDs, enums, receipt
|
|
66
|
+
summaries, statuses): no authority state, raw prompts, logs, telemetry,
|
|
67
|
+
or network reporting.
|
|
68
|
+
|
|
7
69
|
## [0.6.0]
|
|
8
70
|
|
|
9
71
|
### Added
|
package/MIGRATION.md
CHANGED
|
@@ -1,3 +1,40 @@
|
|
|
1
|
+
# Migrating to 0.8.0
|
|
2
|
+
|
|
3
|
+
0.8.0 adds local declarative extensibility (extension packs, custom
|
|
4
|
+
workflows, user-owned project overrides) over the unchanged 0.7
|
|
5
|
+
runtime. No user action is required.
|
|
6
|
+
|
|
7
|
+
- Existing 0.7 installs and configs remain valid: manifest stays
|
|
8
|
+
version 2 (the `extensions` object is optional and additive),
|
|
9
|
+
workflow state stays schemaVersion 1, and existing checkpoints remain
|
|
10
|
+
valid.
|
|
11
|
+
- Built-in workflows (`showdar-feature`, `showdar-bugfix`,
|
|
12
|
+
`showdar-release`, `showdar-incident`), the six built-in profiles,
|
|
13
|
+
adapters, and Phase 6G authority are unchanged.
|
|
14
|
+
- Extensions are opt-in: `add-pack`, `add-workflow`, `init --pack`,
|
|
15
|
+
`list --extensions`. Project overrides in `.showdar/overrides.json`
|
|
16
|
+
are user-owned; Showdar reads and validates the file but never
|
|
17
|
+
rewrites or deletes it.
|
|
18
|
+
- Pack sources in 0.8 are local directories/workspace paths only;
|
|
19
|
+
tarball, URL, Git, and npm/registry sources are rejected.
|
|
20
|
+
|
|
21
|
+
# Migrating to 0.7.0
|
|
22
|
+
|
|
23
|
+
0.7.0 adds deterministic workflow trace projection
|
|
24
|
+
(`src/workflow-trace.js`) and a workflow benchmark corpus over the
|
|
25
|
+
unchanged 0.6 runtime. No user action is required.
|
|
26
|
+
|
|
27
|
+
- Existing 0.6 installs and configs remain valid: no workflow-state
|
|
28
|
+
schema migration (still schemaVersion 1), no config migration, no
|
|
29
|
+
adapter migration, no checkpoint migration.
|
|
30
|
+
- Runtime workflow semantics are unchanged; traces observe released
|
|
31
|
+
behavior only and never affect execution, routing, or authority.
|
|
32
|
+
- The new `src/workflow-trace.js` module ships in the package; benchmark
|
|
33
|
+
scenarios, schema, loader, and eval driver are development/release
|
|
34
|
+
tooling and do not ship.
|
|
35
|
+
- No telemetry, network reporting, automatic storage, or tracking is
|
|
36
|
+
introduced.
|
|
37
|
+
|
|
1
38
|
# Migrating to 0.6.0
|
|
2
39
|
|
|
3
40
|
0.6.0 adds portable workflow execution state (`src/workflow-state.js`,
|
package/README.md
CHANGED
|
@@ -443,6 +443,39 @@ Per-workflow skip policy (evidence-backed, never severity or wording alone):
|
|
|
443
443
|
- Incident: severity never grants production mutation; recovery and
|
|
444
444
|
verification remain gated by current authority.
|
|
445
445
|
|
|
446
|
+
### Workflow traces (observability, benchmark-only)
|
|
447
|
+
|
|
448
|
+
Workflow traces are pure projections of before/after workflow states
|
|
449
|
+
(`src/workflow-trace.js`): ordered events such as `stage-entered`,
|
|
450
|
+
`stage-completed`, `stage-skipped`, `workflow-blocked`, `workflow-resumed`,
|
|
451
|
+
and `workflow-completed`. Traces carry stage IDs, skip reasons, receipt
|
|
452
|
+
summaries, and statuses only — no timestamps, no prompts, no secrets, no
|
|
453
|
+
authority content. Nothing persists them automatically; the benchmark
|
|
454
|
+
corpus (`npm run eval:workflows`) uses them to verify selection, skip,
|
|
455
|
+
resume, and completion behavior deterministically.
|
|
456
|
+
|
|
457
|
+
A workflow trace does not mutate workflow state, affect routing or
|
|
458
|
+
authority, persist automatically, or send telemetry. The 10 event
|
|
459
|
+
categories are `workflow-created`, `stages-selected`, `stage-entered`,
|
|
460
|
+
`evidence-recorded`, `stage-completed`, `stage-skipped`,
|
|
461
|
+
`workflow-blocked`, `workflow-interrupted`, `workflow-resumed`, and
|
|
462
|
+
`workflow-completed`.
|
|
463
|
+
|
|
464
|
+
### Evaluation
|
|
465
|
+
|
|
466
|
+
```bash
|
|
467
|
+
npm run eval:retrieval # retrieval evaluation (unchanged behavior)
|
|
468
|
+
npm run eval:workflows # deterministic workflow semantic benchmark
|
|
469
|
+
npm run eval # both, sequentially (release-blocking)
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
Workflow evaluation asserts exact M1–M10 invariants (selection accuracy,
|
|
473
|
+
invalid-skip rejection, verification preservation, stale-resume blocking,
|
|
474
|
+
authority invariance, completion, trace equality, revision monotonicity,
|
|
475
|
+
checkpoint round-trip, skip-evidence backing) with no fuzzy score
|
|
476
|
+
thresholds. `npm run check` (test/validate/pack) does not run the
|
|
477
|
+
benchmark; the release pipeline runs `npm run eval`, gating both suites.
|
|
478
|
+
|
|
446
479
|
## A typical software workflow
|
|
447
480
|
|
|
448
481
|
```text
|
|
@@ -524,6 +557,64 @@ is idempotent, preserves the configured profile, supports `--ai`/`--scope`
|
|
|
524
557
|
overrides, and refuses to overwrite a foreign same-name skill directory that
|
|
525
558
|
Showdar does not own.
|
|
526
559
|
|
|
560
|
+
## Extensions (0.8.0)
|
|
561
|
+
|
|
562
|
+
Extension packs are local, static, declarative directories installed from a
|
|
563
|
+
local directory or workspace-relative path. A pack carries `pack.json`
|
|
564
|
+
metadata (name, version, skills, workflows, pack-local profiles), skill
|
|
565
|
+
directories, custom workflow definitions, and docs. Packs contain no
|
|
566
|
+
executable hooks, lifecycle scripts, or remote code.
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
showdar add-pack ../acme-pack
|
|
570
|
+
showdar list --extensions
|
|
571
|
+
showdar remove-pack acme
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
Pack skill IDs use the `vendor/skill` namespace (for example,
|
|
575
|
+
`acme/lint`); the `showdar-` prefix is reserved for built-ins. Skill
|
|
576
|
+
`domains` are lowercase kebab-case discovery hints only (at most 8 per
|
|
577
|
+
skill) — they never create capabilities, routes, or authority.
|
|
578
|
+
|
|
579
|
+
Custom workflows compose built-in primitive stages under a `vendor-name`
|
|
580
|
+
ID (for example, `acme-release`). Stages, skip rules, and completion
|
|
581
|
+
policy follow the same frozen contracts as built-in workflows; custom
|
|
582
|
+
workflows cannot define new primitives, authority, evidence kinds, or
|
|
583
|
+
state schemas. Workflow state remains `schemaVersion: 1` and the trace
|
|
584
|
+
projection is unchanged.
|
|
585
|
+
|
|
586
|
+
```bash
|
|
587
|
+
showdar add-workflow ./workflows/acme-release.json
|
|
588
|
+
showdar init --pack ../acme-pack
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Project overrides live in the user-owned `.showdar/overrides.json` file:
|
|
592
|
+
skill descriptions, discovery hints, advisory guidance text, custom
|
|
593
|
+
workflow policy refinement, and new project-owned profiles. Showdar reads
|
|
594
|
+
and validates the file but never rewrites or deletes it; built-in
|
|
595
|
+
workflow semantics and the six built-in profiles cannot be overridden.
|
|
596
|
+
Pack-local profiles select pack-owned skills and workflows only.
|
|
597
|
+
|
|
598
|
+
Showdar computes a full-tree SHA-256 over the validated pack source at
|
|
599
|
+
install and records it in `.showdar.json` (`extensions.packs[].hash`).
|
|
600
|
+
The hash is source-tree identity — a docs-only edit changes it without
|
|
601
|
+
implying any behavior change. Drift means the source tree differs from
|
|
602
|
+
the recorded installation source.
|
|
603
|
+
|
|
604
|
+
Extensions cannot create capabilities, grant authority, modify Phase 6G,
|
|
605
|
+
change built-in workflow semantics or profiles, or execute arbitrary
|
|
606
|
+
code. Supported sources are local directories and workspace-relative
|
|
607
|
+
paths; tarball, URL, Git, and npm/registry sources are rejected in 0.8.
|
|
608
|
+
|
|
609
|
+
Opt-in custom workflow evaluation (never part of the release gate):
|
|
610
|
+
|
|
611
|
+
```bash
|
|
612
|
+
node scripts/generate-custom-eval-fixture.mjs
|
|
613
|
+
node scripts/custom-workflows-eval.mjs \
|
|
614
|
+
--scenarios .tmp/custom-eval-fixture/custom-scenarios \
|
|
615
|
+
--pack .tmp/custom-eval-fixture/acme-pack/pack.json
|
|
616
|
+
```
|
|
617
|
+
|
|
527
618
|
## Routing
|
|
528
619
|
|
|
529
620
|
Showdar routes each request through progressive disclosure: the host discovers
|
|
@@ -558,7 +649,11 @@ Product behavior notes:
|
|
|
558
649
|
```bash
|
|
559
650
|
showdar init [--scope <project|global>] --ai <target> --profile <profile>
|
|
560
651
|
showdar add <skill> [--ai <target>] [--scope <project|global>]
|
|
652
|
+
showdar add-pack <local-path>
|
|
653
|
+
showdar remove-pack <name>
|
|
654
|
+
showdar add-workflow <local-path>
|
|
561
655
|
showdar list
|
|
656
|
+
showdar list --extensions
|
|
562
657
|
showdar status [--scope <project|global>]
|
|
563
658
|
showdar doctor [--scope <project|global>]
|
|
564
659
|
showdar validate
|
package/bin/showdar.js
CHANGED
|
@@ -4,7 +4,7 @@ import { homedir } from 'node:os';
|
|
|
4
4
|
import { readFile } from 'node:fs/promises';
|
|
5
5
|
import { fileURLToPath } from 'node:url';
|
|
6
6
|
import { AI_TARGETS, PRIMITIVE_COUNT, PROFILE_ALIASES, PROFILES, SKILLS, TOTAL_COUNT, WORKFLOW_COUNT, canonicalProfile, isDeprecatedProfile, resolveProfile } from '../src/catalog.js';
|
|
7
|
-
import { addSkill, globalManifestPath, initGlobal, initProject, inspectGlobal, inspectProject, removeGlobal, removeProject } from '../src/project.js';
|
|
7
|
+
import { addPack, addSkill, addWorkflow, globalManifestPath, initGlobal, initProject, inspectGlobal, inspectProject, listExtensions, removeGlobal, removePack, removeProject } from '../src/project.js';
|
|
8
8
|
import { validateRepository } from '../src/validate.js';
|
|
9
9
|
|
|
10
10
|
const packageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
@@ -43,7 +43,7 @@ function printHelp(version, command = null) {
|
|
|
43
43
|
console.log(`Showdar Skills ${version}\n\nUsage:\n showdar add <skill> [--ai <universal|codex|opencode|cursor|claude>] [--scope <project|global>]\n\nExamples:\n showdar add debug\n showdar add showdar-security\n showdar add test --ai cursor\n showdar add review --scope global --ai claude\n\nDefault scope: project. Default AI target: universal, or the configured .showdar.json value when present.`);
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
46
|
-
console.log(`Showdar Skills ${version}\n\nUsage:\n showdar init ${scopeUsage} [--profile <name>] [--ai <universal|codex|opencode|cursor|claude|all>]\n showdar add <skill> [--ai <universal|codex|opencode|cursor|claude>] [--scope <project|global>]\n showdar status ${scopeUsage}\n showdar doctor ${scopeUsage}\n showdar validate\n showdar list\n showdar remove ${scopeUsage}\n\nDefaults: scope project, profile full, AI target universal.\nProfiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\nAI targets: ${AI_TARGETS.join(', ')}`);
|
|
46
|
+
console.log(`Showdar Skills ${version}\n\nUsage:\n showdar init ${scopeUsage} [--profile <name>] [--ai <universal|codex|opencode|cursor|claude|all>] [--pack <local-path>]\n showdar add <skill> [--ai <universal|codex|opencode|cursor|claude>] [--scope <project|global>]\n showdar add-pack <local-path>\n showdar remove-pack <name>\n showdar add-workflow <local-path>\n showdar status ${scopeUsage}\n showdar doctor ${scopeUsage}\n showdar validate\n showdar list [--extensions]\n showdar remove ${scopeUsage}\n\nExtension packs accept local directories/workspace paths only; tarball, URL, Git, and registry sources are rejected.\n\nDefaults: scope project, profile full, AI target universal.\nProfiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\nAI targets: ${AI_TARGETS.join(', ')}`);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
async function main() {
|
|
@@ -62,11 +62,44 @@ async function main() {
|
|
|
62
62
|
const scope = ['init', 'status', 'doctor', 'remove', 'add'].includes(command) ? scopeAfter(args) : null;
|
|
63
63
|
|
|
64
64
|
if (command === 'list') {
|
|
65
|
+
if (args.includes('--extensions')) {
|
|
66
|
+
const result = await listExtensions({ cwd: projectRoot });
|
|
67
|
+
console.log('Packs:');
|
|
68
|
+
for (const pack of result.packs) console.log(` ${pack.name}@${pack.version} ${pack.hash}`);
|
|
69
|
+
console.log('Custom workflows:');
|
|
70
|
+
for (const workflow of result.customWorkflows) console.log(` ${workflow.id} [${workflow.source}] ${workflow.path}`);
|
|
71
|
+
console.log(`Project overrides: ${result.overrides.present ? result.overrides.status : 'absent'}`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
65
74
|
console.log(`Profiles: ${Object.keys(PROFILES).join(', ')}\nDeprecated aliases: ${Object.entries(PROFILE_ALIASES).map(([alias, target]) => `${alias} -> ${target}`).join(', ')}\n\nSkills:`);
|
|
66
75
|
for (const skill of SKILLS) console.log(` ${skill.id} [${skill.domain}] ${skill.description}`);
|
|
67
76
|
return;
|
|
68
77
|
}
|
|
69
78
|
|
|
79
|
+
if (command === 'add-pack') {
|
|
80
|
+
const packSource = args[1];
|
|
81
|
+
if (!packSource) throw new Error('Pack source is required. Usage: showdar add-pack <local-path>');
|
|
82
|
+
const result = await addPack({ cwd: projectRoot, source: packSource, packageVersion: version });
|
|
83
|
+
console.log(`Showdar pack added.\nPack: ${result.pack}\nFiles: ${result.files}\nHash: ${result.hash}\nPath: ${result.destination}`);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (command === 'remove-pack') {
|
|
88
|
+
const packName = args[1];
|
|
89
|
+
if (!packName) throw new Error('Pack name is required. Usage: showdar remove-pack <name>');
|
|
90
|
+
await removePack({ cwd: projectRoot, name: packName });
|
|
91
|
+
console.log(`Showdar pack removed: ${packName}`);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (command === 'add-workflow') {
|
|
96
|
+
const workflowSource = args[1];
|
|
97
|
+
if (!workflowSource) throw new Error('Workflow source is required. Usage: showdar add-workflow <local-path>');
|
|
98
|
+
const result = await addWorkflow({ cwd: projectRoot, source: workflowSource });
|
|
99
|
+
console.log(`Showdar workflow added.\nWorkflow: ${result.workflow}\nPath: ${result.path}`);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
|
|
70
103
|
if (command === 'validate') {
|
|
71
104
|
const result = await validateRepository(packageRoot);
|
|
72
105
|
if (result.ok) console.log(`Showdar validation OK (${PRIMITIVE_COUNT} primitives, ${WORKFLOW_COUNT} workflows, ${TOTAL_COUNT} total).`);
|
|
@@ -86,9 +119,15 @@ async function main() {
|
|
|
86
119
|
const ai = valueAfter(args, '--ai', 'universal');
|
|
87
120
|
const skillIds = resolveProfile(requestedProfile);
|
|
88
121
|
if (isDeprecatedProfile(requestedProfile)) console.warn(`Warning: profile "${requestedProfile}" is deprecated; use "${profile}".`);
|
|
122
|
+
const packSource = valueAfter(args, '--pack', null);
|
|
123
|
+
if (packSource && scope === 'global') throw new Error('--pack is only supported with project scope in 0.8.');
|
|
89
124
|
const result = scope === 'global'
|
|
90
125
|
? await initGlobal({ homeRoot: homedir(), packageRoot, profile, ai, skillIds, packageVersion: version })
|
|
91
126
|
: await initProject({ projectRoot, packageRoot, profile, ai, skillIds, packageVersion: version });
|
|
127
|
+
if (packSource) {
|
|
128
|
+
const pack = await addPack({ cwd: projectRoot, source: packSource, packageVersion: version });
|
|
129
|
+
console.log(`Pack: ${pack.pack}@${pack.version ?? ''} Hash: ${pack.hash}`);
|
|
130
|
+
}
|
|
92
131
|
console.log(`Showdar Skills installed.\nScope: ${scope}\nProfile: ${profile}\nAI: ${ai}\nTargets: ${result.targets.join(', ')}\nSkills: ${result.skills}\nOpenCode commands: ${result.commands}`);
|
|
93
132
|
if (scope === 'project') {
|
|
94
133
|
console.log(`Requested: ${result.requestedSkills}\nInstalled in project: ${result.installedSkills}\nSatisfied by global: ${result.satisfiedByGlobal}\nSkipped duplicate copies: ${result.skippedDuplicates}`);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Showdar custom workflow definition",
|
|
4
|
+
"description": "Custom workflows compose built-in primitive skills only. Stages, skip enums, completion policy, and state schema are frozen contracts.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["id", "stages"],
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"id": { "type": "string", "pattern": "^[a-z][a-z0-9]*-[a-z][a-z0-9-]*$" },
|
|
10
|
+
"description": { "type": "string", "minLength": 30 },
|
|
11
|
+
"stages": {
|
|
12
|
+
"type": "array",
|
|
13
|
+
"minItems": 1,
|
|
14
|
+
"uniqueItems": true,
|
|
15
|
+
"items": { "type": "string", "pattern": "^showdar-[a-z][a-z0-9-]*$" }
|
|
16
|
+
},
|
|
17
|
+
"allowedSkips": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"items": {
|
|
20
|
+
"type": "object",
|
|
21
|
+
"required": ["stage", "reason", "policy", "evidence"],
|
|
22
|
+
"additionalProperties": false,
|
|
23
|
+
"properties": {
|
|
24
|
+
"stage": { "type": "string", "pattern": "^showdar-[a-z][a-z0-9-]*$" },
|
|
25
|
+
"reason": { "enum": ["behavior-defined", "local-low-risk", "no-ux-decision", "known-root-cause", "readiness-only", "no-ops-authority", "no-security-risk"] },
|
|
26
|
+
"policy": { "enum": ["adaptive-skip", "known-root-cause", "readiness-only", "no-ops-authority", "no-security-risk", "behavior-defined", "local-low-risk", "no-ux-decision"] },
|
|
27
|
+
"evidence": { "type": "array", "items": { "type": "string" } }
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"requiredStages": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"items": { "type": "string", "pattern": "^showdar-[a-z][a-z0-9-]*$" }
|
|
34
|
+
},
|
|
35
|
+
"completionPolicy": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"required": ["allSelectedStagesAccounted", "noBlockers", "requiredVerificationSatisfied", "noNegativeEvidence"],
|
|
38
|
+
"additionalProperties": false,
|
|
39
|
+
"properties": {
|
|
40
|
+
"allSelectedStagesAccounted": { "type": "boolean", "const": true },
|
|
41
|
+
"noBlockers": { "type": "boolean", "const": true },
|
|
42
|
+
"requiredVerificationSatisfied": { "type": "boolean", "const": true },
|
|
43
|
+
"noNegativeEvidence": { "type": "boolean", "const": true }
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"workflowStateCompat": {
|
|
47
|
+
"type": "object",
|
|
48
|
+
"required": ["schemaVersion", "selectableStages", "skipRules"],
|
|
49
|
+
"additionalProperties": false,
|
|
50
|
+
"properties": {
|
|
51
|
+
"schemaVersion": { "const": 1 },
|
|
52
|
+
"selectableStages": { "type": "array", "items": { "type": "string" } },
|
|
53
|
+
"skipRules": { "type": "object" }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Showdar extension pack manifest",
|
|
4
|
+
"description": "Metadata only. pack.json MUST NOT contain the authoritative pack-content hash; Showdar computes hashTree() at install and records it in managed manifest state.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["name", "version", "skills"],
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" },
|
|
10
|
+
"version": { "type": "string", "pattern": "^\\d+\\.\\d+\\.\\d+$" },
|
|
11
|
+
"description": { "type": "string" },
|
|
12
|
+
"skills": {
|
|
13
|
+
"type": "array",
|
|
14
|
+
"items": {
|
|
15
|
+
"type": "object",
|
|
16
|
+
"required": ["id", "path"],
|
|
17
|
+
"additionalProperties": false,
|
|
18
|
+
"properties": {
|
|
19
|
+
"id": { "type": "string", "pattern": "^[a-z][a-z0-9]*/[a-z][a-z0-9-]*$" },
|
|
20
|
+
"path": { "type": "string", "minLength": 1 },
|
|
21
|
+
"description": { "type": "string" },
|
|
22
|
+
"domains": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"minItems": 1,
|
|
25
|
+
"maxItems": 8,
|
|
26
|
+
"items": { "type": "string", "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$", "minLength": 2, "maxLength": 40 }
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"workflows": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"items": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"required": ["id", "path"],
|
|
36
|
+
"additionalProperties": false,
|
|
37
|
+
"properties": {
|
|
38
|
+
"id": { "type": "string", "pattern": "^[a-z][a-z0-9]*-[a-z][a-z0-9-]*$" },
|
|
39
|
+
"path": { "type": "string", "minLength": 1 }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"profiles": {
|
|
44
|
+
"type": "object",
|
|
45
|
+
"patternProperties": {
|
|
46
|
+
"^[a-z][a-z0-9-]*$": {
|
|
47
|
+
"type": "array",
|
|
48
|
+
"items": { "type": "string" }
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"additionalProperties": false
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "Showdar project overrides (.showdar/overrides.json)",
|
|
4
|
+
"description": "User-owned project extension configuration. Built-in workflow policy and built-in profile definitions are protected and MUST NOT appear here as semantic overrides.",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"properties": {
|
|
8
|
+
"version": { "const": 1 },
|
|
9
|
+
"skillDescriptions": {
|
|
10
|
+
"type": "object",
|
|
11
|
+
"patternProperties": {
|
|
12
|
+
"^showdar-[a-z][a-z0-9-]*$": { "type": "string", "minLength": 1 }
|
|
13
|
+
},
|
|
14
|
+
"additionalProperties": false
|
|
15
|
+
},
|
|
16
|
+
"skillDomains": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"patternProperties": {
|
|
19
|
+
"^showdar-[a-z][a-z0-9-]*$": { "type": "string", "pattern": "^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$", "minLength": 2, "maxLength": 40 }
|
|
20
|
+
},
|
|
21
|
+
"additionalProperties": false
|
|
22
|
+
},
|
|
23
|
+
"workflowPolicy": {
|
|
24
|
+
"type": "object",
|
|
25
|
+
"description": "Custom workflows only. Built-in showdar-* workflow IDs are rejected.",
|
|
26
|
+
"patternProperties": {
|
|
27
|
+
"^[a-z][a-z0-9]*-[a-z][a-z0-9-]*$": {
|
|
28
|
+
"type": "object",
|
|
29
|
+
"additionalProperties": false,
|
|
30
|
+
"properties": {
|
|
31
|
+
"stages": {
|
|
32
|
+
"type": "array",
|
|
33
|
+
"minItems": 1,
|
|
34
|
+
"uniqueItems": true,
|
|
35
|
+
"items": { "type": "string", "pattern": "^showdar-[a-z][a-z0-9-]*$" }
|
|
36
|
+
},
|
|
37
|
+
"skipRules": { "type": "object" },
|
|
38
|
+
"requiredStages": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"items": { "type": "string", "pattern": "^showdar-[a-z][a-z0-9-]*$" }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
"additionalProperties": false
|
|
46
|
+
},
|
|
47
|
+
"guidance": {
|
|
48
|
+
"type": "object",
|
|
49
|
+
"description": "Separate advisory text. MUST NOT replace SKILL.md semantics or claim authority.",
|
|
50
|
+
"patternProperties": {
|
|
51
|
+
"^showdar-[a-z][a-z0-9-]*$": { "type": "string", "minLength": 1 }
|
|
52
|
+
},
|
|
53
|
+
"additionalProperties": false
|
|
54
|
+
},
|
|
55
|
+
"profiles": {
|
|
56
|
+
"type": "object",
|
|
57
|
+
"description": "New project-owned profiles only. MUST NOT mutate built-in profile definitions.",
|
|
58
|
+
"patternProperties": {
|
|
59
|
+
"^[a-z][a-z0-9-]*$": {
|
|
60
|
+
"type": "array",
|
|
61
|
+
"minItems": 1,
|
|
62
|
+
"items": { "type": "string" }
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"additionalProperties": false
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "showdar-skills",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Production-grade software engineering lifecycle skills for coding agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": { "showdar": "./bin/showdar.js" },
|
|
@@ -8,13 +8,16 @@
|
|
|
8
8
|
"test": "node --test",
|
|
9
9
|
"validate": "node bin/showdar.js validate",
|
|
10
10
|
"sync:runtime": "node scripts/sync-runtime.mjs",
|
|
11
|
-
"eval": "
|
|
11
|
+
"eval": "npm run eval:retrieval && npm run eval:workflows",
|
|
12
|
+
"eval:retrieval": "node scripts/retrieval-eval.mjs",
|
|
13
|
+
"eval:workflows": "node scripts/workflow-observability-eval.mjs",
|
|
14
|
+
"eval:custom-workflows": "node scripts/custom-workflows-eval.mjs",
|
|
12
15
|
"check": "npm test && npm run validate && npm pack --dry-run",
|
|
13
16
|
"smoke": "node scripts/package-smoke.mjs",
|
|
14
17
|
"release:check": "node scripts/check-release-version.mjs"
|
|
15
18
|
},
|
|
16
19
|
"engines": { "node": ">=20" },
|
|
17
|
-
"files": ["bin", "src", "skills", "commands", "router", "bundles", "profiles", "engine", "README.md", "LICENSE", "CHANGELOG.md", "MIGRATION.md"],
|
|
20
|
+
"files": ["bin", "src", "config", "skills", "commands", "router", "bundles", "profiles", "engine", "README.md", "LICENSE", "CHANGELOG.md", "MIGRATION.md"],
|
|
18
21
|
"keywords": ["agent-skills", "coding-agents", "codex", "opencode", "claude-code", "software-engineering", "developer-tools", "requirements", "qa", "security", "devops", "workflow"],
|
|
19
22
|
"license": "MIT",
|
|
20
23
|
"repository": {
|