Skip to content

feat(confluence): add confluence plugin for page management and doc g…#452

Open
mmorency2021 wants to merge 3 commits into
openshift-eng:mainfrom
mmorency2021:feat/confluence-plugin
Open

feat(confluence): add confluence plugin for page management and doc g…#452
mmorency2021 wants to merge 3 commits into
openshift-eng:mainfrom
mmorency2021:feat/confluence-plugin

Conversation

@mmorency2021
Copy link
Copy Markdown

@mmorency2021 mmorency2021 commented May 7, 2026


Plugin Summary

The confluence plugin bridges the gap between Jira issue tracking and Confluence documentation. Today, several plugins in
the repo (jira:grooming, agendas:outcome-refinement) generate useful content but end with "copy this into Confluence
manually." This plugin eliminates that manual step by directly creating, searching, and publishing Confluence pages through
the MCP Atlassian tools that are already available.

Why it matters:

  • Documentation is where knowledge goes from "in someone's head" or "in a Jira ticket" to being discoverable by the whole
    team. Automating that transition reduces friction and makes it more likely to actually happen.
  • It leverages the same mcp-atlassian server already configured for the jira plugin — zero additional setup for teams that
    already use ai-helpers with Jira.
  • Each command requires genuine AI reasoning (synthesizing Jira context into coherent docs, interpreting natural language
    search intent, extracting action items from raw notes) — not just wrapping API calls.

PR Details

Base repo: openshift-eng/ai-helpers (branch: main)
Head repo: mmorency2021/ai-helpers (branch: feat/confluence-plugin)

Title:
feat(confluence): add confluence plugin for page management and doc generation

Body:

