@bvdm/delano 0.2.5 → 0.2.7

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,7 +15,7 @@ The npm package is intentionally thin. It distributes the approved runtime paylo
15
15
  ## Delano CLI
16
16
 
17
17
  - Package: `@bvdm/delano`
18
- - Current package version: `0.2.4`
18
+ - Current package version: `0.2.7`
19
19
  - Binary: `delano`
20
20
  - Commands: `onboarding`, `install`, `viewer`, `init`, `validate`, `status`, `next`
21
21
  - Primary goal: bootstrap a repo safely, expose local delivery state clearly, and keep runtime gates verifiable
@@ -120,6 +120,10 @@
120
120
  ".agents/skills/discovery-skill/references/runbook.md",
121
121
  ".agents/skills/discovery-skill/templates/clarification-questions.md",
122
122
  ".agents/skills/discovery-skill/templates/discovery-summary.md",
123
+ ".agents/skills/research-skill/SKILL.md",
124
+ ".agents/skills/research-skill/references/runbook.md",
125
+ ".agents/skills/research-skill/templates/fold-forward-checklist.md",
126
+ ".agents/skills/research-skill/templates/research-summary.md",
123
127
  ".agents/skills/execution-skill/SKILL.md",
124
128
  ".agents/skills/execution-skill/references/runbook.md",
125
129
  ".agents/skills/execution-skill/templates/blocker-update.md",
@@ -147,6 +147,7 @@ fi
147
147
  # Required skill contracts
