facult 2.14.0 → 2.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,10 +15,6 @@
15
15
  </a>
16
16
  </div>
17
17
 
18
- <p align="center">
19
- <img alt="fclt demo" src="./Ghostty.gif">
20
- </p>
21
-
22
18
  `fclt` is a CLI for managing AI capability across tools and projects.
23
19
 
24
20
  It gives instructions, snippets, skills, agents, MCP definitions, automations, and tool config a shared home. It can inspect what already exists, consolidate duplicates, render selected capability into tools like Codex and Claude, and preserve real-work friction as writeback that can later become reviewed improvements.
@@ -143,6 +139,8 @@ fclt templates init operating-model --global
143
139
  fclt index --global
144
140
  ```
145
141
 
142
+ On first install, `fclt` seeds `AGENTS.global.md` from existing global agent docs such as `~/.codex/AGENTS.md` or `~/.claude/CLAUDE.md` when they exist, then appends the Facult operating-model frame. The packaged template is only the fallback.
143
+
146
144
  Refresh an existing operating-model pack without overwriting local edits:
147
145
 
148
146
  ```bash
@@ -219,7 +217,7 @@ Canonical capability can include:
219
217
  - `mcp/`: MCP server definitions and overlays
220
218
  - `automations/`: scheduled review loops
221
219
  - `tools/<tool>/`: tool config and rules
222
- - `AGENTS.global.md`: composed agent guidance
220
+ - `snippets/templates/agents-global.md`: source template materialized as `AGENTS.global.md`
223
221
 
224
222
  Refs let markdown point at canonical assets without hard-coding paths:
225
223
 
@@ -418,6 +416,7 @@ Start with:
418
416
  - [Project `.ai`](./docs/project-ai.md): repo-owned capability and project sync policy
419
417
  - [Built-in pack](./docs/built-in-pack.md): packaged work-unit, writeback, and evolution defaults
420
418
  - [Built-in pack upgrades](./docs/pack-upgrades.md): non-destructive refresh behavior for existing `.ai` roots
419
+ - [Codex plugin](./docs/codex-plugin.md): installable Codex skills and MCP tools for fclt workflows
421
420
  - [Writeback and evolution](./docs/writeback-evolution.md): the feedback-loop workflow and review surfaces
422
421
  - [Managed mode](./docs/managed-mode.md): when to let `fclt` write tool files
423
422
  - [Roadmap](./docs/roadmap.md): current gaps and planned work
@@ -426,7 +425,7 @@ Start with:
426
425
 
427
426
  ### Does fclt run an MCP server?
428
427
 
429
- Not yet as a first-party runtime. Today, `fclt` is CLI-first. You can scaffold MCP definitions that delegate to the CLI, and a dedicated plugin/MCP surface is on the roadmap.
428
+ The core product is still CLI-first. The first-party Codex plugin includes a small stdio MCP wrapper that delegates to the installed `fclt` binary for status, doctor, paths, setup, writeback, and evolution workflows. See [Codex plugin](./docs/codex-plugin.md).
430
429
 
431
430
  ### Does fclt have to manage Codex or Claude files?
432
431
 
@@ -1,9 +1,9 @@
1
1
  # Global Agent Instructions
2
2
 
3
- This file is the global entry template for the operating-model pack. It should
4
- stay small and composed from snippets. Put detailed doctrine in instructions,
5
- workflow execution in skills, and local/private preferences in user-owned or
6
- project-owned assets outside the public pack.
3
+ This template materializes as `AGENTS.global.md` when the operating-model pack is
4
+ installed. It should stay small and composed from snippets. Put detailed
5
+ doctrine in instructions, workflow execution in skills, and local/private
6
+ preferences in user-owned or project-owned assets outside the public pack.
7
7
 
8
8
  ## Working mode
9
9
 
package/docs/README.md CHANGED
@@ -14,6 +14,7 @@ The concepts guide includes the [feedback-loop diagram](./assets/fclt-capability
14
14
  - [Project `.ai`](./project-ai.md): how repo-local capability works without leaking project review state into the repo.
15
15
  - [Built-in pack](./built-in-pack.md): the packaged operating-model layer for writeback and evolution.
16
16
  - [Built-in pack upgrades](./pack-upgrades.md): non-destructive refresh behavior for existing `.ai` roots.
17
+ - [Codex plugin](./codex-plugin.md): installable Codex skills and MCP tools for fclt workflows.
17
18
  - [Writeback and evolution](./writeback-evolution.md): how real-work friction becomes reviewable capability changes.
18
19
  - [Managed mode](./managed-mode.md): when to let `fclt` write tool files, and how adoption works.
19
20
  - [Security and trust](./security-trust.md): source trust, audit, secrets, and commit hygiene.
@@ -31,11 +31,19 @@ Agents:
31
31
  - `scope-promoter`
32
32
  - `integration-auditor`
33
33
 
34
- Global doc:
34
+ Entry template:
35
35
 
36
- - `AGENTS.global.md`
36
+ - `snippets/templates/agents-global.md`
37
37
 
38
- `AGENTS.global.md` is the composed entry template for global agent guidance. It should stay small and point to snippets and instructions rather than becoming the only place where guidance lives.
38
+ The template materializes as `AGENTS.global.md` when installed into a canonical `.ai` root. The source lives under snippets/templates so the pack itself models composition instead of treating the root global doc as a special hand-maintained asset. The installed `AGENTS.global.md` should stay small and point to snippets and instructions rather than becoming the only place where guidance lives.
39
+
40
+ On first install, `fclt` preserves existing guidance when it can:
41
+
42
+ - global installs seed `AGENTS.global.md` from existing global agent docs such as `~/.codex/AGENTS.md` or `~/.claude/CLAUDE.md`
43
+ - project installs seed from the repo's existing `AGENTS.md` or `CLAUDE.md`
44
+ - the packaged template is only the fallback when no existing guidance is found
45
+
46
+ Seeded `AGENTS.global.md` files are treated as user-owned. They are not marked as pack-owned in the update manifest, so future `--update` runs skip them instead of replacing them with the fallback template.
39
47
 
40
48
  ## When It Becomes Active
41
49
 
@@ -0,0 +1,57 @@
1
+ # Codex Plugin
2
+
3
+ `fclt` ships a first-party Codex plugin at:
4
+
5
+ ```text
6
+ plugins/fclt/
7
+ ```
8
+
9
+ The plugin is for agent-led operation. After install, Codex gets focused skills for setup, writeback, evolution, and capability review, plus an MCP server wrapper that exposes common `fclt` CLI actions as tools.
10
+
11
+ ## What It Includes
12
+
13
+ - `fclt-setup`: install, update, inspect, initialize, and repair fclt setup.
14
+ - `fclt-writeback`: record and review durable writebacks from real work.
15
+ - `fclt-evolution`: turn repeated writeback into reviewed capability proposals.
16
+ - `fclt-capability-review`: inspect global/project capability roots and scope changes.
17
+ - `fclt` MCP server: stdio wrapper around the installed `fclt` CLI.
18
+
19
+ The MCP wrapper intentionally delegates to the local `fclt` binary instead of duplicating core logic. Set `FCLT_BIN` if Codex should call a specific binary.
20
+
21
+ ## MCP Tools
22
+
23
+ The plugin exposes:
24
+
25
+ - `fclt_status`
26
+ - `fclt_doctor`
27
+ - `fclt_paths`
28
+ - `fclt_init_operating_model`
29
+ - `fclt_writeback_add`
30
+ - `fclt_writeback_review`
31
+ - `fclt_evolve`
32
+
33
+ These tools are thin wrappers around CLI commands and return command output. Mutating tools still rely on the normal fclt safety model: dry-run first when available, review broad changes before apply, and preserve existing user guidance.
34
+
35
+ ## Install In Codex
36
+
37
+ From this repository, the plugin can be rendered into the Codex plugin marketplace by managed sync:
38
+
39
+ ```bash
40
+ fclt manage codex --global
41
+ fclt sync codex --global
42
+ ```
43
+
44
+ That writes plugin files under the Codex plugin location and updates the personal marketplace entry. Use managed sync only when you want `fclt` to write Codex tool files.
45
+
46
+ For local plugin development, run the lightweight checks that ship with the repository:
47
+
48
+ ```bash
49
+ node plugins/fclt/scripts/fclt-mcp.cjs --self-test
50
+ bun run check
51
+ ```
52
+
53
+ ## Recommended Agent Use
54
+
55
+ Use the plugin skills as the first interface. Use MCP tools when a Codex workflow benefits from structured calls for status, doctor, paths, writeback, or evolution review.
56
+
57
+ Do not create writeback/evolution noise. Record strong signal, group repeated signal, then propose the smallest concrete capability change.
@@ -54,7 +54,13 @@ Review skipped files before deciding whether to merge changes manually, keep the
54
54
 
55
55
  ## AGENTS.global.md
56
56
 
57
- The pack includes `AGENTS.global.md` as a composed entry template. It is not meant to hold every rule.
57
+ The pack source stores the composed entry template at `snippets/templates/agents-global.md`. During install or update, `fclt` materializes that template as `AGENTS.global.md` in the target `.ai` root.
58
+
59
+ That installed `AGENTS.global.md` is not meant to hold every rule.
60
+
61
+ If first install finds existing agent guidance, `fclt` seeds `AGENTS.global.md` from it and appends the Facult operating-model frame. Global installs look for existing global tool docs such as `~/.codex/AGENTS.md` and `~/.claude/CLAUDE.md`; project installs look for repo-local `AGENTS.md` or `CLAUDE.md`.
62
+
63
+ Seeded files are user-owned. They are intentionally excluded from the pack manifest so `--update` skips them unless you explicitly replace them with `--force` or edit them manually.
58
64
 
59
65
  Use:
60
66
 
package/docs/roadmap.md CHANGED
@@ -16,6 +16,7 @@ This roadmap tracks remaining product direction for `fclt`.
16
16
  - JSON-first `inventory`.
17
17
  - `sync --adopt-live` for explicit promotion of live tool edits.
18
18
  - Managed sync local-edit protection for rendered docs, config, MCP, and skills.
19
+ - Initial first-party Codex plugin with setup/writeback/evolution/capability-review skills and a CLI-backed MCP wrapper.
19
20
 
20
21
  ## Current Priorities
21
22
 
@@ -48,11 +49,11 @@ This roadmap tracks remaining product direction for `fclt`.
48
49
  - Add graph visibility.
49
50
  - Include them in status and sync plans.
50
51
 
51
- 7. Add a first-party Codex plugin and MCP surface.
52
- - Expose safe read/write operations over existing `fclt` behavior.
52
+ 7. Expand the first-party Codex plugin and MCP surface.
53
+ - Add richer setup planning tools beyond the initial CLI wrapper.
53
54
  - Keep the CLI and canonical `.ai` roots as the source of truth.
54
55
  - Gate high-risk global changes behind explicit review.
55
- - Bundle agent-facing skills for work units, writeback, evolution, capability search, and automation setup.
56
+ - Add more focused agent-facing skills for automation setup, capability search, and upgrade flows.
56
57
 
57
58
  8. Tighten selector consistency.
58
59
  - Use one selector grammar across `list`, `show`, `graph`, `enable`, `disable`, `trust`, `audit`, writeback, and evolution.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "facult",
3
- "version": "2.14.0",
3
+ "version": "2.15.1",
4
4
  "description": "Manage canonical AI capabilities, sync surfaces, and evolution state.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -33,6 +33,11 @@
33
33
  "bin/facult.cjs",
34
34
  "docs/**/*.md",
35
35
  "docs/**/*.png",
36
+ "plugins/fclt/.codex-plugin/*.json",
37
+ "plugins/fclt/.mcp.json",
38
+ "plugins/fclt/**/*.cjs",
39
+ "plugins/fclt/**/*.js",
40
+ "plugins/fclt/**/*.md",
36
41
  "src/**/*.ts",
37
42
  "!src/**/*.test.ts",
38
43
  "README.md",
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "fclt",
3
+ "version": "0.1.0",
4
+ "description": "Codex workflows and MCP tools for fclt setup, writeback, evolution, and capability review.",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "fclt",
8
+ "facult",
9
+ "codex",
10
+ "skills",
11
+ "mcp",
12
+ "writeback",
13
+ "evolution"
14
+ ],
15
+ "skills": "./skills/",
16
+ "mcpServers": "./.mcp.json",
17
+ "interface": {
18
+ "displayName": "fclt",
19
+ "shortDescription": "Capability loops for Codex",
20
+ "longDescription": "Install and operate fclt from Codex: initialize AI capability roots, inspect setup health, record writebacks, review evolution proposals, and keep skills, snippets, instructions, automations, and MCP surfaces improving over time.",
21
+ "developerName": "Hack Dance",
22
+ "category": "Productivity",
23
+ "capabilities": ["Read", "Write", "MCP"],
24
+ "defaultPrompt": [
25
+ "Use fclt to check this repo's AI capability setup.",
26
+ "Record useful fclt writeback from this work.",
27
+ "Review fclt evolution proposals and next actions."
28
+ ],
29
+ "brandColor": "#166534"
30
+ }
31
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "mcpServers": {
3
+ "fclt": {
4
+ "command": "node",
5
+ "args": ["./scripts/fclt-mcp.cjs"],
6
+ "env": {
7
+ "FCLT_BIN": "fclt"
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,321 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const { spawn } = require("node:child_process");
5
+
6
+ const FCLT_BIN = process.env.FCLT_BIN || "fclt";
7
+ const DEFAULT_TIMEOUT_MS = Number(process.env.FCLT_MCP_TIMEOUT_MS || 60_000);
8
+ const CONTENT_LENGTH_RE = /Content-Length:\s*(\d+)/i;
9
+
10
+ const tools = [
11
+ {
12
+ name: "fclt_status",
13
+ description:
14
+ "Return fclt status for the current, global, or project scope.",
15
+ inputSchema: {
16
+ type: "object",
17
+ properties: {
18
+ scope: { type: "string", enum: ["auto", "global", "project"] },
19
+ cwd: { type: "string" },
20
+ },
21
+ },
22
+ },
23
+ {
24
+ name: "fclt_doctor",
25
+ description: "Run read-only fclt doctor checks and return JSON output.",
26
+ inputSchema: {
27
+ type: "object",
28
+ properties: {
29
+ scope: { type: "string", enum: ["auto", "global", "project"] },
30
+ cwd: { type: "string" },
31
+ },
32
+ },
33
+ },
34
+ {
35
+ name: "fclt_paths",
36
+ description: "Return canonical, generated, review, and runtime fclt paths.",
37
+ inputSchema: {
38
+ type: "object",
39
+ properties: {
40
+ scope: { type: "string", enum: ["auto", "global", "project"] },
41
+ cwd: { type: "string" },
42
+ },
43
+ },
44
+ },
45
+ {
46
+ name: "fclt_init_operating_model",
47
+ description: "Install or update the built-in operating-model pack.",
48
+ inputSchema: {
49
+ type: "object",
50
+ properties: {
51
+ scope: { type: "string", enum: ["global", "project"] },
52
+ cwd: { type: "string" },
53
+ update: { type: "boolean" },
54
+ dryRun: { type: "boolean" },
55
+ force: { type: "boolean" },
56
+ },
57
+ required: ["scope"],
58
+ },
59
+ },
60
+ {
61
+ name: "fclt_writeback_add",
62
+ description: "Record a durable fclt writeback with evidence.",
63
+ inputSchema: {
64
+ type: "object",
65
+ properties: {
66
+ scope: { type: "string", enum: ["auto", "global", "project"] },
67
+ cwd: { type: "string" },
68
+ kind: { type: "string" },
69
+ summary: { type: "string" },
70
+ asset: { type: "string" },
71
+ evidence: { type: "string" },
72
+ confidence: {
73
+ type: "string",
74
+ enum: ["low", "medium", "high"],
75
+ },
76
+ },
77
+ required: ["kind", "summary"],
78
+ },
79
+ },
80
+ {
81
+ name: "fclt_writeback_review",
82
+ description: "List, group, or summarize current fclt writebacks.",
83
+ inputSchema: {
84
+ type: "object",
85
+ properties: {
86
+ scope: { type: "string", enum: ["auto", "global", "project"] },
87
+ cwd: { type: "string" },
88
+ mode: { type: "string", enum: ["list", "group", "summarize"] },
89
+ by: { type: "string" },
90
+ },
91
+ },
92
+ },
93
+ {
94
+ name: "fclt_evolve",
95
+ description: "List, propose, draft, or review fclt evolution proposals.",
96
+ inputSchema: {
97
+ type: "object",
98
+ properties: {
99
+ scope: { type: "string", enum: ["auto", "global", "project"] },
100
+ cwd: { type: "string" },
101
+ action: {
102
+ type: "string",
103
+ enum: ["list", "propose", "draft", "review", "show"],
104
+ },
105
+ id: { type: "string" },
106
+ },
107
+ },
108
+ },
109
+ ];
110
+
111
+ function scopeArgs(scope) {
112
+ if (scope === "global") {
113
+ return ["--global"];
114
+ }
115
+ if (scope === "project") {
116
+ return ["--project"];
117
+ }
118
+ return [];
119
+ }
120
+
121
+ function boolFlag(name, value) {
122
+ return value ? [name] : [];
123
+ }
124
+
125
+ function stringFlag(name, value) {
126
+ return typeof value === "string" && value.trim() ? [name, value] : [];
127
+ }
128
+
129
+ function commandForTool(name, args = {}) {
130
+ switch (name) {
131
+ case "fclt_status":
132
+ return ["status", ...scopeArgs(args.scope), "--json"];
133
+ case "fclt_doctor":
134
+ return ["doctor", ...scopeArgs(args.scope), "--json"];
135
+ case "fclt_paths":
136
+ return ["paths", ...scopeArgs(args.scope), "--json"];
137
+ case "fclt_init_operating_model":
138
+ return [
139
+ "templates",
140
+ "init",
141
+ "operating-model",
142
+ ...scopeArgs(args.scope),
143
+ ...boolFlag("--update", args.update),
144
+ ...boolFlag("--dry-run", args.dryRun),
145
+ ...boolFlag("--force", args.force),
146
+ "--json",
147
+ ];
148
+ case "fclt_writeback_add":
149
+ return [
150
+ "ai",
151
+ "writeback",
152
+ ...scopeArgs(args.scope),
153
+ "add",
154
+ "--kind",
155
+ args.kind,
156
+ "--summary",
157
+ args.summary,
158
+ ...stringFlag("--asset", args.asset),
159
+ ...stringFlag("--evidence", args.evidence),
160
+ ...stringFlag("--confidence", args.confidence),
161
+ ];
162
+ case "fclt_writeback_review": {
163
+ const mode = args.mode || "list";
164
+ return [
165
+ "ai",
166
+ "writeback",
167
+ ...scopeArgs(args.scope),
168
+ mode,
169
+ ...stringFlag("--by", args.by),
170
+ ];
171
+ }
172
+ case "fclt_evolve": {
173
+ const action = args.action || "list";
174
+ return [
175
+ "ai",
176
+ "evolve",
177
+ ...scopeArgs(args.scope),
178
+ action,
179
+ ...(args.id ? [args.id] : []),
180
+ ];
181
+ }
182
+ default:
183
+ throw new Error(`Unknown tool: ${name}`);
184
+ }
185
+ }
186
+
187
+ function runFclt(args, cwd) {
188
+ return new Promise((resolve) => {
189
+ const child = spawn(FCLT_BIN, args, {
190
+ cwd: cwd || process.cwd(),
191
+ env: process.env,
192
+ stdio: ["ignore", "pipe", "pipe"],
193
+ });
194
+ let stdout = "";
195
+ let stderr = "";
196
+ const timer = setTimeout(() => {
197
+ child.kill("SIGTERM");
198
+ }, DEFAULT_TIMEOUT_MS);
199
+ child.stdout.on("data", (chunk) => {
200
+ stdout += chunk.toString();
201
+ });
202
+ child.stderr.on("data", (chunk) => {
203
+ stderr += chunk.toString();
204
+ });
205
+ child.on("close", (code) => {
206
+ clearTimeout(timer);
207
+ resolve({
208
+ code,
209
+ text: [
210
+ `$ ${FCLT_BIN} ${args.join(" ")}`,
211
+ stdout.trim(),
212
+ stderr.trim() ? `stderr:\n${stderr.trim()}` : "",
213
+ ]
214
+ .filter(Boolean)
215
+ .join("\n\n"),
216
+ });
217
+ });
218
+ });
219
+ }
220
+
221
+ function send(message) {
222
+ const body = JSON.stringify(message);
223
+ process.stdout.write(
224
+ `Content-Length: ${Buffer.byteLength(body)}\r\n\r\n${body}`
225
+ );
226
+ }
227
+
228
+ async function handle(message) {
229
+ if (!message || message.id == null) {
230
+ return;
231
+ }
232
+
233
+ try {
234
+ if (message.method === "initialize") {
235
+ send({
236
+ jsonrpc: "2.0",
237
+ id: message.id,
238
+ result: {
239
+ protocolVersion: "2025-06-18",
240
+ capabilities: { tools: {} },
241
+ serverInfo: { name: "fclt", version: "0.1.0" },
242
+ },
243
+ });
244
+ return;
245
+ }
246
+ if (message.method === "tools/list") {
247
+ send({ jsonrpc: "2.0", id: message.id, result: { tools } });
248
+ return;
249
+ }
250
+ if (message.method === "tools/call") {
251
+ const { name, arguments: args = {} } = message.params || {};
252
+ const command = commandForTool(name, args);
253
+ const result = await runFclt(command, args.cwd);
254
+ send({
255
+ jsonrpc: "2.0",
256
+ id: message.id,
257
+ result: {
258
+ isError: result.code !== 0,
259
+ content: [{ type: "text", text: result.text }],
260
+ },
261
+ });
262
+ return;
263
+ }
264
+ send({
265
+ jsonrpc: "2.0",
266
+ id: message.id,
267
+ error: { code: -32_601, message: `Method not found: ${message.method}` },
268
+ });
269
+ } catch (error) {
270
+ send({
271
+ jsonrpc: "2.0",
272
+ id: message.id,
273
+ error: {
274
+ code: -32_000,
275
+ message: error instanceof Error ? error.message : String(error),
276
+ },
277
+ });
278
+ }
279
+ }
280
+
281
+ let buffer = Buffer.alloc(0);
282
+
283
+ process.stdin.on("data", (chunk) => {
284
+ buffer = Buffer.concat([buffer, chunk]);
285
+ while (true) {
286
+ const headerEnd = buffer.indexOf("\r\n\r\n");
287
+ if (headerEnd === -1) {
288
+ return;
289
+ }
290
+ const header = buffer.slice(0, headerEnd).toString("utf8");
291
+ const match = CONTENT_LENGTH_RE.exec(header);
292
+ if (!match) {
293
+ buffer = Buffer.alloc(0);
294
+ return;
295
+ }
296
+ const length = Number(match[1]);
297
+ const frameEnd = headerEnd + 4 + length;
298
+ if (buffer.length < frameEnd) {
299
+ return;
300
+ }
301
+ const body = buffer.slice(headerEnd + 4, frameEnd).toString("utf8");
302
+ buffer = buffer.slice(frameEnd);
303
+ handle(JSON.parse(body)).catch((error) => {
304
+ send({
305
+ jsonrpc: "2.0",
306
+ id: null,
307
+ error: {
308
+ code: -32_000,
309
+ message: error instanceof Error ? error.message : String(error),
310
+ },
311
+ });
312
+ });
313
+ }
314
+ });
315
+
316
+ if (process.argv.includes("--self-test")) {
317
+ console.log(
318
+ JSON.stringify({ tools: tools.map((tool) => tool.name) }, null, 2)
319
+ );
320
+ process.exit(0);
321
+ }
@@ -0,0 +1,51 @@
1
+ ---
2
+ description: Inspect fclt capability roots, docs, snippets, skills, agents, MCP, and automations.
3
+ tags: [fclt, capability, review, inventory]
4
+ ---
5
+
6
+ # fclt-capability-review
7
+
8
+ ## When To Use
9
+ Use this skill when Codex needs to understand what capability exists before changing it.
10
+
11
+ Use it for:
12
+
13
+ - checking global and project `.ai` roots
14
+ - finding relevant skills, snippets, instructions, agents, MCP servers, or automations
15
+ - deciding whether a change belongs in global or project scope
16
+ - checking whether managed rendering is enabled or needed
17
+ - reviewing public/private boundaries before publishing docs or pack assets
18
+
19
+ ## Workflow
20
+
21
+ ```bash
22
+ fclt status --json
23
+ fclt inventory --json
24
+ fclt list skills
25
+ fclt list instructions
26
+ fclt list snippets
27
+ fclt graph AGENTS.global.md
28
+ ```
29
+
30
+ For project work:
31
+
32
+ ```bash
33
+ fclt status --project --json
34
+ fclt inventory --project --json
35
+ ```
36
+
37
+ ## Rules
38
+
39
+ - Read existing repo guidance before proposing project capability.
40
+ - Use project scope for repo-specific commands, tests, architecture, or team workflow.
41
+ - Use global scope only for broadly reusable behavior.
42
+ - Keep generated state and review artifacts out of repo-local `.ai`.
43
+ - Prefer adding or updating the smallest unit: instruction, snippet, skill, agent, MCP config, or automation.
44
+
45
+ ## Output
46
+
47
+ - capability roots found
48
+ - relevant assets
49
+ - scope recommendation
50
+ - missing or stale capability
51
+ - safe next command