feat: seed the catalog with the slack feature - #2
Open
AhmedTMM wants to merge 2 commits into
Open
Conversation
Initializes ori-feature-catalog as a remote feature root: a `features/*` workspace that any intern can load with `--features github.com/OpenRouterLabs/ori-feature-catalog/features/slack`. `features/slack` is lifted verbatim from OpenRouterInterns/egg at 401b2064df6ec72885a70707d151aae93aaf9c86 (branch `slack-surface`), the same tree ira runs. No source file was modified in the move. The feature is self-contained: its only non-relative imports are its own declared dependencies, node/bun builtins, and the `ori` runtime the consuming workspace provides. Nothing is pulled from egg's root or sibling features, which is what makes it liftable at all. Root scaffolding mirrors egg (workspaces, tsconfig, bunfig exact-install, gitignore) minus the bits that only make sense inside egg: no lefthook, commitlint, or `ori lint` wiring, since the catalog carries no CI yet. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AhmedTMM
commented
Aug 22, 2026
AhmedTMM
left a comment
Collaborator
Author
There was a problem hiding this comment.
Re-posting @louisgv's inline review from #1, which GitHub will not let me reopen after I force-pushed the base ref. Same branch, identical content, so every anchor below is the same file and line.
All six land on code lifted verbatim from egg 401b206, so they are pre-existing rather than regressions from this move — worth deciding whether to fix here or fix in egg and re-lift.
| import { retryPolicies, WebClient } from "@slack/web-api"; | ||
| import { slackifyMarkdown } from "slackify-markdown"; | ||
|
|
||
| import { recordLiveLine } from "../../../src/turn/live-line.ts"; |
Collaborator
Author
| // keep importing from their local guards module. | ||
|
|
||
| // oxlint-disable-next-line import/no-relative-parent-imports -- skills are materialized side by side in the agent workspace; the sibling skill's script is the real runtime path | ||
| export { isString, tryCatchAsync } from "../../slack-api/scripts/result.ts"; |
Collaborator
Author
| makeClient, | ||
| markdownToSlack, | ||
| resolveThreadTs, | ||
| } from "../../slack-api/scripts/helpers.ts"; |
Collaborator
Author
| noThread?: boolean | undefined; | ||
| /** Env map for SLACK_* configuration; defaults to Bun.env. */ | ||
| env?: Record<string, string | undefined> | undefined; | ||
| } |
Collaborator
Author
| originChannel: string | undefined; | ||
| originTs: string | undefined; | ||
| anchorTs?: string | undefined; | ||
| }): unknown[] => { |
Collaborator
Author
| status: HTTP_UNAUTHORIZED, | ||
| }), | ||
| }; | ||
| } |
Collaborator
Author
louisgv
reviewed
Aug 22, 2026
| ): Result.Result<number | undefined, Error> => { | ||
| if (raw === undefined) { | ||
| // oxlint-disable-next-line unicorn/no-useless-undefined -- Result.succeed needs an explicit arg to infer Result<number | undefined, Error> | ||
| return Result.succeed(undefined); |
There was a problem hiding this comment.
instead of using undefined, let's use Option isntead
The README told an intern to run ori dev --features github.com/OpenRouterLabs/ori-feature-catalog/features/slack which does not load the slack feature. `--features` takes a features *root*, and `resolveFeaturesRoot` (framework/runloop/src/feature-boot-services.ts) descends one level only: it returns `<input>/features` when that exists and `<input>` otherwise. Pointing at `features/slack` therefore makes that directory the root and enumerates its own subdirectories as features — `src` and `skills`, never `slack`. Pointing at the repo root resolves to the nested `features/` and discovers `slack` correctly. The shadowing paragraph was also wrong for the flag form. `resolveLocalFeaturesRoot` uses the `--features` value *as* the local root, so a single flag replaces the workspace's own features rather than composing with it, leaving nothing to shadow. Composition happens only for sources declared in `ori.md`, where the local root is appended after the declared ones. The README now says which form gives forking. Also documents that the repo-root form loads every feature in the catalog, that `ori init .` is what makes `bun run typecheck` meaningful, and links to openrouter.ai/ori rather than the internal repo. Adds a CI workflow. Tests need no secrets, so `bun install && bun test` is cheap, and interns consume this repo's default-branch tip with nothing checking it today. Drops the `docs/slack-surface-rebuild.md` link at features/slack/AGENTS.md:5. The target exists in neither repo — egg has no `docs/` at 401b206 — so it was a dead pointer telling the reader to read a nonexistent file first. This is the only departure from a verbatim lift. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Initializes
ori-feature-catalogas a remote feature root and seeds it with its firstfeature,
slack, lifted fromOpenRouterInterns/egg.Replaces #1, which GitHub auto-closed and will not let me reopen — I force-pushed
mainto correct commit authorship, and force-pushing a PR's base ref permanentlycloses it. @louisgv's six review comments are preserved on #1 and re-posted inline here.
A catalog is the list you pick from, distinct from a "feature set", which is what an
individual intern assembles in its own
features/directory. The name also avoids theX/Xslug — the path readsori-feature-catalog/features/slack, notfeatures/features.What changed for users
An intern can load the Slack surface without egg. Point
--featuresat the repo root:Nothing is removed from egg — this is a copy, not a move.
Provenance
features/slackis lifted from egg at401b2064df6ec72885a70707d151aae93aaf9c86, thehead of egg's
slack-surfacebranch. Stating this precisely, since a review questioned it:401b206is in egg — it isslack-surface's current head, dated 2026-08-20.main. Slack was reverted from main inc2dc603("Revert 'feat(slack): bring the Slack chat surface into egg' (#522)"), so
features/on egg's main is
linear notion rules self-update working-with-github— noslack.of the discrepancy.
gh api repos/OpenRouterInterns/egg/commits/401b206resolves.That the feature has no home on egg's main is the argument for this repo, not against it.
Review guide
package.json,tsconfig.json,bunfig.toml,.gitignore— root scaffoldingmirrored from egg, minus egg-only wiring (lefthook, commitlint,
ori lint)..github/workflows/ci.yml—bun install && bun test. No secrets needed.README.md— how to consume the catalog, and rules for adding a feature.features/slack/**— 171 files, verbatim from egg401b206except one line: thedocs/slack-surface-rebuild.mdlink atAGENTS.md:5, removed because the targetexists in neither repo (egg has no
docs/at that commit).Self-contained: the only non-relative imports are declared dependencies, node/bun
builtins, its own package name, and
ori. Nothing reaches into egg's root or a sibling.Fixed after review
--featurespath was wrong (blocking). The README said.../ori-feature-catalog/features/slack, which does not load the feature.resolveFeaturesRootdescends one level only, so that path becomes the root andenumerates
srcandskillsas features. Now points at the repo root. Thanks Devin.--features <remote>replaces the local features root rather than composing with it, so nothing shadows.
Composition happens only via
ori.md. README now distinguishes them.AGENTS.md:5. Removed.and that
ori init .is what makesbun run typecheckmeaningful.How I verified
bun test— 659 pass, 0 fail, 1150 assertions across 59 files, standalone with noegg present. Independently reproduced by Devin.
diff -rvs egg401b206:features/slack— zero differences at the time of the lift.resolveFeaturesRootandresolveLocalFeaturesRootread directly inOpenRouterIncubator/orito confirm both README bugs before fixing them.Corrections to my earlier numbers, both of which Devin was right about:
bun run typecheckemits 21 diagnostics, 14 of them TS2307, not one. The other 7are implicit-any cascades from the same missing SDK. Expected:
oriresolves throughoptionalDependenciesto a generated, git-ignored.ori/sdk. Runori init .first.dropped the claim rather than pick a number.
Follow-ups, deliberately not here
internal, not public. Visibility is an owner call.feature; worth a design decision before the catalog grows.
@ori-monorepo/slack. Renaming means rewriting itsself-referential imports; deserves its own PR with tests.
oxlint-disabledirectives in the lifted source areunenforced here.
cross-skill imports are load-bearing — skills materialize as symlinks and resolution
follows the real path — so the
imports-map alternative should be proven before it isadopted. The
blocks?: unknown[]→KnownBlock[]tightening is worth doing, in eggfirst or as a follow-up the two repos then diverge on.