148
148
  required_skills=(
149
149
  discovery-skill
150
+ research-skill
150
151
  prototype-skill
151
152
  planning-skill
152
153
  breakdown-skill
@@ -5,6 +5,7 @@ Handbook-aligned skill contracts.
5
5
  Core workflow skills:
6
6
 
7
7
  - `discovery-skill`
8
+ - `research-skill`
8
9
  - `prototype-skill`
9
10
  - `planning-skill`
10
11
  - `breakdown-skill`
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: research-skill
3
+ description: Open and run repo-native research intake before mutating canonical delivery artifacts. Use when a Delano request has unclear intent, unresolved options, external evidence needs, or material uncertainty that should be investigated before changing spec, plan, workstreams, or tasks.
4
+ ---
5
+
6
+ # research-skill
7
+
8
+ ## Trigger context
9
+ - delivery intent is unclear enough that direct changes to `spec.md`, `plan.md`, workstreams, or tasks would be speculative
10
+ - options, constraints, risks, or external evidence need investigation before planning or execution
11
+ - imported or user-provided material needs synthesis into Delano's canonical project artifacts
12
+ - a previous `planning_with_files` style briefing would have been useful, but the work must stay inside the Delano repo
13
+
14
+ ## Non-triggers
15
+ - obvious implementation tasks with accepted scope
16
+ - simple bug fixes or one-file edits
17
+ - work that already has an approved spec, plan, and ready tasks
18
+ - personal Obsidian briefing or vault-based planning
19
+
20
+ ## Required inputs
21
+ - project_slug
22
+ - research_slug
23
+ - research_title
24
+ - primary_question
25
+ - owner
26
+ - known_constraints
27
+
28
+ ## Output schema
29
+ - `.project/projects/<slug>/research/<research-slug>/task_plan.md`
30
+ - `.project/projects/<slug>/research/<research-slug>/findings.md`
31
+ - `.project/projects/<slug>/research/<research-slug>/progress.md`
32
+ - folded-forward updates to `spec.md`, `plan.md`, `decisions.md`, workstreams, tasks, or update notes when conclusions are durable
33
+ - explicit no-action closeout when research does not change canonical artifacts
34
+
35
+ ## Quality checks
36
+ - research question is specific enough to answer
37
+ - findings cite inspected files, commands, sources, or artifacts
38
+ - progress log records actions, validation, blockers, and closeout
39
+ - durable conclusions are folded into canonical Delano project artifacts
40
+ - research files do not contain secrets, credentials, private machine paths, or Obsidian vault paths
41
+ - research output is not treated as executable task truth until folded forward
42
+
43
+ ## Failure behavior
44
+ - stop if project slug does not exist
45
+ - return a narrower research question when the current question is too broad
46
+ - document evidence gaps before recommending artifact changes
47
+ - leave canonical project files unchanged when findings are weak or unresolved
48
+
49
+ ## Allowed side effects
50
+ - create a research intake folder under `.project/projects/<slug>/research/<research-slug>/`
51
+ - update `task_plan.md`, `findings.md`, and `progress.md` during investigation
52
+ - update canonical Delano artifacts only after evidence supports the change
53
+ - run Delano validation after creating or folding forward research
54
+
55
+ ## Script hooks
56
+ - `bash .agents/scripts/pm/research.sh <project-slug> <research-slug> --title "<Research Title>" --question "<Primary Question>" --owner <owner> --json`
57
+ - `bash .agents/scripts/pm/validate.sh`
58
+ - `bash .agents/scripts/pm/status.sh`
59
+
60
+ ## Lineage
61
+ This skill adapts Bart's `planning_with_files` pattern to Delano. Keep the useful three-file working state and closeout discipline, but do not use Obsidian, `BartsVault`, or external briefing folders. Delano research belongs inside the project repository.
62
+
63
+ ## Execution assets
64
+ - `references/runbook.md`
65
+ - `templates/research-summary.md`
66
+ - `templates/fold-forward-checklist.md`
@@ -0,0 +1,59 @@
1
+ # research-skill runbook
2
+
3
+ Use research intake as Delano's repo-native version of file-based planning for unclear work. It gives agents durable working state without moving the source of truth out of the repository.
4
+
5
+ ## 1. Decide whether research is needed
6
+
7
+ Open research when the next canonical artifact change would otherwise be a guess. Good triggers include unclear imported requirements, competing implementation options, missing evidence, uncertain user intent, and questions that need investigation before delivery planning.
8
+
9
+ Skip research when the work is already decided and executable. Use `execution-skill`, `planning-skill`, or `quality-skill` directly instead.
10
+
11
+ ## 2. Open the intake
12
+
13
+ Run:
14
+
15
+ ```bash
16
+ bash .agents/scripts/pm/research.sh <project-slug> <research-slug> \
17
+ --title "<Research Title>" \
18
+ --question "<Primary Question>" \
19
+ --owner <owner> \
20
+ --json
21
+ ```
22
+
23
+ The command creates:
24
+ - `task_plan.md`
25
+ - `findings.md`
26
+ - `progress.md`
27
+
28
+ under:
29
+ - `.project/projects/<project-slug>/research/<research-slug>/`
30
+
31
+ Do not create Obsidian briefings for Delano research.
32
+
33
+ ## 3. Work inside the intake
34
+
35
+ Use `task_plan.md` for phase state, `findings.md` for evidence and conclusions, and `progress.md` for chronological actions, tests, blockers, and handoff notes.
36
+
37
+ Keep entries concise and evidence-led. Cite local files, commands, issue references, PRs, docs, or external sources that were actually inspected.
38
+
39
+ ## 4. Fold forward
40
+
41
+ Research is not done just because the three files exist. Durable conclusions must be folded into canonical Delano artifacts:
42
+ - `spec.md`
43
+ - `plan.md`
44
+ - `decisions.md`
45
+ - `workstreams/*.md`
46
+ - `tasks/*.md`
47
+ - `updates/*.md`
48
+
49
+ If the answer is no-action, record why in `progress.md` and keep canonical files unchanged.
50
+
51
+ ## 5. Validate and report
52
+
53
+ Run validation after creating intake files and again after folding conclusions forward:
54
+
55
+ ```bash
56
+ bash .agents/scripts/pm/validate.sh
57
+ ```
58
+
59
+ Report the research path, conclusion, folded-forward files, validation result, and remaining open items.
@@ -0,0 +1,9 @@
1
+ # Fold-forward Checklist
2
+
3
+ - [ ] Research question answered or explicitly narrowed
4
+ - [ ] Evidence and gaps recorded in `findings.md`
5
+ - [ ] Actions, validation, and blockers recorded in `progress.md`
6
+ - [ ] Durable conclusions copied into canonical Delano artifacts
7
+ - [ ] No secrets, credentials, private machine paths, or Obsidian vault paths included
8
+ - [ ] `bash .agents/scripts/pm/validate.sh` run after changes
9
+ - [ ] No-action closeout recorded if canonical artifacts stayed unchanged
@@ -0,0 +1,21 @@
1
+ # Research Summary
2
+
3
+ ## Question
4
+
5
+ <primary research question>
6
+
7
+ ## Evidence Inspected
8
+
9
+ - <file, command, source, issue, PR, or artifact>
10
+
11
+ ## Findings
12
+
13
+ - <finding tied to evidence>
14
+
15
+ ## Recommendation
16
+
17
+ <recommended Delano artifact change or no-action decision>
18
+
19
+ ## Confidence
20
+
21
+ <high|medium|low> because <reason>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bvdm/delano",
3
- "version": "0.2.5",
3
+ "version": "0.2.7",
4
4
  "description": "CLI for the Delano delivery runtime.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -472,12 +472,56 @@ function applyTaskRollups({ project, task, action, previousStatus, timestamp, ch
472
472
  promoteWorkstreamToActive(project, workstream, timestamp, changes);
473
473
  }
474
474
 
475
+ if (action === "close") {
476
+ openDependencyReadyTasks(project, task, timestamp, changes);
477
+ }
478
+
475
479
  if (["close", "defer"].includes(action)) {
476
480
  closeWorkstreamIfDone(project, workstream, timestamp, changes);
477
481
  closeProjectIfDone(project, timestamp, changes);
478
482
  }
479
483
  }
480
484
 
485
+ function openDependencyReadyTasks(project, completedTask, timestamp, changes) {
486
+ const completedTaskId = String(completedTask.frontmatter.id || "").trim();
487
+ if (!completedTaskId) {
488
+ return;
489
+ }
490
+
491
+ for (const candidate of project.tasks) {
492
+ if (candidate === completedTask || !isDependencyOnlyBlockedTask(project, candidate, completedTaskId)) {
493
+ continue;
494
+ }
495
+
496
+ setFrontmatter(candidate, "status", "ready");
497
+ setFrontmatter(candidate, "updated", timestamp);
498
+ removeFrontmatter(candidate, "blocked_owner");
499
+ removeFrontmatter(candidate, "blocked_check_back");
500
+ appendEvidence(candidate, timestamp, `Opened automatically because dependencies are done after ${completedTaskId} closed.`);
501
+ changes.push(`${relativeProjectPath(project, candidate.path)} status -> ready`);
502
+ }
503
+ }
504
+
505
+ function isDependencyOnlyBlockedTask(project, task, completedTaskId) {
506
+ if ((task.frontmatter.status || "") !== "blocked") {
507
+ return false;
508
+ }
509
+
510
+ const dependencies = parseInlineList(task.frontmatter.depends_on || "[]");
511
+ if (!dependencies.includes(completedTaskId)) {
512
+ return false;
513
+ }
514
+ if (!dependencies.every((dependencyId) => findTask(project, dependencyId)?.frontmatter.status === "done")) {
515
+ return false;
516
+ }
517
+
518
+ const owner = String(task.frontmatter.blocked_owner || "").trim().toLowerCase();
519
+ if (!owner) {
520
+ return true;
521
+ }
522
+ return ["dependency", "dependencies", "delano", "delano-cli", "system", "auto", "automation"].includes(owner);
523
+ }
524
+
481
525
  function assertTaskWorkstreamExists(project, task, action) {
482
526
  const workstreamId = String(task.frontmatter.workstream || "").trim();
483
527
  if (!workstreamId) {