Replies: 1 comment
-
|
Hey @CasJam - wanted to push on this with some real operational context, because the problem is sharper than the "fullstack app" framing captures. We run multiple monorepos, and inside each one there are genuinely co-equal language stacks - not a "primary" language with a secondary one bolted on. A typical repo for us has PHP/Laravel handling the API layer, TypeScript/React on the frontend, and Python services alongside for data work. These are not separate concerns that could be split into separate repos. They live together because they are the same product. This is where the current profile model breaks down. The entire inheritance system assumes a project has one dominant technology lineage and you walk up that chain to collect standards. In a monorepo with co-equal stacks, that assumption doesn't hold. There is no single lineage. There are three, and all three need to be active at the same time. The workarounds all hit the same wall - they don't survive the next install, or they introduce structural problems of their own. Composite profiles drift the moment an upstream profile changes. Sequential installs get overwritten. The most sophisticated thing I tried: install a base/common profile at the repo root, then install stack-specific profiles inside subdirectories and link back up to the root for shared items. It didn't work - Agent OS isn't designed with nested installs or cross-directory linking in mind, and the result was brittle enough that I abandoned it. I raise it because it shows the monorepo case drives you toward solutions the tool's architecture doesn't support. The mixin proposal is the right direction. But before the design is locked, one question I'd want answered: Is a flat global merge the right model for a monorepo? If I merge A few things I'd like your thinking on:
This is the hardest wall we hit with Agent OS in practice. The answer shapes whether mixins fully solve it or only solve part of it. |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
The Problem
Agent-OS's profile system uses single-parent inheritance — each profile has exactly one
inherits_frominconfig.yml. For projects that fit cleanly into one technology stack, this works well.Real-world projects often don't. A fullstack application with a React frontend and a FastAPI backend needs standards from two separate profile branches at once. Right now there's no native way to express that, so you end up reaching for workarounds that technically work but leave the setup implicit and brittle.
This is related to [#200](#200), which proposes a similar concept from the install script side (
--mixins propel-auth,prisma). This discussion focuses on the config representation side of the same problem — how multi-profile intent gets encoded inconfig.ymlso tooling can understand and enforce it.Why Single-Parent Falls Short
Consider a monorepo or fullstack project:
None of those concerns belong to a single profile lineage. Forcing them into one
inherits_fromchain means either creating bespoke composite profiles for every combination, or silently dropping standards from one side.Current Workarounds and Their Costs
Option A — Composite leaf profile: Manually copy standards from multiple source profiles into a dedicated composite directory. Explicit, but it duplicates files, drifts as source profiles evolve, and requires manual upkeep whenever an upstream profile changes.
Option B — Sequential install + manual
cp: Install the primary profile viaproject-install.sh, then copy standards from a second profile intoagent-os/standards/. Fragile — a second run ofproject-install.shoverwrites everything — and the layering is invisible inconfig.yml.Option C —
/discover-standardsafter install: Let the agent infer standards for the secondary language from the codebase. Useful when the secondary stack is genuinely project-specific, but not the right fit when the standards already exist in a known profile.All three produce a working setup. None of them encode the intent ("this project uses both of these profiles") in a way that tooling can understand or enforce.
Proposed Change
Allow
inherits_fromto accept a list:Resolution order (leftmost wins on conflict) would keep the behavior predictable. A separate
mixins:key is another option — it makes the additive intent explicit without touching the existinginherits_fromsemantics, and would align naturally with the install-time--mixinsflag proposed in [#200](#200).Questions for the Maintainers
mixins:approach is preferred, are there constraints on how conflict resolution should work?Happy to open a PR if the direction looks right. Thanks for the project — it has meaningfully improved consistency across how our AI agents operate.
Beta Was this translation helpful? Give feedback.
All reactions