Summary

  • Adds a new confluence plugin (v0.1.0) with 3 commands and 2 skills
  • create-from-jira — reads a Jira epic/story and generates a structured Confluence page (design doc, feature spec,
  • search — searches Confluence using natural language, Jira issue keys, or raw CQL, then ranks and summarizes results
    by relevance
  • sync-meeting-notes — takes meeting content (e.g., output from jira:grooming or agendas:outcome-refinement) and
    publishes it as a well-structured Confluence page with extracted action items, decisions, and attendees

Summary by CodeRabbit

  • New Features
    • Added Confluence plugin with three commands: create-from-jira, search, and sync-meeting-notes
    • Added confluence-conventions and page-templates skills to support Confluence workflows
  • Documentation
    • Added full Confluence README and per-command docs with usage, examples, and error handling
  • Tests
    • Added evaluation configs covering create-from-jira, search, and sync-meeting-notes commands

@openshift-ci openshift-ci Bot requested review from bentito and theobarberbany May 7, 2026 14:57
@openshift-ci openshift-ci Bot added the needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. label May 7, 2026
@openshift-ci
Copy link
Copy Markdown

openshift-ci Bot commented May 7, 2026

Hi @mmorency2021. Thanks for your PR.

I'm waiting for a openshift-eng member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work.

Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 7, 2026

Walkthrough

Adds a new Confluence plugin (version 0.1.0): marketplace registration and manifest, README, three command docs, two skills (page templates and conventions), and evaluation suites for each command.

Changes

Confluence Plugin

Layer / File(s) Summary
Plugin registration and manifest
.claude-plugin/marketplace.json, docs/data.json, plugins/confluence/.claude-plugin/plugin.json
Plugin confluence is registered in the marketplace with version: 0.1.0, source: ./plugins/confluence, plus manifest metadata.
Plugin overview and prerequisites
plugins/confluence/README.md
Plugin README documents functionality, mcp-atlassian prerequisites, required env vars (CONFLUENCE_URL, CONFLUENCE_USERNAME, CONFLUENCE_API_TOKEN), commands, skills, and integrations.
create-from-jira command
plugins/confluence/commands/create-from-jira.md
Documents /confluence:create-from-jira workflow: Jira context ingestion, AI template selection, content generation, publishing, labels, examples, args/returns, and error handling.
search command
plugins/confluence/commands/search.md
Documents /confluence:search behavior: query interpretation (issue key/CQL/NL), optional space/limit flags, dual-search for Jira references, ranking, outdated flags, examples, and errors.
sync-meeting-notes command
plugins/confluence/commands/sync-meeting-notes.md
Documents /confluence:sync-meeting-notes workflow: template loading, content extraction (attendees/decisions/actions), target resolution, create/update behavior, labeling, examples, and errors.
Skills and templates
plugins/confluence/skills/confluence-conventions/SKILL.md, plugins/confluence/skills/page-templates/SKILL.md
Adds confluence-conventions and page-templates skills with space/page rules, label conventions, content formatting, templates for Design Doc, Feature Spec, Meeting Notes, Runbook, Decision Record, and examples.
Evaluation configuration
plugins/confluence/evals/create-from-jira.yaml, plugins/confluence/evals/search.yaml, plugins/confluence/evals/sync-meeting-notes.yaml
Adds behavioral evaluations for each command with Anthropic/Vertex provider configs, test cases/assertions, latency/cost thresholds, and maxConcurrency: 20.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Suggested labels

lgtm

Suggested reviewers

  • bentito
  • theobarberbany
🚥 Pre-merge checks | ✅ 10
✅ Passed checks (10 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding a Confluence plugin for page management and documentation generation. It is concise, specific, and clearly summarizes the primary contribution.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No Real People Names In Style References ✅ Passed No real people names used as style references. All examples use role placeholders (Engineering Lead, Product Owner, QA Lead) and template variables (@name) rather than personal names.
No Assumed Git Remote Names ✅ Passed The new Confluence plugin contains no hardcoded git remote names (origin, upstream) in any of its 10 files, and no instructions assume specific git remote names.
Git Push Safety Rules ✅ Passed PR adds only Confluence plugin documentation and configuration. No git push commands, force pushes, or automated push workflows present in any files.
No Untrusted Mcp Servers ✅ Passed PR reuses existing mcp-atlassian server from sooperset, already used by jira plugin. No new MCP servers, npm packages, or untrusted sources introduced.
Ai-Helpers Overlap Detection ✅ Passed Confluence plugin is entirely new with zero overlap: 3 commands and 2 skills have no semantic conflicts with existing plugins or open PRs.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@PLUGINS.md`:
- Around line 118-127: Update the Confluence create-from-jira command
documentation to include "decision-record" as a valid --type option: add
decision-record to the Synopsis line in PLUGINS.md where the create-from-jira
command lists `design-doc|feature-spec|runbook`, and apply the same change to
the create-from-jira docs by updating the argument-hint frontmatter and the
Synopsis code block in plugins/confluence/commands/create-from-jira.md so the
--type values read `design-doc|feature-spec|runbook|decision-record`
consistently.

In `@plugins/confluence/commands/sync-meeting-notes.md`:
- Around line 118-138: Add blank lines before and after each Markdown table to
satisfy MD058 by inserting an empty line above the "Arguments" table (the table
under the "## Arguments" heading) and an empty line below it, and likewise
insert an empty line above and below the "Error Handling" table (the table under
the "## Error Handling" heading); ensure both tables are separated from
surrounding headings and paragraphs by one blank line each so markdownlint no
longer flags them.
- Around line 10-12: Add a language specifier to the fenced code block that
shows the command usage for /confluence:sync-meeting-notes so the static
analyzer stops flagging it; locate the fence containing
"/confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update
<page-id>]" and change the opening triple backticks to include a language token
such as "text" or "bash" (e.g., ```text).
- Around line 89-98: Replace the hardcoded label name in the
mcp__mcp-atlassian__confluence_add_label call: do not pass the literal
"meeting-2026-05"; instead use a dynamic label like "meeting-<YYYY-MM>" and
update the surrounding prose to instruct computing the current year-month at
runtime (derive from current date/time in the runtime language before calling
mcp__mcp-atlassian__confluence_add_label so each page gets a label based on the
actual meeting date).
- Around line 100-116: Add a language specifier ("bash" or "shell") to each of
the three fenced code blocks in the Usage Examples so markdownlint MD040 is
satisfied; specifically update the three blocks containing the shell commands
(/jira:grooming ... /confluence:sync-meeting-notes ...) so their opening fences
read ```bash instead of ``` for the examples that include the /jira:grooming and
the two /confluence:sync-meeting-notes commands.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 5b776576-a103-4d13-ba64-0e9b3afb7d45

📥 Commits

Reviewing files that changed from the base of the PR and between d2de5a1 and e1bee26.

📒 Files selected for processing (10)
  • .claude-plugin/marketplace.json
  • PLUGINS.md
  • docs/data.json
  • plugins/confluence/.claude-plugin/plugin.json
  • plugins/confluence/README.md
  • plugins/confluence/commands/create-from-jira.md
  • plugins/confluence/commands/search.md
  • plugins/confluence/commands/sync-meeting-notes.md
  • plugins/confluence/skills/confluence-conventions/SKILL.md
  • plugins/confluence/skills/page-templates/SKILL.md

Comment thread PLUGINS.md Outdated
Comment on lines +118 to +127
### Confluence Plugin

Confluence page management, documentation generation from Jira, and meeting notes publishing

**Commands:**
- **`/confluence:create-from-jira` `<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]`** - Generate a structured Confluence page from a Jira epic or story
- **`/confluence:search` `<query> [--space <key>] [--limit <n>]`** - Search Confluence for related documentation using natural language or CQL
- **`/confluence:sync-meeting-notes` `<space-key> <title> [--parent-id <id>] [--update <page-id>]`** - Publish meeting notes or agendas to Confluence with structured formatting

See [plugins/confluence/README.md](plugins/confluence/README.md) for detailed documentation.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

decision-record is missing from the --type synopsis here and in create-from-jira.md.

Line 123 lists design-doc|feature-spec|runbook as the valid --type values, but both the create-from-jira command's Arguments table (line 120 of that file) and its Phase 3 implementation explicitly include decision-record as a fourth valid type. This discrepancy can mislead users into never passing --type decision-record directly.

The same truncation appears in three places: the frontmatter argument-hint, the Synopsis section of create-from-jira.md, and here in PLUGINS.md.

📝 Proposed fix
-**`/confluence:create-from-jira` `<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]`**
+**`/confluence:create-from-jira` `<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook|decision-record]`**

Apply the same fix to the argument-hint frontmatter and the Synopsis code block in plugins/confluence/commands/create-from-jira.md.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@PLUGINS.md` around lines 118 - 127, Update the Confluence create-from-jira
command documentation to include "decision-record" as a valid --type option: add
decision-record to the Synopsis line in PLUGINS.md where the create-from-jira
command lists `design-doc|feature-spec|runbook`, and apply the same change to
the create-from-jira docs by updating the argument-hint frontmatter and the
Synopsis code block in plugins/confluence/commands/create-from-jira.md so the
--type values read `design-doc|feature-spec|runbook|decision-record`
consistently.

Comment on lines +10 to +12
```
/confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update <page-id>]
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add a language specifier to the Synopsis fenced code block.

