@ccdd/core 6.5.0 → 6.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/src/artifact-scope.js +6 -0
- package/dist/src/artifact-scope.js.map +1 -1
- package/dist/src/definitions.d.ts +33 -1
- package/examples/artifact-families/README.md +22 -0
- package/examples/artifact-families/scenarios/ccdd.json +66 -0
- package/examples/artifact-families/scenarios/checkout.json +12 -0
- package/examples/artifact-families/scenarios/instances.json +16 -0
- package/examples/artifact-families/scenarios/search.json +12 -0
- package/examples/artifact-families/scenarios/view.mjs +16 -0
- package/examples/computed-views/README.md +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -85,6 +85,7 @@ Reviews run in the workspace you supply. Keep it unchanged until completion, inc
|
|
|
85
85
|
- [Register optional text, image and desktop tools](packages/default-tools/README.md).
|
|
86
86
|
- [Compose folders and mounts](examples/artifact-folders/README.md), including coding-style and blind image comparison Critics.
|
|
87
87
|
- [Compute views on demand](examples/computed-views/README.md) from scenario material.
|
|
88
|
+
- [Declare an Artifact family](examples/artifact-families/README.md): many Artifacts sharing one folder, script and Critic.
|
|
88
89
|
- [Design reviewer tools](docs/reviewer-tools.md) that return only what the reviewer requests.
|
|
89
90
|
- [Configure Agent and Human reviewers](docs/reviewers.md).
|
|
90
91
|
- [Try Why → Spec → Tests → Implementation](docs/demo.md).
|
|
@@ -105,7 +106,7 @@ See [Contributing](CONTRIBUTING.md), [the context map](CONTEXT-MAP.md), [detaile
|
|
|
105
106
|
|
|
106
107
|
[MIT](LICENSE).
|
|
107
108
|
|
|
108
|
-
**CCDD 6.
|
|
109
|
+
**CCDD 6.6.0:** Artifact families declare many Artifacts that share one folder, view scripts and Critics through a static instance list, with per-instance identities so siblings never invalidate each other. Pi is updated to 1.0.0; existing review identities are unchanged. See the [release notes](docs/releases/v6.6.0.md).
|
|
109
110
|
|
|
110
111
|
|
|
111
112
|
### Existing Pi AI API
|
|
@@ -21,6 +21,12 @@ export function resolveScopePath(scope, artifactId, path = '') {
|
|
|
21
21
|
remaining = remaining.slice(child.length).replace(/^\//, '');
|
|
22
22
|
continue;
|
|
23
23
|
}
|
|
24
|
+
// A family folder belongs to its instances, not to the parent: address it as <folder>/<instance>/<path>.
|
|
25
|
+
for (const [name, id] of Object.entries(entry.children)) {
|
|
26
|
+
const folder = name.slice(0, -id.length - 1);
|
|
27
|
+
if (scope[id]?.family && name.endsWith(`/${id}`) && (remaining === folder || remaining.startsWith(`${folder}/`)))
|
|
28
|
+
throw new Error(`Artifact path is inside the folder of Artifact family ${scope[id].family.name}; address one of its instances as ${folder}/<instance>/<path>.`);
|
|
29
|
+
}
|
|
24
30
|
return { artifactId: current, path: remaining };
|
|
25
31
|
}
|
|
26
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-scope.js","sourceRoot":"","sources":["../../src/artifact-scope.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,UAAkB,EAAE,IAAI,GAAG,EAAE;IAClF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC7Q,IAAI,OAAO,GAAG,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC;QACR,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;QACnG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAAC,SAAS;QACxG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAC/G,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACrI,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"artifact-scope.js","sourceRoot":"","sources":["../../src/artifact-scope.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,UAAkB,EAAE,IAAI,GAAG,EAAE;IAClF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC7Q,IAAI,OAAO,GAAG,UAAU,EAAE,SAAS,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC;QACR,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,OAAO,EAAE,CAAC,CAAC;QACnG,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAAC,SAAS;QACxG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QAC/G,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAAC,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACrI,yGAAyG;QACzG,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,KAAK,CAAC,EAAE,CAAC,CAAC,MAAO,CAAC,IAAI,qCAAqC,MAAM,qBAAqB,CAAC,CAAC;QACrR,CAAC;QACD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -54,6 +54,21 @@ export interface ReviewPolicy {
|
|
|
54
54
|
dependencyGates?: 'green' | 'ignore';
|
|
55
55
|
maxConcurrentExecutors?: number;
|
|
56
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* One statically listed member of an Artifact family. Its params, merged shallowly over the family
|
|
59
|
+
* defaults and its named variant, fill `{"$param": "/pointer"}` values in the shared views and Critics.
|
|
60
|
+
*/
|
|
61
|
+
export interface ArtifactInstanceDeclaration {
|
|
62
|
+
variant?: string;
|
|
63
|
+
params?: Record<string, unknown>;
|
|
64
|
+
material?: string[];
|
|
65
|
+
}
|
|
66
|
+
/** Instances are listed inline or in an owner-relative JSON file; discovery reads them and executes nothing. */
|
|
67
|
+
export interface ArtifactFamilyDeclaration {
|
|
68
|
+
instances: string | Record<string, ArtifactInstanceDeclaration>;
|
|
69
|
+
params?: Record<string, unknown>;
|
|
70
|
+
variants?: Record<string, Record<string, unknown>>;
|
|
71
|
+
}
|
|
57
72
|
export interface ArtifactManifest {
|
|
58
73
|
name: string;
|
|
59
74
|
critics?: CriticDefinition[];
|
|
@@ -63,18 +78,31 @@ export interface ArtifactManifest {
|
|
|
63
78
|
basis?: boolean;
|
|
64
79
|
stale?: StaleStrategy;
|
|
65
80
|
envRequirements?: Record<string, EnvironmentRequirement>;
|
|
81
|
+
/** Declares several Artifacts that share this folder, its views and its Critics. `name` then names the family. */
|
|
82
|
+
family?: ArtifactFamilyDeclaration;
|
|
83
|
+
}
|
|
84
|
+
/** How an instance Artifact belongs to its family. Paths are relative to the shared family folder. */
|
|
85
|
+
export interface ArtifactFamilyMembership {
|
|
86
|
+
name: string;
|
|
87
|
+
/** The static instance list file, when the list is not inline. */
|
|
88
|
+
instances?: string;
|
|
89
|
+
/** Material that only this instance's identity covers; other instances exclude it. */
|
|
90
|
+
material: string[];
|
|
91
|
+
/** Hash of this instance's static entry: its params and material list. */
|
|
92
|
+
entry: string;
|
|
66
93
|
}
|
|
67
94
|
export interface ArtifactDefinition {
|
|
68
95
|
name: string;
|
|
69
96
|
path: string;
|
|
70
97
|
views: ArtifactViews;
|
|
71
98
|
mounts: Record<string, string>;
|
|
72
|
-
/** Nearest marked descendants, indexed by their physical relative paths
|
|
99
|
+
/** Nearest marked descendants, indexed by their physical relative paths; a family instance is keyed `<family folder>/<instance>`. */
|
|
73
100
|
children: Record<string, string>;
|
|
74
101
|
reviewPolicy?: ReviewPolicy;
|
|
75
102
|
basis?: boolean;
|
|
76
103
|
stale?: StaleStrategy;
|
|
77
104
|
envRequirements?: Record<string, EnvironmentRequirement>;
|
|
105
|
+
family?: ArtifactFamilyMembership;
|
|
78
106
|
}
|
|
79
107
|
export interface ResolvedCriticDefinition extends CriticDefinition {
|
|
80
108
|
localId: string;
|
|
@@ -94,5 +122,9 @@ export interface ArtifactScopeEntry {
|
|
|
94
122
|
path: string;
|
|
95
123
|
children: Record<string, string>;
|
|
96
124
|
mounts: Record<string, string>;
|
|
125
|
+
family?: {
|
|
126
|
+
name: string;
|
|
127
|
+
material: string[];
|
|
128
|
+
};
|
|
97
129
|
}
|
|
98
130
|
export type ArtifactScope = Record<string, ArtifactScopeEntry>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Artifact families
|
|
2
|
+
|
|
3
|
+
`scenarios/ccdd.json` declares the family `scenarios`: one folder, one view script and one Critic shared by the Artifacts listed in `scenarios/instances.json`. Each listed name, `checkout` and `search`, is an ordinary Artifact with its own Critic `checkout/review` or `search/review`, its own evidence and its own place in the graph.
|
|
4
|
+
|
|
5
|
+
An instance entry has two optional parts:
|
|
6
|
+
|
|
7
|
+
- `params` fill every `{"$param": "/json/pointer"}` value in the shared views and Critics. Here each instance gets its own `detail` input enum and its own instruction. Parameters are copied as JSON; nothing is evaluated.
|
|
8
|
+
Values shared by many instances can live in `family.params` (defaults) or `family.variants` (named sets an entry selects with `"variant"`); an entry's own `params` win, key by key.
|
|
9
|
+
- `material` lists the files that belong to that instance alone; they must exist. The view script finds them in `context.scope[context.artifactId].family.material`.
|
|
10
|
+
|
|
11
|
+
Editing `checkout.json` or the `checkout` entry invalidates only `checkout`'s review. Adding a new instance with its own material leaves existing reviews current. Editing the shared `ccdd.json`, `view.mjs` or any unlisted file invalidates every instance. Discovery only reads `instances.json`; an authoring tool may write that file, but CCDD never runs code to produce it.
|
|
12
|
+
|
|
13
|
+
Run these commands from this directory after installing `@ccdd/ccdd`:
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
ccdd-project config check
|
|
17
|
+
ccdd-project tools check --artifact checkout --for agent --tool detail --execute --args '{"id":"summary"}'
|
|
18
|
+
ccdd-project verify --all --human-inbox
|
|
19
|
+
ccdd-project monitor
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The monitor shows the family as one node; select it to list its instances and their Critics, or expand it into instance nodes. Submit the Human verdicts explicitly through the monitor. See [the Artifact family contract](../../docs/contracts.md#artifact-families).
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "scenarios",
|
|
3
|
+
"family": {
|
|
4
|
+
"instances": "instances.json"
|
|
5
|
+
},
|
|
6
|
+
"views": {
|
|
7
|
+
"agentTools": {
|
|
8
|
+
"overview": {
|
|
9
|
+
"metadata": {
|
|
10
|
+
"description": "Read the objective, criteria and detail IDs of {artifactName}.",
|
|
11
|
+
"inputSchema": { "type": "object", "properties": {}, "additionalProperties": false },
|
|
12
|
+
"resultKinds": ["json"],
|
|
13
|
+
"observation": "content"
|
|
14
|
+
},
|
|
15
|
+
"script": { "command": "node", "args": ["view.mjs", "overview"] }
|
|
16
|
+
},
|
|
17
|
+
"detail": {
|
|
18
|
+
"metadata": {
|
|
19
|
+
"description": "Read one observed detail of {artifactName}.",
|
|
20
|
+
"inputSchema": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": { "id": { "type": "string", "enum": { "$param": "/detailIds" } } },
|
|
23
|
+
"required": ["id"],
|
|
24
|
+
"additionalProperties": false
|
|
25
|
+
},
|
|
26
|
+
"resultKinds": ["json"],
|
|
27
|
+
"observation": "content"
|
|
28
|
+
},
|
|
29
|
+
"script": { "command": "node", "args": ["view.mjs", "detail"] }
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"humanTools": {
|
|
33
|
+
"overview": {
|
|
34
|
+
"metadata": {
|
|
35
|
+
"description": "Read the objective, criteria and detail IDs of {artifactName}.",
|
|
36
|
+
"inputSchema": { "type": "object", "properties": {}, "additionalProperties": false },
|
|
37
|
+
"resultKinds": ["json"],
|
|
38
|
+
"observation": "content"
|
|
39
|
+
},
|
|
40
|
+
"script": { "command": "node", "args": ["view.mjs", "overview"] }
|
|
41
|
+
},
|
|
42
|
+
"detail": {
|
|
43
|
+
"metadata": {
|
|
44
|
+
"description": "Read one observed detail of {artifactName}.",
|
|
45
|
+
"inputSchema": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"properties": { "id": { "type": "string", "enum": { "$param": "/detailIds" } } },
|
|
48
|
+
"required": ["id"],
|
|
49
|
+
"additionalProperties": false
|
|
50
|
+
},
|
|
51
|
+
"resultKinds": ["json"],
|
|
52
|
+
"observation": "content"
|
|
53
|
+
},
|
|
54
|
+
"script": { "command": "node", "args": ["view.mjs", "detail"] }
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"critics": [
|
|
59
|
+
{
|
|
60
|
+
"id": "review",
|
|
61
|
+
"title": "Review the scenario",
|
|
62
|
+
"profile": { "kind": "human" },
|
|
63
|
+
"payload": { "instruction": { "$param": "/instruction" } }
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Guest checkout",
|
|
3
|
+
"objective": "A guest can review the total before placing an order.",
|
|
4
|
+
"criteria": [
|
|
5
|
+
"The order summary shows both shipping and the final total.",
|
|
6
|
+
"The guest can return to the cart before placing the order."
|
|
7
|
+
],
|
|
8
|
+
"details": [
|
|
9
|
+
{ "id": "summary", "observation": "The summary shows items at $20, shipping at $5, and a final total of $25." },
|
|
10
|
+
{ "id": "navigation", "observation": "A Back to cart link appears beside the Place order button." }
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"checkout": {
|
|
3
|
+
"params": {
|
|
4
|
+
"detailIds": ["summary", "navigation"],
|
|
5
|
+
"instruction": "Read the overview of {checkout}, then inspect every listed detail. Decide whether observations satisfy each criterion. Cite detail IDs and explain missing or contradictory evidence."
|
|
6
|
+
},
|
|
7
|
+
"material": ["checkout.json"]
|
|
8
|
+
},
|
|
9
|
+
"search": {
|
|
10
|
+
"params": {
|
|
11
|
+
"detailIds": ["message", "query"],
|
|
12
|
+
"instruction": "Read the overview of {search}, then inspect every listed detail. Decide whether observations satisfy each criterion. Cite detail IDs and explain missing or contradictory evidence."
|
|
13
|
+
},
|
|
14
|
+
"material": ["search.json"]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Empty search results",
|
|
3
|
+
"objective": "A user can recover from a search that finds no items.",
|
|
4
|
+
"criteria": [
|
|
5
|
+
"The result view states that no items match the search.",
|
|
6
|
+
"The user can change the query without leaving the result view."
|
|
7
|
+
],
|
|
8
|
+
"details": [
|
|
9
|
+
{ "id": "message", "observation": "The result heading reads No matching items." },
|
|
10
|
+
{ "id": "query", "observation": "The original query remains in an editable search field above the heading." }
|
|
11
|
+
]
|
|
12
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
let text = '';
|
|
4
|
+
for await (const chunk of process.stdin) text += chunk;
|
|
5
|
+
const { version, context, args } = JSON.parse(text);
|
|
6
|
+
if (version !== 1) throw new Error('Unsupported request version.');
|
|
7
|
+
// Every instance shares this folder and script; each one names its own material.
|
|
8
|
+
const [file] = context.scope[context.artifactId].family?.material ?? [];
|
|
9
|
+
if (!file) throw new Error('This view serves Artifact family instances.');
|
|
10
|
+
const scenario = JSON.parse(await readFile(join(context.artifactPath, file), 'utf8'));
|
|
11
|
+
if (!Array.isArray(scenario.details) || !Array.isArray(scenario.criteria)) throw new Error('Invalid scenario.');
|
|
12
|
+
const data = process.argv[2] === 'overview'
|
|
13
|
+
? { name: scenario.name, objective: scenario.objective, criteria: scenario.criteria, detailIds: scenario.details.map(item => item.id) }
|
|
14
|
+
: scenario.details.find(item => item.id === args.id);
|
|
15
|
+
if (!data) throw new Error('Unknown scenario detail.');
|
|
16
|
+
process.stdout.write(JSON.stringify({ content: [{ type: 'json', data }], observation: { kind: 'content' } }));
|
|
@@ -9,4 +9,4 @@ ccdd-project verify checkout --human-inbox
|
|
|
9
9
|
ccdd-project monitor
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
Run these commands from this directory after installing `@ccdd/ccdd`. Submit the Human verdict explicitly through the monitor. Scenario files, the manifest and the shared script determine input identity. Output belongs in `context.outputDir`, outside the supplied workspace.
|
|
12
|
+
Run these commands from this directory after installing `@ccdd/ccdd`. Submit the Human verdict explicitly through the monitor. Scenario files, the manifest and the shared script determine input identity. Output belongs in `context.outputDir`, outside the supplied workspace. When many scenarios share one script and Critic, the [Artifact family example](../artifact-families/README.md) declares them once with a static instance list instead of one folder each.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ccdd/core",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.6.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -55,8 +55,8 @@
|
|
|
55
55
|
"examples/"
|
|
56
56
|
],
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@earendil-works/pi-agent-core": "0.
|
|
59
|
-
"@earendil-works/pi-ai": "0.
|
|
58
|
+
"@earendil-works/pi-agent-core": "1.0.0",
|
|
59
|
+
"@earendil-works/pi-ai": "1.0.0",
|
|
60
60
|
"@lucide/vue": "1.41.0",
|
|
61
61
|
"@vue-flow/background": "1.3.2",
|
|
62
62
|
"@vue-flow/core": "1.48.2",
|