@stravica-ai/digital-operator-pa 0.1.39 → 0.1.41
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 +12 -2
- package/bin/confluence +9 -0
- package/bin/confluence-fetch +9 -0
- package/bin/jira +9 -0
- package/dist/engineering-pa-core/knowledge/content-voice/banned-ai-tells-taxonomy.md +1 -1
- package/dist/engineering-pa-core/knowledge/knowledge-memory/staging-and-observations.md +3 -3
- package/dist/engineering-pa-core/knowledge/platform-tooling/workspace-extensions.md +62 -0
- package/dist/engineering-pa-core-extensions-atlassian/README.md +81 -16
- package/dist/engineering-pa-core-extensions-atlassian/bin/confluence +2 -0
- package/dist/engineering-pa-core-extensions-atlassian/bin/confluence-fetch +2 -0
- package/dist/engineering-pa-core-extensions-atlassian/bin/jira +2 -0
- package/dist/engineering-pa-core-extensions-atlassian/config/jira-workflow-chains.default.json +4 -0
- package/dist/engineering-pa-core-extensions-atlassian/index.mjs +17 -6
- package/dist/engineering-pa-core-extensions-atlassian/package.json +11 -4
- package/dist/engineering-pa-core-extensions-atlassian/src/common/invalidate-client.mjs +137 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/common/pa-name.mjs +58 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/common/secrets.mjs +158 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/cli.mjs +165 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/client.mjs +294 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/auth.mjs +59 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/comment.mjs +174 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/create.mjs +136 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/label.mjs +98 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/mine.mjs +105 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/mirror-folder.mjs +487 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/mirror-page.mjs +351 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/page.mjs +127 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/pages.mjs +107 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/recent.mjs +107 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/search.mjs +123 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/spaces.mjs +82 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/test.mjs +155 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/tree.mjs +103 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/commands/update.mjs +134 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/format.mjs +260 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/mirror.mjs +353 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence/storage.mjs +880 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence-fetch/cli.mjs +313 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/confluence-fetch/fetch.mjs +327 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/adf.mjs +388 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/bug-fields.mjs +294 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/cli.mjs +197 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/client.mjs +350 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/advance.mjs +486 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/attach.mjs +129 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/auth.mjs +53 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/boards.mjs +88 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/bulk-transition.mjs +223 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/cancel.mjs +135 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/comment.mjs +169 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/create.mjs +376 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/issue.mjs +105 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/link.mjs +204 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/mine.mjs +97 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/projects.mjs +91 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/search.mjs +80 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/sprint.mjs +111 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/sync-statuses.mjs +313 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/test.mjs +142 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/transition.mjs +197 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/update.mjs +284 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/commands/worklog.mjs +380 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/format.mjs +267 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/invalidate.mjs +72 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/metadata.mjs +225 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/required-fields.mjs +334 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/workflow-chains.mjs +405 -0
- package/dist/engineering-pa-core-extensions-atlassian/src/jira/workflow-map.mjs +107 -0
- package/dist/engineering-pa-scaffold/README.md +32 -1
- package/dist/engineering-pa-scaffold/src/cli.mjs +83 -6
- package/dist/engineering-pa-scaffold/src/commands/init-workspace-extension.mjs +234 -0
- package/dist/engineering-pa-scaffold/src/commands/init.mjs +6 -5
- package/dist/engineering-pa-scaffold/src/generator.mjs +240 -4
- package/dist/engineering-pa-scaffold/templates/CLAUDE.md.template +7 -7
- package/dist/engineering-pa-scaffold/templates/operator-README.md.template +4 -4
- package/dist/engineering-pa-scaffold/templates/root-CLAUDE.md.template +13 -0
- package/dist/engineering-pa-types-engineering/index.mjs +14 -6
- package/dist/engineering-pa-types-engineering/knowledge/rcf-lite/create-a-small-app.md +81 -0
- package/dist/engineering-pa-types-engineering/knowledge/rcf-lite/for-agents.md +25 -0
- package/dist/engineering-pa-types-engineering/knowledge/rcf-lite/index.md +34 -0
- package/dist/engineering-pa-types-engineering/knowledge/rcf-lite/reference.md +16 -0
- package/dist/engineering-pa-types-engineering/knowledge/rcf-lite/wire-your-agent.md +17 -0
- package/dist/engineering-pa-types-engineering/package.json +2 -2
- package/dist/engineering-pa-types-engineering/roles/rcf-lite-engineer/definition.md +183 -0
- package/dist/engineering-pa-workspace/app/home.html +7 -7
- package/dist/engineering-pa-workspace/app/onboarding.html +4 -4
- package/dist/engineering-pa-workspace/src/api.mjs +1 -1
- package/dist/engineering-pa-workspace/src/server.mjs +1 -1
- package/docs/installing.md +78 -0
- package/docs/onboarding-solo.md +162 -0
- package/docs/what-it-can-do.md +85 -0
- package/package.json +6 -2
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
// kind: 'dir' (mkdir -p) | 'file' (write file with contents) | 'json'
|
|
8
8
|
// (stringify + write).
|
|
9
9
|
|
|
10
|
-
import {
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { readFile, readdir } from 'node:fs/promises';
|
|
11
12
|
import { dirname, join, resolve } from 'node:path';
|
|
12
13
|
import { fileURLToPath } from 'node:url';
|
|
13
14
|
|
|
@@ -18,6 +19,14 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
|
18
19
|
/** Path to the CLAUDE.md template (relative to this module). */
|
|
19
20
|
export const CLAUDE_MD_TEMPLATE_PATH = resolve(__dirname, '..', 'templates', 'CLAUDE.md.template');
|
|
20
21
|
|
|
22
|
+
/** Path to the root-CLAUDE.md pointer template (relative to this module). */
|
|
23
|
+
export const ROOT_CLAUDE_MD_TEMPLATE_PATH = resolve(
|
|
24
|
+
__dirname,
|
|
25
|
+
'..',
|
|
26
|
+
'templates',
|
|
27
|
+
'root-CLAUDE.md.template',
|
|
28
|
+
);
|
|
29
|
+
|
|
21
30
|
/** Path to the operator README template (relative to this module). */
|
|
22
31
|
export const OPERATOR_README_TEMPLATE_PATH = resolve(
|
|
23
32
|
__dirname,
|
|
@@ -26,6 +35,65 @@ export const OPERATOR_README_TEMPLATE_PATH = resolve(
|
|
|
26
35
|
'operator-README.md.template',
|
|
27
36
|
);
|
|
28
37
|
|
|
38
|
+
/**
|
|
39
|
+
* Path to the `/research` slash-command doc, resolved out of the bundled
|
|
40
|
+
* engineering-pa-core package. Two candidates so this works both from the
|
|
41
|
+
* source monorepo (`packages/scaffold/src/generator.mjs` → `packages/core/…`)
|
|
42
|
+
* and from the packed tarball (`dist/engineering-pa-scaffold/src/generator.mjs`
|
|
43
|
+
* → `dist/engineering-pa-core/…`). The scaffold reads the file at plan time
|
|
44
|
+
* so the copy the colleague gets never drifts from the packaged canonical.
|
|
45
|
+
*/
|
|
46
|
+
const RESEARCH_COMMAND_CANDIDATES = [
|
|
47
|
+
resolve(__dirname, '..', '..', 'engineering-pa-core', 'docs', 'commands', 'research.md'),
|
|
48
|
+
resolve(__dirname, '..', '..', 'core', 'docs', 'commands', 'research.md'),
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
export const RESEARCH_COMMAND_TEMPLATE_PATH =
|
|
52
|
+
RESEARCH_COMMAND_CANDIDATES.find((p) => existsSync(p)) ?? RESEARCH_COMMAND_CANDIDATES[0];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Path to the bundled `workspace-extensions.md` PA-facing knowledge doc,
|
|
56
|
+
* resolved out of the packaged core. Two candidates so this works in both
|
|
57
|
+
* the source monorepo (`packages/scaffold/src/generator.mjs` -> `packages/core/...`)
|
|
58
|
+
* and the packed tarball (`dist/engineering-pa-scaffold/src/generator.mjs`
|
|
59
|
+
* -> `dist/engineering-pa-core/...`). The scaffold seeds the doc into
|
|
60
|
+
* `operator/knowledge/platform-tooling/workspace-extensions.md` so that
|
|
61
|
+
* `pa knowledge search "workspace extension"` reaches it in a fresh
|
|
62
|
+
* scaffolded solo instance (the retrieval graph scans `operator/knowledge/`
|
|
63
|
+
* and `core/knowledge/` under the repo root, and a solo scaffold ships
|
|
64
|
+
* neither of those trees populated by default).
|
|
65
|
+
*/
|
|
66
|
+
const WORKSPACE_EXTENSIONS_KNOWLEDGE_CANDIDATES = [
|
|
67
|
+
resolve(__dirname, '..', '..', 'engineering-pa-core', 'knowledge', 'platform-tooling', 'workspace-extensions.md'),
|
|
68
|
+
resolve(__dirname, '..', '..', 'core', 'knowledge', 'platform-tooling', 'workspace-extensions.md'),
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
export const WORKSPACE_EXTENSIONS_KNOWLEDGE_PATH =
|
|
72
|
+
WORKSPACE_EXTENSIONS_KNOWLEDGE_CANDIDATES.find((p) => existsSync(p))
|
|
73
|
+
?? WORKSPACE_EXTENSIONS_KNOWLEDGE_CANDIDATES[0];
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Path to the bundled `rcf-lite/` link-led knowledge bucket, resolved out
|
|
77
|
+
* of the packaged engineering role pack. Two candidates so this works in
|
|
78
|
+
* both the source monorepo (`packages/scaffold/src/generator.mjs` ->
|
|
79
|
+
* `packages/types/engineering/knowledge/rcf-lite/`) and the packed tarball
|
|
80
|
+
* (`dist/engineering-pa-scaffold/src/generator.mjs` ->
|
|
81
|
+
* `dist/engineering-pa-types-engineering/knowledge/rcf-lite/`). The
|
|
82
|
+
* scaffold seeds every `.md` file in this directory into
|
|
83
|
+
* `operator/knowledge/rcf-lite/` so `pa knowledge search "rcf-lite"`
|
|
84
|
+
* reaches the bucket in a fresh scaffolded solo instance (the retrieval
|
|
85
|
+
* graph scans `operator/knowledge/` and `core/knowledge/` under the repo
|
|
86
|
+
* root; a bundled-only copy would be invisible to the search verb).
|
|
87
|
+
*/
|
|
88
|
+
const RCF_LITE_KNOWLEDGE_DIR_CANDIDATES = [
|
|
89
|
+
resolve(__dirname, '..', '..', 'engineering-pa-types-engineering', 'knowledge', 'rcf-lite'),
|
|
90
|
+
resolve(__dirname, '..', '..', 'types', 'engineering', 'knowledge', 'rcf-lite'),
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
export const RCF_LITE_KNOWLEDGE_DIR_PATH =
|
|
94
|
+
RCF_LITE_KNOWLEDGE_DIR_CANDIDATES.find((p) => existsSync(p))
|
|
95
|
+
?? RCF_LITE_KNOWLEDGE_DIR_CANDIDATES[0];
|
|
96
|
+
|
|
29
97
|
/**
|
|
30
98
|
* The base set of knowledge domains seeded into every fresh PA instance.
|
|
31
99
|
* Per the methodology doc: engineering, ops, agent-ops, knowledge-meta,
|
|
@@ -78,6 +146,19 @@ export function renderClaudeMd(template, config) {
|
|
|
78
146
|
.replaceAll('{COMMUNICATION_STYLE}', config.communicationStyle);
|
|
79
147
|
}
|
|
80
148
|
|
|
149
|
+
/**
|
|
150
|
+
* Render the root-CLAUDE.md pointer with the config. The root file is a
|
|
151
|
+
* short quick-reference that points at the full agent CLAUDE.md — the
|
|
152
|
+
* split mirrors the established estate convention (root pointer +
|
|
153
|
+
* canonical agent file) so the two files never drift as byte-identical
|
|
154
|
+
* duplicates.
|
|
155
|
+
*/
|
|
156
|
+
export function renderRootClaudeMd(template, config) {
|
|
157
|
+
return template
|
|
158
|
+
.replaceAll('{PA_NAME}', config.paName)
|
|
159
|
+
.replaceAll('{OPERATOR_NAME}', config.operatorName);
|
|
160
|
+
}
|
|
161
|
+
|
|
81
162
|
/**
|
|
82
163
|
* Render the operator-repo README template. Uses the same token set as
|
|
83
164
|
* CLAUDE.md.template for consistency.
|
|
@@ -205,7 +286,13 @@ export function buildExtensionsManifest(config) {
|
|
|
205
286
|
return {
|
|
206
287
|
version: '1.0',
|
|
207
288
|
generatedAt: config.generatedAt,
|
|
208
|
-
extensions: [
|
|
289
|
+
extensions: [
|
|
290
|
+
{
|
|
291
|
+
id: 'atlassian',
|
|
292
|
+
enabled: true,
|
|
293
|
+
note: 'Common-use Atlassian CLIs (jira, confluence, confluence-fetch). Configure with: secrets set JIRA_DOMAIN <site>; secrets set JIRA_EMAIL <email>; secrets set JIRA_API_TOKEN <token>.',
|
|
294
|
+
},
|
|
295
|
+
],
|
|
209
296
|
note: 'Extensions land in Phase 2. This manifest is the registration surface for promoted core extensions and operator-private extensions.',
|
|
210
297
|
};
|
|
211
298
|
}
|
|
@@ -302,6 +389,69 @@ export function buildGitkeep() {
|
|
|
302
389
|
return '';
|
|
303
390
|
}
|
|
304
391
|
|
|
392
|
+
/**
|
|
393
|
+
* Build the .claude/settings.json contents.
|
|
394
|
+
*
|
|
395
|
+
* Two things:
|
|
396
|
+
* 1. `permissions.deny` for the built-in `deep-research` skill and
|
|
397
|
+
* workflow. The core operating model (Bucket 4) directs the PA to
|
|
398
|
+
* the `/research` verb, which persists a session and promotes
|
|
399
|
+
* durable answers back into the knowledge library. The built-in
|
|
400
|
+
* `deep-research` skill produces no such trail and would silently
|
|
401
|
+
* short-circuit the discipline; deny is the correct default.
|
|
402
|
+
*
|
|
403
|
+
* 2. `hooks.PreToolUse` wiring `pa-coordinator-hook` for the matcher
|
|
404
|
+
* the coordinator-hook doc gives. The hook is a no-op unless the
|
|
405
|
+
* operator sets `PA_COORDINATOR_MODE=1` in their shell, so the
|
|
406
|
+
* scaffold ships the wiring inert. A per-repo overlay slot is
|
|
407
|
+
* scaffolded alongside as `.claude/coordinator-overlay.json`.
|
|
408
|
+
*
|
|
409
|
+
* SessionStart hooks (boot-context style injection) are deliberately
|
|
410
|
+
* NOT scaffolded — the boot-context tool lives in the HQ estate, not
|
|
411
|
+
* the published package. Scaffolding a hook that names a binary the
|
|
412
|
+
* colleague does not have would fire on every session boot with a
|
|
413
|
+
* non-blocking error. Documented in docs/onboarding-solo.md under
|
|
414
|
+
* "what is not included in solo mode".
|
|
415
|
+
*/
|
|
416
|
+
export function buildClaudeSettingsJson() {
|
|
417
|
+
return {
|
|
418
|
+
permissions: {
|
|
419
|
+
deny: ['Skill(skill:deep-research)', 'Workflow(name:deep-research)'],
|
|
420
|
+
},
|
|
421
|
+
hooks: {
|
|
422
|
+
PreToolUse: [
|
|
423
|
+
{
|
|
424
|
+
matcher: '^(Bash|Read|Write|Edit|NotebookEdit|Grep|Glob|WebFetch|WebSearch)$',
|
|
425
|
+
hooks: [
|
|
426
|
+
{
|
|
427
|
+
type: 'command',
|
|
428
|
+
command: 'pa-coordinator-hook',
|
|
429
|
+
},
|
|
430
|
+
],
|
|
431
|
+
},
|
|
432
|
+
],
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Build the .claude/coordinator-overlay.json starter. The overlay is a
|
|
439
|
+
* per-repo extension slot for `pa-coordinator-hook` — see the doc at
|
|
440
|
+
* packages/cli/docs/coordinator-hook.md for the merge contract. Only
|
|
441
|
+
* `tier2.<Bash|Read|Write>.allowPatterns` / `.allowPathPatterns` may be
|
|
442
|
+
* extended; the file ships empty so the presence of the overlay is
|
|
443
|
+
* documentation on its own without widening the default policy.
|
|
444
|
+
*/
|
|
445
|
+
export function buildCoordinatorOverlayJson() {
|
|
446
|
+
return {
|
|
447
|
+
tier2: {
|
|
448
|
+
Bash: { allowPatterns: [] },
|
|
449
|
+
Read: { allowPathPatterns: [] },
|
|
450
|
+
Write: { allowPathPatterns: [] },
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
|
|
305
455
|
/**
|
|
306
456
|
* Compose the full plan. Returns an ordered list of `{ kind, path, contents }`
|
|
307
457
|
* relative to `config.targetDir`. The runner resolves the paths and writes
|
|
@@ -309,8 +459,37 @@ export function buildGitkeep() {
|
|
|
309
459
|
*/
|
|
310
460
|
export async function buildPlan(config) {
|
|
311
461
|
const claudeTemplate = await readFile(CLAUDE_MD_TEMPLATE_PATH, 'utf8');
|
|
462
|
+
const rootClaudeTemplate = await readFile(ROOT_CLAUDE_MD_TEMPLATE_PATH, 'utf8');
|
|
312
463
|
const operatorReadmeTemplate = await readFile(OPERATOR_README_TEMPLATE_PATH, 'utf8');
|
|
313
|
-
|
|
464
|
+
const researchCommand = await readFile(RESEARCH_COMMAND_TEMPLATE_PATH, 'utf8');
|
|
465
|
+
const workspaceExtensionsKnowledge = await readFile(WORKSPACE_EXTENSIONS_KNOWLEDGE_PATH, 'utf8');
|
|
466
|
+
const rcfLiteKnowledge = await readRcfLiteKnowledge(RCF_LITE_KNOWLEDGE_DIR_PATH);
|
|
467
|
+
return buildPlanFromTemplates(config, {
|
|
468
|
+
claudeTemplate,
|
|
469
|
+
rootClaudeTemplate,
|
|
470
|
+
operatorReadmeTemplate,
|
|
471
|
+
researchCommand,
|
|
472
|
+
workspaceExtensionsKnowledge,
|
|
473
|
+
rcfLiteKnowledge,
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* Read every `.md` file in the packaged rcf-lite knowledge directory and
|
|
479
|
+
* return a `{ filename: contents }` map for seeding into the scaffolded
|
|
480
|
+
* `operator/knowledge/rcf-lite/` tree. Returns `null` when the directory
|
|
481
|
+
* is absent so the pure-plan seam degrades to "skip the seed" rather than
|
|
482
|
+
* throwing, matching the workspace-extensions behaviour.
|
|
483
|
+
*/
|
|
484
|
+
export async function readRcfLiteKnowledge(dirPath) {
|
|
485
|
+
if (!existsSync(dirPath)) return null;
|
|
486
|
+
const entries = await readdir(dirPath);
|
|
487
|
+
const files = entries.filter((n) => n.endsWith('.md')).sort();
|
|
488
|
+
const out = {};
|
|
489
|
+
for (const filename of files) {
|
|
490
|
+
out[filename] = await readFile(join(dirPath, filename), 'utf8');
|
|
491
|
+
}
|
|
492
|
+
return out;
|
|
314
493
|
}
|
|
315
494
|
|
|
316
495
|
/**
|
|
@@ -321,6 +500,13 @@ export async function buildPlan(config) {
|
|
|
321
500
|
export function buildPlanFromTemplates(config, templates) {
|
|
322
501
|
const { paName } = config;
|
|
323
502
|
const claudeMd = renderClaudeMd(templates.claudeTemplate, config);
|
|
503
|
+
// Root-CLAUDE.md is a short pointer to the full agent file. Falling
|
|
504
|
+
// back to the agent file when the pointer template is absent keeps
|
|
505
|
+
// pure-plan tests that only pass `claudeTemplate` working, while the
|
|
506
|
+
// real buildPlan() path always supplies both.
|
|
507
|
+
const rootClaudeMd = templates.rootClaudeTemplate
|
|
508
|
+
? renderRootClaudeMd(templates.rootClaudeTemplate, config)
|
|
509
|
+
: claudeMd;
|
|
324
510
|
const readmeMd = renderOperatorReadme(templates.operatorReadmeTemplate, config);
|
|
325
511
|
const pkg = buildOperatorPackageJson(config);
|
|
326
512
|
const gitignore = buildGitignore();
|
|
@@ -348,20 +534,70 @@ export function buildPlanFromTemplates(config, templates) {
|
|
|
348
534
|
'projects',
|
|
349
535
|
'schedules',
|
|
350
536
|
'.vault',
|
|
537
|
+
'.claude',
|
|
538
|
+
'.claude/commands',
|
|
351
539
|
];
|
|
352
540
|
|
|
353
541
|
const plan = [];
|
|
354
542
|
for (const d of dirs) plan.push({ kind: 'dir', path: d });
|
|
355
543
|
|
|
356
|
-
plan.push({ kind: 'file', path: 'CLAUDE.md', contents:
|
|
544
|
+
plan.push({ kind: 'file', path: 'CLAUDE.md', contents: rootClaudeMd });
|
|
357
545
|
plan.push({ kind: 'file', path: 'README.md', contents: readmeMd });
|
|
358
546
|
plan.push({ kind: 'json', path: 'package.json', contents: pkg });
|
|
359
547
|
plan.push({ kind: 'file', path: '.gitignore', contents: gitignore });
|
|
360
548
|
plan.push({ kind: 'file', path: '.nvmrc', contents: '24\n' });
|
|
361
549
|
|
|
550
|
+
plan.push({ kind: 'json', path: '.claude/settings.json', contents: buildClaudeSettingsJson() });
|
|
551
|
+
// /research slash command: rendered from the packaged core doc so the
|
|
552
|
+
// command a colleague gets is exactly what the platform ships. The scaffold
|
|
553
|
+
// never re-authors it, and there is no template to drift.
|
|
554
|
+
if (templates.researchCommand) {
|
|
555
|
+
plan.push({
|
|
556
|
+
kind: 'file',
|
|
557
|
+
path: '.claude/commands/research.md',
|
|
558
|
+
contents: templates.researchCommand,
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
plan.push({
|
|
562
|
+
kind: 'json',
|
|
563
|
+
path: '.claude/coordinator-overlay.json',
|
|
564
|
+
contents: buildCoordinatorOverlayJson(),
|
|
565
|
+
});
|
|
566
|
+
|
|
362
567
|
plan.push({ kind: 'file', path: 'operator/profile/profile.md', contents: profile });
|
|
363
568
|
plan.push({ kind: 'json', path: 'operator/knowledge/domains.json', contents: domains });
|
|
364
569
|
plan.push({ kind: 'json', path: 'operator/knowledge/index.json', contents: knowledgeIndex });
|
|
570
|
+
// Seed the PA-facing workspace-extensions knowledge doc into the operator
|
|
571
|
+
// tree so `pa knowledge search "workspace extension"` reaches it. The
|
|
572
|
+
// retrieval graph scans `operator/knowledge/` and `core/knowledge/` under
|
|
573
|
+
// the repo root; a solo scaffold ships neither of those trees populated
|
|
574
|
+
// by default, so a bundled-only copy would be invisible to the search
|
|
575
|
+
// verb. Kept in lockstep with the packaged canonical via the plan-time
|
|
576
|
+
// read at WORKSPACE_EXTENSIONS_KNOWLEDGE_PATH.
|
|
577
|
+
if (templates.workspaceExtensionsKnowledge) {
|
|
578
|
+
plan.push({
|
|
579
|
+
kind: 'file',
|
|
580
|
+
path: 'operator/knowledge/platform-tooling/workspace-extensions.md',
|
|
581
|
+
contents: templates.workspaceExtensionsKnowledge,
|
|
582
|
+
});
|
|
583
|
+
}
|
|
584
|
+
// Seed the link-led rcf-lite knowledge bucket into the operator tree so
|
|
585
|
+
// `pa knowledge search "rcf-lite"` reaches every file. Same rationale as
|
|
586
|
+
// the workspace-extensions doc above: the retrieval graph scans
|
|
587
|
+
// `operator/knowledge/` and `core/knowledge/` under the repo root, so a
|
|
588
|
+
// bundled-only copy is invisible to the search verb. `templates.rcfLiteKnowledge`
|
|
589
|
+
// is a `{ filename: contents }` map read by `readRcfLiteKnowledge` from
|
|
590
|
+
// the packaged types/engineering pack at plan time; pure-plan callers
|
|
591
|
+
// omit the field to skip the seed (backwards compatible).
|
|
592
|
+
if (templates.rcfLiteKnowledge) {
|
|
593
|
+
for (const [filename, contents] of Object.entries(templates.rcfLiteKnowledge)) {
|
|
594
|
+
plan.push({
|
|
595
|
+
kind: 'file',
|
|
596
|
+
path: `operator/knowledge/rcf-lite/${filename}`,
|
|
597
|
+
contents,
|
|
598
|
+
});
|
|
599
|
+
}
|
|
600
|
+
}
|
|
365
601
|
plan.push({ kind: 'json', path: 'operator/config/preferences.json', contents: buildPreferencesJson(config) });
|
|
366
602
|
plan.push({ kind: 'json', path: 'operator/extensions/manifest.json', contents: manifest });
|
|
367
603
|
|
|
@@ -10,7 +10,7 @@ You are a colleague, not a servant. You have opinions and you voice them -- with
|
|
|
10
10
|
|
|
11
11
|
Your long-term goal is to learn {OPERATOR_NAME}'s judgement so thoroughly that you can operate autonomously on their behalf -- making decisions, managing tasks, running delegated work -- without needing to ask. Every interaction is training data. The measure of progress: how often can you act without escalating? Every question you have to ask that you could have answered is a gap.
|
|
12
12
|
|
|
13
|
-
**PA operating mode
|
|
13
|
+
**PA operating mode. Dispatch-first. This is the defining posture; re-read it every boot.** Your main thread exists for three things only: (1) orchestrating work, (2) keeping the work-trail current (work items, projects, spawn-log, journal, staging), and (3) interacting with {OPERATOR_NAME}. **ALL substantive work goes into a dispatch**: a subagent with a full 8-section brief. Research, writing, code, analysis, multi-file reads, anything that produces a work product: dispatched, not done inline. You lead the team by delegating, not by doing. Keeping the main thread clean is what keeps you available to {OPERATOR_NAME} and stops you burning context on work you could have handed off. The narrow inline exceptions (a one-line edit, a single file read, a status answer) are enumerated in Bucket 3. Treat them as the exception, never the reflex. When unsure: dispatch.
|
|
14
14
|
|
|
15
15
|
**Autonomy envelope.** Per-task-type approval state lives at `agents/{PA_NAME}/autonomy-envelope.md`. Three states: `fullyApproved` (act, don't ask), `checkBeforeCommitting` (draft, get sign-off before durable action), `needsFullSupervision` (do not act; escalate every step). {OPERATOR_NAME} promotes or demotes at any time via `pa autonomy set`. The envelope is the durable record; your judgement calibrates day-to-day, but the envelope is what you check when the reflex is unclear. See `@stravica-ai/engineering-pa-core/docs/autonomy-envelope-tracker.md`.
|
|
16
16
|
|
|
@@ -97,7 +97,7 @@ Right information at the right time. Repo is truth; memory is cache.
|
|
|
97
97
|
|
|
98
98
|
Ship correct, safe, reversible changes. Never destroy {OPERATOR_NAME}'s work.
|
|
99
99
|
|
|
100
|
-
1. **Match the engineering role to the shape of work.** Base role ladder: `tool-developer` (shared internal CLI) → `web-developer` (content-led marketing site) → `product-engineer` (shippable
|
|
100
|
+
1. **Match the engineering role to the shape of work.** Base role ladder: `tool-developer` (shared internal CLI) → `web-developer` (content-led marketing site) → `product-engineer` (prototypes, local apps and utilities) → `rcf-lite-engineer` (shippable greenfield apps up to small commercial SaaS on the rcf-lite spine; not brownfield/enterprise) → `rcf-engineer` (enterprise product with full RCF traceability). Operator-side specialisations (site-cloner, seo-*, infographic-designer, etc.) layer above. Wrong tier ships wrong. The `rcf-lite-engineer` role definition and its link-led knowledge bucket live at `operator/knowledge/rcf-lite/` (seeded from the packaged engineering role pack); rcf-lite installs per project via `npm install rcf-lite`.
|
|
101
101
|
2. **Verify runtime behaviour, not just type-check + tests.** Tests verify code correctness, not feature correctness. If you can't test the UI, say so explicitly.
|
|
102
102
|
3. **Blast-radius awareness.** Local reversible = free. Shared / hard-to-reverse / visible to others = confirm first. Match action scope to what was requested.
|
|
103
103
|
4. **Investigate root causes.** Don't bypass safety checks (`--no-verify`) as a shortcut.
|
|
@@ -107,7 +107,7 @@ Ship correct, safe, reversible changes. Never destroy {OPERATOR_NAME}'s work.
|
|
|
107
107
|
8. **Investigate unexpected state before overwriting.** Unfamiliar files / branches / config may represent {OPERATOR_NAME}'s in-progress work. `git status` before any command that could discard uncommitted changes.
|
|
108
108
|
9. **When staging or committing, review what's included.** Never commit files that likely contain secrets. Suspicious filenames get their contents checked before push.
|
|
109
109
|
|
|
110
|
-
**Deeper reference:** `operator/knowledge/engineering-discipline/` -- role-ladder + selection heuristics, git safety protocol, worktree-isolation patterns, verify skill catalogue, blast-radius examples, secret-scanning heuristics.
|
|
110
|
+
**Deeper reference:** `operator/knowledge/engineering-discipline/` -- role-ladder + selection heuristics, git safety protocol, worktree-isolation patterns, verify skill catalogue, blast-radius examples, secret-scanning heuristics. **rcf-lite:** `operator/knowledge/rcf-lite/` -- link-led bucket into `https://stravica.ai/docs/rcf/` (start here / wire your agent / how it works / driving / for agents / reference), plus the one local `create-a-small-app.md` command sequence.
|
|
111
111
|
|
|
112
112
|
<!-- OPERATOR: list operator-side specialised engineering roles here (the role LIST beyond the base ladder), plus operator-specific engineering conventions (per-project git safety rules, CI-integration patterns, downstream-repo policies). -->
|
|
113
113
|
|
|
@@ -129,7 +129,7 @@ Content that lands in {OPERATOR_NAME}'s voice, not generic AI-speak. Route throu
|
|
|
129
129
|
|
|
130
130
|
Use the estate's own tooling first. Consistent, dogfooded, learnable.
|
|
131
131
|
|
|
132
|
-
1. **Always use local tooling before reaching for others.** Discover the current surface every session -- don't rely on memory. Sources: `pnpm exec pa --help`, `pnpm exec desk --help`, `ls operator/extensions/tools/`. External tools only when nothing local fits.
|
|
132
|
+
1. **Always use local tooling before reaching for others.** Discover the current surface every session -- don't rely on memory. Sources: `pnpm exec pa --help`, `pnpm exec desk --help`, `pnpm exec jira --help`, `pnpm exec confluence --help`, `pnpm exec confluence-fetch --help`, `ls operator/extensions/tools/`. External tools only when nothing local fits.
|
|
133
133
|
2. **Environmental awareness.** `pa environment` runs on session boot -- lightweight core CLI that populates `.session/environment.json` in <2s (OS, tools, network reachability, workspace state, working directory). Default `pa environment` reads the cache; `pa environment refresh` rebuilds. Deeper diagnostics via `pa environment extended` (operator overlay) run on demand only. Factor environment into decisions -- dispatch target, tool availability, network access.
|
|
134
134
|
3. **Platform CLIs invoked via `pnpm exec`** -- platform ships as `@stravica-ai/digital-operator-pa` npm package.
|
|
135
135
|
4. **`desk` CLI is read-only.** Overview, today, work, projects. Never edit through desk.
|
|
@@ -137,9 +137,9 @@ Use the estate's own tooling first. Consistent, dogfooded, learnable.
|
|
|
137
137
|
6. **Scheduling:** `schedules/{id}.json`. Default target host is an operator-configured field -- name it in your operator overlay.
|
|
138
138
|
7. **MCP servers available on demand:** discover via `--help` on the tool surface. Use when the task fits; don't force.
|
|
139
139
|
8. **Working directory ≠ project root.** cwd is `agents/{PA_NAME}/`; derive project root via `.session/environment.json:workingDirectory.projectRoot` or a `*_ROOT` env var. Never hard-code paths.
|
|
140
|
-
9. **Proactive tool proposal.** When a task pattern repeats or is complex enough that manual execution is error-prone, propose a tool to {OPERATOR_NAME}. On approval, dispatch tool-developer at the next convenient point. Don't wait for {OPERATOR_NAME} to suggest -- building a decent library of helpful tools is estate improvement work you own.
|
|
140
|
+
9. **Proactive tool proposal.** When a task pattern repeats or is complex enough that manual execution is error-prone, propose a tool to {OPERATOR_NAME}. On approval, dispatch tool-developer at the next convenient point. Don't wait for {OPERATOR_NAME} to suggest -- building a decent library of helpful tools is estate improvement work you own. **Workspace pages count as a tool for this rule.** When {OPERATOR_NAME}'s habits fit the triggers in `operator/knowledge/platform-tooling/workspace-extensions.md` (repeated manual view, explicit ask for a dashboard, an installed tool with a natural page), propose a workspace extension and, on approval, invoke `pa-init workspace-extension <name>` for the skeleton before dispatching `tool-developer` for the real content.
|
|
141
141
|
|
|
142
|
-
**Deeper reference:** `operator/knowledge/platform-tooling/` -- pa/desk/pnpm-exec/workspace reference, tool-discovery discipline, environment-awareness protocol (`pa environment` core + `extended` overlay), scheduling API, MCP server catalogue, proactive-tool-proposal pattern.
|
|
142
|
+
**Deeper reference:** `operator/knowledge/platform-tooling/` -- pa/desk/pnpm-exec/workspace reference, tool-discovery discipline, environment-awareness protocol (`pa environment` core + `extended` overlay), scheduling API, MCP server catalogue, proactive-tool-proposal pattern, workspace-extension prompting (`workspace-extensions.md`).
|
|
143
143
|
|
|
144
144
|
<!-- OPERATOR: list your `operator/extensions/tools/` (custom operator tools you have built), your workspace port if not 4200, your scheduling default host, and MCP servers you rely on. -->
|
|
145
145
|
|
|
@@ -193,6 +193,6 @@ Stage observations, update journal, update work items, update spawn-log outcomes
|
|
|
193
193
|
|
|
194
194
|
All paths are relative to the operator repo root. Resolve via `.session/environment.json:workingDirectory.projectRoot` or a `*_ROOT` env var, never hard-code absolutes.
|
|
195
195
|
|
|
196
|
-
Symbolic `@stravica-ai/engineering-pa-core/<subpath>` references resolve on disk to `node_modules/@stravica-ai/digital-operator-pa/dist/engineering-pa-core/<subpath
|
|
196
|
+
Symbolic `@stravica-ai/engineering-pa-core/<subpath>` references resolve on disk to `node_modules/@stravica-ai/digital-operator-pa/dist/engineering-pa-core/<subpath>`. The internal packages ship bundled inside the wrapper package, not under their own names in `node_modules`.
|
|
197
197
|
|
|
198
198
|
<!-- OPERATOR: add any operator-specific paths that are frequently referenced (a vault path, a scratchpad convention, an integration credentials store). -->
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# {PA_NAME}
|
|
1
|
+
# {PA_NAME}: operator repo
|
|
2
2
|
|
|
3
3
|
Personal-assistant instance for {OPERATOR_NAME}, scaffolded with `pa-init`.
|
|
4
4
|
|
|
5
|
-
This repo holds **only operator content
|
|
5
|
+
This repo holds **only operator content**: your profile, knowledge, work items,
|
|
6
6
|
projects, agent run state, schedules, and secrets. The PA platform code is
|
|
7
7
|
supplied by the `@stravica-ai/digital-operator-pa` npm package; you never edit it in
|
|
8
8
|
place.
|
|
@@ -17,7 +17,7 @@ place.
|
|
|
17
17
|
│ ├── profile/ # operator profile (distilled over time)
|
|
18
18
|
│ ├── knowledge/ # domain-organised knowledge tree
|
|
19
19
|
│ └── extensions/ # operator-private extensions (Phase 2+)
|
|
20
|
-
├── agents/{PA_NAME}/ # PA run folder
|
|
20
|
+
├── agents/{PA_NAME}/ # PA run folder: journal, staging, spawn-log
|
|
21
21
|
├── work/ # work items (one JSON per item)
|
|
22
22
|
├── projects/ # projects (one folder per project)
|
|
23
23
|
├── schedules/ # scheduled-task definitions
|
|
@@ -28,7 +28,7 @@ place.
|
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
30
|
pnpm install
|
|
31
|
-
pnpm status # alias for `pa status
|
|
31
|
+
pnpm status # alias for `pa status`, a boot-time sanity check
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
Then launch your PA via Claude Code in this repo; it reads `CLAUDE.md`
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# {PA_NAME}
|
|
2
|
+
|
|
3
|
+
Personal assistant platform instance for {OPERATOR_NAME}. See `agents/{PA_NAME}/CLAUDE.md` for the full operating instructions. That file is the source of truth for how {PA_NAME} works and is the one Claude Code loads when you start a session from the agent directory.
|
|
4
|
+
|
|
5
|
+
## Quick reference
|
|
6
|
+
|
|
7
|
+
- Work items: `work/w-YYYY-MM-DD-NNN.json`
|
|
8
|
+
- Projects: `projects/{id}/project.json`
|
|
9
|
+
- Operator content: `operator/`
|
|
10
|
+
- Agent run folder: `agents/{PA_NAME}/`
|
|
11
|
+
- Platform package: installed as an npm dependency (`@stravica-ai/digital-operator-pa`); invoke tooling via `pnpm exec <bin>` (`pa`, `desk`, `secrets`, `distill`, etc.)
|
|
12
|
+
- Workspace: `pnpm exec pa workspace start` then http://localhost:4200
|
|
13
|
+
- Onboarding guide: `node_modules/@stravica-ai/digital-operator-pa/docs/onboarding-solo.md`
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
// @stravica-ai/engineering-pa-types-engineering
|
|
1
|
+
// @stravica-ai/engineering-pa-types-engineering - engineering-PA role pack.
|
|
2
2
|
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
3
|
+
// Ships:
|
|
4
|
+
// - product-engineer: prototypes, local apps, utilities on the estate's
|
|
5
|
+
// opinionated Docker + CI + node:test spine.
|
|
6
|
+
// - rcf-lite-engineer: shippable greenfield apps up to small commercial
|
|
7
|
+
// SaaS on the rcf-lite spec-and-build spine (see the knowledge/rcf-lite
|
|
8
|
+
// bucket for its link-led reference).
|
|
9
|
+
// - The `product-build` slash-command doc under docs/.
|
|
10
|
+
//
|
|
11
|
+
// Role sources live under roles/<role>/definition.md. A role.json is
|
|
12
|
+
// optional; both roles here ship definition.md only. The pack is copied
|
|
13
|
+
// verbatim into dist/engineering-pa-types-engineering/ by the packager.
|
|
6
14
|
|
|
7
15
|
export const name = './';
|
|
8
|
-
export const version = '0.
|
|
9
|
-
export const roles = ['product-engineer'];
|
|
16
|
+
export const version = '0.2.0';
|
|
17
|
+
export const roles = ['product-engineer', 'rcf-lite-engineer'];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Create a small app or service with rcf-lite from a fresh PA
|
|
2
|
+
|
|
3
|
+
The one local how-to allowed in this bucket. Every command below has been checked against `npx rcf --help` on the published rcf-lite (see `Verified against` at the bottom).
|
|
4
|
+
|
|
5
|
+
Prerequisites: Node.js 24 or newer; git; a Claude Code (or equivalent) harness set up in the shell.
|
|
6
|
+
|
|
7
|
+
## The numbered sequence
|
|
8
|
+
|
|
9
|
+
1. Make and enter the project directory.
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
mkdir my-app && cd my-app
|
|
13
|
+
git init -q
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
2. Install `rcf-lite` per project (not global, so different apps can pin different versions).
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npm init -y
|
|
20
|
+
npm install rcf-lite
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
3. Scaffold the `rcf/` tree and wire the harness. `rcf init` writes the tree, registers the MCP server in `.mcp.json`, and drops the agent-instructions fragment into `CLAUDE.md` and `AGENTS.md`.
|
|
24
|
+
|
|
25
|
+
```sh
|
|
26
|
+
npx rcf init --project-name my-app --non-interactive
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Interactive form (drop `--non-interactive`): the CLI prompts only for the project name.
|
|
30
|
+
|
|
31
|
+
4. Confirm the wiring is healthy. `rcf doctor` diagnoses and repairs init-hygiene drift; run it any time the harness looks off.
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npx rcf doctor
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
5. Pick a blueprint from the shelf (the packaged shelf that ships with rcf-lite). Two examples the shelf carries by name:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
npx rcf define blueprint add deploy-cloudflare-workers
|
|
41
|
+
npx rcf define blueprint add application-spa
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
List everything that has been applied so far, grouped by category:
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
npx rcf define blueprint list
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
6. Enter the build loop.
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
npx rcf build queue # what is scheduled next
|
|
54
|
+
npx rcf build bundle --next # spec bundle for the next FBS
|
|
55
|
+
# then implement the FBS in code, keeping the suite green
|
|
56
|
+
npx rcf build finalise <fbs-id> # ship gate for one FBS
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
7. Run the audit surface as the tree grows.
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
npx rcf audit view # live HTML tree render (long-running)
|
|
63
|
+
npx rcf audit coverage # structural coverage over the REQ chain
|
|
64
|
+
npx rcf audit trace <id> # walk the graph forward, back, or both
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
8. When the candidate is ready, hand it back for the independent verifier. The RCF Lite Engineer never self-certifies as ship-ready; the orchestrator dispatches the verify session against the deployed runtime.
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
npx rcf verify run # run the adversarial ship-gate verifier
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Verified against
|
|
74
|
+
|
|
75
|
+
- `rcf-lite@0.27.0` (`npm view rcf-lite version` at 2026-09-16). Commands above match the top-level groups (`define`, `build`, `verify`, `audit`) and the verbs (`init`, `doctor`, `define blueprint {add,list,remove}`, `build {queue,bundle,mark,finalise}`, `verify run`, `audit {view,coverage,trace}`) shown by `npx rcf --help` and `npx rcf help define blueprint`.
|
|
76
|
+
- Blueprint slugs `deploy-cloudflare-workers` and `application-spa` are the shelf resolvers documented by `rcf define blueprint add <source>` help (bare kebab slugs resolve to the packaged shelf).
|
|
77
|
+
|
|
78
|
+
## See also
|
|
79
|
+
|
|
80
|
+
- Full CLI reference on the docs site: [https://stravica.ai/docs/rcf/reference/cli/](https://stravica.ai/docs/rcf/reference/cli/)
|
|
81
|
+
- Build-cycle playbook for the agent driving the loop: [https://stravica.ai/docs/rcf/for-agents/build-cycle-playbook/](https://stravica.ai/docs/rcf/for-agents/build-cycle-playbook/)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# rcf-lite for agents
|
|
2
|
+
|
|
3
|
+
The RCF Lite Engineer role definition (`../../roles/rcf-lite-engineer/definition.md`) is the operating spine. This doc is the pointer set into the agent-facing pages on the Stravica docs site; the docs are the current source of truth for method-level detail.
|
|
4
|
+
|
|
5
|
+
## Playbooks
|
|
6
|
+
|
|
7
|
+
- **Build cycle playbook (the five-stage loop the RCF Lite Engineer runs):** [https://stravica.ai/docs/rcf/for-agents/build-cycle-playbook/](https://stravica.ai/docs/rcf/for-agents/build-cycle-playbook/)
|
|
8
|
+
- **Elicitation playbook (how to draw the PRD/REQ/US/AC content out of the operator):** [https://stravica.ai/docs/rcf/for-agents/elicitation-playbook/](https://stravica.ai/docs/rcf/for-agents/elicitation-playbook/)
|
|
9
|
+
- **Document model (what each RCF document is for and how it links):** [https://stravica.ai/docs/rcf/for-agents/document-model/](https://stravica.ai/docs/rcf/for-agents/document-model/)
|
|
10
|
+
- **Harness block (the fragment `rcf init` writes into `CLAUDE.md`/`AGENTS.md`):** [https://stravica.ai/docs/rcf/for-agents/harness-block/](https://stravica.ai/docs/rcf/for-agents/harness-block/)
|
|
11
|
+
- **MCP surface (the tool surface the agent gets when the harness is wired):** [https://stravica.ai/docs/rcf/for-agents/mcp-surface/](https://stravica.ai/docs/rcf/for-agents/mcp-surface/)
|
|
12
|
+
- **Persona programme (the failure classes that shaped the role's disciplines):** [https://stravica.ai/docs/rcf/for-agents/persona-programme/](https://stravica.ai/docs/rcf/for-agents/persona-programme/)
|
|
13
|
+
|
|
14
|
+
## Deploy-target-first
|
|
15
|
+
|
|
16
|
+
The role's first discipline is naming the deploy target before locking a stack. See:
|
|
17
|
+
|
|
18
|
+
- **Cloudflare-first projects (the reference edge stack for rcf-lite):** [https://stravica.ai/docs/rcf/for-agents/cloudflare-first-projects/](https://stravica.ai/docs/rcf/for-agents/cloudflare-first-projects/)
|
|
19
|
+
|
|
20
|
+
## How the pieces fit
|
|
21
|
+
|
|
22
|
+
- **The chain and the referee (what the tooling guarantees about the tree):** [https://stravica.ai/docs/rcf/how-it-works/the-chain/](https://stravica.ai/docs/rcf/how-it-works/the-chain/), [https://stravica.ai/docs/rcf/how-it-works/what-the-referee-guarantees/](https://stravica.ai/docs/rcf/how-it-works/what-the-referee-guarantees/)
|
|
23
|
+
- **The five-stage build cycle (define, design, build, test, review):** [https://stravica.ai/docs/rcf/how-it-works/the-five-stage-build-cycle/](https://stravica.ai/docs/rcf/how-it-works/the-five-stage-build-cycle/)
|
|
24
|
+
- **Coverage, trace, impact (the tree audit surface):** [https://stravica.ai/docs/rcf/how-it-works/coverage-trace-impact/](https://stravica.ai/docs/rcf/how-it-works/coverage-trace-impact/)
|
|
25
|
+
- **Blueprints as composition units:** [https://stravica.ai/docs/rcf/how-it-works/blueprints/](https://stravica.ai/docs/rcf/how-it-works/blueprints/)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# rcf-lite
|
|
2
|
+
|
|
3
|
+
rcf-lite is a lightweight spec-and-build spine for greenfield software. It gives an agent a Requirements Confidence Framework tree (PRD -> REQ -> US -> AC -> FBS) plus a green test suite that gates each build, without the ceremony of the full enterprise RCF chain. It is the tier the `rcf-lite-engineer` role builds on.
|
|
4
|
+
|
|
5
|
+
The role is chosen when the deliverable is a real shippable application (weekend utility up to small commercial SaaS) that needs a proper requirements-confidence spine, not a prototype or an internal script. If the task is a static site, a local utility, or a full enterprise product, pick a different role from the ladder.
|
|
6
|
+
|
|
7
|
+
## Where to read next
|
|
8
|
+
|
|
9
|
+
- **Start here (product overview + status + release notes):** [https://stravica.ai/docs/rcf/](https://stravica.ai/docs/rcf/), [https://stravica.ai/docs/rcf/status/](https://stravica.ai/docs/rcf/status/), [https://stravica.ai/docs/rcf/changelog/](https://stravica.ai/docs/rcf/changelog/)
|
|
10
|
+
- **How it works (the chain, the five-stage build cycle, blueprints, coverage/trace/impact, what the referee guarantees):** [https://stravica.ai/docs/rcf/how-it-works/](https://stravica.ai/docs/rcf/how-it-works/)
|
|
11
|
+
- **Driving one as an operator (steering, reviewing the tree, handing over, when it goes wrong):** [https://stravica.ai/docs/rcf/driving/](https://stravica.ai/docs/rcf/driving/)
|
|
12
|
+
- **Guides (add rcf to an existing repo, close the loop without a deploy, kick the tyres by hand, wiring alternatives, the tree viewer):** [https://stravica.ai/docs/rcf/guides/](https://stravica.ai/docs/rcf/guides/)
|
|
13
|
+
- **For agents (the playbook the RCF Lite Engineer works from):** see the sibling doc `for-agents.md`.
|
|
14
|
+
- **Reference (CLI, document types, exit codes, blueprints shelf):** see the sibling doc `reference.md`.
|
|
15
|
+
- **Wiring an agent into a project (harness, MCP, `rcf init`):** see the sibling doc `wire-your-agent.md`.
|
|
16
|
+
|
|
17
|
+
The Stravica docs site is the current source of truth; the docs in this bucket are framing and pointers so the local knowledge stays in sync as the docs move.
|
|
18
|
+
|
|
19
|
+
## When to reach for it
|
|
20
|
+
|
|
21
|
+
- Greenfield: no existing codebase to retrofit into.
|
|
22
|
+
- Small-to-mid ambition: from a weekend utility up to a small commercial SaaS. Anything multi-tenant, regulated, or contractually-audited is `rcf-engineer` territory, not this tier.
|
|
23
|
+
- The operator wants a real requirements spine and a green-gated build, not a code-first prototype.
|
|
24
|
+
- The output needs to be a candidate the operator can point an independent verifier at before shipping.
|
|
25
|
+
|
|
26
|
+
## When not to
|
|
27
|
+
|
|
28
|
+
- A brownfield retrofit or an enterprise/full-RCF build. Escalate to the tier above.
|
|
29
|
+
- A single-file utility or a throwaway prototype. Escalate to `product-engineer` below.
|
|
30
|
+
- A static site or content-led marketing page. Escalate to `web-developer` below.
|
|
31
|
+
|
|
32
|
+
## Local how-to
|
|
33
|
+
|
|
34
|
+
The one local how-to allowed in this bucket is `create-a-small-app.md`. Everything else links out to the docs site.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# rcf-lite reference
|
|
2
|
+
|
|
3
|
+
Reference pages on the Stravica docs site. The docs are the current source of truth for verb shapes, exit codes, and the packaged blueprint shelf; the local knowledge is deliberately link-led so it stays current as the docs move.
|
|
4
|
+
|
|
5
|
+
- **CLI reference (every `rcf` verb, options, examples):** [https://stravica.ai/docs/rcf/reference/cli/](https://stravica.ai/docs/rcf/reference/cli/)
|
|
6
|
+
- **CLI cheatsheet (the shortlist an operator or agent reaches for daily):** [https://stravica.ai/docs/rcf/reference/cli/cheatsheet/](https://stravica.ai/docs/rcf/reference/cli/cheatsheet/)
|
|
7
|
+
- **Document types (PRD, REQ, US, AC, FBS, TS, TAC, TC, ADR, FRAG):** [https://stravica.ai/docs/rcf/reference/document-types/](https://stravica.ai/docs/rcf/reference/document-types/)
|
|
8
|
+
- **Exit codes (what a non-zero exit from any `rcf` verb means):** [https://stravica.ai/docs/rcf/reference/exit-codes/](https://stravica.ai/docs/rcf/reference/exit-codes/)
|
|
9
|
+
- **Blueprints shelf (the composable building blocks that ship in the box):** [https://stravica.ai/docs/rcf/reference/blueprints/](https://stravica.ai/docs/rcf/reference/blueprints/)
|
|
10
|
+
|
|
11
|
+
## Related surfaces
|
|
12
|
+
|
|
13
|
+
- **Add rcf to an existing repo (the guide, not a blueprint):** [https://stravica.ai/docs/rcf/guides/add-rcf-to-existing-repo/](https://stravica.ai/docs/rcf/guides/add-rcf-to-existing-repo/)
|
|
14
|
+
- **Close the loop without a deploy (running the cycle without a live target):** [https://stravica.ai/docs/rcf/guides/close-the-loop-without-a-deploy/](https://stravica.ai/docs/rcf/guides/close-the-loop-without-a-deploy/)
|
|
15
|
+
- **Kick the tyres by hand (a minimal manual walkthrough):** [https://stravica.ai/docs/rcf/guides/kick-the-tyres-by-hand/](https://stravica.ai/docs/rcf/guides/kick-the-tyres-by-hand/)
|
|
16
|
+
- **Using the tree viewer (the audit surface for a running project):** [https://stravica.ai/docs/rcf/guides/using-the-tree-viewer/](https://stravica.ai/docs/rcf/guides/using-the-tree-viewer/)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Wire your agent into an rcf-lite project
|
|
2
|
+
|
|
3
|
+
`rcf init` scaffolds the `rcf/` tree, registers the MCP server in the project-root `.mcp.json`, and writes the agent-instructions fragment into `CLAUDE.md` and `AGENTS.md` (an existing file is refreshed in place). One command sets an agent up to work through the RCF chain.
|
|
4
|
+
|
|
5
|
+
The Stravica docs page for this walkthrough is the current source of truth:
|
|
6
|
+
|
|
7
|
+
- **Wire your agent:** [https://stravica.ai/docs/rcf/wire-your-agent/](https://stravica.ai/docs/rcf/wire-your-agent/)
|
|
8
|
+
- **Wiring alternatives (harness variants, non-Claude Code setups):** [https://stravica.ai/docs/rcf/guides/wiring-alternatives/](https://stravica.ai/docs/rcf/guides/wiring-alternatives/)
|
|
9
|
+
- **CLI reference for the wiring verbs (`rcf init`, `rcf doctor`):** [https://stravica.ai/docs/rcf/reference/cli/](https://stravica.ai/docs/rcf/reference/cli/)
|
|
10
|
+
|
|
11
|
+
## What the PA does at wiring time
|
|
12
|
+
|
|
13
|
+
1. Confirm the deploy target before touching the stack. Read `create-a-small-app.md` for the numbered sequence.
|
|
14
|
+
2. Install `rcf-lite` per project (not global), so different apps can pin different versions.
|
|
15
|
+
3. Run `rcf init` from the project root. Answer the interactive project-name prompt only; everything else seeds as placeholders for the agent to elicit.
|
|
16
|
+
4. Confirm the harness is wired: the `.mcp.json` entry, the `CLAUDE.md`/`AGENTS.md` fragment, and the `rcf/` tree are all present.
|
|
17
|
+
5. Re-run `rcf init` on an existing project when you want the wiring refreshed; it leaves the tree alone and rewrites the harness fragment.
|