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 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.6.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": "node scripts/retrieval-eval.mjs",
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": {