Skip to content

Plugin#22

Merged
CameronCarlin merged 13 commits intomainfrom
plugin
Mar 23, 2026
Merged

Plugin#22
CameronCarlin merged 13 commits intomainfrom
plugin

Conversation

@CameronCarlin
Copy link
Copy Markdown
Contributor

@CameronCarlin CameronCarlin commented Mar 23, 2026

Adding 2 new plugins and rearranging the layout for the repo.


Summary by cubic

Adds two interactive builder plugins to speed up Falcon connector development and updates examples and docs. Recent fixes polish plugin manifests, commands, and the new-user flow.

  • New Features

    • stackone-connector-builder: end-to-end wizard for setup, auth, action discovery (scoped/max), YAML generation, validation, and live testing with cleanup.
    • stackone-unified-builder: guides schema selection/import, connector setup, action scoping, field mapping, validation, and testing; integrates /import-schema (CSV/JSON/YAML) into the choose-schema flow; adds unified schema references (HRIS/ATS/CRM/LMS/IAM/Accounting/Ticketing/Documents/Marketing).
    • Examples split for clarity: Ashby ATS candidates and BambooHR unified employees. Added .claude/settings.local.json with MCP permissions; simplified CLAUDE.md into a Falcon connector template; removed obsolete docs/plans.
  • Bug Fixes

    • Fixed plugin manifests and SKILL invocations; corrected command names (/build-connector, /build-unified-connector) and auto-trigger behavior.
    • Improved session handling and CLI fallback paths; collapsed inline schema path into /import-schema for a simpler choose-schema experience.
    • General plugin stability fixes for new users.

Written for commit 27c4f04. Summary will update on new commits.

Copilot AI review requested due to automatic review settings March 23, 2026 10:13
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds Claude Code plugins for building StackOne Falcon connectors (generic + unified) and introduces new example connector configurations (BambooHR, Ashby) alongside bundled schema/reference documentation used by the plugins.

Changes:

  • Add stackone-unified-builder and stackone-connector-builder plugins (skills + references) under .claude/plugins/.
  • Add new example connector YAMLs for BambooHR and Ashby under examples/.
  • Add local Claude settings/permissions config for tool access.

Reviewed changes

Copilot reviewed 45 out of 45 changed files in this pull request and generated 7 comments.

