Conversation
There was a problem hiding this comment.
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-builderandstackone-connector-builderplugins (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.
| cursor: | ||
| enabled: true | ||
| pageSize: 50 | ||
|
|
There was a problem hiding this comment.
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).
| - 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: |
There was a problem hiding this comment.
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 (request → map_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.
| { | ||
| "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:*)" | ||
| ] | ||
| } | ||
| } |
There was a problem hiding this comment.
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.
| ````markdown | ||
| # Field Mapping Guide | ||
|
|
||
| Detailed reference for writing `fieldConfigs` in unified connectors. | ||
| Used by the `map-fields` sub-skill. | ||
|
|
There was a problem hiding this comment.
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.
| 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) |
There was a problem hiding this comment.
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.
| | `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 | |
There was a problem hiding this comment.
Typo in model description: "assigment" should be "assignment".
| | `progress` | `number` | The progress associated with this assigment | | |
| | `progress` | `number` | The progress associated with this assignment | |
| - 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 |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
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>
.claude/plugins/stackone-unified-builder/skills/map-fields/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-connector-builder/skills/build-config/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-connector-builder/skills/test-connector/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-unified-builder/skills/import-schema/SKILL.md
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
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.
.claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-unified-builder/skills/test-connector/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-unified-builder/skills/choose-schema/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-connector-builder/references/connector-patterns.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-connector-builder/skills/setup-connector/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-unified-builder/skills/scope-actions/SKILL.md
Outdated
Show resolved
Hide resolved
.claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md
Show resolved
Hide resolved
.claude/plugins/stackone-connector-builder/skills/validate-connector/SKILL.md
Show resolved
Hide resolved
There was a problem hiding this comment.
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.
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)..claude/settings.local.jsonwith MCP permissions; simplifiedCLAUDE.mdinto a Falcon connector template; removed obsoletedocs/plans.Bug Fixes
/build-connector,/build-unified-connector) and auto-trigger behavior./import-schemafor a simpler choose-schema experience.Written for commit 27c4f04. Summary will update on new commits.