Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
e86cfc5
test(maestro-flow): add arm-neutral flow discovery (#2745)
tmatup Aug 21, 2026
8bd0eb7
test(maestro-flow): align loop-neutral task batch (#2748)
tmatup Aug 21, 2026
f0fa034
test(maestro-flow): align HITL and interactive task batch (#2749)
tmatup Aug 21, 2026
7d57a6d
test(maestro-flow): align bindings and connector features (#2750)
tmatup Aug 22, 2026
3645260
test(maestro-flow): align IxP and context-grounding tasks (#2751)
tmatup Aug 22, 2026
832ce29
test(maestro-flow): align connector trigger, e2e, edit, and evaluatio…
tmatup Aug 22, 2026
5bca8d1
test(maestro-flow): fix phase 2 contract false negatives
tmatup Aug 22, 2026
20400f9
style(maestro-flow): format alignment checks
tmatup Aug 22, 2026
bf1c11c
test(maestro-flow): accept legacy exact-match evaluators
tmatup Aug 22, 2026
086bedf
test(maestro-flow): tighten review edge cases
tmatup Aug 22, 2026
64dd458
test(maestro-flow): clarify trigger detail shape
tmatup Aug 22, 2026
264eaa5
fix(maestro-flow): align GenerateSchema eval across loops
tmatup Aug 25, 2026
8ee1c00
fix(evals): make shared grader imports sandbox-safe
tmatup Aug 25, 2026
be5c334
fix(maestro-flow): remediate live and preview eval failures (#2821)
tmatup Aug 26, 2026
0298574
fix(evals): bake released Flow SDK into shared image (#2841)
tmatup Aug 27, 2026
bfe2d32
test(maestro-flow): align Data Fabric same-ground tasks (#2846)
tmatup Aug 27, 2026
91366fd
fix(evals): point the Flow v2 preview experiment at the shared image
bai-uipath Aug 27, 2026
021b2e4
fix(maestro-flow): restore campaign CI after rebase (#2896)
tmatup Aug 29, 2026
f1a1b26
fix(maestro-case): recognize V30 stage references (#2897)
tmatup Aug 29, 2026
66c5689
test(maestro-case): make grading author-loop neutral (#2898)
tmatup Aug 29, 2026
50e5d28
test(maestro-bpmn): accept message summary events (#2899)
tmatup Aug 29, 2026
5265245
fix(maestro-bpmn): accept registry-native agent jobs (#2901)
tmatup Aug 29, 2026
ee05a86
Accept the SDK default for optional Case tasks (#2902)
tmatup Aug 29, 2026
4bd97a7
Accept SDK-authored generic BPMN activities (#2905)
tmatup Aug 29, 2026
a58344d
Make BPMN evals author-loop neutral (#2909)
tmatup Aug 30, 2026
dd71ed3
Align Case evals across authoring loops (#2911)
tmatup Aug 30, 2026
f0eb75a
fix(maestro-flow): make artifact discovery author-loop neutral (#2913)
tmatup Aug 30, 2026
15b9ddc
fix(maestro-flow): remove remaining arm-specific checks (#2915)
tmatup Aug 30, 2026
fd9500f
fix(maestro-flow): accept equivalent connector artifacts (#2919)
tmatup Aug 31, 2026
2b27394
fix(maestro-flow): clarify task resource scope (#2920)
tmatup Aug 31, 2026
9e6e7d8
test(skills): stabilize npm publish dry runs
tmatup Aug 31, 2026
712cade
fix(maestro-flow): accept supported Slack lookup routes (#2945)
tmatup Sep 1, 2026
00423c2
fix(maestro-flow): restore the routing tasks' loop-neutral scope clause
tmatup Sep 1, 2026
94cf258
fix(eval-image): read the connector library location from the CLI, no…
tmatup Sep 1, 2026
e1ce801
fix(maestro-flow): name the routing tasks' deliverable — the .flow ar…
tmatup Sep 1, 2026
47ad96b
fix(flow-check): classify a Completed debug with unreadable outputs a…
tmatup Sep 1, 2026
d2bd00e
fix(flow-check): name an unconfigured connector node instead of "no c…
tmatup Sep 2, 2026
e470389
fix(flow-check): carry the backend's incident details when a debug ru…
tmatup Sep 2, 2026
fd3381a
fix(jira-teardown): confirm the irreversible delete — every Jira e2e …
tmatup Sep 2, 2026
4c151dd
fix(eval-checker): discover the orchestrator-paths flow for validate …
tmatup Sep 2, 2026
20ae144
fix(flow-check): INTERIM — retry a debug once as a new import when St…
tmatup Sep 2, 2026
d41fafb
fix(flow-check): close the .uipx read handle in the interim SolutionI…
tmatup Sep 2, 2026
6fcc3ec
fix(eval-prompt): name the graded flow artifact in local_crud (SmokeE…
tmatup Sep 2, 2026
f2fe2c2
fix(eval-prompt): routing tasks say where the deliverable goes — the …
tmatup Sep 2, 2026
4104152
test(maestro-flow): keep the corpus guard exact after the 2026-09-02 …
tmatup Sep 2, 2026
1cd9372
fix(uipath-maestro-flow): route if/otherwise to a Decision, name the …
tmatup Sep 2, 2026
b792074
fix(flow-check): INTERIM Overwrite rotation also recognises the CLI's…
tmatup Sep 3, 2026
69cd581
fix(uipath-maestro-flow): put the if/otherwise → Decision routing whe…
tmatup Sep 3, 2026
a7cb7e3
fix(maestro-flow): address #2756 review (pagination gate, rotation cl…
tmatup Sep 3, 2026
7fd1a1c
test(maestro-flow): pagination gate also accepts the uip maestro regi…
tmatup Sep 3, 2026
94ceb9a
fix(preview): make preview/ a real plugin root (skills/ + .claude-plu…
tmatup Sep 4, 2026
843cb74
fix: address remaining #2756 review feedback
tmatup Sep 4, 2026
eb6192c
Merge origin/main into campaign/same-ground-expansion
tmatup Sep 4, 2026
2ccd517
Merge origin/main into campaign/same-ground-expansion
tmatup Sep 4, 2026
d136266
Merge origin/main into campaign/same-ground-expansion
tmatup Sep 4, 2026
27a8c44
Merge origin/main into campaign/same-ground-expansion
tmatup Sep 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
6 changes: 4 additions & 2 deletions .github/workflows/run-coder-eval.yml
Original file line number Diff line number Diff line change
Expand Up @@ -320,8 +320,9 @@ jobs:
echo "${{ secrets.GH_PACKAGES_TOKEN || secrets.GH_PAT }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin
docker pull "ghcr.io/uipath/coder-eval-agent:${CE_IMAGE_TAG}"

# Build the skills extension image (`@uipath/cli` + `@uipath/admin-tool`
# on top of coder-eval-agent). Matches smoke-skills.yml + daily.sh.
# Build the skills extension image (`@uipath/cli`, its tool plugins, and
# `@uipath/flow-sdk` on top of coder-eval-agent). Matches
# smoke-skills.yml + daily.sh.
- name: Build skills Docker image
env:
DOCKER_BUILDKIT: "1"
Expand All @@ -332,6 +333,7 @@ jobs:
--build-arg CODER_EVAL_IMAGE="ghcr.io/uipath/coder-eval-agent:${CE_IMAGE_TAG}" \
--secret id=npm_auth_token,env=NPM_AUTH_TOKEN \
--build-arg CLI_VERSION="${{ inputs.cli_version }}" \
--build-arg FLOW_SDK_VERSION="${{ vars.FLOW_SDK_VERSION || 'latest' }}" \
-t skills-image:latest \
-f tests/docker/Dockerfile \
.
Expand Down
14 changes: 8 additions & 6 deletions .github/workflows/smoke-skills.yml
Original file line number Diff line number Diff line change
Expand Up @@ -368,12 +368,13 @@ jobs:
echo "${{ secrets.GH_PACKAGES_TOKEN || secrets.GH_PAT }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin
docker pull ghcr.io/uipath/coder-eval-agent:${{ steps.ceref.outputs.version }}

# Build custom smoke image extending coder-eval-agent with @uipath/cli and
# every whitelisted tool plugin from GitHub Packages @dev (see
# tests/docker/Dockerfile). Every push to `cli/main` publishes a
# `-dev.<run>` prerelease under the `dev` dist-tag (cli PR #2650 renamed the
# old `alpha` tag → `dev` on 2026-06-26), so smoke tracks main — not stale
# `latest` from public npm (which lags by ~2 weeks).
# Build custom smoke image extending coder-eval-agent with @uipath/cli,
# every whitelisted tool plugin from GitHub Packages @dev, and the latest
# published @uipath/flow-sdk (see tests/docker/Dockerfile). Every push to
# `cli/main` publishes a `-dev.<run>` prerelease under the `dev` dist-tag
# (cli PR #2650 renamed the old `alpha` tag → `dev` on 2026-06-26), so
# smoke tracks main — not stale `latest` from public npm (which lags by ~2
# weeks).

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: the FLOW_SDK_VERSION pin does not reach this image.

run-coder-eval.yml:336 now passes --build-arg FLOW_SDK_VERSION="${{ vars.FLOW_SDK_VERSION || 'latest' }}", but the docker build just below (line 383) does not, so it always takes the Dockerfile default latest. Both steps tag skills-image:latest.

Effect: setting the repo variable to stop a bad SDK release pins nightly but not smoke, and the two images can silently carry different @uipath/flow-sdk versions. That is the reverse of what smoke is for.

One line, same as the other workflow:

--build-arg FLOW_SDK_VERSION="${{ vars.FLOW_SDK_VERSION || 'latest' }}" \

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 843cb74. The smoke-image build now receives the same FLOW_SDK_VERSION repository variable as the nightly image, so both builds honor a rollback pin.

- name: Build skills smoke Docker image
env:
DOCKER_BUILDKIT: "1"
Expand All @@ -382,6 +383,7 @@ jobs:
docker build \
--build-arg CODER_EVAL_IMAGE=ghcr.io/uipath/coder-eval-agent:${{ steps.ceref.outputs.version }} \
--secret id=npm_auth_token,env=NPM_AUTH_TOKEN \
--build-arg FLOW_SDK_VERSION="${{ vars.FLOW_SDK_VERSION || 'latest' }}" \
-t skills-image:latest \
-f tests/docker/Dockerfile \
.
Expand Down
20 changes: 10 additions & 10 deletions .github/workflows/sync-maestro-sdk-preview.yml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:
for skill in flow case bpmn; do
findings="$RUNNER_TEMP/maestro-$skill-verbs.ndjson"
python3 scripts/check-skill-verbs.py \
--json "preview/uipath-maestro-$skill" > "$findings"
--json "preview/skills/uipath-maestro-$skill" > "$findings"
blocking=$(jq -c \
'select(.severity=="Stale" and .matched_prefix == null)' \
"$findings" | wc -l | tr -d ' ')
Expand Down Expand Up @@ -108,16 +108,16 @@ jobs:
run: |
set -euo pipefail
if git diff --quiet -- \
preview/uipath-maestro-flow \
preview/uipath-maestro-case \
preview/uipath-maestro-bpmn; then
preview/skills/uipath-maestro-flow \
preview/skills/uipath-maestro-case \
preview/skills/uipath-maestro-bpmn; then
changed=false
else
changed=true
git diff --stat -- \
preview/uipath-maestro-flow \
preview/uipath-maestro-case \
preview/uipath-maestro-bpmn
preview/skills/uipath-maestro-flow \
preview/skills/uipath-maestro-case \
preview/skills/uipath-maestro-bpmn
fi
if [ "$changed" != "$SCRIPT_CHANGED" ]; then
echo "Sync script reported changed=$SCRIPT_CHANGED but git reported changed=$changed."
Expand Down Expand Up @@ -146,9 +146,9 @@ jobs:
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git checkout -b "$BRANCH"
git add \
preview/uipath-maestro-flow \
preview/uipath-maestro-case \
preview/uipath-maestro-bpmn
preview/skills/uipath-maestro-flow \
preview/skills/uipath-maestro-case \
preview/skills/uipath-maestro-bpmn
git commit \
-m "chore(preview): re-sync Maestro SDK skills to flow-builder-sdk@$NEW_PIN" \
-m "🤖 Generated with Claude Code
Expand Down
18 changes: 18 additions & 0 deletions .github/workflows/test-helpers.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ on:
paths:
- 'tests/tasks/uipath-maestro-flow/**'
- 'tests/tasks/uipath-maestro-case/**'
- 'tests/tasks/uipath-maestro-bpmn/**'
- 'skills/uipath-maestro-bpmn/validator/bpmn-spec.json'
- 'tests/tasks/uipath-planner/**'
- 'tests/tasks/uipath-agents/**'
- 'tests/tasks/uipath-admin/**'
Expand All @@ -15,6 +17,22 @@ on:
workflow_dispatch:

jobs:
pytest-bpmn-check:
runs-on: uipath-ubuntu-latest
name: maestro-bpmn checker unit tests
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0

- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
with:
python-version: '3.13'

- name: Install pytest
run: pip install pytest

- name: Run pytest
run: pytest tests/tasks/uipath-maestro-bpmn/ -v

pytest-flow-check:
runs-on: uipath-ubuntu-latest
name: maestro-flow checker unit tests
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/verb-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ jobs:
# verbs exactly like `skills/` ones, and a retired verb rots the same
# way in either place.
if echo "$CHANGED" | grep -qE '^(assets/uip-catalog-snapshot\.json|scripts/check-skill-verbs\.py|\.github/workflows/verb-gate\.yml)$'; then
SKILLS=$(ls -d skills/*/ preview/*/ 2>/dev/null | sed 's|/$||' | sort -u)
SKILLS=$(ls -d skills/*/ preview/skills/*/ 2>/dev/null | sed 's|/$||' | sort -u)
else
SKILLS=$(echo "$CHANGED" \
| grep -E '^(skills|preview)/[^/]+/.*\.md$' \
| sed -E 's#^((skills|preview)/[^/]+)/.*#\1#' \
| grep -E '^(skills|preview/skills)/[^/]+/.*\.md$' \
| sed -E 's#^((skills|preview/skills)/[^/]+)/.*#\1#' \
| sort -u || true)
fi

Expand Down
6 changes: 3 additions & 3 deletions CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
/skill-flavors/studioweb/ @astridstaicu

# preview skills
/preview/uipath-maestro-flow/ @UiPath/maestro-cli-team
/preview/uipath-maestro-case/ @UiPath/maestro-cli-team
/preview/uipath-maestro-bpmn/ @UiPath/maestro-cli-team
/preview/skills/uipath-maestro-flow/ @UiPath/maestro-cli-team
/preview/skills/uipath-maestro-case/ @dmetzgar @tmatup
/preview/skills/uipath-maestro-bpmn/ @UiPath/maestro-cli-team

# Activity references (bundled inside uipath-rpa skill)
/skills/uipath-rpa/references/activity-docs/ @DragosUnguru
Expand Down
9 changes: 9 additions & 0 deletions preview/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "uipath-preview",
"version": "0.1.0",
"description": "UiPath Maestro preview skills — the builder-SDK authoring path for uipath-maestro-{flow,case,bpmn}. Synced from UiPath/flow-builder-sdk by scripts/sync-maestro-sdk-preview.mjs; loads as a Claude Code plugin root (skills/<name>/SKILL.md).",
"author": { "name": "UiPath" },
"license": "MIT",
"homepage": "https://github.com/UiPath/skills",
"repository": "https://github.com/UiPath/skills"
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
88 changes: 44 additions & 44 deletions scripts/sync-maestro-sdk-preview.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -13,31 +13,31 @@ const sourceRoot = 'typescript/sdk';
const skillMappings = [
{
source: `${sourceRoot}/skill/SKILL.md`,
target: 'preview/uipath-maestro-flow/SKILL.md',
target: 'preview/skills/uipath-maestro-flow/SKILL.md',
},
{
source: `${sourceRoot}/skill/SKILL-case.md`,
target: 'preview/uipath-maestro-case/SKILL.md',
target: 'preview/skills/uipath-maestro-case/SKILL.md',
},
{
source: `${sourceRoot}/skill/SKILL-bpmn.md`,
target: 'preview/uipath-maestro-bpmn/SKILL.md',
target: 'preview/skills/uipath-maestro-bpmn/SKILL.md',
},
];

const provenanceFiles = [
['preview/uipath-maestro-flow/SKILL.md', 'typescript/sdk/skill/SKILL.md'],
['preview/uipath-maestro-case/SKILL.md', 'typescript/sdk/skill/SKILL-case.md'],
['preview/uipath-maestro-bpmn/SKILL.md', 'typescript/sdk/skill/SKILL-bpmn.md'],
['preview/skills/uipath-maestro-flow/SKILL.md', 'typescript/sdk/skill/SKILL.md'],
['preview/skills/uipath-maestro-case/SKILL.md', 'typescript/sdk/skill/SKILL-case.md'],
['preview/skills/uipath-maestro-bpmn/SKILL.md', 'typescript/sdk/skill/SKILL-bpmn.md'],
];

const managedDirectories = [
'preview/uipath-maestro-flow/references',
'preview/uipath-maestro-flow/examples',
'preview/uipath-maestro-case/references',
'preview/uipath-maestro-case/examples',
'preview/uipath-maestro-bpmn/references',
'preview/uipath-maestro-bpmn/examples',
'preview/skills/uipath-maestro-flow/references',
'preview/skills/uipath-maestro-flow/examples',
'preview/skills/uipath-maestro-case/references',
'preview/skills/uipath-maestro-case/examples',
'preview/skills/uipath-maestro-bpmn/references',
'preview/skills/uipath-maestro-bpmn/examples',
];

const oldSiblingParagraph = [
Expand Down Expand Up @@ -190,40 +190,40 @@ function collectMappings(upstreamRoot, refs) {
'bpmn-runtime.md',
].includes(name)) continue;
const relative = path.posix.relative(referencesRoot, source);
add(source, `preview/uipath-maestro-flow/references/${relative}`);
add(source, `preview/skills/uipath-maestro-flow/references/${relative}`);
}

const flowExamplesRoot = `${sourceRoot}/example-eval`;
for (const source of gitFiles(upstreamRoot, ref, flowExamplesRoot)) {
const relative = path.posix.relative(flowExamplesRoot, source);
add(source, `preview/uipath-maestro-flow/examples/${relative}`);
add(source, `preview/skills/uipath-maestro-flow/examples/${relative}`);
}

const sharedExamplesRoot = `${sourceRoot}/example`;
for (const source of gitFiles(upstreamRoot, ref, sharedExamplesRoot)) {
const name = path.posix.basename(source);
const relative = path.posix.relative(sharedExamplesRoot, source);
if (name.endsWith('.case.ts')) {
add(source, `preview/uipath-maestro-case/examples/${relative}`);
add(source, `preview/skills/uipath-maestro-case/examples/${relative}`);
} else if (relative === 'case-bindings.json') {
add(source, 'preview/uipath-maestro-case/examples/bindings.json');
add(source, 'preview/skills/uipath-maestro-case/examples/bindings.json');
} else if (name.endsWith('.bpmn.ts')) {
add(source, `preview/uipath-maestro-bpmn/examples/${relative}`);
add(source, `preview/skills/uipath-maestro-bpmn/examples/${relative}`);
}
}
}

add(
`${sourceRoot}/skill/references/case-api.md`,
'preview/uipath-maestro-case/references/api.md',
'preview/skills/uipath-maestro-case/references/api.md',
);
add(
`${sourceRoot}/skill/references/bpmn-api.md`,
'preview/uipath-maestro-bpmn/references/api.md',
'preview/skills/uipath-maestro-bpmn/references/api.md',
);
for (const [source, target] of [
[`${sourceRoot}/skill/references/case-runtime.md`, 'preview/uipath-maestro-case/references/case-runtime.md'],
[`${sourceRoot}/skill/references/bpmn-runtime.md`, 'preview/uipath-maestro-bpmn/references/bpmn-runtime.md'],
[`${sourceRoot}/skill/references/case-runtime.md`, 'preview/skills/uipath-maestro-case/references/case-runtime.md'],
[`${sourceRoot}/skill/references/bpmn-runtime.md`, 'preview/skills/uipath-maestro-bpmn/references/bpmn-runtime.md'],
]) {
if (refs.some((ref) => gitObjectExists(upstreamRoot, ref, source))) add(source, target);
}
Expand Down Expand Up @@ -406,13 +406,13 @@ function adaptBpmnRuntime(text) {
}

const snapshotAdaptations = new Map([
['preview/uipath-maestro-flow/SKILL.md', adaptFlowSkill],
['preview/uipath-maestro-case/SKILL.md', adaptCaseSkill],
['preview/uipath-maestro-bpmn/SKILL.md', adaptBpmnSkill],
['preview/uipath-maestro-flow/references/api.md', adaptFlowApi],
['preview/uipath-maestro-case/examples/NotifyOnApproval.case.ts', adaptCaseExample],
['preview/uipath-maestro-case/references/case-runtime.md', adaptCaseRuntime],
['preview/uipath-maestro-bpmn/references/bpmn-runtime.md', adaptBpmnRuntime],
['preview/skills/uipath-maestro-flow/SKILL.md', adaptFlowSkill],
['preview/skills/uipath-maestro-case/SKILL.md', adaptCaseSkill],
['preview/skills/uipath-maestro-bpmn/SKILL.md', adaptBpmnSkill],
['preview/skills/uipath-maestro-flow/references/api.md', adaptFlowApi],
['preview/skills/uipath-maestro-case/examples/NotifyOnApproval.case.ts', adaptCaseExample],
['preview/skills/uipath-maestro-case/references/case-runtime.md', adaptCaseRuntime],
['preview/skills/uipath-maestro-bpmn/references/bpmn-runtime.md', adaptBpmnRuntime],
]);

function snapshotAdaptationFor(target) {
Expand Down Expand Up @@ -470,10 +470,10 @@ function verifySkillBody(skillsRoot, upstreamRoot, newCommit, target, source, ad

function verifyExactMappings(skillsRoot, upstreamRoot, newCommit, mappings) {
const adaptedTargets = new Map([
['preview/uipath-maestro-flow/references/api.md', adaptFlowApi],
['preview/uipath-maestro-case/examples/NotifyOnApproval.case.ts', adaptCaseExample],
['preview/uipath-maestro-case/references/case-runtime.md', adaptCaseRuntime],
['preview/uipath-maestro-bpmn/references/bpmn-runtime.md', adaptBpmnRuntime],
['preview/skills/uipath-maestro-flow/references/api.md', adaptFlowApi],
['preview/skills/uipath-maestro-case/examples/NotifyOnApproval.case.ts', adaptCaseExample],
['preview/skills/uipath-maestro-case/references/case-runtime.md', adaptCaseRuntime],
['preview/skills/uipath-maestro-bpmn/references/bpmn-runtime.md', adaptBpmnRuntime],
]);
const skillTargets = new Set(skillMappings.map(({ target }) => target));
for (const mapping of mappings) {
Expand All @@ -492,7 +492,7 @@ function verifyExactMappings(skillsRoot, upstreamRoot, newCommit, mappings) {

function verifyFrontmatterAndPins(skillsRoot, newPin) {
for (const skill of ['flow', 'case', 'bpmn']) {
const target = `preview/uipath-maestro-${skill}/SKILL.md`;
const target = `preview/skills/uipath-maestro-${skill}/SKILL.md`;
const text = readText(path.join(skillsRoot, target));
const frontmatter = text.match(/^---\n([\s\S]*?)\n---\n/);
if (!frontmatter) fail(`${target} is missing YAML frontmatter`);
Expand All @@ -510,7 +510,7 @@ function verifyFrontmatterAndPins(skillsRoot, newPin) {

function verifyDeadLinks(skillsRoot) {
for (const skill of ['flow', 'case', 'bpmn']) {
const skillRoot = path.join(skillsRoot, `preview/uipath-maestro-${skill}`);
const skillRoot = path.join(skillsRoot, `preview/skills/uipath-maestro-${skill}`);
const documents = [path.join(skillRoot, 'SKILL.md')];
documents.push(
...walkFiles(path.join(skillRoot, 'references')).filter((file) => file.endsWith('.md')),
Expand Down Expand Up @@ -545,7 +545,7 @@ function routerRows(text) {
}

function verifyRouter(skillsRoot, upstreamRoot, newCommit) {
const target = readText(path.join(skillsRoot, 'preview/uipath-maestro-flow/SKILL.md'));
const target = readText(path.join(skillsRoot, 'preview/skills/uipath-maestro-flow/SKILL.md'));
const source = gitShow(upstreamRoot, newCommit, `${sourceRoot}/skill/SKILL.md`).toString('utf8');
const rows = routerRows(target);
const sourceRows = routerRows(source);
Expand All @@ -555,19 +555,19 @@ function verifyRouter(skillsRoot, upstreamRoot, newCommit) {
for (const row of rows) {
const reference = row.match(/\]\(references\/([^)]+)\)/)?.[1];
const example = row.match(/`examples\/([^`]+)`/)?.[1];
if (!reference || !fs.existsSync(path.join(skillsRoot, 'preview/uipath-maestro-flow/references', reference))) {
if (!reference || !fs.existsSync(path.join(skillsRoot, 'preview/skills/uipath-maestro-flow/references', reference))) {
fail(`Flow router row has a missing reference: ${row}`);
}
if (!example || !fs.existsSync(path.join(skillsRoot, 'preview/uipath-maestro-flow/examples', example))) {
if (!example || !fs.existsSync(path.join(skillsRoot, 'preview/skills/uipath-maestro-flow/examples', example))) {
fail(`Flow router row has a missing example: ${row}`);
}
}
}

function verifyStalePaths(skillsRoot) {
const flow = readText(path.join(skillsRoot, 'preview/uipath-maestro-flow/SKILL.md'));
const caseSkill = readText(path.join(skillsRoot, 'preview/uipath-maestro-case/SKILL.md'));
const bpmn = readText(path.join(skillsRoot, 'preview/uipath-maestro-bpmn/SKILL.md'));
const flow = readText(path.join(skillsRoot, 'preview/skills/uipath-maestro-flow/SKILL.md'));
const caseSkill = readText(path.join(skillsRoot, 'preview/skills/uipath-maestro-case/SKILL.md'));
const bpmn = readText(path.join(skillsRoot, 'preview/skills/uipath-maestro-bpmn/SKILL.md'));
if (/\bexample\//.test(flow) || /references\/(?:case|bpmn)-api\.md/.test(flow)) {
fail('Flow SKILL.md contains an upstream-only path');
}
Expand All @@ -577,7 +577,7 @@ function verifyStalePaths(skillsRoot) {
if (/bpmn-api|\bexample\//.test(bpmn)) {
fail('BPMN SKILL.md contains an upstream-only path');
}
for (const file of walkFiles(path.join(skillsRoot, 'preview/uipath-maestro-case/examples'))) {
for (const file of walkFiles(path.join(skillsRoot, 'preview/skills/uipath-maestro-case/examples'))) {
if (/case-bindings|\bexample\//.test(readText(file))) {
fail(`${normalizeRelative(path.relative(skillsRoot, file))} contains an upstream-only path`);
}
Expand Down Expand Up @@ -618,23 +618,23 @@ export function verifySnapshot({ skillsRoot, upstreamRoot, newCommit, newPin, ma
skillsRoot,
upstreamRoot,
newCommit,
'preview/uipath-maestro-flow/SKILL.md',
'preview/skills/uipath-maestro-flow/SKILL.md',
`${sourceRoot}/skill/SKILL.md`,
adaptFlowSkill,
);
verifySkillBody(
skillsRoot,
upstreamRoot,
newCommit,
'preview/uipath-maestro-case/SKILL.md',
'preview/skills/uipath-maestro-case/SKILL.md',
`${sourceRoot}/skill/SKILL-case.md`,
adaptCaseSkill,
);
verifySkillBody(
skillsRoot,
upstreamRoot,
newCommit,
'preview/uipath-maestro-bpmn/SKILL.md',
'preview/skills/uipath-maestro-bpmn/SKILL.md',
`${sourceRoot}/skill/SKILL-bpmn.md`,
adaptBpmnSkill,
);
Expand Down
12 changes: 8 additions & 4 deletions skills/uipath-maestro-bpmn/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -289,10 +289,14 @@ and honestly surfaced to the user as gaps when asked.
and the process structure with the user (AskUserQuestion).
5. **The diagram is mandatory.** Import is diagram-driven — every node needs a
`BPMNShape`, every flow a `BPMNEdge`, or it will not appear on the canvas.
6. **Node type is a child element, never an attribute.** Every `uipath:activity`
/ `uipath:event` / `uipath:mapping` declares its type as
`<uipath:type value="<Type>" version="v1" />` inside the wrapper. Never write
`<uipath:activity type="…">` — the canvas will not recognize the node.
6. **Preserve the registry's node-type shape.** Most `uipath:activity` /
`uipath:event` / `uipath:mapping` templates declare their type as a nested
`<uipath:type value="<Type>" version="v1" />`. Some runtime-authored
templates use the payload's `type` attribute instead; notably,
`Orchestrator.StartAgentJob` is a direct child of `bpmn:ServiceTask` with
`<uipath:activity type="Orchestrator.StartAgentJob" version="v1">`. Both
declarations are supported. Paste the selected registry template literally
and do not normalize one form into the other.
Event extension types (`Intsvc.WaitForEvent`, `Intsvc.EventTrigger`,
`Maestro.ReceiveMessageEvent`, `Maestro.SendMessageEvent`) must use
`<uipath:event>`, including when the BPMN host is task-like such as
Expand Down
Loading
Loading