The static analysis tool flags this block for missing a language tag. Using text or bash will silence the warning.

🔧 Proposed fix
-```
+```text
 /confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update <page-id>]
</details>

<!-- suggestion_start -->

<details>
<summary>📝 Committable suggestion</summary>

> ‼️ **IMPORTANT**
> Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

```suggestion

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/commands/sync-meeting-notes.md` around lines 10 - 12, Add
a language specifier to the fenced code block that shows the command usage for
/confluence:sync-meeting-notes so the static analyzer stops flagging it; locate
the fence containing "/confluence:sync-meeting-notes <space-key> <title>
[--parent-id <id>] [--update <page-id>]" and change the opening triple backticks
to include a language token such as "text" or "bash" (e.g., ```text).

Comment on lines +89 to +98
### Phase 6: Apply Labels and Report
1. Add date-based label:
```python
mcp__mcp-atlassian__confluence_add_label(
page_id="<page-id>",
name="meeting-2026-05"
)
```
2. Add a `meeting-notes` label for discoverability.
3. Report the page URL and summary of extracted items (action count, decision count).
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Hardcoded date label meeting-2026-05 will go stale and may mislead the AI agent.

The Phase 6 code snippet passes the literal string "meeting-2026-05" as the label name. If the AI model follows the example literally rather than deriving the date from the current date, all pages will receive the same stale label. Replace the hardcoded value with a dynamic placeholder and add a prose instruction to compute it at runtime.

🔧 Proposed fix
 1. Add date-based label:
    ```python
    mcp__mcp-atlassian__confluence_add_label(
        page_id="<page-id>",
-       name="meeting-2026-05"
+       name="meeting-<YYYY-MM>"  # derive from current date at runtime
    )
    ```
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/commands/sync-meeting-notes.md` around lines 89 - 98,
Replace the hardcoded label name in the mcp__mcp-atlassian__confluence_add_label
call: do not pass the literal "meeting-2026-05"; instead use a dynamic label
like "meeting-<YYYY-MM>" and update the surrounding prose to instruct computing
the current year-month at runtime (derive from current date/time in the runtime
language before calling mcp__mcp-atlassian__confluence_add_label so each page
gets a label based on the actual meeting date).

Comment on lines +100 to +116
## Usage Examples

1. **Publish grooming notes after running `/jira:grooming`:**
```
/jira:grooming PROJ sprint-42
/confluence:sync-meeting-notes TEAM "Sprint 42 Grooming - 2026-05-07"
```

2. **Create meeting notes under a specific parent:**
```
/confluence:sync-meeting-notes DEV "Architecture Review - 2026-05-07" --parent-id 123456789
```

3. **Update an existing meeting page with new notes:**
```
/confluence:sync-meeting-notes TEAM "Weekly Standup" --update 987654321
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add language specifiers to all three usage-example fenced code blocks.

Lines 103, 109, and 114 are flagged by markdownlint (MD040). All three contain shell commands; use bash (or shell).

🔧 Proposed fix
-   ```
+   ```bash
    /jira:grooming PROJ sprint-42
    /confluence:sync-meeting-notes TEAM "Sprint 42 Grooming - 2026-05-07"
    ```
 
-   ```
+   ```bash
    /confluence:sync-meeting-notes DEV "Architecture Review - 2026-05-07" --parent-id 123456789
    ```
 
-   ```
+   ```bash
    /confluence:sync-meeting-notes TEAM "Weekly Standup" --update 987654321
    ```
🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 103-103: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 109-109: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


[warning] 114-114: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/commands/sync-meeting-notes.md` around lines 100 - 116,
Add a language specifier ("bash" or "shell") to each of the three fenced code
blocks in the Usage Examples so markdownlint MD040 is satisfied; specifically
update the three blocks containing the shell commands (/jira:grooming ...
/confluence:sync-meeting-notes ...) so their opening fences read ```bash instead
of ``` for the examples that include the /jira:grooming and the two
/confluence:sync-meeting-notes commands.

Comment thread plugins/confluence/commands/sync-meeting-notes.md
@mmorency2021
Copy link
Copy Markdown
Author

can someone give ok-to-test for this PR ? @theobarberbany @bentito

@bentito
Copy link
Copy Markdown
Contributor

bentito commented May 19, 2026

/ok-to-test

@openshift-ci openshift-ci Bot added ok-to-test Indicates a non-member PR verified by an org member that is safe to test. and removed needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels May 19, 2026
@mmorency2021
Copy link
Copy Markdown
Author

Since all tests are successful , can someone approve the PR so it can be merged? @theobarberbany @bentito

@bentito
Copy link
Copy Markdown
Contributor

bentito commented May 20, 2026

I think this is a good, non-redundant PR. We just recently added some evals with promptfoo. Could you add a couple happy path evals that will help answer any other questions I might have? #464 adds the promptfoo machinery. You just need to add plugins/confluence/evals/ with the promptfoo evals.

@openshift-ci openshift-ci Bot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label May 20, 2026
…eneration

New plugin with 3 commands and 2 skills for Confluence integration:
- create-from-jira: generate structured pages from Jira epics/stories
- search: find related docs using natural language, CQL, or issue keys
- sync-meeting-notes: publish meeting notes and agendas to Confluence
@mmorency2021 mmorency2021 force-pushed the feat/confluence-plugin branch from e1bee26 to 811e069 Compare May 20, 2026 21:10
@openshift-ci openshift-ci Bot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label May 20, 2026
@openshift-ci
Copy link
Copy Markdown

openshift-ci Bot commented May 20, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: mmorency2021

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci Bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label May 20, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 7

🧹 Nitpick comments (1)
plugins/confluence/commands/search.md (1)

33-35: ⚡ Quick win

Raw-CQL detection is too broad and can catch normal language accidentally.

Using presence of AND/OR as a raw-CQL signal (Line 34) can misroute plain English queries. Consider tightening this rule (e.g., require CQL field/operator patterns) before pass-through.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/commands/search.md` around lines 33 - 35, The Raw-CQL
detection rule that treats presence of "AND"/"OR" as sufficient should be
tightened in the search parsing logic (the function that decides "raw CQL" /
"pass-through", e.g., isRawCql or detectRawCql used in the Confluence query
parser) by requiring explicit CQL field/operator patterns before allowing
pass-through; update the check to only classify as raw CQL when the input
contains CQL-style tokens such as a field+operator pattern (examples: "field =",
"field ~", "field :", or "field IN") or matches a regex like
<field>\s*(=|~|:|IN)\s*<value>, while still allowing Jira-key detection and
natural-language fallback otherwise.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/data.json`:
- Around line 1808-1813: Update the "description" field for the command named
"sync-meeting-notes" in the data.json entry so it explicitly states where the
meeting content is sourced from (e.g., conversation context, grooming output, or
files). Locate the object with "name": "sync-meeting-notes" and replace the
current description value with a clarified sentence such as "Publish meeting
notes or agendas from conversation context (or grooming output or files) to
Confluence with structured formatting" to improve discoverability.

In `@plugins/confluence/commands/create-from-jira.md`:
- Line 3: Update the user-facing `--type` option list in the command argument
hints to include the missing `decision-record` entry; specifically modify the
`argument-hint` occurrences in create-from-jira.md so the `--type` choices read
"design-doc|feature-spec|runbook|decision-record" (update both places where the
hint appears, e.g., the top-level `argument-hint` and the later occurrence
around line 11) to keep the displayed syntax consistent with the command
description and allowed arguments.
- Around line 10-12: The markdown in
plugins/confluence/commands/create-from-jira.md has unlabeled fenced code blocks
and tables without surrounding blank lines; update each fenced block (e.g., the
command usage block "/confluence:create-from-jira <issue-key> [...]") to include
an appropriate language tag such as bash or text to satisfy MD040/MD058, and
ensure every table block has a blank line before and after it (matching the
format used in plugins/hello-world/commands/echo.md); apply these fixes
consistently to all affected sections mentioned in the review so the linter
passes.

In `@plugins/confluence/commands/search.md`:
- Around line 10-12: The command docs for /confluence:search currently fail
markdownlint MD040/MD058 because the usage code block lacks a fenced language
and the Arguments/Error Handling tables need surrounding blank lines; update the
usage block to use a fenced language (e.g., ```bash) and add a blank line before
and after each table (Arguments, Error Handling) for the /confluence:search
command and the other affected sections (lines referenced 64-74, 81-98, 101-105,
113-117), matching the structure used in plugins/hello-world/commands/echo.md so
the linter passes.

In `@plugins/confluence/evals/sync-meeting-notes.yaml`:
- Around line 41-44: The example meeting-note lines contain real person names;
update the fixture in sync-meeting-notes.yaml to use role-based placeholders
instead (e.g., replace "Attendees: Alice, Bob, Carol" with "Attendees: Product
Manager, Backend Engineer, Designer", change "Discussion: finalize architecture
decision for release" to remain but ensure roles are used in actions and
decisions such as "Actions: Backend Engineer to update the design doc", and
likewise replace any other named references in the same block so all
attendees/action owners are roles rather than personal names.

In `@plugins/confluence/skills/confluence-conventions/SKILL.md`:
- Around line 40-47: Two Markdown tables (one starting with the header "|
Content Type | Required Labels | Optional Labels |" and the other the second
table referenced in the comment) lack surrounding blank lines and trigger MD058;
fix by adding a single blank line both immediately before and immediately after
each table so each table is separated from surrounding paragraphs and headings.
Ensure you update the blocks that include the "| Content Type | Required Labels
| Optional Labels |" header and the other table block so there is exactly one
blank line above and one blank line below each table.

In `@plugins/confluence/skills/page-templates/SKILL.md`:
- Around line 162-163: The example uses real-person names; replace them with
neutral role-based placeholders. In SKILL.md update the sample meeting lines
that read "Attendees: Alice, Bob, Carol" and "Facilitator: Alice" (and the
similar occurrence at the later block) to role placeholders such as "Attendees:
Product Manager, Engineer, Designer" and "Facilitator: Product Manager" (or
"Attendee 1, Attendee 2, Attendee 3" / "Facilitator: Attendee 1") so no real
names appear.

---

Nitpick comments:
In `@plugins/confluence/commands/search.md`:
- Around line 33-35: The Raw-CQL detection rule that treats presence of
"AND"/"OR" as sufficient should be tightened in the search parsing logic (the
function that decides "raw CQL" / "pass-through", e.g., isRawCql or detectRawCql
used in the Confluence query parser) by requiring explicit CQL field/operator
patterns before allowing pass-through; update the check to only classify as raw
CQL when the input contains CQL-style tokens such as a field+operator pattern
(examples: "field =", "field ~", "field :", or "field IN") or matches a regex
like <field>\s*(=|~|:|IN)\s*<value>, while still allowing Jira-key detection and
natural-language fallback otherwise.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 1ff1cab5-cd5e-4215-9af1-fcec7e9cddd3

📥 Commits

Reviewing files that changed from the base of the PR and between e1bee26 and 811e069.

📒 Files selected for processing (12)
  • .claude-plugin/marketplace.json
  • docs/data.json
  • plugins/confluence/.claude-plugin/plugin.json
  • plugins/confluence/README.md
  • plugins/confluence/commands/create-from-jira.md
  • plugins/confluence/commands/search.md
  • plugins/confluence/commands/sync-meeting-notes.md
  • plugins/confluence/evals/create-from-jira.yaml
  • plugins/confluence/evals/search.yaml
  • plugins/confluence/evals/sync-meeting-notes.yaml
  • plugins/confluence/skills/confluence-conventions/SKILL.md
  • plugins/confluence/skills/page-templates/SKILL.md
✅ Files skipped from review due to trivial changes (4)
  • plugins/confluence/evals/create-from-jira.yaml
  • .claude-plugin/marketplace.json
  • plugins/confluence/.claude-plugin/plugin.json
  • plugins/confluence/README.md

Comment thread docs/data.json
Comment on lines +1808 to +1813
{
"argument_hint": "<space-key> <title> [--parent-id <id>] [--update <page-id>]",
"description": "Publish meeting notes or agendas to Confluence with structured formatting",
"name": "sync-meeting-notes",
"synopsis": "/confluence:sync-meeting-notes <space-key> <title> [--parent-id <id>] [--update <page-id>]"
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check sync-meeting-notes command implementation for content input handling
fd -t f 'sync-meeting-notes.md' plugins/confluence/commands/ --exec cat {}

Repository: openshift-eng/ai-helpers

Length of output: 5834


Clarify the content source in command metadata.

The sync-meeting-notes command signature doesn't indicate where the meeting content comes from. While the full implementation documentation clearly explains that content defaults to conversation context (with fallback to user input or files), the data.json metadata entry should hint at this for better discoverability.

Update the description to clarify the content source:

"description": "Publish meeting notes or agendas from conversation context to Confluence with structured formatting"

Or reference the content sources more explicitly:

"description": "Publish meeting notes or agendas (from conversation context, grooming output, or files) to Confluence with structured formatting"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/data.json` around lines 1808 - 1813, Update the "description" field for
the command named "sync-meeting-notes" in the data.json entry so it explicitly
states where the meeting content is sourced from (e.g., conversation context,
grooming output, or files). Locate the object with "name": "sync-meeting-notes"
and replace the current description value with a clarified sentence such as
"Publish meeting notes or agendas from conversation context (or grooming output
or files) to Confluence with structured formatting" to improve discoverability.

@@ -0,0 +1,139 @@
---
description: Generate a structured Confluence page from a Jira epic or story
argument-hint: "<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

--type option list is incomplete in user-facing command syntax.

Line 3 and Line 11 omit decision-record, but the command description and arguments later allow it. Please keep all entry points consistent.

Suggested fix
-argument-hint: "<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]"
+argument-hint: "<issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook|decision-record]"
...
-/confluence:create-from-jira <issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]
+/confluence:create-from-jira <issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook|decision-record]

As per coding guidelines "Follow existing command format patterns documented in plugins/hello-world/commands/echo.md and ensure the linter enforces structure".

Also applies to: 11-11

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/commands/create-from-jira.md` at line 3, Update the
user-facing `--type` option list in the command argument hints to include the
missing `decision-record` entry; specifically modify the `argument-hint`
occurrences in create-from-jira.md so the `--type` choices read
"design-doc|feature-spec|runbook|decision-record" (update both places where the
hint appears, e.g., the top-level `argument-hint` and the later occurrence
around line 11) to keep the displayed syntax consistent with the command
description and allowed arguments.

Comment on lines +10 to +12
```
/confluence:create-from-jira <issue-key> [--space <key>] [--parent-id <id>] [--type design-doc|feature-spec|runbook]
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix markdownlint issues (MD040/MD058) in command docs.

Line 10/100/105/110 fenced blocks are missing language tags, and table blocks around Line 115 and Line 128 need surrounding blank lines.

As per coding guidelines "Follow existing command format patterns documented in plugins/hello-world/commands/echo.md and ensure the linter enforces structure".

Also applies to: 100-112, 115-121, 128-133

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/commands/create-from-jira.md` around lines 10 - 12, The
markdown in plugins/confluence/commands/create-from-jira.md has unlabeled fenced
code blocks and tables without surrounding blank lines; update each fenced block
(e.g., the command usage block "/confluence:create-from-jira <issue-key> [...]")
to include an appropriate language tag such as bash or text to satisfy
MD040/MD058, and ensure every table block has a blank line before and after it
(matching the format used in plugins/hello-world/commands/echo.md); apply these
fixes consistently to all affected sections mentioned in the review so the
linter passes.

Comment on lines +10 to +12
```
/confluence:search <query> [--space <key>] [--limit <n>]
```
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Address markdownlint MD040/MD058 in this command doc.

Add fenced code languages and blank lines around the Arguments/Error Handling tables.

As per coding guidelines "Follow existing command format patterns documented in plugins/hello-world/commands/echo.md and ensure the linter enforces structure".

Also applies to: 64-74, 81-98, 101-105, 113-117

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/commands/search.md` around lines 10 - 12, The command docs
for /confluence:search currently fail markdownlint MD040/MD058 because the usage
code block lacks a fenced language and the Arguments/Error Handling tables need
surrounding blank lines; update the usage block to use a fenced language (e.g.,
```bash) and add a blank line before and after each table (Arguments, Error
Handling) for the /confluence:search command and the other affected sections
(lines referenced 64-74, 81-98, 101-105, 113-117), matching the structure used
in plugins/hello-world/commands/echo.md so the linter passes.

Comment thread plugins/confluence/evals/sync-meeting-notes.yaml Outdated
Comment on lines +40 to +47
| Content Type | Required Labels | Optional Labels |
|-------------|----------------|-----------------|
| Design Document | `design-doc` | component name, team name |
| Feature Spec | `feature-spec` | component name, version |
| Meeting Notes | `meeting-notes`, `meeting-YYYY-MM` | team name, meeting type |
| Runbook | `runbook` | service name, severity |
| Decision Record | `decision-record` | status (`accepted`, `proposed`) |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add blank lines around both tables to satisfy MD058.

The tables starting at Line 40 and Line 80 should be separated from surrounding text by blank lines.

Also applies to: 80-87

🧰 Tools
🪛 markdownlint-cli2 (0.22.1)

[warning] 40-40: Tables should be surrounded by blank lines

(MD058, blanks-around-tables)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/skills/confluence-conventions/SKILL.md` around lines 40 -
47, Two Markdown tables (one starting with the header "| Content Type | Required
Labels | Optional Labels |" and the other the second table referenced in the
comment) lack surrounding blank lines and trigger MD058; fix by adding a single
blank line both immediately before and immediately after each table so each
table is separated from surrounding paragraphs and headings. Ensure you update
the blocks that include the "| Content Type | Required Labels | Optional Labels
|" header and the other table block so there is exactly one blank line above and
one blank line below each table.

Comment thread plugins/confluence/skills/page-templates/SKILL.md Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
plugins/confluence/evals/sync-meeting-notes.yaml (1)

45-51: ⚡ Quick win

Consider adding assertions that verify successful Confluence interaction.

The current assertions only check for substring presence ("meeting notes", "Attendees", "Action items"), which won't catch failures where the command produces output but fails to actually create or update the Confluence page.

Since the maintainer requested "happy path" evals to exercise the promptfoo machinery, these basic assertions may be sufficient for the initial implementation. However, consider adding at least one assertion that confirms successful Confluence API interaction (e.g., checking for a success message or page URL in the output) to increase confidence that the command executed end-to-end correctly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@plugins/confluence/evals/sync-meeting-notes.yaml` around lines 45 - 51, Add
an assertion to verify a successful Confluence API interaction in the existing
assert block (which currently contains icontains checks for "meeting notes",
"Attendees", and "Action items"). For example, add an icontains or regex
assertion that looks for a success message or page URL (e.g., "Page created",
"Page updated", or a Confluence URL pattern like "confluence" or
"atlassian.net") in the command output to confirm the page was actually
created/updated rather than just containing text fragments.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@plugins/confluence/evals/sync-meeting-notes.yaml`:
- Around line 45-51: Add an assertion to verify a successful Confluence API
interaction in the existing assert block (which currently contains icontains
checks for "meeting notes", "Attendees", and "Action items"). For example, add
an icontains or regex assertion that looks for a success message or page URL
(e.g., "Page created", "Page updated", or a Confluence URL pattern like
"confluence" or "atlassian.net") in the command output to confirm the page was
actually created/updated rather than just containing text fragments.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 3c9ff008-6d16-4b0f-949c-6a1686514164

📥 Commits

Reviewing files that changed from the base of the PR and between 811e069 and 85a4950.

📒 Files selected for processing (2)
  • plugins/confluence/evals/sync-meeting-notes.yaml
  • plugins/confluence/skills/page-templates/SKILL.md
✅ Files skipped from review due to trivial changes (1)
  • plugins/confluence/skills/page-templates/SKILL.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. ok-to-test Indicates a non-member PR verified by an org member that is safe to test.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants