@bvdm/delano 0.1.5 → 0.1.8
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/.delano/README.md +7 -0
- package/.delano/viewer/README.md +19 -0
- package/.delano/viewer/public/app.js +818 -0
- package/.delano/viewer/public/explorer.svg +3 -0
- package/.delano/viewer/public/index.html +21 -0
- package/.delano/viewer/public/markdown.svg +6 -0
- package/.delano/viewer/public/styles.css +1042 -0
- package/.delano/viewer/public/vscode.svg +24 -0
- package/.delano/viewer/server.js +389 -0
- package/HANDBOOK.md +66 -45
- package/README.md +21 -2
- package/assets/install-manifest.json +112 -23
- package/assets/payload/.agents/README.md +31 -6
- package/assets/payload/.agents/adapters/claude/README.md +22 -3
- package/assets/payload/.agents/adapters/codex/README.md +22 -3
- package/assets/payload/.agents/adapters/opencode/README.md +22 -3
- package/assets/payload/.agents/adapters/pi/README.md +22 -3
- package/assets/payload/.agents/common/log-safety.js +55 -0
- package/assets/payload/.agents/eval-fixtures/skill-output/invalid/missing-evidence/output.json +6 -0
- package/assets/payload/.agents/eval-fixtures/skill-output/valid/summary/output.json +7 -0
- package/assets/payload/.agents/fixtures/github/status-snapshot.json +6 -0
- package/assets/payload/.agents/fixtures/linear/issue-snapshot.json +6 -0
- package/assets/payload/.agents/hooks/bash-worktree-fix.sh +2 -1
- package/assets/payload/.agents/hooks/post-tool-logger.js +2 -1
- package/assets/payload/.agents/hooks/session-tracker.js +0 -0
- package/assets/payload/.agents/hooks/user-prompt-logger.js +17 -1
- package/assets/payload/.agents/logs/delivery-metrics.md +22 -0
- package/assets/payload/.agents/logs/schema.md +20 -1
- package/assets/payload/.agents/rules/delivery-modes.md +17 -0
- package/assets/payload/.agents/schemas/README.md +22 -0
- package/assets/payload/.agents/schemas/artifact-scope.json +237 -0
- package/assets/payload/.agents/schemas/artifacts/context.schema.json +11 -0
- package/assets/payload/.agents/schemas/artifacts/decision_log.schema.json +12 -0
- package/assets/payload/.agents/schemas/artifacts/evidence.schema.json +17 -0
- package/assets/payload/.agents/schemas/artifacts/plan.schema.json +83 -0
- package/assets/payload/.agents/schemas/artifacts/spec.schema.json +101 -0
- package/assets/payload/.agents/schemas/artifacts/task.schema.json +121 -0
- package/assets/payload/.agents/schemas/artifacts/update.schema.json +12 -0
- package/assets/payload/.agents/schemas/artifacts/workstream.schema.json +66 -0
- package/assets/payload/.agents/schemas/evidence-map.json +53 -0
- package/assets/payload/.agents/schemas/learning/closeout-learning-proposal.schema.json +20 -0
- package/assets/payload/.agents/schemas/learning/delivery-metric-event.schema.json +21 -0
- package/assets/payload/.agents/schemas/leases/lease.schema.json +39 -0
- package/assets/payload/.agents/schemas/metrics/delivery-event.schema.json +29 -0
- package/assets/payload/.agents/schemas/metrics/delivery-events.schema.json +49 -0
- package/assets/payload/.agents/schemas/operating-modes.json +42 -0
- package/assets/payload/.agents/schemas/status-transitions.json +31 -0
- package/assets/payload/.agents/schemas/sync/drift-report.schema.json +25 -0
- package/assets/payload/.agents/schemas/sync/drift-taxonomy.json +38 -0
- package/assets/payload/.agents/schemas/sync/sync-map.schema.json +39 -0
- package/assets/payload/.agents/scripts/README.md +1 -0
- package/assets/payload/.agents/scripts/audit-context-files.mjs +54 -0
- package/assets/payload/.agents/scripts/audit-context-scoring.mjs +14 -0
- package/assets/payload/.agents/scripts/build-drift-report.mjs +133 -0
- package/assets/payload/.agents/scripts/check-artifact-schemas.mjs +116 -0
- package/assets/payload/.agents/scripts/check-closeout-learning-proposals.mjs +23 -0
- package/assets/payload/.agents/scripts/check-context-audit.mjs +61 -0
- package/assets/payload/.agents/scripts/check-delivery-metric-events.mjs +35 -0
- package/assets/payload/.agents/scripts/check-delivery-metrics.mjs +52 -0
- package/assets/payload/.agents/scripts/check-evidence-map.mjs +143 -0
- package/assets/payload/.agents/scripts/check-github-status-inspection.mjs +93 -0
- package/assets/payload/.agents/scripts/check-github-sync.mjs +159 -0
- package/assets/payload/.agents/scripts/check-handoff-summaries.mjs +57 -0
- package/assets/payload/.agents/scripts/check-lease-conflicts.mjs +24 -0
- package/assets/payload/.agents/scripts/check-lease-contracts.mjs +17 -0
- package/assets/payload/.agents/scripts/check-linear-issue-inspection.mjs +63 -0
- package/assets/payload/.agents/scripts/check-local-sync-map.mjs +151 -0
- package/assets/payload/.agents/scripts/check-log-safety.sh +62 -0
- package/assets/payload/.agents/scripts/check-operating-modes.mjs +99 -0
- package/assets/payload/.agents/scripts/check-path-standards.sh +1 -1
- package/assets/payload/.agents/scripts/check-skill-output-evals.mjs +13 -0
- package/assets/payload/.agents/scripts/check-status-transitions.mjs +169 -0
- package/assets/payload/.agents/scripts/check-strict-fixtures.mjs +140 -0
- package/assets/payload/.agents/scripts/check-sync-schemas.mjs +52 -0
- package/assets/payload/.agents/scripts/check-text-safety.mjs +158 -0
- package/assets/payload/.agents/scripts/check-worktree-health.mjs +100 -0
- package/assets/payload/.agents/scripts/fix-path-standards.sh +1 -1
- package/assets/payload/.agents/scripts/git-sparse-download.sh +0 -0
- package/assets/payload/.agents/scripts/inspect-github-sync.mjs +108 -0
- package/assets/payload/.agents/scripts/lease-manager.mjs +88 -0
- package/assets/payload/.agents/scripts/log-event.js +3 -0
- package/assets/payload/.agents/scripts/log-event.sh +0 -0
- package/assets/payload/.agents/scripts/plan-sync-repairs.mjs +66 -0
- package/assets/payload/.agents/scripts/pm/blocked.sh +0 -0
- package/assets/payload/.agents/scripts/pm/epic-list.sh +0 -0
- package/assets/payload/.agents/scripts/pm/in-progress.sh +0 -0
- package/assets/payload/.agents/scripts/pm/init.sh +0 -0
- package/assets/payload/.agents/scripts/pm/next.sh +0 -0
- package/assets/payload/.agents/scripts/pm/prd-list.sh +0 -0
- package/assets/payload/.agents/scripts/pm/search.sh +0 -0
- package/assets/payload/.agents/scripts/pm/standup.sh +0 -0
- package/assets/payload/.agents/scripts/pm/status.sh +0 -0
- package/assets/payload/.agents/scripts/pm/validate.sh +657 -2
- package/assets/payload/.agents/scripts/propose-closeout-learning.mjs +20 -0
- package/assets/payload/.agents/scripts/query-log.sh +0 -0
- package/assets/payload/.agents/scripts/read-local-sync-map.mjs +135 -0
- package/assets/payload/.agents/scripts/select-next-task.mjs +22 -0
- package/assets/payload/.agents/scripts/summarize-project-metrics.mjs +15 -0
- package/assets/payload/.agents/scripts/test-and-log.sh +0 -0
- package/assets/payload/.agents/skills/README.md +6 -0
- package/assets/payload/.agents/skills/closeout-skill/SKILL.md +3 -0
- package/assets/payload/.agents/skills/closeout-skill/references/runbook.md +5 -2
- package/assets/payload/.agents/skills/closeout-skill/templates/closure-checklist.md +2 -0
- package/assets/payload/.agents/skills/closeout-skill/templates/learning-proposal.md +21 -0
- package/assets/payload/.agents/skills/closeout-skill/templates/learning-proposals.md +25 -0
- package/assets/payload/.agents/skills/manage-context/SKILL.md +55 -0
- package/assets/payload/.agents/skills/manage-context/references/context-audit-checklist.md +26 -0
- package/assets/payload/.agents/skills/manage-context/references/runbook.md +26 -0
- package/assets/payload/.agents/skills/manage-context/templates/context-debt-report.md +22 -0
- package/assets/payload/.agents/skills/manage-context/templates/context-refresh-summary.md +13 -0
- package/assets/payload/.agents/skills/onboarding/SKILL.md +49 -0
- package/assets/payload/.agents/skills/onboarding/references/agents-md-best-practices.md +76 -0
- package/assets/payload/.agents/skills/prototype-skill/SKILL.md +51 -0
- package/assets/payload/.agents/skills/prototype-skill/references/probe-design-checklist.md +26 -0
- package/assets/payload/.agents/skills/prototype-skill/references/runbook.md +27 -0
- package/assets/payload/.agents/skills/prototype-skill/templates/probe-approval-recommendation.md +13 -0
- package/assets/payload/.agents/skills/prototype-skill/templates/probe-findings.md +16 -0
- package/assets/payload/.agents/validation-fixtures/strict/invalid/broken-dependencies/dependency.md +18 -0
- package/assets/payload/.agents/validation-fixtures/strict/invalid/broken-dependencies/task.md +24 -0
- package/assets/payload/.agents/validation-fixtures/strict/invalid/invalid-transition/task.md +20 -0
- package/assets/payload/.agents/validation-fixtures/strict/invalid/missing-evidence/task.md +27 -0
- package/assets/payload/.agents/validation-fixtures/strict/invalid/path-leak/task.md +27 -0
- package/assets/payload/.agents/validation-fixtures/strict/invalid/stale-context/context.md +9 -0
- package/assets/payload/.agents/validation-fixtures/strict/manifest.json +11 -0
- package/assets/payload/.agents/validation-fixtures/strict/valid/minimal-project/task.md +27 -0
- package/assets/payload/.delano/viewer/README.md +19 -0
- package/assets/payload/.delano/viewer/public/app.js +818 -0
- package/assets/payload/.delano/viewer/public/explorer.svg +3 -0
- package/assets/payload/.delano/viewer/public/index.html +21 -0
- package/assets/payload/.delano/viewer/public/markdown.svg +6 -0
- package/assets/payload/.delano/viewer/public/styles.css +1042 -0
- package/assets/payload/.delano/viewer/public/vscode.svg +24 -0
- package/assets/payload/.delano/viewer/server.js +389 -0
- package/assets/payload/.project/templates/plan.md +1 -1
- package/assets/payload/.project/templates/spec.md +1 -1
- package/assets/payload/.project/templates/task.md +1 -0
- package/assets/payload/HANDBOOK.md +66 -45
- package/assets/payload/install-delano.sh +0 -0
- package/install-delano.sh +0 -0
- package/package.json +31 -2
- package/src/cli/commands/onboarding.js +29 -0
- package/src/cli/commands/viewer.js +81 -0
- package/src/cli/index.js +20 -0
- package/src/cli/lib/install.js +1 -0
- package/src/cli/lib/onboarding.js +243 -0
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
const { existsSync, readFileSync } = require("node:fs");
|
|
2
|
+
const path = require("node:path");
|
|
3
|
+
const readline = require("node:readline/promises");
|
|
4
|
+
const { stdin, stdout } = require("node:process");
|
|
5
|
+
|
|
6
|
+
const { CliError } = require("./errors");
|
|
7
|
+
const { getPackageRoot } = require("./runtime");
|
|
8
|
+
|
|
9
|
+
const ANALYSIS_APPROVAL_FLAG = "--approve-agents-analysis";
|
|
10
|
+
|
|
11
|
+
function parseOnboardingArgs(args) {
|
|
12
|
+
const options = {
|
|
13
|
+
approveAnalysis: false,
|
|
14
|
+
target: process.cwd()
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
18
|
+
const arg = args[index];
|
|
19
|
+
|
|
20
|
+
if (arg === "--target") {
|
|
21
|
+
index += 1;
|
|
22
|
+
if (!args[index]) {
|
|
23
|
+
throw new CliError("Missing value for --target.", 1);
|
|
24
|
+
}
|
|
25
|
+
options.target = args[index];
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (arg.startsWith("--target=")) {
|
|
30
|
+
options.target = arg.slice("--target=".length);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (arg === ANALYSIS_APPROVAL_FLAG) {
|
|
35
|
+
options.approveAnalysis = true;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
throw new CliError(`Unknown onboarding option: ${arg}`, 1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
options.target = path.resolve(options.target);
|
|
43
|
+
return options;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function findAgentsFile(startDir = process.cwd()) {
|
|
47
|
+
let current = path.resolve(startDir);
|
|
48
|
+
const { root } = path.parse(current);
|
|
49
|
+
|
|
50
|
+
while (true) {
|
|
51
|
+
const candidate = path.join(current, "AGENTS.md");
|
|
52
|
+
if (existsSync(candidate)) {
|
|
53
|
+
return candidate;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (current === root) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
current = path.dirname(current);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function getOnboardingGuidePath() {
|
|
65
|
+
const packageRoot = getPackageRoot();
|
|
66
|
+
const candidates = [
|
|
67
|
+
path.join(packageRoot, ".agents", "skills", "onboarding", "references", "agents-md-best-practices.md"),
|
|
68
|
+
path.join(
|
|
69
|
+
packageRoot,
|
|
70
|
+
"assets",
|
|
71
|
+
"payload",
|
|
72
|
+
".agents",
|
|
73
|
+
"skills",
|
|
74
|
+
"onboarding",
|
|
75
|
+
"references",
|
|
76
|
+
"agents-md-best-practices.md"
|
|
77
|
+
)
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
for (const candidate of candidates) {
|
|
81
|
+
if (existsSync(candidate)) {
|
|
82
|
+
return candidate;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
throw new CliError(
|
|
87
|
+
"Could not find the packaged onboarding guide. Rebuild the package assets with 'npm run build:assets'.",
|
|
88
|
+
1
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function analyzeAgentsContent(content) {
|
|
93
|
+
const checks = [
|
|
94
|
+
{
|
|
95
|
+
label: "mission",
|
|
96
|
+
presentMessage: "Maps the repository's core operating surface and canonical files.",
|
|
97
|
+
missingMessage: "Add a one-line mission so each turn starts from the repo's purpose and quality bar.",
|
|
98
|
+
test: (text) => /(^|\n)##\s+mission\b/i.test(text)
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
label: "first-turn workflow",
|
|
102
|
+
presentMessage: "Provides a reusable first-turn sequence instead of only static rules.",
|
|
103
|
+
missingMessage: "Add a numbered first-turn workflow so the agent knows how to inspect, retrieve, implement, and verify in order.",
|
|
104
|
+
test: (text) => /first-turn workflow|first turn workflow/i.test(text)
|
|
105
|
+
|| (/order of operations/i.test(text) && /(^|\n)1\.\s/m.test(text))
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
label: "source-of-truth map",
|
|
109
|
+
presentMessage: "Points to the main sources of truth the agent should trust.",
|
|
110
|
+
missingMessage: "Keep a compact source-of-truth map and include 'read this first for X' hints where drift would be costly.",
|
|
111
|
+
test: (text) => /canonical truth|source of truth/i.test(text)
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
label: "retrieval index",
|
|
115
|
+
presentMessage: "Provides retrieval hints for common questions and work areas.",
|
|
116
|
+
missingMessage: "Add a retrieval index so the agent can jump from a task area to the right file quickly.",
|
|
117
|
+
test: (text) => /retrieval index/i.test(text)
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
label: "stable constraints",
|
|
121
|
+
presentMessage: "Captures durable repo constraints and runtime shape.",
|
|
122
|
+
missingMessage: "Call out stable high-impact constraints such as runtime assumptions, branch policy, style rules, or business-logic conventions.",
|
|
123
|
+
test: (text) => /branch policy|style rules|runtime quirks|default workspace|definition of done|node|bash|python|workspace/i.test(text)
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
label: "approval and safety boundaries",
|
|
127
|
+
presentMessage: "States approval boundaries or destructive-action handling.",
|
|
128
|
+
missingMessage: "Make approval boundaries explicit, including destructive actions, recoverable edits, and outbound/public actions.",
|
|
129
|
+
test: (text) => /approval|destructive|recoverable|outbound|public actions|confirm/i.test(text)
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
label: "verification expectations",
|
|
133
|
+
presentMessage: "Tells the agent how to verify work and report completion state.",
|
|
134
|
+
missingMessage: "Add verification expectations, including when to run lint/test/build and how to report done, partial, or blocked.",
|
|
135
|
+
test: (text) => /verification|verify|lint|test|build|done|partial|blocked/i.test(text)
|
|
136
|
+
}
|
|
137
|
+
];
|
|
138
|
+
|
|
139
|
+
const strengths = [];
|
|
140
|
+
const gaps = [];
|
|
141
|
+
|
|
142
|
+
for (const check of checks) {
|
|
143
|
+
if (check.test(content)) {
|
|
144
|
+
strengths.push(check.presentMessage);
|
|
145
|
+
} else {
|
|
146
|
+
gaps.push(check.missingMessage);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return { strengths, gaps };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function formatOnboardingReport({ agentsPath, guidePath, review }) {
|
|
154
|
+
const lines = [
|
|
155
|
+
"Onboarding review",
|
|
156
|
+
"-----------------",
|
|
157
|
+
`AGENTS.md: ${agentsPath}`,
|
|
158
|
+
`Guide: ${guidePath}`,
|
|
159
|
+
""
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
if (review.strengths.length > 0) {
|
|
163
|
+
lines.push("Already working well:");
|
|
164
|
+
for (const strength of review.strengths) {
|
|
165
|
+
lines.push(`- ${strength}`);
|
|
166
|
+
}
|
|
167
|
+
lines.push("");
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (review.gaps.length > 0) {
|
|
171
|
+
lines.push("Improve next:");
|
|
172
|
+
for (const gap of review.gaps) {
|
|
173
|
+
lines.push(`- ${gap}`);
|
|
174
|
+
}
|
|
175
|
+
lines.push("");
|
|
176
|
+
} else {
|
|
177
|
+
lines.push("No major gaps detected against the onboarding guide.");
|
|
178
|
+
lines.push("");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
lines.push("No edits were applied.");
|
|
182
|
+
lines.push("If you want AGENTS.md changed, approve that explicitly in a separate step.");
|
|
183
|
+
|
|
184
|
+
return lines.join("\n");
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
async function confirmAgentsAnalysis(options, agentsPath) {
|
|
188
|
+
if (options.approveAnalysis) {
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (!stdin.isTTY || !stdout.isTTY) {
|
|
193
|
+
throw new CliError(
|
|
194
|
+
`Onboarding requires explicit approval. Re-run interactively or pass ${ANALYSIS_APPROVAL_FLAG}.`,
|
|
195
|
+
1
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const rl = readline.createInterface({ input: stdin, output: stdout });
|
|
200
|
+
try {
|
|
201
|
+
const answer = await rl.question(
|
|
202
|
+
`Analyze AGENTS.md at ${agentsPath} with the onboarding skill rubric? This only reads the file and prints recommendations. [y/N] `
|
|
203
|
+
);
|
|
204
|
+
return /^[Yy](es)?$/.test(answer.trim());
|
|
205
|
+
} finally {
|
|
206
|
+
rl.close();
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async function runOnboarding(args) {
|
|
211
|
+
const options = parseOnboardingArgs(args);
|
|
212
|
+
const agentsPath = findAgentsFile(options.target);
|
|
213
|
+
|
|
214
|
+
if (!agentsPath) {
|
|
215
|
+
throw new CliError(
|
|
216
|
+
`Could not find AGENTS.md from ${options.target}. Add AGENTS.md or pass --target to a repository that has one.`,
|
|
217
|
+
1
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const approved = await confirmAgentsAnalysis(options, agentsPath);
|
|
222
|
+
if (!approved) {
|
|
223
|
+
console.log("Onboarding skipped. No analysis performed.");
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const guidePath = getOnboardingGuidePath();
|
|
228
|
+
const agentsContent = readFileSync(agentsPath, "utf8");
|
|
229
|
+
const review = analyzeAgentsContent(agentsContent);
|
|
230
|
+
console.log(formatOnboardingReport({ agentsPath, guidePath, review }));
|
|
231
|
+
return 0;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
module.exports = {
|
|
235
|
+
ANALYSIS_APPROVAL_FLAG,
|
|
236
|
+
analyzeAgentsContent,
|
|
237
|
+
confirmAgentsAnalysis,
|
|
238
|
+
findAgentsFile,
|
|
239
|
+
formatOnboardingReport,
|
|
240
|
+
getOnboardingGuidePath,
|
|
241
|
+
parseOnboardingArgs,
|
|
242
|
+
runOnboarding
|
|
243
|
+
};
|