@ccdd/core 3.3.1 → 4.1.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 +69 -62
- package/dist/src/artifact-scope.d.ts +6 -0
- package/dist/src/artifact-scope.js +27 -0
- package/dist/src/artifact-scope.js.map +1 -0
- package/dist/src/definitions.d.ts +33 -23
- package/dist/src/sdk.d.ts +3 -8
- package/dist/src/sdk.js +2 -3
- package/dist/src/sdk.js.map +1 -1
- package/dist/src/tools/contracts.d.ts +44 -80
- package/examples/artifact-folders/README.md +18 -0
- package/examples/artifact-folders/coding-style/ccdd.json +128 -0
- package/examples/artifact-folders/coding-style/style.md +3 -0
- package/examples/artifact-folders/explosion/blind-pair.mjs +19 -0
- package/examples/artifact-folders/explosion/ccdd.json +220 -0
- package/examples/artifact-folders/explosion/effect/ccdd.json +128 -0
- package/examples/artifact-folders/explosion/preview/ccdd.json +142 -0
- package/examples/artifact-folders/theme-image/ccdd.json +128 -0
- package/examples/artifact-folders/theme-image/theme.png +0 -0
- package/examples/computed-views/README.md +12 -0
- package/examples/computed-views/checkout/ccdd.json +133 -0
- package/examples/computed-views/search/ccdd.json +133 -0
- package/examples/computed-views/view.mjs +13 -0
- package/examples/custom-text-reader/README.md +7 -19
- package/examples/custom-text-reader/spec/ccdd.json +60 -0
- package/examples/custom-text-reader/view.mjs +20 -0
- package/examples/custom-text-reader/why/ccdd.json +46 -0
- package/package.json +21 -7
- package/examples/artifact-groups/README.md +0 -60
- package/examples/artifact-groups/ccdd.config.ts +0 -37
- package/examples/custom-text-reader/ccdd.config.ts +0 -64
- package/examples/generated-artifacts/README.md +0 -55
- package/examples/generated-artifacts/ccdd.config.ts +0 -86
- /package/examples/{artifact-groups → artifact-folders/explosion/effect}/effect.md +0 -0
- /package/examples/{artifact-groups → artifact-folders/explosion/preview}/preview.png +0 -0
- /package/examples/{generated-artifacts/scenarios/checkout.json → computed-views/checkout/scenario.json} +0 -0
- /package/examples/{generated-artifacts/scenarios/search.json → computed-views/search/scenario.json} +0 -0
- /package/examples/custom-text-reader/{spec.md → spec/spec.md} +0 -0
- /package/examples/custom-text-reader/{why.md → why/why.md} +0 -0
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
# Default image tool and Artifact groups
|
|
2
|
-
|
|
3
|
-
The `effect` document and `preview` image are independent Artifacts. `explosion` is a group referencing both IDs, with no path or type. Tools for the document and image are explicitly registered. This example is a static sample, not an actual VFX asset.
|
|
4
|
-
|
|
5
|
-
- `preview-review`: Evaluates one image. Only `view_image_preview` is supplied.
|
|
6
|
-
- `explosion-review`: Evaluates the group. `read_effect` and `view_image_preview` are supplied. Tools are not duplicated when `preview` is both a member and a dependency.
|
|
7
|
-
- `explosion-human`: Opens the group's document and image in desktop applications, then accepts a submitted verdict.
|
|
8
|
-
|
|
9
|
-
In a full Run, both group Critics must wait for the image review to pass because of explicit `deps: ['preview']`. Membership alone does not require prior evaluation. Once both group Critics are GREEN, `explosion` is GREEN while `effect` remains unreviewed.
|
|
10
|
-
|
|
11
|
-
## Running the example
|
|
12
|
-
|
|
13
|
-
Install the three v3.1.0 packages on Node 22 LTS (22.19.0 or later). The following command works after npm publication; before that, use the local source build below. Start in the CCDD source repository and copy the example into a new project outside it.
|
|
14
|
-
|
|
15
|
-
```sh
|
|
16
|
-
CCDD_EXAMPLE_ROOT=$(mktemp -d /tmp/ccdd-groups.XXXXXX)
|
|
17
|
-
cp -R examples/artifact-groups "$CCDD_EXAMPLE_ROOT/project"
|
|
18
|
-
cd "$CCDD_EXAMPLE_ROOT/project"
|
|
19
|
-
npm init -y
|
|
20
|
-
npm pkg set type=module
|
|
21
|
-
npm install --ignore-scripts @ccdd/core@3.1.0 @ccdd/project@3.1.0 @ccdd/default-tools@3.1.0
|
|
22
|
-
|
|
23
|
-
# Check group member tool readiness without calling a Provider.
|
|
24
|
-
npx ccdd tools check --artifact explosion --for agent
|
|
25
|
-
# Select an individual Artifact for actual image reading.
|
|
26
|
-
npx ccdd tools check --artifact preview --for agent --tool view_image --execute
|
|
27
|
-
|
|
28
|
-
# Review one Critic; this legacy command skips waiting for prerequisite verdicts.
|
|
29
|
-
npx ccdd run --copy --critic explosion-review --codex-auth-file "$HOME/.codex/auth.json" --wait
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Actual Agent review requires authentication and access to a model supporting image input. See the [reviewer guide](../../docs/reviewers.md) for authentication methods. Tool checks do not call a model. The `--execute` output above includes actual image blocks in base64.
|
|
33
|
-
|
|
34
|
-
If core is already installed, change the first `cp` source to `node_modules/@ccdd/core/examples/artifact-groups`.
|
|
35
|
-
|
|
36
|
-
Start a full Run with Human review by registering a local notification:
|
|
37
|
-
|
|
38
|
-
```sh
|
|
39
|
-
npx ccdd run --copy --human-inbox --codex-auth-file "$HOME/.codex/auth.json"
|
|
40
|
-
npx ccdd monitor
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
Select a project and Run in the monitor, then click the group node in Graph to inspect its members. Claim the Human request, click `{explosion}`, execute each member's `open` tool, and submit a verdict with evidence. Default desktop opening targets macOS; explicitly register an executable on other operating systems.
|
|
44
|
-
|
|
45
|
-
`view_image` reuses Pi `read` image results. It detects PNG/JPEG/WebP from file content, with a 4MiB limit. GIF, BMP, animated PNG, and text results fail; no automatic conversion or resizing occurs. When registered on a directory Artifact, pass an internal path such as `{"path":"frames/preview.png"}`.
|
|
46
|
-
|
|
47
|
-
## Using a local source build
|
|
48
|
-
|
|
49
|
-
To test modified source, prepare three tarballs in the CCDD repository:
|
|
50
|
-
|
|
51
|
-
```sh
|
|
52
|
-
npm ci
|
|
53
|
-
npm run build
|
|
54
|
-
CCDD_LOCAL_PACKAGES=$(mktemp -d /tmp/ccdd-group-packages.XXXXXX)
|
|
55
|
-
npm pack --ignore-scripts --pack-destination "$CCDD_LOCAL_PACKAGES"
|
|
56
|
-
npm pack --ignore-scripts --workspace @ccdd/project --pack-destination "$CCDD_LOCAL_PACKAGES"
|
|
57
|
-
npm pack --ignore-scripts --workspace @ccdd/default-tools --pack-destination "$CCDD_LOCAL_PACKAGES"
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
In the same shell, create the new example project from the steps above, then replace the npm version installation with `npm install --ignore-scripts "$CCDD_LOCAL_PACKAGES"/*.tgz`. Subsequent tool checks and review commands are the same. To also run the full test suite and separate installation checks on source fixed to a commit, use `--dry-run` with the [local Release command](../../docs/releases.md#releasing-a-specific-commit-locally).
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from '@ccdd/core';
|
|
2
|
-
import { agent, human } from '@ccdd/default-tools';
|
|
3
|
-
|
|
4
|
-
export default defineConfig({
|
|
5
|
-
artifacts: {
|
|
6
|
-
effect: { type: 'markdown', path: 'effect.md' },
|
|
7
|
-
preview: { type: 'image', path: 'preview.png' },
|
|
8
|
-
explosion: { kind: 'group', members: ['effect', 'preview'] },
|
|
9
|
-
},
|
|
10
|
-
artifactTypes: {
|
|
11
|
-
markdown: {
|
|
12
|
-
agentTools: { read: agent.text.read() },
|
|
13
|
-
humanTools: { open: human.desktop.open() },
|
|
14
|
-
},
|
|
15
|
-
image: {
|
|
16
|
-
agentTools: { view_image: agent.image.view() },
|
|
17
|
-
humanTools: { open: human.desktop.open() },
|
|
18
|
-
},
|
|
19
|
-
},
|
|
20
|
-
critics: [
|
|
21
|
-
{
|
|
22
|
-
id: 'preview-review', title: 'Image visibility', target: 'preview', deps: [],
|
|
23
|
-
profile: { kind: 'agent', provider: 'openai-codex', model: 'gpt-6-astra', reasoning: 'medium' },
|
|
24
|
-
payload: { instruction: 'Check whether {preview} has a bright center and an orange ring distinguishable from the dark background. Review the image itself; matching the effect specification is outside this review.' },
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
id: 'explosion-review', title: 'Match the effect description and preview', target: 'explosion', deps: ['preview'],
|
|
28
|
-
profile: { kind: 'agent', provider: 'openai-codex', model: 'gpt-6-astra', reasoning: 'medium' },
|
|
29
|
-
payload: { instruction: 'Observe every member of {explosion} and evaluate whether {preview} matches the static appearance specified in {effect}. Animation timing and actual VFX runtime behavior are outside the scope of this static example.' },
|
|
30
|
-
},
|
|
31
|
-
{
|
|
32
|
-
id: 'explosion-human', title: 'Review the group on the desktop', target: 'explosion', deps: ['preview'],
|
|
33
|
-
profile: { kind: 'human' },
|
|
34
|
-
payload: { instruction: 'Open the document and image in {explosion} with their desktop programs, compare them, and submit your verdict.' },
|
|
35
|
-
},
|
|
36
|
-
],
|
|
37
|
-
});
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { defineConfig, defineTool } from '@ccdd/core';
|
|
3
|
-
|
|
4
|
-
// This factory defines a tool. It does not read the Artifact or execute an app.
|
|
5
|
-
function customTextReader() {
|
|
6
|
-
return defineTool({
|
|
7
|
-
metadata: {
|
|
8
|
-
description: 'Read the specified line range from {artifactName}.',
|
|
9
|
-
inputSchema: {
|
|
10
|
-
type: 'object',
|
|
11
|
-
properties: {
|
|
12
|
-
startLine: { type: 'integer', minimum: 1 },
|
|
13
|
-
lineCount: { type: 'integer', minimum: 1, maximum: 80 },
|
|
14
|
-
},
|
|
15
|
-
required: ['startLine', 'lineCount'],
|
|
16
|
-
additionalProperties: false,
|
|
17
|
-
} as const,
|
|
18
|
-
resultKinds: ['json'],
|
|
19
|
-
observation: 'content',
|
|
20
|
-
artifactKind: 'file',
|
|
21
|
-
},
|
|
22
|
-
async execute(context, args) {
|
|
23
|
-
// Deliberately small teaching example: it accepts files up to 1 MiB.
|
|
24
|
-
const file = await context.resolvePath();
|
|
25
|
-
const bytes = await readFile(file, { signal: context.signal });
|
|
26
|
-
if (bytes.length > 1024 * 1024) throw new Error('This example reader supports files up to 1 MiB.');
|
|
27
|
-
const text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes);
|
|
28
|
-
if (text.includes('\0')) throw new Error('This example reader accepts text, not binary data.');
|
|
29
|
-
const lines = text.match(/[^\n]*\n|[^\n]+$/g) ?? [];
|
|
30
|
-
const offset = args.startLine - 1;
|
|
31
|
-
const selected = lines.slice(offset, offset + args.lineCount);
|
|
32
|
-
const content = selected.join('');
|
|
33
|
-
if (Buffer.byteLength(content) > 64 * 1024) throw new Error('Select a smaller line range.');
|
|
34
|
-
const nextOffset = offset + selected.length;
|
|
35
|
-
return {
|
|
36
|
-
content: [{ type: 'json', data: {
|
|
37
|
-
content,
|
|
38
|
-
startLine: args.startLine,
|
|
39
|
-
endLine: selected.length ? nextOffset : null,
|
|
40
|
-
lineCount: selected.length,
|
|
41
|
-
totalLines: lines.length,
|
|
42
|
-
nextStartLine: nextOffset < lines.length ? nextOffset + 1 : null,
|
|
43
|
-
} }],
|
|
44
|
-
...(selected.length ? { observation: { kind: 'content' as const } }
|
|
45
|
-
: lines.length === 0 ? { observation: { kind: 'empty' as const } } : {}),
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export default defineConfig(() => ({
|
|
52
|
-
artifactTypes: {
|
|
53
|
-
document: { agentTools: { read: customTextReader() } },
|
|
54
|
-
},
|
|
55
|
-
artifacts: {
|
|
56
|
-
why: { type: 'document', path: 'why.md', basis: true },
|
|
57
|
-
spec: { type: 'document', path: 'spec.md' },
|
|
58
|
-
},
|
|
59
|
-
critics: [{
|
|
60
|
-
id: 'spec-why', title: 'Does Spec match Why?', target: 'spec', deps: ['why'],
|
|
61
|
-
profile: { kind: 'agent', provider: 'openai-codex', model: 'gpt-6-astra', reasoning: 'medium' },
|
|
62
|
-
payload: { instruction: 'Read both documents and evaluate whether Spec satisfies the maximum task count in Why.' },
|
|
63
|
-
}],
|
|
64
|
-
}));
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
# Review generated scenario data
|
|
2
|
-
|
|
3
|
-
This example captures two JSON scenarios as independent generated Artifacts. The scenario files are sample evidence for demonstrating review mechanics, not recorded product tests. Each Human Critic must inspect an overview and every listed detail, then make an actual judgment.
|
|
4
|
-
|
|
5
|
-
`scenarioSource.prepare` reads a file from the captured project through `context.resolvePath`. It returns structured data directly; CCDD persists the fixed value outside the reviewed workspace. The source does no generation, so it declares `preparation: 'read-only'` and supports `status` and `plan`.
|
|
6
|
-
|
|
7
|
-
The explicitly registered `overview` and `detail` tools use `context.readData()`. Each call receives a copy of the recorded value, including after worker restart. The full scenario determines identity even when a tool only returns one field. Initial prompts and monitor scope metadata do not contain that data.
|
|
8
|
-
|
|
9
|
-
## Run the example
|
|
10
|
-
|
|
11
|
-
Use Node 22 LTS, at least 22.19.0. These APIs require CCDD 3.2.0 or later. From the source repository, build and pack core and project:
|
|
12
|
-
|
|
13
|
-
```sh
|
|
14
|
-
npm ci
|
|
15
|
-
npm run build
|
|
16
|
-
CCDD_GENERATED_PACKAGES=$(mktemp -d /tmp/ccdd-generated-packages.XXXXXX)
|
|
17
|
-
npm pack --ignore-scripts --pack-destination "$CCDD_GENERATED_PACKAGES"
|
|
18
|
-
npm pack --ignore-scripts --workspace @ccdd/project --pack-destination "$CCDD_GENERATED_PACKAGES"
|
|
19
|
-
|
|
20
|
-
CCDD_GENERATED_EXAMPLE=$(mktemp -d /tmp/ccdd-generated-example.XXXXXX)
|
|
21
|
-
cp -R examples/generated-artifacts "$CCDD_GENERATED_EXAMPLE/project"
|
|
22
|
-
cd "$CCDD_GENERATED_EXAMPLE/project"
|
|
23
|
-
npm init -y
|
|
24
|
-
npm pkg set type=module
|
|
25
|
-
npm install --ignore-scripts "$CCDD_GENERATED_PACKAGES"/*.tgz
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Inspect the current input and execute the two data tools without starting a review:
|
|
29
|
-
|
|
30
|
-
```sh
|
|
31
|
-
npx ccdd-project plan checkout
|
|
32
|
-
npx ccdd-project tools check --artifact checkout --for human --tool overview --execute
|
|
33
|
-
npx ccdd-project tools check --artifact checkout --for human --tool detail --execute --args '{"id":"summary"}'
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
These tool diagnostics prepare a new snapshot and report actual tool results. They do not create a verdict or demonstrate that the scenario passes its Critic.
|
|
37
|
-
|
|
38
|
-
Request both Human reviews and open the monitor:
|
|
39
|
-
|
|
40
|
-
```sh
|
|
41
|
-
npx ccdd-project verify --all --human-inbox
|
|
42
|
-
npx ccdd-project monitor
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Open the printed local address, choose the project and a Human request, and claim it. Execute `overview`, then call `detail` for every returned detail ID. Submit your verdict with a summary and evidence citing those IDs. Repeat for the other scenario. See the [Human reviewer guide](../../docs/reviewers.md#ask-a-person-to-review) for the claim and submission workflow.
|
|
46
|
-
|
|
47
|
-
The tools are also registered for Agents. To use them, change the desired Critic to an explicitly supported Agent profile and supply credentials as described in the [reviewer guide](../../docs/reviewers.md). An Agent review makes actual Provider calls. Runtime Critics do not support generated Artifact scopes.
|
|
48
|
-
|
|
49
|
-
## Inspect reuse
|
|
50
|
-
|
|
51
|
-
After completing real reviews, run `npx ccdd-project status`. Edit a detail in `scenarios/checkout.json` and run `npx ccdd-project plan --all`. Checkout now has changed input; an applicable passing search review can remain reusable because its captured data and Critic definition are unchanged. Changing an unread detail also changes checkout identity. Restoring equivalent checkout data can reuse its applicable historical evidence, subject to the existing latest-verdict and dependency rules.
|
|
52
|
-
|
|
53
|
-
Changing whitespace or object-key order preserves canonical JSON identity. Array order remains significant. Keep changing scenario data in these source files rather than importing it into shared config: imported config module changes conservatively affect effective Critic definitions.
|
|
54
|
-
|
|
55
|
-
See [generated Artifact contracts](../../docs/generated-artifacts.md) for identity strategies, canonicalization, size limits, preparation policy, and reopening behavior.
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
-
import { defineArtifactSource, defineConfig, defineDataTool } from '@ccdd/core';
|
|
3
|
-
import type { JsonValue } from '@ccdd/core';
|
|
4
|
-
|
|
5
|
-
function scenarioData(value: JsonValue) {
|
|
6
|
-
if (!value || typeof value !== 'object' || Array.isArray(value)
|
|
7
|
-
|| typeof value.name !== 'string' || typeof value.objective !== 'string'
|
|
8
|
-
|| !Array.isArray(value.criteria) || value.criteria.some(item => typeof item !== 'string')
|
|
9
|
-
|| !Array.isArray(value.details) || value.details.some(item => !item || typeof item !== 'object'
|
|
10
|
-
|| Array.isArray(item) || typeof item.id !== 'string' || typeof item.observation !== 'string')) {
|
|
11
|
-
throw new Error('Expected a scenario with name, objective, criteria, and identified details.');
|
|
12
|
-
}
|
|
13
|
-
return value as { name: string; objective: string; criteria: string[]; details: { id: string; observation: string }[] };
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const scenarioSource = defineArtifactSource({
|
|
17
|
-
metadata: {
|
|
18
|
-
preparation: 'read-only',
|
|
19
|
-
identity: { kind: 'canonical-data', namespace: 'example/scenario', version: '1' },
|
|
20
|
-
},
|
|
21
|
-
async prepare(context) {
|
|
22
|
-
if (typeof context.params !== 'string') throw new Error('Expected a scenario file path.');
|
|
23
|
-
const data: JsonValue = JSON.parse(await readFile(await context.resolvePath(context.params), 'utf8'));
|
|
24
|
-
scenarioData(data);
|
|
25
|
-
return { data };
|
|
26
|
-
},
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
const overview = defineDataTool({
|
|
30
|
-
metadata: {
|
|
31
|
-
description: 'Read the objective, criteria, and available detail IDs of {artifactName}.',
|
|
32
|
-
inputSchema: { type: 'object', properties: {}, additionalProperties: false },
|
|
33
|
-
resultKinds: ['json'],
|
|
34
|
-
observation: 'content',
|
|
35
|
-
},
|
|
36
|
-
execute(context) {
|
|
37
|
-
const data = scenarioData(context.readData());
|
|
38
|
-
return {
|
|
39
|
-
content: [{ type: 'json', data: {
|
|
40
|
-
name: data.name, objective: data.objective, criteria: data.criteria,
|
|
41
|
-
detailIds: data.details.map(detail => detail.id),
|
|
42
|
-
} }],
|
|
43
|
-
observation: { kind: 'content' },
|
|
44
|
-
};
|
|
45
|
-
},
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
const detail = defineDataTool({
|
|
49
|
-
metadata: {
|
|
50
|
-
description: 'Read one identified detail from the captured {artifactName} scenario.',
|
|
51
|
-
inputSchema: {
|
|
52
|
-
type: 'object', properties: { id: { type: 'string', minLength: 1 } },
|
|
53
|
-
required: ['id'], additionalProperties: false,
|
|
54
|
-
},
|
|
55
|
-
resultKinds: ['json'],
|
|
56
|
-
observation: 'content',
|
|
57
|
-
},
|
|
58
|
-
execute(context, args) {
|
|
59
|
-
const found = scenarioData(context.readData()).details.find(item => item.id === args.id);
|
|
60
|
-
if (!found) throw new Error('Unknown scenario detail.');
|
|
61
|
-
return { content: [{ type: 'json', data: found }], observation: { kind: 'content' } };
|
|
62
|
-
},
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
export default defineConfig({
|
|
66
|
-
artifactSources: { scenario: scenarioSource },
|
|
67
|
-
artifactTypes: {
|
|
68
|
-
scenario: { agentTools: { overview, detail }, humanTools: { overview, detail } },
|
|
69
|
-
},
|
|
70
|
-
artifacts: {
|
|
71
|
-
checkout: { kind: 'generated', type: 'scenario', source: 'scenario', params: 'scenarios/checkout.json' },
|
|
72
|
-
search: { kind: 'generated', type: 'scenario', source: 'scenario', params: 'scenarios/search.json' },
|
|
73
|
-
},
|
|
74
|
-
critics: [
|
|
75
|
-
{
|
|
76
|
-
id: 'checkout-review', title: 'Review the checkout scenario', target: 'checkout', deps: [],
|
|
77
|
-
profile: { kind: 'human' },
|
|
78
|
-
payload: { instruction: 'Read the overview of {checkout}, then inspect every listed detail. Decide whether the observations satisfy each criterion. Cite detail IDs and explain missing or contradictory evidence.' },
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
id: 'search-review', title: 'Review the search scenario', target: 'search', deps: [],
|
|
82
|
-
profile: { kind: 'human' },
|
|
83
|
-
payload: { instruction: 'Read the overview of {search}, then inspect every listed detail. Decide whether the observations satisfy each criterion. Cite detail IDs and explain missing or contradictory evidence.' },
|
|
84
|
-
},
|
|
85
|
-
],
|
|
86
|
-
});
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/examples/{generated-artifacts/scenarios/search.json → computed-views/search/scenario.json}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|