@sun-asterisk/sungen 3.1.2 → 3.2.0-beta.141
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 +4 -428
- package/dist/capabilities/builtins.d.ts +31 -0
- package/dist/capabilities/builtins.d.ts.map +1 -0
- package/dist/capabilities/builtins.js +84 -0
- package/dist/capabilities/builtins.js.map +1 -0
- package/dist/capabilities/context-router.d.ts +34 -0
- package/dist/capabilities/context-router.d.ts.map +1 -0
- package/dist/capabilities/context-router.js +49 -0
- package/dist/capabilities/context-router.js.map +1 -0
- package/dist/capabilities/context.d.ts +68 -0
- package/dist/capabilities/context.d.ts.map +1 -0
- package/dist/capabilities/context.js +17 -0
- package/dist/capabilities/context.js.map +1 -0
- package/dist/capabilities/discover.d.ts +2 -0
- package/dist/capabilities/discover.d.ts.map +1 -0
- package/dist/capabilities/discover.js +109 -0
- package/dist/capabilities/discover.js.map +1 -0
- package/dist/capabilities/registry.d.ts +92 -0
- package/dist/capabilities/registry.d.ts.map +1 -0
- package/dist/capabilities/registry.js +43 -0
- package/dist/capabilities/registry.js.map +1 -0
- package/dist/capabilities/sensor.d.ts +52 -0
- package/dist/capabilities/sensor.d.ts.map +1 -0
- package/dist/capabilities/sensor.js +3 -0
- package/dist/capabilities/sensor.js.map +1 -0
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +17 -11
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/capability.d.ts.map +1 -1
- package/dist/cli/commands/capability.js +57 -5
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/context.d.ts +9 -0
- package/dist/cli/commands/context.d.ts.map +1 -0
- package/dist/cli/commands/context.js +91 -0
- package/dist/cli/commands/context.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +42 -30
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +35 -8
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/ledger.d.ts.map +1 -1
- package/dist/cli/commands/ledger.js +15 -5
- package/dist/cli/commands/ledger.js.map +1 -1
- package/dist/cli/commands/manifest.d.ts.map +1 -1
- package/dist/cli/commands/manifest.js +10 -9
- package/dist/cli/commands/manifest.js.map +1 -1
- package/dist/cli/commands/repair.d.ts +8 -0
- package/dist/cli/commands/repair.d.ts.map +1 -0
- package/dist/cli/commands/repair.js +97 -0
- package/dist/cli/commands/repair.js.map +1 -0
- package/dist/cli/commands/script-check.d.ts.map +1 -1
- package/dist/cli/commands/script-check.js +13 -9
- package/dist/cli/commands/script-check.js.map +1 -1
- package/dist/cli/commands/trace.d.ts.map +1 -1
- package/dist/cli/commands/trace.js +7 -4
- package/dist/cli/commands/trace.js.map +1 -1
- package/dist/cli/index.js +14 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +1 -0
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +1 -0
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/dist/generators/test-generator/code-generator.d.ts +18 -9
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +162 -115
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +0 -10
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +10 -47
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts +1 -0
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +1 -1
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/harness/annotation-overrides.d.ts +11 -0
- package/dist/harness/annotation-overrides.d.ts.map +1 -0
- package/dist/harness/annotation-overrides.js +38 -0
- package/dist/harness/annotation-overrides.js.map +1 -0
- package/dist/harness/audit.d.ts +9 -1
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +140 -10
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/capability-plan.d.ts +14 -0
- package/dist/harness/capability-plan.d.ts.map +1 -1
- package/dist/harness/capability-plan.js +63 -1
- package/dist/harness/capability-plan.js.map +1 -1
- package/dist/harness/catalog/drivers.yaml +35 -12
- package/dist/harness/data-driven-lint.d.ts.map +1 -1
- package/dist/harness/data-driven-lint.js +23 -0
- package/dist/harness/data-driven-lint.js.map +1 -1
- package/dist/harness/flow-check.d.ts +9 -0
- package/dist/harness/flow-check.d.ts.map +1 -1
- package/dist/harness/flow-check.js +13 -6
- package/dist/harness/flow-check.js.map +1 -1
- package/dist/harness/intent.d.ts +6 -0
- package/dist/harness/intent.d.ts.map +1 -1
- package/dist/harness/intent.js +20 -4
- package/dist/harness/intent.js.map +1 -1
- package/dist/harness/ledger.d.ts.map +1 -1
- package/dist/harness/ledger.js +3 -2
- package/dist/harness/ledger.js.map +1 -1
- package/dist/harness/manifest.d.ts.map +1 -1
- package/dist/harness/manifest.js +3 -2
- package/dist/harness/manifest.js.map +1 -1
- package/dist/harness/parse.d.ts +2 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +16 -4
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/quality-gates.js +1 -1
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/query-catalog.d.ts.map +1 -1
- package/dist/harness/query-catalog.js +0 -0
- package/dist/harness/query-catalog.js.map +1 -1
- package/dist/harness/repair.d.ts +20 -0
- package/dist/harness/repair.d.ts.map +1 -0
- package/dist/harness/repair.js +111 -0
- package/dist/harness/repair.js.map +1 -0
- package/dist/harness/script-check.d.ts +3 -1
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +22 -8
- package/dist/harness/script-check.js.map +1 -1
- package/dist/harness/sensors.d.ts +40 -0
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +54 -2
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/trace.d.ts.map +1 -1
- package/dist/harness/trace.js +4 -3
- package/dist/harness/trace.js.map +1 -1
- package/dist/harness/unit-paths.d.ts +3 -0
- package/dist/harness/unit-paths.d.ts.map +1 -0
- package/dist/harness/unit-paths.js +52 -0
- package/dist/harness/unit-paths.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/ai-rules-updater.d.ts.map +1 -1
- package/dist/orchestrator/ai-rules-updater.js +2 -0
- package/dist/orchestrator/ai-rules-updater.js.map +1 -1
- package/dist/orchestrator/context-discovery.d.ts +12 -0
- package/dist/orchestrator/context-discovery.d.ts.map +1 -0
- package/dist/orchestrator/context-discovery.js +46 -0
- package/dist/orchestrator/context-discovery.js.map +1 -0
- package/dist/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +7 -1
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +10 -5
- package/dist/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +18 -1
- package/dist/orchestrator/templates/ai-instructions/claude-skill-api-design.md +62 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +1 -0
- package/dist/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md +2 -1
- package/dist/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +19 -2
- package/dist/orchestrator/templates/ai-instructions/claude-skill-viewpoint.md +14 -0
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +10 -5
- package/dist/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +11 -1
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-api-design.md +62 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +1 -0
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +2 -1
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +19 -2
- package/dist/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md +14 -0
- package/dist/orchestrator/templates/specs-api.d.ts +55 -0
- package/dist/orchestrator/templates/specs-api.d.ts.map +1 -0
- package/dist/orchestrator/templates/specs-api.js +171 -0
- package/dist/orchestrator/templates/specs-api.js.map +1 -0
- package/dist/orchestrator/templates/specs-api.ts +154 -0
- package/dist/orchestrator/templates/specs-db.d.ts +3 -0
- package/dist/orchestrator/templates/specs-db.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-db.js +78 -1
- package/dist/orchestrator/templates/specs-db.js.map +1 -1
- package/dist/orchestrator/templates/specs-db.ts +78 -1
- package/dist/orchestrator/templates/specs-test-data.ts +2 -1
- package/package.json +7 -30
- package/src/capabilities/builtins.ts +85 -0
- package/src/capabilities/context-router.ts +66 -0
- package/src/capabilities/context.ts +65 -0
- package/src/capabilities/discover.ts +62 -0
- package/src/capabilities/registry.ts +113 -0
- package/src/capabilities/sensor.ts +47 -0
- package/src/cli/commands/audit.ts +15 -9
- package/src/cli/commands/capability.ts +53 -5
- package/src/cli/commands/context.ts +52 -0
- package/src/cli/commands/delivery.ts +40 -31
- package/src/cli/commands/generate.ts +37 -8
- package/src/cli/commands/ledger.ts +13 -5
- package/src/cli/commands/manifest.ts +9 -7
- package/src/cli/commands/repair.ts +57 -0
- package/src/cli/commands/script-check.ts +12 -8
- package/src/cli/commands/trace.ts +7 -4
- package/src/cli/index.ts +14 -1
- package/src/generators/test-generator/adapters/adapter-interface.ts +1 -1
- package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/src/generators/test-generator/code-generator.ts +163 -111
- package/src/generators/test-generator/patterns/index.ts +9 -35
- package/src/generators/test-generator/template-engine.ts +2 -2
- package/src/harness/annotation-overrides.ts +27 -0
- package/src/harness/audit.ts +141 -12
- package/src/harness/capability-plan.ts +51 -1
- package/src/harness/catalog/drivers.yaml +35 -12
- package/src/harness/data-driven-lint.ts +20 -0
- package/src/harness/flow-check.ts +15 -6
- package/src/harness/intent.ts +25 -4
- package/src/harness/ledger.ts +3 -2
- package/src/harness/manifest.ts +3 -2
- package/src/harness/parse.ts +11 -2
- package/src/harness/quality-gates.ts +1 -1
- package/src/harness/query-catalog.ts +0 -0
- package/src/harness/repair.ts +75 -0
- package/src/harness/script-check.ts +25 -8
- package/src/harness/sensors.ts +71 -2
- package/src/harness/trace.ts +4 -3
- package/src/harness/unit-paths.ts +14 -0
- package/src/index.ts +32 -0
- package/src/orchestrator/ai-rules-updater.ts +2 -0
- package/src/orchestrator/context-discovery.ts +50 -0
- package/src/orchestrator/templates/ai-instructions/claude-agent-reviewer.md +7 -1
- package/src/orchestrator/templates/ai-instructions/claude-cmd-create-test.md +10 -5
- package/src/orchestrator/templates/ai-instructions/claude-cmd-run-test.md +18 -1
- package/src/orchestrator/templates/ai-instructions/claude-skill-api-design.md +62 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-gherkin-syntax.md +1 -0
- package/src/orchestrator/templates/ai-instructions/claude-skill-harness-audit.md +2 -1
- package/src/orchestrator/templates/ai-instructions/claude-skill-tc-generation.md +19 -2
- package/src/orchestrator/templates/ai-instructions/claude-skill-viewpoint.md +14 -0
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-create-test.md +10 -5
- package/src/orchestrator/templates/ai-instructions/copilot-cmd-run-test.md +11 -1
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-api-design.md +62 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-gherkin-syntax.md +1 -0
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-harness-audit.md +2 -1
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-tc-generation.md +19 -2
- package/src/orchestrator/templates/ai-instructions/github-skill-sungen-viewpoint.md +14 -0
- package/src/orchestrator/templates/specs-api.ts +154 -0
- package/src/orchestrator/templates/specs-db.ts +78 -1
- package/src/orchestrator/templates/specs-test-data.ts +2 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +0 -626
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/capture-patterns.d.ts +0 -21
- package/dist/generators/test-generator/patterns/capture-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/capture-patterns.js +0 -87
- package/dist/generators/test-generator/patterns/capture-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/database-patterns.d.ts +0 -6
- package/dist/generators/test-generator/patterns/database-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/database-patterns.js +0 -95
- package/dist/generators/test-generator/patterns/database-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/form-patterns.d.ts +0 -6
- package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/form-patterns.js +0 -160
- package/dist/generators/test-generator/patterns/form-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +0 -6
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +0 -433
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/keyboard-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/keyboard-patterns.js +0 -47
- package/dist/generators/test-generator/patterns/keyboard-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +0 -6
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.js +0 -125
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/scope-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/scope-patterns.js +0 -36
- package/dist/generators/test-generator/patterns/scope-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts +0 -7
- package/dist/generators/test-generator/patterns/scroll-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/scroll-patterns.js +0 -25
- package/dist/generators/test-generator/patterns/scroll-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts +0 -6
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/setup-patterns.js +0 -72
- package/dist/generators/test-generator/patterns/setup-patterns.js.map +0 -1
- package/dist/generators/test-generator/patterns/table-patterns.d.ts +0 -19
- package/dist/generators/test-generator/patterns/table-patterns.d.ts.map +0 -1
- package/dist/generators/test-generator/patterns/table-patterns.js +0 -239
- package/dist/generators/test-generator/patterns/table-patterns.js.map +0 -1
- package/docs/orchestration-spec.md +0 -267
- package/src/generators/test-generator/patterns/assertion-patterns.ts +0 -691
- package/src/generators/test-generator/patterns/capture-patterns.ts +0 -97
- package/src/generators/test-generator/patterns/database-patterns.ts +0 -96
- package/src/generators/test-generator/patterns/form-patterns.ts +0 -167
- package/src/generators/test-generator/patterns/interaction-patterns.ts +0 -465
- package/src/generators/test-generator/patterns/keyboard-patterns.ts +0 -51
- package/src/generators/test-generator/patterns/navigation-patterns.ts +0 -140
- package/src/generators/test-generator/patterns/scope-patterns.ts +0 -40
- package/src/generators/test-generator/patterns/scroll-patterns.ts +0 -27
- package/src/generators/test-generator/patterns/setup-patterns.ts +0 -76
- package/src/generators/test-generator/patterns/table-patterns.ts +0 -279
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Orchestration phase-hook SPIs (Capability SPI, R1 — phase hooks).
|
|
3
|
+
*
|
|
4
|
+
* The kernel owns the pipeline (Plan → Discover → Contextualize → Generate → Gate → Repair →
|
|
5
|
+
* Deliver); a capability fills the domain-specific phases via these hooks:
|
|
6
|
+
* - `DiscoveryProvider` — sources → a slice of the normalized `Context`.
|
|
7
|
+
* - `ContextMapper` — `Context` → generation units + the capability's MODES
|
|
8
|
+
* (ui: screen|flow; api: matrix|flow|async; db: query-catalog).
|
|
9
|
+
*
|
|
10
|
+
* R1 scope: these are **declared** (the contract) and attachable to a CapabilityDescriptor, but
|
|
11
|
+
* the kernel does not consume them yet — the pipeline still runs as before. R2 (driver-ui) is the
|
|
12
|
+
* first conformer that implements them; the orchestration is rewired to call them then.
|
|
13
|
+
* See `docs/spec/sungen_capability_spi_spec.md` §3–§6 and `sungen_ui_driver_spec.md`.
|
|
14
|
+
*/
|
|
15
|
+
/** Normalized, capability-tagged discovery output. Lazy/sliced — never materialized whole. */
|
|
16
|
+
export interface Context {
|
|
17
|
+
target: {
|
|
18
|
+
kind: string;
|
|
19
|
+
id: string;
|
|
20
|
+
capability?: string;
|
|
21
|
+
};
|
|
22
|
+
/** Lazy source handles (spec/viewpoint/openapi/routes/schema/liveSnapshot/figma/…). */
|
|
23
|
+
sources: Record<string, unknown>;
|
|
24
|
+
/** Capability-specific normalized facts (ui: elements/states/pageType; api: endpoints; db: tables). */
|
|
25
|
+
facts: Record<string, unknown>;
|
|
26
|
+
/** For run-time-connected capabilities (api/db): reachability probe result. */
|
|
27
|
+
connectivity?: {
|
|
28
|
+
reachable: boolean;
|
|
29
|
+
baseUrl?: string;
|
|
30
|
+
probedAt?: string;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** One unit of generation work the kernel will drive through Generate → Gate → Repair. */
|
|
34
|
+
export interface GenerationUnit {
|
|
35
|
+
/** Capability-defined mode: 'screen' | 'flow' | 'matrix' | 'async' | 'query-catalog' | … */
|
|
36
|
+
mode: string;
|
|
37
|
+
/** The slice of Context this unit covers (a screen, an endpoint group, a query set, …). */
|
|
38
|
+
targetSlice: unknown;
|
|
39
|
+
/** Band weight hint (source-aware) — the kernel supplies the band targets. */
|
|
40
|
+
weight?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface DiscoveryProvider {
|
|
43
|
+
appliesTo(target: Context['target']): boolean;
|
|
44
|
+
/** Produce this capability's slice of the Context for the given target + requested scope. */
|
|
45
|
+
discover(target: Context['target'], scope: unknown): Promise<Partial<Context>>;
|
|
46
|
+
}
|
|
47
|
+
export interface ContextMapper {
|
|
48
|
+
/** Turn the Context into generation units (+ modes), honouring the kernel's band targets. */
|
|
49
|
+
decompose(ctx: Context, bands?: Record<string, number>): GenerationUnit[];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Repair phase hook — a capability's deterministic fix catalog. Each rule matches a finding (audit
|
|
53
|
+
* gap) or a runtime failure message and proposes a concrete fix. `sungen repair` gathers the
|
|
54
|
+
* unit-capability's rules and turns the findings/failures into an actionable plan; the AI repair
|
|
55
|
+
* loop and a human get the same proposals. Drivers/projects extend the catalog by adding rules.
|
|
56
|
+
*/
|
|
57
|
+
export interface RepairRule {
|
|
58
|
+
/** Stable id, e.g. 'api-error' | 'api-auth'. */
|
|
59
|
+
id: string;
|
|
60
|
+
/** Matches a finding or failure message. */
|
|
61
|
+
match: RegExp;
|
|
62
|
+
/** The concrete repair instruction to apply. */
|
|
63
|
+
fix: string;
|
|
64
|
+
}
|
|
65
|
+
export interface RepairProvider {
|
|
66
|
+
rules: RepairRule[];
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/capabilities/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,8FAA8F;AAC9F,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,uFAAuF;IACvF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,uGAAuG;IACvG,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,+EAA+E;IAC/E,YAAY,CAAC,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5E;AAED,0FAA0F;AAC1F,MAAM,WAAW,cAAc;IAC7B,4FAA4F;IAC5F,IAAI,EAAE,MAAM,CAAC;IACb,2FAA2F;IAC3F,WAAW,EAAE,OAAO,CAAC;IACrB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;IAC9C,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;CAC3E;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;CACrB"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Orchestration phase-hook SPIs (Capability SPI, R1 — phase hooks).
|
|
4
|
+
*
|
|
5
|
+
* The kernel owns the pipeline (Plan → Discover → Contextualize → Generate → Gate → Repair →
|
|
6
|
+
* Deliver); a capability fills the domain-specific phases via these hooks:
|
|
7
|
+
* - `DiscoveryProvider` — sources → a slice of the normalized `Context`.
|
|
8
|
+
* - `ContextMapper` — `Context` → generation units + the capability's MODES
|
|
9
|
+
* (ui: screen|flow; api: matrix|flow|async; db: query-catalog).
|
|
10
|
+
*
|
|
11
|
+
* R1 scope: these are **declared** (the contract) and attachable to a CapabilityDescriptor, but
|
|
12
|
+
* the kernel does not consume them yet — the pipeline still runs as before. R2 (driver-ui) is the
|
|
13
|
+
* first conformer that implements them; the orchestration is rewired to call them then.
|
|
14
|
+
* See `docs/spec/sungen_capability_spi_spec.md` §3–§6 and `sungen_ui_driver_spec.md`.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/capabilities/context.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/capabilities/discover.ts"],"names":[],"mappings":"AAwDA,wBAAgB,+BAA+B,IAAI,IAAI,CAKtD"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.discoverAndRegisterCapabilities = discoverAndRegisterCapabilities;
|
|
37
|
+
/**
|
|
38
|
+
* Capability discovery (R5 packaging seam).
|
|
39
|
+
*
|
|
40
|
+
* Core registers capabilities without importing any driver package statically. External
|
|
41
|
+
* `@sungen/driver-*` packages are loaded at runtime via their `sungenDriver.register` entry point;
|
|
42
|
+
* the capabilities still in core (`db`, `api`) register from `LOCAL_DRIVERS`; the generic `core`
|
|
43
|
+
* capability registers last. Idempotent (guards on `registry.isPopulated()`).
|
|
44
|
+
*
|
|
45
|
+
* Ordering is deterministic and behaviour-preserving: external drivers (currently `@sungen/driver-ui`)
|
|
46
|
+
* load first, then `LOCAL_DRIVERS` (db → api), then `core` — i.e. the historical ui → db → api → core
|
|
47
|
+
* composition order, so pattern composition / compiled output is byte-identical.
|
|
48
|
+
*
|
|
49
|
+
* A driver that isn't installed is simply skipped (capabilities are opt-in). Errors thrown *inside* a
|
|
50
|
+
* present driver propagate — only a genuinely absent package is swallowed (resolve-then-require).
|
|
51
|
+
*/
|
|
52
|
+
const module_1 = require("module");
|
|
53
|
+
const path = __importStar(require("path"));
|
|
54
|
+
const registry_1 = require("./registry");
|
|
55
|
+
const builtins_1 = require("./builtins");
|
|
56
|
+
/**
|
|
57
|
+
* Driver packages relocated out of core, loaded before the in-core `LOCAL_DRIVERS`. As `db`/`api`
|
|
58
|
+
* move to their packages (R5.5/R5.6) they join this list and leave `LOCAL_DRIVERS`; eventually this
|
|
59
|
+
* becomes a scan of installed `@sungen/driver-*` packages (R5.7).
|
|
60
|
+
*/
|
|
61
|
+
const EXTERNAL_DRIVERS = ['@sungen/driver-ui', '@sungen/driver-db', '@sungen/driver-api'];
|
|
62
|
+
function loadExternalDriver(name) {
|
|
63
|
+
// Resolve from the user's PROJECT first, then from core's own location. Opt-in drivers
|
|
64
|
+
// (`sungen capability add db|api`) install into the PROJECT's node_modules — a globally-installed
|
|
65
|
+
// core (`npm i -g`) wouldn't see them via a core-anchored `require`. The bundled @sungen/driver-ui
|
|
66
|
+
// is a core dependency (co-located with core), so the second anchor finds it.
|
|
67
|
+
for (const anchor of [path.join(process.cwd(), 'package.json'), __filename]) {
|
|
68
|
+
let req;
|
|
69
|
+
try {
|
|
70
|
+
req = (0, module_1.createRequire)(anchor);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
let resolved;
|
|
76
|
+
try {
|
|
77
|
+
resolved = req.resolve(name);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
continue;
|
|
81
|
+
} // not installed at this anchor → try next
|
|
82
|
+
try {
|
|
83
|
+
const mod = req(resolved);
|
|
84
|
+
const register = mod?.sungenDriver?.register ?? mod?.register;
|
|
85
|
+
if (typeof register === 'function')
|
|
86
|
+
register(registry_1.capabilityRegistry);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
// A present-but-BROKEN driver (e.g. a stale/incompatible leftover whose own core dep doesn't
|
|
90
|
+
// resolve) must never crash the whole CLI — `sungen --version`, `capability remove`, etc. must
|
|
91
|
+
// still work. Warn + skip so the user can recover.
|
|
92
|
+
console.warn(`⚠ sungen: capability driver "${name}" is installed but failed to load — skipping.\n` +
|
|
93
|
+
` ${e?.message || e}\n` +
|
|
94
|
+
` Fix: reinstall it (\`sungen capability add ${name.replace(/^@sungen\/driver-/, '')}\`) or remove it.`);
|
|
95
|
+
}
|
|
96
|
+
return; // found at this anchor (loaded or warned) — don't fall through to other anchors
|
|
97
|
+
}
|
|
98
|
+
// not installed at any anchor — capabilities are opt-in, so skip silently
|
|
99
|
+
}
|
|
100
|
+
function discoverAndRegisterCapabilities() {
|
|
101
|
+
if (registry_1.capabilityRegistry.isPopulated())
|
|
102
|
+
return;
|
|
103
|
+
for (const name of EXTERNAL_DRIVERS)
|
|
104
|
+
loadExternalDriver(name); // ui (external) — first, default capability
|
|
105
|
+
for (const driver of builtins_1.LOCAL_DRIVERS)
|
|
106
|
+
driver.register(registry_1.capabilityRegistry); // db, api (in-core for now)
|
|
107
|
+
(0, builtins_1.registerCoreCapability)(registry_1.capabilityRegistry); // generic layer, always present, registered last
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=discover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/capabilities/discover.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,0EAKC;AA7DD;;;;;;;;;;;;;;GAcG;AACH,mCAAuC;AACvC,2CAA6B;AAC7B,yCAAgD;AAChD,yCAAmE;AAEnE;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;AAE1F,SAAS,kBAAkB,CAAC,IAAY;IACtC,uFAAuF;IACvF,kGAAkG;IAClG,mGAAmG;IACnG,8EAA8E;IAC9E,KAAK,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;QAC5E,IAAI,GAAgB,CAAC;QACrB,IAAI,CAAC;YAAC,GAAG,GAAG,IAAA,sBAAa,EAAC,MAAM,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QACxD,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YAAC,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC,CAAC,0CAA0C;QACpG,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,QAAQ,GAAyD,GAAG,EAAE,YAAY,EAAE,QAAQ,IAAI,GAAG,EAAE,QAAQ,CAAC;YACpH,IAAI,OAAO,QAAQ,KAAK,UAAU;gBAAE,QAAQ,CAAC,6BAAkB,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,6FAA6F;YAC7F,+FAA+F;YAC/F,mDAAmD;YACnD,OAAO,CAAC,IAAI,CACV,gCAAgC,IAAI,iDAAiD;gBACrF,KAAM,CAAW,EAAE,OAAO,IAAI,CAAC,IAAI;gBACnC,gDAAgD,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,mBAAmB,CACzG,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,gFAAgF;IAC1F,CAAC;IACD,0EAA0E;AAC5E,CAAC;AAED,SAAgB,+BAA+B;IAC7C,IAAI,6BAAkB,CAAC,WAAW,EAAE;QAAE,OAAO;IAC7C,KAAK,MAAM,IAAI,IAAI,gBAAgB;QAAE,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,4CAA4C;IAC3G,KAAK,MAAM,MAAM,IAAI,wBAAa;QAAE,MAAM,CAAC,QAAQ,CAAC,6BAAkB,CAAC,CAAC,CAAC,4BAA4B;IACrG,IAAA,iCAAsB,EAAC,6BAAkB,CAAC,CAAC,CAAC,iDAAiD;AAC/F,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability registry — the extension seam for the microkernel (Capability SPI, R1).
|
|
3
|
+
*
|
|
4
|
+
* Replaces hardcoded `this.patterns.push(...)` wiring with **registration**: each capability
|
|
5
|
+
* (ui · db · api · …) declares what it contributes; the kernel composes it. This is the
|
|
6
|
+
* "shared framework, pull in what you use" mechanism (`docs/spec/sungen_capability_spi_spec.md`).
|
|
7
|
+
*
|
|
8
|
+
* R1 scope (behaviour-preserving): only the **patterns** slice is wired through here — the set of
|
|
9
|
+
* registered patterns is identical to the old hardcoded list, so compiled output is unchanged
|
|
10
|
+
* (golden + audit snapshots are the contract). The remaining SPI slices (discovery, contextMapper,
|
|
11
|
+
* sensors, adapter, viewpoints, runtimeHelpers) are declared on the descriptor for the upcoming
|
|
12
|
+
* steps but are not consumed yet.
|
|
13
|
+
*/
|
|
14
|
+
import type { StepPattern } from '../generators/test-generator/patterns/types';
|
|
15
|
+
import type { Sensor } from './sensor';
|
|
16
|
+
import type { DiscoveryProvider, ContextMapper, RepairProvider } from './context';
|
|
17
|
+
export interface CapabilityDescriptor {
|
|
18
|
+
/** Stable id: 'ui' | 'db' | 'api' | 'core' | … */
|
|
19
|
+
id: string;
|
|
20
|
+
/** The implicit/default capability (a scenario with no capability tag). UI sets this. */
|
|
21
|
+
default?: boolean;
|
|
22
|
+
/** Annotation tags this capability owns (e.g. ['@query'], ['@api','@hybrid']). */
|
|
23
|
+
annotations?: string[];
|
|
24
|
+
/** Step patterns this capability contributes to the compiler. */
|
|
25
|
+
patterns?: StepPattern[];
|
|
26
|
+
/** Harness sensors this capability contributes (advisory and/or gate). */
|
|
27
|
+
sensors?: Sensor[];
|
|
28
|
+
/** Orchestration phase hooks — declared in R1, consumed by the pipeline from R2 onward. */
|
|
29
|
+
discovery?: DiscoveryProvider;
|
|
30
|
+
contextMapper?: ContextMapper;
|
|
31
|
+
/** Repair phase: the capability's deterministic fix catalog (audit/runtime finding → fix). */
|
|
32
|
+
repair?: RepairProvider;
|
|
33
|
+
/** Provider for this capability's viewpoint catalog (UI: the 17-pattern universal catalog). */
|
|
34
|
+
viewpoints?: () => unknown;
|
|
35
|
+
/**
|
|
36
|
+
* Score-bearing gate computation owned by this capability (UI: viewpoint coverage + assertion
|
|
37
|
+
* depth). The audit engine calls it and assembles the score from the result. Typed generically
|
|
38
|
+
* so the registry stays decoupled from harness internals; the caller knows the concrete shape.
|
|
39
|
+
*/
|
|
40
|
+
gateProvider?: (input: unknown) => unknown;
|
|
41
|
+
/** Runtime helper file(s) this capability emits into specs/ when it is active for a feature
|
|
42
|
+
* (db → specs/db.ts). Emitted via the same sync-when-changed mechanism. */
|
|
43
|
+
runtimeHelpers?: Array<{
|
|
44
|
+
file: string;
|
|
45
|
+
template: string;
|
|
46
|
+
}>;
|
|
47
|
+
/** Optional step detector: the capability is "active" for a feature if any step matches —
|
|
48
|
+
* for steps that carry no annotation tag (db's declarative `User see [t] row where …`). */
|
|
49
|
+
detectsStep?: (stepText: string) => boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Precondition codegen for this capability's annotations on a scenario (db's `@query:<name>`
|
|
52
|
+
* → `testData.bind(name, await db.fetchQuery(...))`). Returns raw statements (the compiler
|
|
53
|
+
* indents) + `boundVars` (the `{{name}}` variables it binds, so the compiler registers them as
|
|
54
|
+
* runtime-resolved). Keeps `@query` codegen owned by `db`, not hardcoded in the compiler.
|
|
55
|
+
*/
|
|
56
|
+
preconditionCodegen?: (input: {
|
|
57
|
+
tags: string[];
|
|
58
|
+
screenName: string;
|
|
59
|
+
cwd: string;
|
|
60
|
+
}) => Array<{
|
|
61
|
+
comment?: string;
|
|
62
|
+
code: string;
|
|
63
|
+
boundVars?: string[];
|
|
64
|
+
}>;
|
|
65
|
+
/**
|
|
66
|
+
* CLI commands this capability contributes. The CLI calls each with the commander `program`
|
|
67
|
+
* (typed generically so the registry stays decoupled from commander; the driver knows the shape).
|
|
68
|
+
* Lets a driver own its authoring commands (api → `sungen api import`) instead of hardcoding them
|
|
69
|
+
* in core's CLI. Invoked once, after discovery, in `src/cli/index.ts`.
|
|
70
|
+
*/
|
|
71
|
+
cliCommands?: Array<(program: unknown) => void>;
|
|
72
|
+
}
|
|
73
|
+
export declare class CapabilityRegistry {
|
|
74
|
+
private caps;
|
|
75
|
+
/** Register (or replace, by id) a capability descriptor. Idempotent by id. */
|
|
76
|
+
register(descriptor: CapabilityDescriptor): void;
|
|
77
|
+
get(id: string): CapabilityDescriptor | undefined;
|
|
78
|
+
/** True once any capability is registered — discovery guards on this (replaces the builtins boolean). */
|
|
79
|
+
isPopulated(): boolean;
|
|
80
|
+
all(): CapabilityDescriptor[];
|
|
81
|
+
/** The id of the implicit/default capability (UI), if registered. */
|
|
82
|
+
defaultCapabilityId(): string | undefined;
|
|
83
|
+
/** All step patterns contributed by registered capabilities (composition order = registration order). */
|
|
84
|
+
patterns(): StepPattern[];
|
|
85
|
+
/** All registered sensors, optionally filtered by kind ('advisory' | 'gate'). */
|
|
86
|
+
sensors(kind?: Sensor['kind']): Sensor[];
|
|
87
|
+
/** Test seam: drop all registrations. */
|
|
88
|
+
_reset(): void;
|
|
89
|
+
}
|
|
90
|
+
/** Process-wide singleton (mirrors `adapterRegistry`). */
|
|
91
|
+
export declare const capabilityRegistry: CapabilityRegistry;
|
|
92
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/capabilities/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC/E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAElF,MAAM,WAAW,oBAAoB;IACnC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,yFAAyF;IACzF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2FAA2F;IAC3F,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,+FAA+F;IAC/F,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;IAC3B;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAC3C;gFAC4E;IAC5E,cAAc,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D;gGAC4F;IAC5F,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAC/E,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAElE;;;;;OAKG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC;CAIjD;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAA2C;IAEvD,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,oBAAoB,GAAG,IAAI;IAIhD,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAIjD,yGAAyG;IACzG,WAAW,IAAI,OAAO;IAItB,GAAG,IAAI,oBAAoB,EAAE;IAI7B,qEAAqE;IACrE,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIzC,yGAAyG;IACzG,QAAQ,IAAI,WAAW,EAAE;IAIzB,iFAAiF;IACjF,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE;IAKxC,yCAAyC;IACzC,MAAM,IAAI,IAAI;CAGf;AAED,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.capabilityRegistry = exports.CapabilityRegistry = void 0;
|
|
4
|
+
class CapabilityRegistry {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.caps = new Map();
|
|
7
|
+
}
|
|
8
|
+
/** Register (or replace, by id) a capability descriptor. Idempotent by id. */
|
|
9
|
+
register(descriptor) {
|
|
10
|
+
this.caps.set(descriptor.id, descriptor);
|
|
11
|
+
}
|
|
12
|
+
get(id) {
|
|
13
|
+
return this.caps.get(id);
|
|
14
|
+
}
|
|
15
|
+
/** True once any capability is registered — discovery guards on this (replaces the builtins boolean). */
|
|
16
|
+
isPopulated() {
|
|
17
|
+
return this.caps.size > 0;
|
|
18
|
+
}
|
|
19
|
+
all() {
|
|
20
|
+
return [...this.caps.values()];
|
|
21
|
+
}
|
|
22
|
+
/** The id of the implicit/default capability (UI), if registered. */
|
|
23
|
+
defaultCapabilityId() {
|
|
24
|
+
return this.all().find((c) => c.default)?.id;
|
|
25
|
+
}
|
|
26
|
+
/** All step patterns contributed by registered capabilities (composition order = registration order). */
|
|
27
|
+
patterns() {
|
|
28
|
+
return this.all().flatMap((c) => c.patterns ?? []);
|
|
29
|
+
}
|
|
30
|
+
/** All registered sensors, optionally filtered by kind ('advisory' | 'gate'). */
|
|
31
|
+
sensors(kind) {
|
|
32
|
+
const all = this.all().flatMap((c) => c.sensors ?? []);
|
|
33
|
+
return kind ? all.filter((s) => s.kind === kind) : all;
|
|
34
|
+
}
|
|
35
|
+
/** Test seam: drop all registrations. */
|
|
36
|
+
_reset() {
|
|
37
|
+
this.caps.clear();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.CapabilityRegistry = CapabilityRegistry;
|
|
41
|
+
/** Process-wide singleton (mirrors `adapterRegistry`). */
|
|
42
|
+
exports.capabilityRegistry = new CapabilityRegistry();
|
|
43
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/capabilities/registry.ts"],"names":[],"mappings":";;;AAoEA,MAAa,kBAAkB;IAA/B;QACU,SAAI,GAAG,IAAI,GAAG,EAAgC,CAAC;IAwCzD,CAAC;IAtCC,8EAA8E;IAC9E,QAAQ,CAAC,UAAgC;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,yGAAyG;IACzG,WAAW;QACT,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,qEAAqE;IACrE,mBAAmB;QACjB,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;IAC/C,CAAC;IAED,yGAAyG;IACzG,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,IAAqB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACzD,CAAC;IAED,yCAAyC;IACzC,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;CACF;AAzCD,gDAyCC;AAED,0DAA0D;AAC7C,QAAA,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness Sensor SPI (Capability SPI, R1 — Sensor step).
|
|
3
|
+
*
|
|
4
|
+
* A sensor is a deterministic harness check a capability contributes. The kernel collects all
|
|
5
|
+
* registered sensors and runs them; findings merge into the harness output. Two kinds:
|
|
6
|
+
* - `advisory` — surfaced as warnings (e.g. at `sungen generate`), never blocks.
|
|
7
|
+
* - `gate` — feeds the audit scorecard / pass-fail (migrated from the hardcoded `audit.ts`
|
|
8
|
+
* calls in the next sub-step; gate sensors carry an intent-aware threshold).
|
|
9
|
+
*
|
|
10
|
+
* Generic over the input so the same registry holds both generate-time advisory sensors
|
|
11
|
+
* (which scan a screen/flow dir) and audit-time gate sensors (which read parsed scenarios) —
|
|
12
|
+
* each sensor declares the input it consumes; callers filter by `kind` and pass the right input.
|
|
13
|
+
*/
|
|
14
|
+
export interface SensorFinding {
|
|
15
|
+
sensorId: string;
|
|
16
|
+
capability?: string;
|
|
17
|
+
scenario?: string;
|
|
18
|
+
message: string;
|
|
19
|
+
severity?: 'info' | 'warn' | 'error';
|
|
20
|
+
}
|
|
21
|
+
export interface Sensor<I = unknown> {
|
|
22
|
+
id: string;
|
|
23
|
+
capability?: string;
|
|
24
|
+
kind: 'gate' | 'advisory';
|
|
25
|
+
run(input: I): SensorFinding[];
|
|
26
|
+
}
|
|
27
|
+
/** Input for generate-time advisory sensors that scan a screen/flow directory. */
|
|
28
|
+
export interface AdvisoryScanInput {
|
|
29
|
+
dir: string;
|
|
30
|
+
cwd: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Input for audit-time gate sensors. Intentionally minimal/structural (not the full ScenarioInfo
|
|
34
|
+
* type) so `src/capabilities` doesn't depend on harness internals — the audit caller passes the
|
|
35
|
+
* parsed scenarios it already has.
|
|
36
|
+
*/
|
|
37
|
+
export interface GateInput {
|
|
38
|
+
screenName: string;
|
|
39
|
+
cwd: string;
|
|
40
|
+
featureText: string;
|
|
41
|
+
scenarios: Array<{
|
|
42
|
+
name: string;
|
|
43
|
+
queryRefs?: string[];
|
|
44
|
+
apiRefs?: string[];
|
|
45
|
+
casesDataset?: string;
|
|
46
|
+
stepsText?: string;
|
|
47
|
+
manual?: boolean;
|
|
48
|
+
}>;
|
|
49
|
+
/** UI: universal-viewpoint theme gaps the coverage gate found (generic string list). */
|
|
50
|
+
universalGaps?: string[];
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=sensor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensor.d.ts","sourceRoot":"","sources":["../../src/capabilities/sensor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,OAAO;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC;CAChC;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC1I,wFAAwF;IACxF,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sensor.js","sourceRoot":"","sources":["../../src/capabilities/sensor.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqC3D"}
|
|
@@ -37,13 +37,17 @@ exports.registerAuditCommand = registerAuditCommand;
|
|
|
37
37
|
const path = __importStar(require("path"));
|
|
38
38
|
const fs = __importStar(require("fs"));
|
|
39
39
|
const audit_1 = require("../../harness/audit");
|
|
40
|
+
const unit_paths_1 = require("../../harness/unit-paths");
|
|
40
41
|
function findScreenDir(name) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
// `name` may be a bare screen/flow/area, or an api unit id (`api/<area>`, `api/flows/<flow>`).
|
|
43
|
+
const candidates = [
|
|
44
|
+
path.join(process.cwd(), 'qa', 'screens', name),
|
|
45
|
+
path.join(process.cwd(), 'qa', 'flows', name),
|
|
46
|
+
path.join(process.cwd(), 'qa', 'api', name), // qa/api/<area> or qa/api/flows/<flow>
|
|
47
|
+
];
|
|
48
|
+
for (const c of candidates)
|
|
49
|
+
if (fs.existsSync(c))
|
|
50
|
+
return c;
|
|
47
51
|
return null;
|
|
48
52
|
}
|
|
49
53
|
function bar(ratio, width = 20) {
|
|
@@ -137,20 +141,22 @@ function registerAuditCommand(program) {
|
|
|
137
141
|
.command('audit')
|
|
138
142
|
.description('Harness: measure test-design quality (viewpoint gate, depth, balance, duplicates, traceability)')
|
|
139
143
|
.option('-s, --screen <name>', 'Screen or flow name to audit')
|
|
144
|
+
.option('--api <name>', 'API-first area or api flow to audit (e.g. orders, flows/signup)')
|
|
145
|
+
.option('--area <name>', 'Alias of --api — an API-first area (qa/api/<name>)')
|
|
140
146
|
.option('--json', 'Output the raw JSON report')
|
|
141
147
|
.action((options) => {
|
|
142
148
|
try {
|
|
143
|
-
const name = options.screen;
|
|
149
|
+
const name = options.screen || options.api || options.area;
|
|
144
150
|
if (!name)
|
|
145
|
-
throw new Error('Provide --screen <name>');
|
|
151
|
+
throw new Error('Provide --screen <name> (or --api <area>)');
|
|
146
152
|
const dir = findScreenDir(name);
|
|
147
153
|
if (!dir)
|
|
148
|
-
throw new Error(`
|
|
154
|
+
throw new Error(`Not found: qa/screens/${name}, qa/flows/${name}, or qa/api/${name}`);
|
|
149
155
|
const report = (0, audit_1.runAudit)(dir, name);
|
|
150
|
-
// Persist report under .sungen/reports/
|
|
156
|
+
// Persist report under .sungen/reports/ (flat slug: api flow `flows/x` → `flows-x-audit.json`).
|
|
151
157
|
const outDir = path.join(process.cwd(), '.sungen', 'reports');
|
|
152
158
|
fs.mkdirSync(outDir, { recursive: true });
|
|
153
|
-
const outPath = path.join(outDir, `${name}-audit.json`);
|
|
159
|
+
const outPath = path.join(outDir, `${(0, unit_paths_1.reportSlug)(name)}-audit.json`);
|
|
154
160
|
fs.writeFileSync(outPath, JSON.stringify(report, null, 2), 'utf-8');
|
|
155
161
|
if (options.json) {
|
|
156
162
|
console.log(JSON.stringify(report, null, 2));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"capability.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/capability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuDpC,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwJhE"}
|
|
@@ -35,11 +35,51 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerCapabilityCommand = registerCapabilityCommand;
|
|
37
37
|
const child_process_1 = require("child_process");
|
|
38
|
+
const module_1 = require("module");
|
|
38
39
|
const fs = __importStar(require("fs"));
|
|
39
40
|
const path = __importStar(require("path"));
|
|
40
41
|
const capability_1 = require("../../harness/capability");
|
|
41
42
|
const capability_plan_1 = require("../../harness/capability-plan");
|
|
42
43
|
const adapters_1 = require("../../generators/test-generator/adapters");
|
|
44
|
+
/** The running CLI's (core) version — opt-in drivers install in lockstep with it (not `@latest`). */
|
|
45
|
+
function coreVersion() {
|
|
46
|
+
try {
|
|
47
|
+
return require('../../../package.json').version || 'latest';
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return 'latest';
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Verify a capability driver (db/api/…) installed into the PROJECT exposes the capability SPI entry
|
|
55
|
+
* (`sungenDriver.register`). Resolved from the project's node_modules so it works with a globally
|
|
56
|
+
* installed core. Capability drivers are NOT codegen adapters — don't route them through loadDriver.
|
|
57
|
+
*/
|
|
58
|
+
function verifyCapabilityDriver(pkg, cwd) {
|
|
59
|
+
const req = (0, module_1.createRequire)(path.join(cwd, 'package.json'));
|
|
60
|
+
// 1) Installed? (resolve only — distinguishes "not installed" from "installed but broken")
|
|
61
|
+
try {
|
|
62
|
+
req.resolve(pkg);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
throw new Error(`${pkg} is not installed in this project — run \`npm install -D ${pkg}\` here (a package.json must exist in this directory).`);
|
|
66
|
+
}
|
|
67
|
+
// 2) Loadable? Surface the REAL error — a failure here is almost always a stale/wrong
|
|
68
|
+
// @sun-asterisk/sungen on the module path (e.g. leftover node_modules), NOT a missing driver.
|
|
69
|
+
let mod;
|
|
70
|
+
try {
|
|
71
|
+
mod = req(pkg);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
throw new Error(`${pkg} is installed but failed to load:\n ${e?.message || e}\n` +
|
|
75
|
+
' This usually means a stale @sun-asterisk/sungen is on the module path. Run in a clean,\n' +
|
|
76
|
+
' dedicated project directory and remove stray installs (e.g. rm -rf ~/node_modules).');
|
|
77
|
+
}
|
|
78
|
+
const register = mod?.sungenDriver?.register ?? mod?.register;
|
|
79
|
+
if (typeof register !== 'function') {
|
|
80
|
+
throw new Error(`${pkg} is installed but is not a sungen capability driver (missing sungenDriver.register).`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
43
83
|
function findScreenDir(name) {
|
|
44
84
|
const s = path.join(process.cwd(), 'qa', 'screens', name);
|
|
45
85
|
if (fs.existsSync(s))
|
|
@@ -145,17 +185,29 @@ function registerCapabilityCommand(program) {
|
|
|
145
185
|
const adapterName = meta.adapter || meta.id;
|
|
146
186
|
const bundled = adapters_1.adapterRegistry.hasAdapter(adapterName); // e.g. `web` is bundled in Phase 2a
|
|
147
187
|
if (!bundled && !o.skipInstall) {
|
|
148
|
-
|
|
149
|
-
|
|
188
|
+
// Pin the driver to the RUNNING core's exact version (lockstep). Without this, plain
|
|
189
|
+
// `npm install @sungen/driver-x` resolves the package's `latest` dist-tag — which on a
|
|
190
|
+
// beta channel can lag (e.g. a prerelease first-published-as-latest), pulling a driver
|
|
191
|
+
// whose core dep resolves to the wrong @sun-asterisk/sungen and fails to load.
|
|
192
|
+
const spec = `${meta.package}@${coreVersion()}`;
|
|
193
|
+
console.log(`📦 Installing ${spec} (dev dependency)...`);
|
|
194
|
+
const r = (0, child_process_1.spawnSync)('npm', ['install', '-D', spec], { stdio: 'inherit', shell: true });
|
|
150
195
|
if (r.status !== 0)
|
|
151
|
-
throw new Error(`npm install -D ${
|
|
196
|
+
throw new Error(`npm install -D ${spec} failed.`);
|
|
152
197
|
}
|
|
153
198
|
else if (bundled) {
|
|
154
199
|
console.log(`✓ ${driver} is built-in (no install needed).`);
|
|
155
200
|
}
|
|
156
|
-
// Verify it
|
|
201
|
+
// Verify it loaded (skip for bundled — already registered). Two driver shapes:
|
|
202
|
+
// - platform driver (web/mobile): a codegen adapter, loaded via the adapter registry (mod.activate)
|
|
203
|
+
// - capability driver (db/api/…): a capability-SPI package (mod.sungenDriver.register) — NOT an adapter
|
|
157
204
|
if (!bundled) {
|
|
158
|
-
|
|
205
|
+
if (meta.kind === 'platform') {
|
|
206
|
+
adapters_1.adapterRegistry.loadDriver(adapterName, meta.package, cwd); // throws if not loadable
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
verifyCapabilityDriver(meta.package, cwd); // capability SPI entry, resolved from the project
|
|
210
|
+
}
|
|
159
211
|
}
|
|
160
212
|
const profile = (0, capability_1.readCapabilities)(cwd);
|
|
161
213
|
const enabled = Array.from(new Set([...profile.enabled, driver]));
|