Skip to content

feat(contentunderstanding): Copilot skills for authoring custom analyzers#49672

Open
chienyuanchang wants to merge 8 commits into
mainfrom
cu-sdk/custom-analyzer-skills
Open

feat(contentunderstanding): Copilot skills for authoring custom analyzers#49672
chienyuanchang wants to merge 8 commits into
mainfrom
cu-sdk/custom-analyzer-skills

Conversation

@chienyuanchang

Copy link
Copy Markdown
Member

feat(contentunderstanding): Copilot skills for authoring custom analyzers

Summary

Adds two GitHub Copilot skills under sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/ that guide users through the iterative cycle of authoring custom Content Understanding analyzers directly inside VS Code:

Skill Use case
cu-sdk-author-analyzer Single-document-type authoring (e.g. invoices, receipts, contracts)
cu-sdk-author-analyzer-classify-route Classify-and-route pipelines for mixed-document packets (e.g. invoice + bank statement + loan application in one PDF)

Both skills delegate to a small cu-skill Maven tool under .github/skills/_shared/ that exposes three subcommands:

  • extract-layout — pulls document structure into .layout.{json,md} so Copilot has ground-truth context for schema drafting.
  • create-and-test — validates a schema locally, creates the analyzer, batch-tests inputs, prints a per-field fill-rate + avg-confidence summary, and (with --ephemeral) cleans up.
  • create-and-test-router — same loop for classify-and-route: creates N inner extractors + 1 outer classifier, wires contentCategories[*].analyzerId, runs, and prints a category-aware summary.

A pure-Java SchemaValidator (Jackson only, no com.azure.* imports) catches structural mistakes (unknown baseAnalyzerId, missing fieldSchema, malformed contentCategories routes) before a service round-trip.

This mirrors the .NET skills shipped in Azure/azure-sdk-for-net#60394 and the Python skills in Azure/azure-sdk-for-python#47218.

Live test

Tested against a real CU resource with mixed_financial_docs.pdf (an invoice + bank statement + loan application):

$ mvn -f .github/skills/_shared/pom.xml exec:java \
    -Dexec.args="extract-layout --input mixed_financial_docs.pdf --output /tmp/layout/"
[RUN ] mixed_financial_docs.pdf -> /tmp/layout/mixed_financial_docs.layout.{json,md}
[DONE] 1 ok, 0 failed
$ java -cp .github/skills/_shared/target/classes:<deps> \
    com.azure.ai.contentunderstanding.skills.Cli create-and-test \
    --schema bank_statement.schema.json \
    --input mixed_financial_docs.pdf --output /tmp/results/ \
    --reuse --ephemeral
[CREATE] analyzer_id=bank_statement.schema_9a2bf4bc
[CREATE] bank_statement.schema_9a2bf4bc ready
[ANALYZE] mixed_financial_docs.pdf -> /tmp/results/mixed_financial_docs.json
[CLEANUP] delete analyzer bank_statement.schema_9a2bf4bc

[SUMMARY]
category: (single)  (1 document)
  field                                    fill rate  avg conf
  accountHolder                            100.0%    0.960
  accountNumber                            100.0%    0.962
  beginningBalance                         100.0%    0.902
  endingBalance                            100.0%    0.902
  ...
  transactions[].deposit                   15.4%     0.880
lowest-confidence fields:
  0.587  transactions[].date  (mixed_financial_docs)

The router variant created 3 inner + 1 outer analyzer, classified 3 segments, extracted all fields, and cleaned up all 4 analyzers (~59 s end-to-end).

What's in the PR

Component LOC Notes
_shared/SchemaValidator.java 335 Pure Jackson — no com.azure.* deps; purity-guarded by a unit test
_shared/ExtractLayoutCommand.java 271 Stage 1
_shared/CreateAndTestCommand.java 712 Stage 2 (single-type)
_shared/CreateAndTestRouterCommand.java 559 Stage 2 (classify-route)
_shared/Cli.java 61 Subcommand dispatcher
_shared/pom.xml + _shared/README.md 164 Standalone Maven module; intentionally not a child of azure-client-sdk-parent and not referenced from the package POM, so zero effect on the published artifact
cu-sdk-author-analyzer/SKILL.md + template 478 Single-type SKILL
cu-sdk-author-analyzer-classify-route/SKILL.md + template 507 Classify-route SKILL
SchemaValidatorTest.java 366 18 JUnit cases, all passing
README.md +24 New "What's New" section + two new author-skill rows in the existing table
CHANGELOG.md +18 Entry under 1.1.0-beta.3 (Unreleased)
Total +3,495

Test results

$ mvn -B test
[INFO] Running com.azure.ai.contentunderstanding.skills.SchemaValidatorTest
[INFO] Tests run: 18, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.605 s
[INFO] BUILD SUCCESS

Coverage:

  • Valid single-type and classify-route schemas
  • Classify-route allows category without analyzerId (catch-all "other" bucket)
  • Unknown baseAnalyzerId rejected (catches the prebuilt-documentAnalyzer typo class)
  • Missing fieldSchema on non-classifier
  • Empty fields object, unknown field type/method
  • Nested object.properties and array.items recursion
  • Classify-route + top-level fieldSchema → rejected
  • Classify-route without enableSegment: true → rejected
  • Empty category description → rejected
  • validateFile: missing file, invalid JSON, valid round-trip
  • KNOWN_BASE_ANALYZER_IDS allow-list sanity check
  • Purity guard — fails if SchemaValidator.java ever pulls in com.azure.* / java.net.http / HttpURLConnection

Bugs fixed during live test

  1. Env var quoting.env values typically wrap in "…"; raw export keeps the quotes. Added a readEnv() helper that strips one layer of surrounding quotes (mirrors the .NET fix).
  2. DefaultAzureCredentialBuilder does not expose excludeCredentials in the Java SDK (unlike .NET). Built a focused ChainedTokenCredentialBuilder chain (EnvironmentCredentialAzureCliCredential) so the IMDS probe doesn't stall on dev boxes (~30 s wait on WSL).
  3. Output JSON shape parity — used the BinaryData protocol overload of beginAnalyzeBinary / beginCreateAnalyzer so we can keep the wire format (valueString/valueNumber/...) and unwrap the LRO envelope {id,status,result,usage} to match Python's poller.result() output and the .NET skill output.
  4. Fill-rate denominator — initial implementation used results.size() (doc count) instead of rows.size() (per-field row count), which inflated array-leaf fields to 1300%. Switched to per-field row count to match Python and .NET semantics.

Backward compatibility

No public API changes. The skills tree is opt-in tooling that lives under .github/skills/ and is only loaded by Copilot when a user explicitly asks. The cu-skill Maven module is standalone — not a child of azure-client-sdk-parent, not referenced from the package POM — so it doesn't affect normal package builds or the published azure-ai-contentunderstanding artifact.

Checklist

…nalyzers

Add two GitHub Copilot skills under .github/skills/ that guide users
through the iterative cycle of authoring custom Content Understanding
analyzers in VS Code:

- cu-sdk-author-analyzer            — single-document-type authoring
- cu-sdk-author-analyzer-classify-route — classify-and-route pipelines

Both skills delegate to a small cu-skill Maven tool under
.github/skills/_shared/ that exposes three subcommands (extract-layout,
create-and-test, create-and-test-router) and a pure-Java SchemaValidator
(no com.azure.* deps) so structural mistakes are caught before a service
round-trip.

Mirrors the .NET skills shipped in Azure/azure-sdk-for-net#60394 and
the Python skills in Azure/azure-sdk-for-python#47218.

Live-tested against a real CU resource with mixed_financial_docs.pdf:

- extract-layout produces .layout.{json,md}
- create-and-test reports per-field fill rate + avg confidence and
  cleans up the analyzer when --ephemeral is set
- create-and-test-router creates N inner + 1 outer analyzer, prints a
  category-aware summary, and cleans up all four

New unit tests:

- SchemaValidatorTest (18 cases) mirrors Python's
  test_skills_shared_schema_validator.py and the .NET
  SkillSchemaValidatorTests.cs: valid single-type and classify-route
  schemas, every rejection path, validateFile error handling,
  KNOWN_BASE_ANALYZER_IDS allow-list sanity, and a purity guard that
  fails if the validator source ever pulls in com.azure.* or HTTP
  namespaces.

README:

- New 'What's New' section and two new entries in the existing
  'GitHub Copilot Skills' table.

CHANGELOG:

- Entry under 1.1.0-beta.3 (Unreleased) describing the new skills.

Build:

- mvn -B -DskipTests compile: clean
- mvn -B test: 18/18 tests pass

The Maven module is intentionally NOT a child of azure-client-sdk-parent
and is NOT referenced from the package POM, so it has zero effect on the
published azure-ai-contentunderstanding artifact.
CI cspell check flagged abbreviated locals and a few domain acronyms
in the skill-tooling sources. Replaces them with the full words used
elsewhere in the file so the dictionary does not need a new entry.

- confs -> confidences (CreateAndTestCommand, CreateAndTestRouterCommand)
- fobj -> fieldObj, vobj -> valueObj (CreateAndTestCommand)
- IMDS -> metadata-service (ExtractLayoutCommand comment)
- prebuilts -> prebuilt analyzers (SchemaValidator javadoc)

No behavior change. All 18 unit tests still pass.
…le paths

Verify-Links flagged 15 broken relative links in the two analyzer skill
docs. The Python source skills referenced 'samples/sample_*.py' files
at the package root; the Java port mechanically copied the link
structure but the Java layout is different:

- Java samples live at src/samples/java/com/azure/ai/contentunderstanding/samples/,
  not samples/.
- Java does not have the per-sample .md companion files Python ships
  (Sample06_GetAnalyzer.md, Sample02_AnalyzeUrl.md, etc.) — only the
  .java source files.

Rewrites all 15 links to point at the correct .java source under
src/samples/java/. All 10 distinct sample files referenced were
verified to exist on disk before the rewrite.
…ts from Python

Three changes for parity with Python PR #47218:

1. **summarizeRouted denominator bug fix** (was a port-time regression).
   The denominator for a per-field fill rate must be the per-category
   segment count, NOT the per-field row count. Two invoice segments
   where only one has TotalAmount correctly reports 50% (1/2 segments),
   not 100% (1/1 rows). This matches Python and .NET; the same bug
   existed in JS and is being fixed on its PR. The comment claiming
   'Mirrors Python/.NET semantics' was misleading — fixed in this commit.

2. **New CLI-helper test classes** — CreateAndTestCommandTest and
   CreateAndTestRouterCommandTest. Together they cover the 4
   pure-helper tests Python ships (summarize leaf-row flattening,
   summarizeRouted per-category denominator, summarizeRouted zero-fill,
   wireInnerIds alias substitution). The denom regression above was
   discovered by these tests.

   Python ships 10 CLI-helper tests total; the remaining 6 either test
   argparse-specific behaviour (--help smoke, monkey-patched client)
   or test code structured differently in Java (error-tuple API), so
   they don't translate 1:1. We cover the substantive behaviour.

3. **Cross-skill SKILL.md updates** that Python's PR #47218 also
   shipped: a two-stage-pipeline section + a baseAnalyzerId table in
   cu-sdk-common-knowledge, 'Next step' cross-refs in cu-sdk-sample-run,
   and a 'step numbering is contract' callout in cu-sdk-setup.
CI cspell caught 3 occurrences in cu-sdk-common-knowledge/SKILL.md
introduced by the earlier Python cross-skill port. Also fix one
occurrence in SchemaValidatorTest.java comment that was already there
but at the same risk. Rephrase all as 'prebuilt analyzers' (matches
the surrounding prose and the phrasing already used in
SchemaValidator.java's javadoc after the earlier cspell round).
@chienyuanchang chienyuanchang marked this pull request as ready for review July 7, 2026 18:11
Copilot AI review requested due to automatic review settings July 7, 2026 18:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adds GitHub Copilot skills and a small standalone Java CLI tool to support an iterative “layout → schema → validate → create → batch test → review” workflow for authoring Azure AI Content Understanding custom analyzers (single-type and classify-and-route) directly from VS Code.

Changes:

  • Added two new Copilot skills (cu-sdk-author-analyzer, cu-sdk-author-analyzer-classify-route) plus templates to guide analyzer authoring workflows.
  • Introduced a standalone Maven module under .github/skills/_shared/ that implements the cu-skill CLI (layout extraction + create/test loops) and a pure-Jackson SchemaValidator.
  • Updated package docs (README + CHANGELOG) and cross-linked existing skills to the new authoring workflows.

Reviewed changes

Copilot reviewed 19 out of 19 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
sdk/contentunderstanding/azure-ai-contentunderstanding/README.md Adds “What’s New” highlights and documents the two new authoring skills with links.
sdk/contentunderstanding/azure-ai-contentunderstanding/CHANGELOG.md Records the addition of the new authoring skills and shared CLI tooling.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/cu-sdk-setup/SKILL.md Notes step-numbering stability as a contract for the new authoring skills to route users correctly.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/cu-sdk-sample-run/SKILL.md Adds “next step” pointers to the new authoring skills from relevant samples.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/cu-sdk-common-knowledge/SKILL.md Adds domain guidance used by authoring skills (two-stage pipeline, baseAnalyzerId rules, classify-and-route rules).
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/cu-sdk-author-analyzer/templates/schema_template.json Starter JSON schema template for single-type analyzer authoring.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/cu-sdk-author-analyzer/SKILL.md New skill that guides the single-document-type authoring loop.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/cu-sdk-author-analyzer-classify-route/templates/classifier_template.json Starter JSON schema template for outer classifier in classify-and-route.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/cu-sdk-author-analyzer-classify-route/SKILL.md New skill that guides the mixed-packet classify-and-route authoring loop.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/test/java/com/azure/ai/contentunderstanding/skills/SchemaValidatorTest.java Unit tests for the pure-Jackson SchemaValidator (including purity guard).
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/test/java/com/azure/ai/contentunderstanding/skills/CreateAndTestRouterCommandTest.java Unit tests for router summary logic and schema wiring helper.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/test/java/com/azure/ai/contentunderstanding/skills/CreateAndTestCommandTest.java Unit tests for single-type summary logic (leaf field flattening, lowest-confidence reporting).
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/main/java/com/azure/ai/contentunderstanding/skills/SchemaValidator.java Adds pure-Jackson schema validation to fail fast before service calls.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/main/java/com/azure/ai/contentunderstanding/skills/ExtractLayoutCommand.java Implements layout extraction via prebuilt-documentSearch, writing .layout.{json,md} files.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/main/java/com/azure/ai/contentunderstanding/skills/CreateAndTestRouterCommand.java Implements create/test loop for classify-and-route (N inner + 1 outer) and category-aware summary.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/main/java/com/azure/ai/contentunderstanding/skills/CreateAndTestCommand.java Implements create/test loop for single-type analyzers and per-field summary output.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/src/main/java/com/azure/ai/contentunderstanding/skills/Cli.java Adds CLI subcommand dispatcher for the cu-skill tool.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/README.md Documents _shared as a library/tooling directory (not a skill), with build/run instructions.
sdk/contentunderstanding/azure-ai-contentunderstanding/.github/skills/_shared/pom.xml Adds standalone Maven module definition for building and running the cu-skill CLI.

… template

The template comment referenced create_and_test.py — the Python
source-of-truth filename copied into the port. In this Java skill, the
concrete tool is the cu-skill Maven module under .github/skills/_shared/,
so the template now references the create-and-test skill script and points
readers at the tool directory.

Same drift being fixed in the parallel .NET (#60394) and JS (#39137) PRs.
No functional or public-API change.
Addresses all 9 comments from the Copilot code reviewer on #49672.

Correctness fixes:

1. CreateAndTestRouterCommand: rewrite wireInnerIds() to fix a bug
   introduced by keying the alias lookup on the *category name* instead
   of on the *analyzerId value*. Previous behavior:
     contentCategories:
       loan:
         analyzerId: loan_application   <- looked up by "loan", missed
   caused wireInnerIds to silently leave the placeholder in place when
   the category name and analyzerId value differed.

   New behavior mirrors Python (_patch_outer_analyzer_ids) and .NET
   (WireInnerIds):
     - Skip categories that omit analyzerId (classification-only bucket).
     - Skip analyzerId values that start with "prebuilt-" — those are
       Azure-side prebuilts and don't need an --inner-schema.
     - Any other value must match an alias in aliasToId; otherwise
       return a validation error naming the missing alias + category.
     - Every alias in aliasToId must be referenced by some category
       (typo check); otherwise return an "unused" error.

   Signature changed from `ObjectNode wireInnerIds(...)` to
   `WireResult wireInnerIds(...)` where WireResult carries both the
   patched schema and any errors. Caller now checks errors before
   proceeding with analyzer creation.

   Removed the old "cross-check" block in run() — wireInnerIds() now
   handles that check in one place with the correct behavior.

Compile-error fixes (High):

2. CreateAndTestRouterCommand.java: drop unused imports
   com.azure.core.util.polling.SyncPoller and
   com.azure.core.util.BinaryData.

3. CreateAndTestCommand.java: drop unused import java.util.HashMap.

Documentation fixes (Medium — .NET-copy-paste drift):

4. cu-sdk-author-analyzer/SKILL.md — prerequisites: "built DLL" wording
   was copied from the .NET port. Java runs the tool via Maven, so
   changed to "Maven + JDK 17+".

5. cu-sdk-author-analyzer-classify-route/SKILL.md — same fix.

6. cu-sdk-author-analyzer/SKILL.md — cp path used the .NET package
   name (Azure.AI.ContentUnderstanding); changed to the Java package
   name (azure-ai-contentunderstanding).

7. cu-sdk-author-analyzer-classify-route/SKILL.md — same fix.

8. cu-sdk-author-analyzer/SKILL.md — reference to
   `AnalysisResultExtensions.ToLlmInput` (a .NET name) changed to
   `LlmInputHelper.toLlmInput` which is the actual Java sample name.

9. cu-sdk-author-analyzer-classify-route/SKILL.md — same fix.

Test coverage:

Rewrote wireInnerIdsSubstitutesMatchingAliases with category names
deliberately different from analyzerId values (catches the
category-name-vs-alias-value regression) and added:

- wireInnerIdsKeepsPrebuiltAnalyzerIdsAsIs (prebuilt-invoice etc.
  bypass the aliasToId check)
- wireInnerIdsReportsMissingAliasAsError
- wireInnerIdsReportsUnusedAliasAsError
- wireInnerIdsAllowsCategoriesWithoutAnalyzerId ("other" catch-all
  bucket must not error)

Verified: mvn -B test in .github/skills/_shared/ passes 26/26.
chienyuanchang added a commit to Azure/azure-sdk-for-js that referenced this pull request Jul 7, 2026
Ports the correctness fix from the sibling Java PR (Azure/azure-sdk-for-java#49672,
bca631f00b4) to the JS skill.

Bug: wireInnerIds keyed the alias lookup on the *category name* instead
of on the *analyzerId value*, so a schema like

  contentCategories:
    loan_bucket:
      analyzerId: loan_application

silently left the placeholder in place because `aliasToId.has("loan_bucket")`
returned false even when `aliasToId.has("loan_application")` was true.
The cross-check in runCreateAndTestRouter had the same defect and also
rejected valid `prebuilt-*` values (Azure service prebuilts don't need
an --inner-schema).

New behavior mirrors Python (_patch_outer_analyzer_ids), .NET (WireInnerIds),
and Java (WireResult):

- Skip categories that omit analyzerId (classification-only "other" bucket).
- Skip analyzerId values that start with "prebuilt-" (service prebuilts).
- Any other value must match an alias in aliasToId; otherwise return an
  error naming the missing alias + category.
- Every alias in aliasToId must be referenced by some category (typo
  check); otherwise return an "unused" error.

Signature changed from `wireInnerIds(...) -> Record<string, unknown>` to
`wireInnerIds(...) -> WireResult` where WireResult carries both patched
schema and any errors. Caller in runCreateAndTestRouter now checks
errors before proceeding.

Test coverage: rewrote wireInnerIdsSubstitutesMatchingAliases with
category names deliberately different from analyzerId values, and added:
- keeps 'prebuilt-*' analyzerId values as-is
- returns error for unknown alias
- returns error for unused alias
- allows categories without analyzerId

Verified: `npm test` in .github/skills/_shared/ passes 27/27 (up from 23).
@chienyuanchang

Copy link
Copy Markdown
Member Author

Thanks Copilot. Pushed bca631f which addresses all 9 comments.

Correctness fixes

  1. Router alias cross-check (wireInnerIds) — this was a real bug and worth calling out. The old code keyed the alias lookup on the category name instead of the analyzerId value, so a schema like

    contentCategories:
      loan_bucket:
        analyzerId: loan_application

    silently left the placeholder in place because aliasToSchema.containsKey("loan_bucket") returned false even when aliasToSchema.containsKey("loan_application") was true. The same defect existed in the run() cross-check and also rejected valid prebuilt-* values.

    Rewrote wireInnerIds to return WireResult (patched + errors), matching Python's _patch_outer_analyzer_ids and .NET's WireInnerIds:

    • Skip categories with no analyzerId (classification-only "other" bucket).
    • Skip analyzerId values starting with "prebuilt-" — service prebuilts don't need an --inner-schema.
    • Any other value must match an alias in aliasToId; otherwise error out naming the missing alias + category.
    • Every alias in aliasToId must be used (typo check); otherwise error out on the unused one.

    Dropped the redundant cross-check block in run().

    Ported the same fix to the sibling JS PR (feat(contentunderstanding): Copilot skills for authoring custom analyzers azure-sdk-for-js#39137 → ba7c3083d8d) since it had the exact same bug.

Compile-error fixes

  1. Removed unused imports SyncPoller + BinaryData from CreateAndTestRouterCommand.java.
  2. Removed unused import HashMap from CreateAndTestCommand.java.

Documentation fixes (.NET → Java copy-paste drift)

4, 5. Prerequisites: Azure.AI.ContentUnderstanding DLL wording → Maven + JDK 17+ in both SKILL.md files.
6, 7. cp paths: Azure.AI.ContentUnderstandingazure-ai-contentunderstanding in both SKILL.md files.
8, 9. AnalysisResultExtensions.ToLlmInputLlmInputHelper.toLlmInput in both SKILL.md files.

Test coverage

Rewrote wireInnerIdsSubstitutesMatchingAliases with category names deliberately different from analyzerId values (catches the regression) and added:

  • wireInnerIdsKeepsPrebuiltAnalyzerIdsAsIs
  • wireInnerIdsReportsMissingAliasAsError
  • wireInnerIdsReportsUnusedAliasAsError
  • wireInnerIdsAllowsCategoriesWithoutAnalyzerId

Verified: mvn -B test in .github/skills/_shared/ passes 26/26 (up from 22).

Audit turned up 3 places in the Java port where the Python-source
filename `samples/sample_update_defaults.py` was left in place:

  - schema_template.json (`models._comment`)
  - classifier_template.json (`models._comment`)
  - CreateAndTestCommand.java (a user-facing [WARN] on missing
    models.completion)

Replaced with `Sample00_UpdateDefaultsAsync`, the actual Java sample
that configures resource-level model defaults (matching the link
convention already used in the SKILL.md files). Same drift exists in
the sibling .NET and JS PRs and is being fixed there too.

Verified: `mvn -B test` in .github/skills/_shared/ still 26/26 passing.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 19 out of 19 changed files in this pull request and generated 5 comments.

Comment on lines +85 to +98
if (opts.schemaDir != null) {
Path dir = Paths.get(opts.schemaDir);
if (!Files.isDirectory(dir)) {
System.err.println("--schema-dir is not a directory: " + dir);
return 2;
}
try (var stream = Files.list(dir)) {
stream
.filter(p -> p.getFileName().toString().endsWith(".json"))
.sorted()
.forEach(p -> aliasToPath.putIfAbsent(
stripExtension(p.getFileName().toString()), p));
}
}
Comment on lines +228 to +236
case "--input":
input = args[++i];
break;
case "--output":
output = args[++i];
break;
case "--analyzer-id":
analyzerId = args[++i];
break;
Comment on lines +580 to +594
case "--schema":
o.schema = args[++i];
break;
case "--input":
o.input = args[++i];
break;
case "--output":
o.output = args[++i];
break;
case "--analyzer-id":
o.analyzerId = args[++i];
break;
case "--iterations":
o.iterations = Integer.parseInt(args[++i]);
break;
Comment on lines +524 to +541
case "--outer-schema":
o.outerSchema = args[++i];
break;
case "--inner-schema":
o.innerSchemas.add(args[++i]);
break;
case "--schema-dir":
o.schemaDir = args[++i];
break;
case "--input":
o.input = args[++i];
break;
case "--output":
o.output = args[++i];
break;
case "--analyzer-id":
o.analyzerId = args[++i];
break;
Comment on lines +39 to +42
<!-- Skip Checkstyle / SpotBugs / javadoc enforcement; this is internal tooling. -->
<checkstyle.skip>true</checkstyle.skip>
<spotbugs.skip>true</spotbugs.skip>
<maven.javadoc.skip>true</maven.javadoc.skip>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants