Adds a subtle "with SCE" line beneath the Claude Code startup branding

AI made code generation fast. Team alignment didn't keep up.
SCE treats the why behind your code, architecture, decisions, constraints, as a versioned, shared artifact that both your team and your AI agents work from.
context/ directory holding the architecture, decisions, and constraints AI agents otherwise re-derive every sessionInstall the sce CLI through whichever channel fits your environment:
# npm
npm install -g @crocoder-dev/sce
# cargo
cargo install shared-context-engineering --locked
# nix
nix profile install github:crocoder-dev/shared-context-engineering
Then, from inside a git repository:
sce setup # install generated assistant config, hooks, and bash policy
sce doctor # verify the install is healthy
sce setup writes OpenCode, Claude Code, and/or Pi config into your repo, installs the required git hooks, and initializes the per-repo Agent Trace database. Use sce setup --pi for Pi only, or sce setup --all for OpenCode + Claude Code + Pi. sce doctor is read-only by default; sce doctor --fix will repair the issues it knows how to repair (missing or stale hooks, missing canonical DB parent directories) and report the rest for manual follow-up.
Stop agents from running commands your repo does not allow.
Configure policies.bash in .sce/config.json with built-in presets and/or your own deny rules. Examples of what teams use it for:
git commit so agents go through the SCE commit flownpm/pnpm in a Bun repo)SCE writes a local, per-repo audit trail conforming to the Agent Trace spec. Each commit links back to the agent conversation, tool calls, and diff that produced it, all stored on your machine.
| Feature | OpenCode | Claude Code | Pi |
|---|---|---|---|
| Generated config | ✓ | ✓ | ✓ |
| Hooks + Bash policy | ✓ | ✓ | ✓ |
| Conversation + diff trace | ✓ | ✓ | ✓ |
| Model / session attribution | full | full | full |
Shared context/ | ✓ | ✓ | ✓ |
AI sped up code generation, not team alignment. Without shared, durable context, every agent session starts cold and every reviewer re-derives the why from scratch, what we call cognitive debt. SCE is the infrastructure to pay it down.
Read the full argument → Motivation
Built by CroCoder.
hooks/register.ts 72 lines1import type { On } from 'claude-code'
2
3let started = false
4
5export const ART = [
6 '███████╗ ██████╗███████╗',
7 '██╔════╝██╔════╝██╔════╝',
8 '███████╗██║ █████╗',
9 '╚════██║██║ ██╔══╝',
10 '███████║╚██████╗███████╗',
11 '╚══════╝ ╚═════╝╚══════╝',
12]
13
14const GRADIENT_LEFT = [255, 0, 255] as const
15const GRADIENT_RIGHT = [0, 255, 255] as const
16const ART_WIDTH = Math.max(...ART.map((row) => [...row].length))
17
18export function gradientColor(col: number): string {
19 const t = col / Math.max(ART_WIDTH - 1, 1)
20 return (
21 '#' +
22 GRADIENT_LEFT.map((a, i) => Math.round(a + (GRADIENT_RIGHT[i] - a) * t).toString(16).padStart(2, '0')).join('')
23 )
24}
25
26export const SITE = 'sce.crocoder.dev'
27export const FOOTER = `Visit ${SITE} to learn more.`
28export const LOADED = 'loaded.'
29
30export function register(on: On) {
31 on('prompt.submit', async ($, e, next) => {
32 if (!started) {
33 started = true
34 $.ui.invalidate('ui.render')
35 }
36 return next(e)
37 }).catch(($, e, next) => next(e))
38
39 on('session.end', async ($, e, next) => {
40 if (e.reason === 'clear' && started) {
41 started = false
42 $.ui.invalidate('ui.render')
43 }
44 return next(e)
45 })
46
47 on('ui.render', { component: 'AbovePrompt', surface: 'terminal' }, async ($, e, next) => {
48 if (started || e.props.hasSurvey) return next(e)
49 const { Box, Text, Link } = $.ui.resolve(e)
50 const theirs = await next(e)
51 const label = Box({
52 paddingLeft: 11,
53 flexDirection: 'column',
54 children: [
55 ...ART.map((row, i) => {
56 const art = Text({ children: [...row].map((ch, col) => (ch === ' ' ? ch : Text({ color: gradientColor(col), children: ch }))) })
57 if (i !== ART.length - 2) return art
58 return Box({ flexDirection: 'row', children: [art, Text({ color: 'cyan', children: ` ${LOADED}` })] })
59 }),
60 Text({
61 children: [
62 'Visit ',
63 Text({ color: 'cyan', underline: true, children: Link({ href: `https://${SITE}`, label: SITE }) }),
64 ' to learn more.',
65 ],
66 }),
67 ],
68 })
69 return Box({ flexDirection: 'column', children: [label, theirs] })
70 })
71}
72