Skip to content

docs(config): add application onboarding guide and plain-language companion - #411

Open
alex-budanov wants to merge 13 commits into
codemie-ai:mainfrom
alex-budanov:docs/EPMCDME-14751-application-guides
Open

alex-budanov wants to merge 13 commits into
codemie-ai:mainfrom
alex-budanov:docs/EPMCDME-14751-application-guides

Conversation

@alex-budanov

Copy link
Copy Markdown

Summary

Supersedes #396 (closed, was on a now-abandoned branch) and #402 (an earlier, less-corrected draft — see note below). Fresh branch off current main, no rebase conflicts since main hasn't moved since divergence.

  • Adds an Application Onboarding Guide covering the decision process (journeys J1/J2/J3, types link/iframe/module), the YAML registration schema's sharp edges, the Module Federation contract for module, a review checklist, and known platform gaps.
  • This content previously existed only as a developer-facing guide inside the codemie backend repo (unpublished, unlinked from any docs site, only reachable by browsing that repo's source tree).
  • Adds user-guide/applications/add-an-application.md, a plain-language companion page for teams deciding whether/how to add their product, deferring to the onboarding guide for exact schema/API details.
  • Wires the previously orphaned user-guide/applications/index.md page into the sidebar (it had no sidebar entry at all) and cross-links it with both new guides.
  • Cross-links the new guides with admin/configuration/codemie/customer-feature-configuration.md and user-guide/api/index.md.
  • Adds two FAQ entries: how to add an application tile, and how Applications differ from Integrations.
  • Grounds six additional technical claims in applications-onboarding.md against origin/main of codemie and codemie-ui (verified via dedicated read-only worktrees, not the locally checked-out feature branches): the async mount()/unmount() teardown race, the full YAML-to-API field mapping (idslug, enabled filtering, availableForExternal being dropped, description null→""), the exact application routes and the iframe-slug constraint, availableForExternal being silently inert for applications specifically, the rolling-restart replica-disagreement window, the missing removal/ownership-transfer path, and the narrow PUT /v1/config/declarations/{id} API not covering applications.
  • Adds a one-line caption under the placeholder YAML block in both guides, naming AICE (and MF Lens) as real apps registered with the same shape — without pasting real URLs/arguments into the template, so the example can't go stale.

Note on #402

#402's add-an-application.md was an earlier draft with two claims this PR corrects: "AICE... framed from a path on CodeMie's own host" (unverifiable against source, dropped) and a technology-copilot module example (the app no longer exists in production). #402 also has a couple of independent wording improvements this branch doesn't carry over — give co-deployment its own heading and widen application guide audience to new builds — worth a follow-up pass if their content is still wanted.

Changes

  • docs/admin/configuration/codemie/applications-onboarding.md (new)
  • docs/user-guide/applications/add-an-application.md (new)
  • docs/admin/configuration/codemie/customer-feature-configuration.md — cross-link to the new guide
  • docs/user-guide/applications/index.md — links to both new guides; wired into sidebars.ts
  • docs/user-guide/api/index.md — cross-link to the plain-language guide
  • docs/user-guide/data-source/datasources-types/add-provider-datasource.md — note on the provider SDK
  • sidebars.ts — both pages added under Admin → Configuration → CodeMie and User Manuals → Applications
  • faq/how-do-i-add-my-application-as-a-tile-in-codemie.md — links to the new plain-language guide
  • faq/whats-the-difference-between-an-application-and-an-integration-in-codemie.md (new)
  • CLAUDE.md — documents the admonitions-in-.md-files convention
  • cspell.config.yaml — adds SAMEORIGIN

Testing

  • npm run check passes (typecheck, eslint, prettier, markdownlint, cspell, commitlint) — 0 errors across all checks
  • npm run build completes locally — production build succeeds, static files generated, no broken-link errors
  • All internal links and heading anchors manually verified against Docusaurus's slug convention and realpath

Quality Checks

  • npm run check passes (typecheck + lint + commitlint)
  • No MDX compilation errors expected — all placeholders wrapped in backticks, mermaid content stays inside its fenced block
  • No raw angle brackets outside code spans/fences
  • Sidebar references document IDs (not filenames)

Aleksandr Budanov added 11 commits September 9, 2026 20:03
Documents the decision process, YAML registration schema gotchas, Module
Federation contract, and review checklist for registering a third-party
product as an Application tile — content that previously only existed as
a developer guide inside the codemie backend repo, unpublished and
unlinked from any docs site.

Wires the previously orphaned user-guide/applications page into the
sidebar and cross-links it with the new guide and with Customer Feature
Configuration.
Code review on PR codemie-ai#396 found: a Sources link in the integrations-vs-
applications FAQ was missing the integrations/integrations doc-id
segment (404), and the review checklist plus known-gaps table used
"entry" where the danger callout explicitly reserves that word for the
API response field, not the YAML field a reviewer is actually checking.
Also aligns the arguments field description between the two docs.
…text

Replace the rewritten guide body with the exact content from
codemie!EPMCDME-14469_applications-onboarding-guide, keeping only the
Docusaurus front matter. Drops the impersonal-voice rewrite, admonition
conversion, schema deduplication against customer-feature-configuration.md,
and the entry/url terminology fix applied in the prior two commits.
Fixes a register mismatch ("your thing"), a self-contradicting
Module Federation exposes-key example now confirmed by reading
@originjs/vite-plugin-federation's source directly, an
overclaimed dev-override feature that hasn't shipped anywhere yet,
a British/American spelling inconsistency, and a couple of
run-on sentences.
Retitle section 1 to match what it covers, since two thirds of it explained
registration mechanics rather than the build-or-not decision.

Correct the routing framing. The section split mechanisms by "assistant side"
versus application, but a registered MCP server is not assistant-only: the
managed catalog is client-neutral and is provisioned into agent clients and
the codemie-code CLI. The split is now capability-that-gets-called versus
UI-a-person-opens, which names no consumer and stays true as clients are added.

Other corrections and readability fixes:

- "no API" becomes "no registration API". A read API exists and section 4
  refers to it twice; what is absent is any way to register via API, since
  config writes reject undeclared components.
- Name GCP and Azure in the ConfigMap inconsistency instead of describing them
  anonymously, so a reader can tell whether the warning applies to them.
- Generalize the tiebreak, which sent readers to build an MCP server even when
  the other applicable row was Skill or Workflow.
- Break the 130-word config-precedence paragraph into two bullets plus the
  instruction, and drop the "Not this" table column, whose four cells restated
  the header.
- Thin the bold, which covered three spans in four sentences.

Claude-Session: https://claude.ai/code/session_01S88R2iND5WD4UvXwAhx6uU
Correct the axis error. The flowchart routes D1=yes straight to J3 without
asking D2, yet J3's type is "any" and the callout below tells that reader
their type drives the security review. Say explicitly that landing on J3
still requires answering D2.

The journey table encoded the same error through its "+" convention, which
chains J1 into J2 into J3 and so charged a co-deployed link with a hosted
remote bundle, a frontend review, and architecture sign-off it does not
need. J3's cells are now self-contained and name the module conditional.
J2 keeps its "+", which is correct there.

Also:

- Drop the six-stage vocabulary. It was asserted twice, defined nowhere,
  had no section for "agree", and listed test before review while the guide
  reviews at section 5 and tests at section 6.
- Remove the hardcoded Mermaid palette. It was the only diagram of the
  site's three that hardcoded colors, so it alone would not follow the
  light/dark toggle, and it painted decision and outcome nodes identically.
- Trim the diagram nodes to journey and type. Timeline and sign-off were
  duplicated in the table and had already drifted from it.
- Reword "the shape X runs today", and unbacktick AICE, a product name
  whose config id is lowercase aice.

Claude-Session: https://claude.ai/code/session_01S88R2iND5WD4UvXwAhx6uU
The worked example and the review checklist both told readers to expose
`./CodemieEntryComponent`, which section 4 already warns will fail. The host
passes 'CodemieEntryComponent' verbatim to getRemote (codemie-ui,
ApplicationFederationPage.tsx:30 and :85), and vite-plugin-federation 1.4.1
does a literal moduleMap lookup with no ./ normalization, so a prefixed key
throws "Can not find remote module CodemieEntryComponent". A team could
follow the example, pass the checklist, and ship a module that never mounts.

Both places now name the bare key, and the checklist flags the leading ./
since that is the whole trap.

"Each tier includes the ones above it" was also wrong. The iframe tier is
entirely about being framed: frame-ancestors, third-party cookies,
frame-breakout. None of it reaches a module, which is never in a frame.
Section 5 now states the real composition, and the worked example names the
two tiers that actually apply to it.

Also:

- Cut the meta-commentary explaining why the worked example references later
  sections, and the reassurance about unfamiliar terms. The pointer to
  section 4 stays.
- Move the "you" and "CodeMie" definition from section 3 into the header
  block, three sections ahead of where it was and before first use.
- Drop the timeline and sign-off from worked-example step 1. They duplicated
  the journey table, had drifted from it, and contradicted step 6 of the
  same list.

Claude-Session: https://claude.ai/code/session_01S88R2iND5WD4UvXwAhx6uU
…in section 4

The styling paragraph claimed a standard build that injects CSS into
document.head "works out of the box". Verified against codemie-ui with a
throwaway vitest probe on observeAndMoveStyles: that holds on first open
only. The util caches, and restores on later mounts, exclusively stylesheet
links matching /assets/style-*.css, removing them from document.head to do
so. Nothing else is cached. Since the remote is imported once per page load,
navigating away and back yields a fresh shadow root with no re-injection to
copy, so an injected <style> or a link named assets/index-<hash>.css, which
is Vite's default, is simply gone. The probe saw exactly one stylesheet and
zero style elements on the second mount. The paragraph now leads with that
and names the one delivery form that survives.

The ?path= deep link was described as appending a query string to the entry.
The host reads path from its own URL and concatenates the raw value with no
separator (ApplicationIframePage.tsx:28-36), so the value must carry its own
leading / or ?. A reader following the old wording would build their app to
parse a query parameter that never arrives.

The exposes-key callout still surveyed two forms as though the answer were
open. It is settled: vite-plugin-federation 1.4.1, the pinned version, does a
literal moduleMap lookup, and the ./ form throws "Can not find remote module
CodemieEntryComponent". The callout now states the rule and quotes the error,
matching sections 3 and 5.

Also drop "the single most expensive typo available here". Omitting name,
type or description produces the same 500, and omitting enabled stops the
backend starting, which is strictly worse.

Claude-Session: https://claude.ai/code/session_01S88R2iND5WD4UvXwAhx6uU
…n gaps

Section 5 asked reviewers to confirm entry "resolves from the operator's
network". Section 4 says the opposite in bold: reachable from the user's
browser, not from the backend, which only echoes the string. The two readings
agree for most deployments and diverge for J3, where a team deploying into the
operator's cluster could tick the box truthfully with a service DNS name that
resolves from no browser anywhere.

Section 3's trust-tier row assigns green to link, yellow to iframe, red to
module. Section 5 then used green for "All types", so an iframe or module
submitter who learned green means link could skip the universal items. Green
becomes white there, and the two places that referenced it follow.

Section 7 gains two gaps that are real in current code and ticketed together:
link dispatch still calls window.open(entry, '_blank') with no noopener
(ApplicationsPage.tsx:45), and ?path= is still concatenated onto entry without
an origin check (ApplicationIframePage.tsx:36).

Section 6 step 2 now says GET /v1/applications needs no authentication, so a
plain curl works. Verified at every layer: no global dependencies on the app,
dependencies=[] on the router, no Depends on the endpoint, and none of the six
middlewares authenticates. Without this a developer assumes a token is needed
and skips the step, which is exactly where a malformed entry would have been
caught before it blanked the page.

Also drop the example URL added to the ?path= sentence last commit. It read
/applications/your-slug, but ?path= is read by ApplicationIframePage at
applications/iframe/:slug, so the example pointed at the module route where
nothing reads it. The rule is kept; the example is gone rather than corrected,
leaving no URL to drift against router.tsx.

Claude-Session: https://claude.ai/code/session_01S88R2iND5WD4UvXwAhx6uU
… gaps

- Adds user-guide/applications/add-an-application.md, a plain-language
  companion to the Application Onboarding Guide, wired into the sidebar
  and cross-linked from the applications index and API docs.
- Adds six items to applications-onboarding.md verified against origin/main
  of codemie and codemie-ui: the mount()/unmount() teardown race, the full
  YAML-to-API field mapping, the exact application routes and slug
  constraint, availableForExternal being silently inert for applications,
  the rolling-restart replica window, the missing removal path, and the
  narrow declarations API not covering applications.
Adds a one-line caption under the placeholder YAML block in both the
Application Onboarding Guide and the plain-language guide, naming AICE
(and MF Lens, in the plain-language guide) as real apps registered with
the same shape. Keeps the template itself generic so it can't go stale
the way the earlier Technology Copilot example did.
Aleksandr Budanov added 2 commits September 14, 2026 18:54
The audience line said "already built its own product", which excluded
teams building a panel specifically for CodeMie. That reader is served
by the module type and the capability-reuse section already on this
page.
…oarding guide

The iframe-redirect / keycloakConfigPath mechanism was only ever demonstrated
by an example application that has since been removed from production, and
no platform code implements or examines that field. State only the confirmed
fact (no identity/token/session is passed) instead.
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.

1 participant