Show a summary per file
File Description
examples/bamboo-hr/bamboo-hr.employees.s1.partial.yaml Adds BambooHR employee actions (list/get/create/update/terminate) with mapping/typecasting steps.
examples/bamboo-hr/bamboo-hr.connector.s1.yaml Adds BambooHR connector definition (baseUrl + auth + actions ref).
examples/ashby/ashby.connector.s1.yaml Adds Ashby connector definition (baseUrl + auth + action ref).
.claude/settings.local.json Adds Claude local tool-permissions configuration.
.claude/plugins/stackone-unified-builder/skills/validate-connector/SKILL.md Adds unified-builder validation skill docs and checklist.
.claude/plugins/stackone-unified-builder/skills/test-connector/SKILL.md Adds unified-builder live testing skill docs.
.claude/plugins/stackone-unified-builder/skills/stackone-unified-builder/SKILL.md Adds unified-builder top-level wizard skill docs.
.claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md Adds unified-builder action scoping skill docs.
.claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md Adds unified-builder field mapping skill docs.
.claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md Adds unified-builder schema import skill docs.
.claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md Adds unified-builder schema selection skill docs.
.claude/plugins/stackone-unified-builder/skills/check-connector/SKILL.md Adds unified-builder connector existence/CLI check skill docs.
.claude/plugins/stackone-unified-builder/references/unified-schemas.md Adds category index for unified schema references.
.claude/plugins/stackone-unified-builder/references/schemas/marketing.md Adds Marketing schema reference doc.
.claude/plugins/stackone-unified-builder/references/schemas/lms.md Adds LMS schema reference doc.
.claude/plugins/stackone-unified-builder/references/schemas/iam.md Adds IAM schema reference doc.
.claude/plugins/stackone-unified-builder/references/schemas/documents.md Adds Documents schema reference doc.
.claude/plugins/stackone-unified-builder/references/schemas/crm.md Adds CRM schema reference doc.
.claude/plugins/stackone-unified-builder/references/schemas/accounting.md Adds Accounting schema reference doc.
.claude/plugins/stackone-unified-builder/references/field-mapping-guide.md Adds guide for writing field mappings.
.claude/plugins/stackone-unified-builder/references/connector-patterns.md Adds canonical YAML patterns for connectors/partials.
.claude/plugins/stackone-unified-builder/references/cli-commands.md Adds StackOne CLI usage reference.
.claude/plugins/stackone-unified-builder/references/auth-patterns.md Adds authentication pattern reference.
.claude/plugins/stackone-unified-builder/references/actions-and-steps.md Adds action/step DSL reference.
.claude/plugins/stackone-unified-builder/README.md Adds unified-builder plugin README.
.claude/plugins/stackone-unified-builder/.claude-plugin/plugin.json Adds unified-builder plugin manifest.
.claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md Adds generic-builder validation skill docs and checklist.
.claude/plugins/stackone-connector-builder/skills/test-connector/SKILL.md Adds generic-builder live testing + cleanup skill docs.
.claude/plugins/stackone-connector-builder/skills/stackone-connector-builder/SKILL.md Adds generic-builder top-level wizard skill docs.
.claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md Adds generic-builder setup skill docs.
.claude/plugins/stackone-connector-builder/skills/discover-actions/SKILL.md Adds generic-builder discovery skill docs.
.claude/plugins/stackone-connector-builder/skills/configure-auth/SKILL.md Adds generic-builder auth configuration skill docs.
.claude/plugins/stackone-connector-builder/skills/build-config/SKILL.md Adds generic-builder YAML generation skill docs.
.claude/plugins/stackone-connector-builder/references/connector-patterns.md Adds canonical YAML patterns for generic connectors/partials.
.claude/plugins/stackone-connector-builder/references/cli-commands.md Adds StackOne CLI usage reference (generic builder).
.claude/plugins/stackone-connector-builder/references/auth-patterns.md Adds authentication pattern reference (generic builder).
.claude/plugins/stackone-connector-builder/references/actions-and-steps.md Adds action/step DSL reference (generic builder).
.claude/plugins/stackone-connector-builder/README.md Adds generic-builder plugin README.
.claude/plugins/stackone-connector-builder/.claude-plugin/plugin.json Adds generic-builder plugin manifest.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +12 to +15
cursor:
enabled: true
pageSize: 50

Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

The cursor block uses enabled/pageSize, but the cursor configuration pattern documented in this repo uses explicit pagination settings (e.g., type, requestParam, responsePath). As written, the action also doesn’t pass any pagination params to the request, so pagination likely won’t advance. Please align the cursor block with the supported cursor schema (or remove it if the endpoint is non-paginated).

Copilot uses AI. Check for mistakes.
Comment on lines +261 to +639
- actionId: create_employee
label: Create Employee
categories:
- hris
actionType: create
description: Creates a new employee record in BambooHR.
details: Creates a new employee with the provided personal and contact details. First name and last name are required. All other fields are optional and will only be sent if provided.
resources: https://documentation.bamboohr.com/reference/post-employee
entrypointUrl: /employees
entrypointHttpMethod: post

inputs:
- name: first_name
description: The employee's first name
type: string
in: body
required: true
- name: last_name
description: The employee's last name
type: string
in: body
required: true
- name: date_of_birth
description: The employee's date of birth in YYYY-MM-DD format
type: datetime_string
in: body
required: false
- name: personal_email
description: The employee's personal email address
type: string
in: body
required: false
- name: personal_phone_number
description: The employee's personal mobile phone number
type: string
in: body
required: false
- name: start_date
description: The employee's hire date in YYYY-MM-DD format
type: datetime_string
in: body
required: false
- name: title
description: The employee's name prefix (Mr, Ms, Dr, etc.)
type: string
in: body
required: false
- name: employee_number
description: The assigned employee number or ID
type: string
in: body
required: false
- name: marital_status
description: The employee's marital status
type: string
in: body
required: false
- name: home_location
description: The employee's home address details
type: object
in: body
required: false
properties:
- name: street_1
description: First line of the home address
type: string
required: false
- name: street_2
description: Second line of the home address
type: string
required: false
- name: city
description: City of the home address
type: string
required: false
- name: zip_code
description: ZIP or postal code of the home address
type: string
required: false
- name: country
description: Country of the home address
type: string
required: false

steps:
- stepId: create_employee
description: Create new employee record in BambooHR
stepFunction:
functionName: request
parameters:
url: /employees
method: post
args:
- name: Accept
value: application/json
in: headers
- name: Content-Type
value: application/json
in: headers
- name: firstName
value: $.inputs.first_name
in: body
- name: lastName
value: $.inputs.last_name
in: body
- name: dateOfBirth
value: $.inputs.date_of_birth
in: body
condition: '{{present(inputs.date_of_birth)}}'
- name: homeEmail
value: $.inputs.personal_email
in: body
condition: '{{present(inputs.personal_email)}}'
- name: mobilePhone
value: $.inputs.personal_phone_number
in: body
condition: '{{present(inputs.personal_phone_number)}}'
- name: hireDate
value: $.inputs.start_date
in: body
condition: '{{present(inputs.start_date)}}'
- name: prefix
value: $.inputs.title
in: body
condition: '{{present(inputs.title)}}'
- name: employeeNumber
value: $.inputs.employee_number
in: body
condition: '{{present(inputs.employee_number)}}'
- name: maritalStatus
value: $.inputs.marital_status
in: body
condition: '{{present(inputs.marital_status)}}'
- name: address1
value: $.inputs.home_location.street_1
in: body
condition: '{{present(inputs.home_location.street_1)}}'
- name: address2
value: $.inputs.home_location.street_2
in: body
condition: '{{present(inputs.home_location.street_2)}}'
- name: city
value: $.inputs.home_location.city
in: body
condition: '{{present(inputs.home_location.city)}}'
- name: zipCode
value: $.inputs.home_location.zip_code
in: body
condition: '{{present(inputs.home_location.zip_code)}}'
- name: country
value: $.inputs.home_location.country
in: body
condition: '{{present(inputs.home_location.country)}}'

result:
message: Employee created successfully
data:
id: $.steps.create_employee.output.data.id

- actionId: update_employee
label: Update Employee
categories:
- hris
actionType: update
description: Updates an existing employee record in BambooHR.
details: Updates one or more fields on an existing employee. Only provided fields will be updated — all body fields are optional except the employee ID path parameter. BambooHR uses POST (not PATCH) for employee field updates.
resources: https://documentation.bamboohr.com/reference/update-employee
entrypointUrl: /employees/${inputs.id}
entrypointHttpMethod: post

inputs:
- name: id
description: The unique identifier of the employee to update
type: string
in: path
required: true
- name: first_name
description: The employee's first name
type: string
in: body
required: false
- name: last_name
description: The employee's last name
type: string
in: body
required: false
- name: date_of_birth
description: The employee's date of birth in YYYY-MM-DD format
type: datetime_string
in: body
required: false
- name: personal_email
description: The employee's personal email address
type: string
in: body
required: false
- name: personal_phone_number
description: The employee's personal mobile phone number
type: string
in: body
required: false
- name: start_date
description: The employee's hire date in YYYY-MM-DD format
type: datetime_string
in: body
required: false
- name: termination_date
description: The employee's termination date in YYYY-MM-DD format
type: datetime_string
in: body
required: false
- name: title
description: The employee's name prefix (Mr, Ms, Dr, etc.)
type: string
in: body
required: false
- name: employee_number
description: The assigned employee number or ID
type: string
in: body
required: false
- name: marital_status
description: The employee's marital status
type: string
in: body
required: false
- name: home_location
description: The employee's home address details
type: object
in: body
required: false
properties:
- name: street_1
description: First line of the home address
type: string
required: false
- name: street_2
description: Second line of the home address
type: string
required: false
- name: city
description: City of the home address
type: string
required: false
- name: zip_code
description: ZIP or postal code of the home address
type: string
required: false
- name: country
description: Country of the home address
type: string
required: false

steps:
- stepId: update_employee
description: Update employee record fields in BambooHR
stepFunction:
functionName: request
parameters:
url: /employees/${inputs.id}
method: post
args:
- name: Accept
value: application/json
in: headers
- name: Content-Type
value: application/json
in: headers
- name: firstName
value: $.inputs.first_name
in: body
condition: '{{present(inputs.first_name)}}'
- name: lastName
value: $.inputs.last_name
in: body
condition: '{{present(inputs.last_name)}}'
- name: dateOfBirth
value: $.inputs.date_of_birth
in: body
condition: '{{present(inputs.date_of_birth)}}'
- name: homeEmail
value: $.inputs.personal_email
in: body
condition: '{{present(inputs.personal_email)}}'
- name: mobilePhone
value: $.inputs.personal_phone_number
in: body
condition: '{{present(inputs.personal_phone_number)}}'
- name: hireDate
value: $.inputs.start_date
in: body
condition: '{{present(inputs.start_date)}}'
- name: terminationDate
value: $.inputs.termination_date
in: body
condition: '{{present(inputs.termination_date)}}'
- name: prefix
value: $.inputs.title
in: body
condition: '{{present(inputs.title)}}'
- name: employeeNumber
value: $.inputs.employee_number
in: body
condition: '{{present(inputs.employee_number)}}'
- name: maritalStatus
value: $.inputs.marital_status
in: body
condition: '{{present(inputs.marital_status)}}'
- name: address1
value: $.inputs.home_location.street_1
in: body
condition: '{{present(inputs.home_location.street_1)}}'
- name: address2
value: $.inputs.home_location.street_2
in: body
condition: '{{present(inputs.home_location.street_2)}}'
- name: city
value: $.inputs.home_location.city
in: body
condition: '{{present(inputs.home_location.city)}}'
- name: zipCode
value: $.inputs.home_location.zip_code
in: body
condition: '{{present(inputs.home_location.zip_code)}}'
- name: country
value: $.inputs.home_location.country
in: body
condition: '{{present(inputs.home_location.country)}}'

result:
message: Employee updated successfully
data:
id: $.inputs.id

- actionId: terminate_employee
label: Terminate Employee
categories:
- hris
actionType: delete
description: Terminates an employee in BambooHR by setting their termination date.
details: BambooHR does not support hard deletion of employee records. This action terminates an employee by setting their termination date. The employee record remains accessible in the system after termination.
resources: https://documentation.bamboohr.com/reference/update-employee
entrypointUrl: /employees/${inputs.id}
entrypointHttpMethod: post

inputs:
- name: id
description: The unique identifier of the employee to terminate
type: string
in: path
required: true
- name: termination_date
description: The termination date in YYYY-MM-DD format
type: datetime_string
in: body
required: true

steps:
- stepId: terminate_employee
description: Set termination date on employee record in BambooHR
stepFunction:
functionName: request
parameters:
url: /employees/${inputs.id}
method: post
args:
- name: Accept
value: application/json
in: headers
- name: Content-Type
value: application/json
in: headers
- name: terminationDate
value: $.inputs.termination_date
in: body

result:
message: Employee terminated successfully
data:
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

These write/terminate actions use actionType: create/update/delete but only implement a request step and return a custom result payload. In the unified-builder docs added in this PR, unified actions are expected to include the full pipeline (requestmap_fields v2 → typecast v2) and field mapping. Either convert these to actionType: custom (raw actions) or add the missing mapping/typecast steps and fieldConfigs so they behave like unified actions.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +14
{
"permissions": {
"allow": [
"mcp__stackone-agent-global__get_docs",
"mcp__stackone-agent-global__get_stackone_categories",
"mcp__stackone-agent-global__map_provider_key",
"mcp__stackone-agent-global__web_search",
"mcp__stackone-agent-global__fetch",
"mcp__stackone-agent-global__vector_search",
"Bash(grep:*)",
"Bash(stackone validate:*)"
]
}
}
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

This appears to be a machine/local environment configuration file ("settings.local.json") that grants tool permissions. Committing it can unintentionally change permissions for other developers/CI and may leak local setup assumptions. Consider removing it from version control and adding .claude/settings.local.json to .gitignore, or replacing it with a documented, non-local example template.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +6
````markdown
# Field Mapping Guide

Detailed reference for writing `fieldConfigs` in unified connectors.
Used by the `map-fields` sub-skill.

Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

This file is wrapped in an outer fenced code block (starts with markdown and ends with ). As a result, the entire guide will render as a code snippet instead of formatted Markdown, and any tooling that expects normal Markdown headings may not find them. If this isn’t intentional, remove the outer fence and keep the content as standard Markdown.

Copilot uses AI. Check for mistakes.
Comment on lines +32 to +35
Read each `.yaml` and `.partial.yaml` file in `src/configs/{{provider}}/` and check:
- All unified actions have `schemaType: unified`
- All unified actions have a `fieldConfigs` array
- All unified actions have all three steps: `request`, `map_fields` (version 2), `typecast` (version 2)
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

The manual validation checklist here requires unified actions to include schemaType: unified, but a repo-wide search shows existing unified example connectors don’t use schemaType at all. This mismatch will confuse users of the skill (they’ll be told to add fields that don’t appear in any working examples). Please either update the examples to the new schemaType-based format or adjust the checklist/docs to match the actual config format used in the repo.

Copilot uses AI. Check for mistakes.
| `learning_object_id` | `string` | The learning_object_id associated with this assignment. This is not required unless specified in ... |
| `remote_learning_object_id` | `string` | Provider's unique identifier of the learning object related to the assignment |
| `learning_object_external_reference` | `string` | The external reference of the learning object associated with this assignment, this is the main i... |
| `progress` | `number` | The progress associated with this assigment |
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

Typo in model description: "assigment" should be "assignment".

Suggested change
| `progress` | `number` | The progress associated with this assigment |
| `progress` | `number` | The progress associated with this assignment |

Copilot uses AI. Check for mistakes.
Comment on lines +29 to +57
- stepId: map_employees_data
description: Map employee directory fields to unified HRIS schema
stepFunction:
functionName: map_fields
version: '2'
parameters:
fields:
- targetFieldKey: id
expression: $.id
type: string
- targetFieldKey: first_name
expression: $.firstName
type: string
- targetFieldKey: last_name
expression: $.lastName
type: string
- targetFieldKey: personal_email
expression: $.homeEmail
type: string
- targetFieldKey: personal_phone_number
expression: $.mobilePhone
type: string
- targetFieldKey: employee_number
expression: $.employeeNumber
type: string
- targetFieldKey: title
expression: $.prefix
type: string
dataSource: $.steps.get_employees.output.data.employees
Copy link

Copilot AI Mar 23, 2026

Choose a reason for hiding this comment

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

map_fields and typecast here are being configured with an inline parameters.fields list, but the rest of the repo’s connector examples consistently define mappings in fieldConfigs at the action level and have map_fields only point at dataSource. Without fieldConfigs, these actions are unlikely to validate or map correctly. Consider moving these field definitions into fieldConfigs on the action and simplifying the steps to match the established pattern.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

40 issues found across 45 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/configs/breathehr/breathehr_v1-0-1.s1.yaml">

<violation number="1" location="src/configs/breathehr/breathehr_v1-0-1.s1.yaml:714">
P1: This action is being published even though the comment says the provider returns 500 for valid create requests, so `create_employee` is expected to fail in production.</violation>

<violation number="2" location="src/configs/breathehr/breathehr_v1-0-1.s1.yaml:1334">
P1: The result path points to a nonexistent step id, so this action cannot return the fetched data.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/references/actions-and-steps.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/references/actions-and-steps.md:22">
P1: `entrypointUrl` and `entrypointHttpMethod` are required for generic connectors in this plugin, so telling authors not to use them will produce invalid configs that fail validation.</violation>

<violation number="2" location=".claude/plugins/stackone-connector-builder/references/actions-and-steps.md:114">
P2: The docs should not forbid JEXL in `value` fields; it is already supported and used throughout the repo.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md:51">
P1: This CLI command assumes a `list_{{resource}}` action already exists, but new connectors are scaffolded blank and the skill only creates actions later in Step 3.</violation>

<violation number="2" location=".claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md:64">
P2: Use the selected `schema_file` for built-in schemas here; `unified-schemas.md` is only an index and does not contain the actual model fields to map.</violation>

<violation number="3" location=".claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md:97">
P1: Use `actionId` instead of `name` for partial actions; the documented partial format starts each entry with `- actionId:`.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/build-config/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/build-config/SKILL.md:38">
P1: This action template uses a different schema than the Falcon configs in this repo, so generated partials will not match the expected connector format.</violation>

<violation number="2" location=".claude/plugins/stackone-connector-builder/skills/build-config/SKILL.md:125">
P1: The `actions` example uses the wrong `$ref` syntax for partials; it should reference the provider/resource key, not a `./...partial.yaml` list item.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md:44">
P1: The manual validation checklist is enforcing unified-action fields (`entrypointUrl` / `entrypointHttpMethod`) on generic `actionType: custom` actions, so it will reject valid custom connectors and recommend an invalid schema.</violation>

<violation number="2" location=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md:50">
P1: Requiring pagination inputs on every `list_*` action will reject valid unpaginated endpoints and add unsupported provider params.</violation>

<violation number="3" location=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md:79">
P1: The fix examples use an invalid generic-action structure (`name`, object-shaped `inputs`, no `actionId`/`stepId`), so applying them would still produce connectors that don't match the documented custom YAML format.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/references/auth-patterns.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/references/auth-patterns.md:163">
P1: This OAuth2 pattern uses the wrong YAML shape for Falcon connectors. `configure-auth` will generate connectors with top-level `grantType`/`authorizationUrl`/`tokenUrl` instead of the nested `authorization` block used by working examples.</violation>

<violation number="2" location=".claude/plugins/stackone-connector-builder/references/auth-patterns.md:187">
P1: This refresh-token snippet puts `authorization.type: none` at the wrong level. In the repo's OAuth connectors, the override belongs on the refresh request step, so this example won't disable auth headers on the actual token request.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md:15">
P1: Only resume to `/check-connector` when both `provider` and `schema` are already in session; imported-schema sessions can have `schema` without `provider` and will otherwise get stuck.</violation>

<violation number="2" location=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md:70">
P1: Don't populate `resources` from model names here; later steps use resource slugs like `employees`, so saving `Employee`/`HRISDepartment` will generate invalid action names and schema paths.</violation>
</file>

<file name="examples/bamboo-hr/bamboo-hr.employees.s1.partial.yaml">

<violation number="1" location="examples/bamboo-hr/bamboo-hr.employees.s1.partial.yaml:13">
P1: This action enables cursor pagination, but the request/result flow never applies a cursor or page size, so pagination will not work as declared.</violation>

<violation number="2" location="examples/bamboo-hr/bamboo-hr.employees.s1.partial.yaml:55">
P1: `prefix` is a salutation, not an employee title. Mapping it to the unified `title` field will return and update the wrong business field.</violation>

<violation number="3" location="examples/bamboo-hr/bamboo-hr.employees.s1.partial.yaml:85">
P1: Use a path placeholder in `entrypointUrl` instead of `${inputs.id}`. These actions are declaring the external route, so interpolation here can stop `get_employee`, `update_employee`, and `terminate_employee` from matching `/employees/:id` requests.</violation>
</file>

<file name="examples/bamboo-hr/bamboo-hr.connector.s1.yaml">

<violation number="1" location="examples/bamboo-hr/bamboo-hr.connector.s1.yaml:1">
P1: Add `schemaType: unified`; without it this config is not explicitly recognized as a unified connector.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/references/cli-commands.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/references/cli-commands.md:69">
P1: This validation table tells the generic connector workflow to add unified-only fields (`schemaType`, `fieldConfigs`, `map_fields`). That can make `check-connector` or `validate-connector` push a raw-response connector into the wrong connector type.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md:62">
P1: Don't gate `cli pull` on MCP action coverage alone; check the CLI connector list first or this step can fail for providers that have indexed actions but no pullable connector config.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/discover-actions/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/discover-actions/SKILL.md:150">
P1: Persist the builder-selected subset here, not all discovered actions, or `/build-config` will generate YAML for endpoints the user explicitly excluded.</violation>
</file>

<file name=".claude/settings.local.json">

<violation number="1" location=".claude/settings.local.json:4">
P1: This allow-list is missing MCP tools that the new builder plugins invoke, so the plugin workflows will fail mid-run.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/test-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/test-connector/SKILL.md:137">
P1: Trigger cleanup after the last available mutating step, not only after `update`.</violation>

<violation number="2" location=".claude/plugins/stackone-connector-builder/skills/test-connector/SKILL.md:140">
P2: The delete verification assumes `get_{{resource}}` exists, which breaks connectors that can delete a resource but do not expose a corresponding `get` action.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/test-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/test-connector/SKILL.md:49">
P1: Include create/update/delete in the MCP test call so write actions are actually tested.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/references/schemas/hris.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/references/schemas/hris.md:810">
P1: This enum table flattens wrapper enum schemas into raw strings, which misdocuments the HRIS payload shape.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/validate-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/validate-connector/SKILL.md:35">
P1: The manual-review fallback misses `entrypointUrl`, so it can save `validated: true` for a connector that would still fail real validation.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/references/schemas/lms.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/references/schemas/lms.md:257">
P1: These enum models are documented as plain strings, but the OAS defines them as `{ value, source_value }` objects.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md:172">
P2: This handoff sends standalone imports into `/choose-schema`, but that command short-circuits as soon as `schema` is present, so it never collects the missing provider.</violation>

<violation number="2" location=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md:176">
P1: Don't jump to `/scope-actions` just because `provider` is set; that can bypass `/check-connector` before the connector has been pulled or scaffolded.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/stackone-connector-builder/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/stackone-connector-builder/SKILL.md:50">
P2: Step 2 tells the wizard to write YAML before Step 4, which contradicts the later rule that no YAML should be written until `build-config`.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/references/schemas/accounting.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/references/schemas/accounting.md:80">
P2: This description is truncated and removes the `negative for credit` rule. For journal entries, that sign convention is important documentation, so the generated reference should keep the full sentence.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/references/connector-patterns.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/references/connector-patterns.md:538">
P1: The credential reference syntax here does not match the documented auth patterns, so copied examples will not resolve credentials at runtime.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/references/field-mapping-guide.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/references/field-mapping-guide.md:93">
P1: Use the documented `enumMapper.matcher[]` form here; the direct `enumMapper.matchExpression` example conflicts with the repo's fieldConfig schema.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/configure-auth/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/configure-auth/SKILL.md:77">
P1: Persist custom-header auth details, not just `auth_type`, or `/build-config` cannot add the required header args to each action.</violation>
</file>

<file name="examples/ashby/ashby.candidates.s1.partial.yaml">

<violation number="1" location="examples/ashby/ashby.candidates.s1.partial.yaml:54">
P2: Expose the pagination/sync metadata here as well; returning only `data` makes the advertised cursor/syncToken flow unusable after the first page.</violation>

<violation number="2" location="examples/ashby/ashby.candidates.s1.partial.yaml:543">
P2: Return the notes pagination/sync metadata along with `data`; otherwise callers cannot continue paging or incremental note syncs.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md:57">
P2: Use indexed provider actions when recommending scope; otherwise this step can save unsupported actions that `/map-fields` will scaffold anyway.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

- `examples`: Input/output demonstration pairs
- `inputs`: Request parameters
- `requiredScopes`: Space-separated OAuth scopes (must be defined in `scopeDefinitions`). Use most restrictive scope.
- `entrypointUrl` / `entrypointHttpMethod`: **Unified actions ONLY** (DO NOT USE for non-unified)
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot Mar 23, 2026

Choose a reason for hiding this comment

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

P1: entrypointUrl and entrypointHttpMethod are required for generic connectors in this plugin, so telling authors not to use them will produce invalid configs that fail validation.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .claude/plugins/stackone-connector-builder/references/actions-and-steps.md, line 22:

<comment>`entrypointUrl` and `entrypointHttpMethod` are required for generic connectors in this plugin, so telling authors not to use them will produce invalid configs that fail validation.</comment>

<file context>
@@ -0,0 +1,302 @@
+- `examples`: Input/output demonstration pairs
+- `inputs`: Request parameters
+- `requiredScopes`: Space-separated OAuth scopes (must be defined in `scopeDefinitions`). Use most restrictive scope.
+- `entrypointUrl` / `entrypointHttpMethod`: **Unified actions ONLY** (DO NOT USE for non-unified)
+
+## Inputs
</file context>
Fix with Cubic

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

13 issues found across 26 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".claude/plugins/stackone-unified-builder/skills/test-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/test-connector/SKILL.md:49">
P2: Add the missing comma after the `actions` array so the documented `test_actions` call is valid syntax.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md:18">
P2: Collecting the missing provider should skip schema selection afterward; otherwise resumed imported/custom sessions can overwrite the schema they already saved.</violation>

<violation number="2" location=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md:72">
P1: Don't derive session `resources` by transforming model names; use resource slugs from the endpoint/category docs, because the Models section contains helper types that are not buildable resources.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/references/connector-patterns.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/references/connector-patterns.md:538">
P2: This documentation now incorrectly limits `$.credentials.*` references to `configFields`/`setupFields` keys. OAuth connectors also reference auth-managed credentials like `accessToken` and `refreshToken`, so following this guidance can produce broken auth examples.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md:64">
P2: Use an exact match for the CLI list check; the current `grep -i {{provider}}` can match unrelated providers by substring and send the workflow down the wrong `pull` path.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md:172">
P2: This handoff sends sessions without a `provider` to `/check-connector`, but that skill immediately rejects missing `provider` and redirects to `/choose-schema` first.</violation>

<violation number="2" location=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md:177">
P2: This `session_step` update drops the `/map-fields` case, so running `/import-schema` after actions are already scoped will send resume flow back to earlier steps.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md:49">
P2: Use the unified action ID in the CLI example; `list_{{resource}}` does not match the `unified_*` actions this skill generates.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md:57">
P2: Resolve `provider_key` before calling `get_provider_actions`, otherwise standalone `/scope-actions` runs can use an unset placeholder.</violation>
</file>

<file name="examples/ashby/ashby.candidates.s1.partial.yaml">

<violation number="1" location="examples/ashby/ashby.candidates.s1.partial.yaml:55">
P2: This reads pagination metadata from the list payload instead of the response metadata, so `nextCursor` will not round-trip for `list_candidates`.</violation>

<violation number="2" location="examples/ashby/ashby.candidates.s1.partial.yaml:547">
P2: This uses the notes array as the source for pagination metadata, so `nextCursor`/`syncToken`/`moreDataAvailable` will come back empty.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md:44">
P2: These checklist rules now contradict the later CRUD checks, so the manual validator will falsely reject valid `actionType: custom` actions.</violation>

<violation number="2" location=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md:80">
P2: This example no longer adds `entrypointUrl`, so it does not fix the documented `Missing required field: entrypointUrl` error.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

5 issues found across 10 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md:83">
P1: This fix example converts a generic connector action into a unified action shape. Following it would produce YAML that conflicts with this plugin's `actionType: custom` workflow.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md:72">
P1: Filter endpoint-derived slugs to canonical resources; otherwise operation paths like `.../invite` or `.../download` can be saved as resources.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md:59">
P2: `resolved_provider_key` is never defined here, so the provider-action lookup can run with an empty key.</violation>
</file>

<file name=".claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md:64">
P2: `grep -w` still produces false positives for hyphenated connector names, so this check can pull the wrong provider.</violation>
</file>

<file name=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md">

<violation number="1" location=".claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md:172">
P2: Save the provider into session before sending the user to `/check-connector`, otherwise the next skill immediately fails on a missing `provider`.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

@CameronCarlin CameronCarlin merged commit e52ea78 into main Mar 23, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants