@tacuchi/agent-workflow-cli 20.12.0 → 20.13.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tacuchi/agent-workflow-cli",
3
- "version": "20.12.0",
3
+ "version": "20.13.0",
4
4
  "description": "Runtime CLI for Workline — the stages + loops + artifacts system for agent work. Bundles the universal `w` skill set under `skills/w/` (slash commands `/w:*`: spec-new/spec-refine, plan-new/plan-exec, quick, persist, workspace-init, export-*); `self install --target <host>` copies SKILL + commands + hooks into the host. Pluggable capability skills via `.workflow/skills.toml`. Multi-empresa parametrization via `profile.json` cascade. Namespace auto-detected from any `.<ns>/sessions/` dir in CWD; default `workflow`.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -39,6 +39,7 @@ The capabilities the harness layer depends on, with their universal fallback (wh
39
39
  | **subagent-dispatch** | *(optional)* parallelize research breadth | **inline sequential** research in the same session (the default anyway) |
40
40
  | **persistent-context** | the `WORKSPACE` block + conventions always present | the repo's context file (standard **`AGENTS.md`**; `CLAUDE.md` on Claude Code) |
41
41
  | **host-memory** | *(optional)* recover state/pending work from the host's accessible history — a **second source** after the workline signals | recent **git** / **`docs/`** signals + (in `/resume`) **ask the user**; plus Workline's own `.workflow/CHECKPOINT` via `aw resume-summary` |
42
+ | **web-research** | *(optional)* search/fetch external online evidence inside a consented ideation round (spec-refine § *Ideation gate*) | **offline ideation** (own knowledge + workspace + repos) — the loop **declares** the web was unavailable |
42
43
  | **external-data** | read-only DB reads or other sources for research/validation | **MCP** (widely supported); without it, the gap degrades to a human question |
43
44
  | **dry-run / preview** | preview what a command would do without writing | the command **describes** the change instead of applying it (e.g. `spec-new` lists the draft without creating the file) |
44
45
 
@@ -57,6 +58,7 @@ Concrete mechanism per harness (**Jul-2026**, verified against official docs; `~
57
58
  | subagent-dispatch | `Task` (parallel) | `SubagentStart` / agents | agents (`.gemini/agents`) | `.opencode/agent/*.md` | ~ | ~ (cloud agents) | inline |
58
59
  | persistent-context | `CLAUDE.md` (does **not** read AGENTS.md → symlink) | `AGENTS.md` | `GEMINI.md` + `AGENTS.md` | `AGENTS.md` | `CRUSH.md` + `AGENTS.md` | `AGENTS.md` (auto) | `AGENTS.md` |
59
60
  | **host-memory** | `MEMORY.md` (cheap) + transcripts/`--resume` (deep) | `AGENTS.md` (static → fallback) | `GEMINI.md`+`AGENTS.md` (static → fallback) | `AGENTS.md` (static → fallback) | `CRUSH.md`+`AGENTS.md` (static → fallback) | rules / history (~) | git/`docs/` + ask |
61
+ | **web-research** | `WebSearch` / `WebFetch` | `web_search` (opt-in config) | `google_web_search` + `web_fetch` | `webfetch` (~) | ~ | ~ (agent web access) | — (offline + declare) |
60
62
  | external-data (MCP) | `.mcp.json` | `.codex/config.toml` `[mcp_servers]` | `settings.json` `mcpServers` | `opencode.json` `mcp` | `crush.json` `mcp` | `.warp/.mcp.json` (+auto-discovers `.mcp.json`) · Oz: `--mcp` flag | — |
61
63
  | **enforcement (deny tool)** | `PreToolUse` → `permissionDecision:deny` / exit 2 | `PreToolUse` (**≈same protocol**) | `BeforeTool` → `decision:deny` / exit 2 | plugin `tool.execute.before` (`throw`) | `allowed_tools` (+ preliminary hooks) | allow/deny lists (**coarse**) | doctrine (git-safe #5) |
62
64
  | plugin / dist | `.claude-plugin` + marketplace | `.codex-plugin` + `/plugins` marketplace | Extension `gemini-extension.json` | JS/TS plugin (npm) | MCP + skills + config | Warp Drive | — |
@@ -69,6 +71,8 @@ Concrete mechanism per harness (**Jul-2026**, verified against official docs; `~
69
71
 
70
72
  > **host-memory (tiers & consumers).** Two tiers: *cheap* (structured, bounded — on Claude Code the auto-memory `MEMORY.md` + `CLAUDE.md`) and *deep* (transcript / `--resume` search, expensive). Consumers: **`/status`** reads only the *cheap* tier, **opportunistically and additively** (a `CONTEXTO DEL HOST` section when available; it **never asks** — a read-only dashboard — and silently omits the section on degrade); **`/resume`** **composes `/status`** and escalates a host-only finding **to a proposal only when the workline level does not explain the pending work** (the spec's fixed order governs the proposals, not the summary), optionally using the *deep* tier or asking as fallback. It is *enhancement*, never a `must`.
71
73
 
74
+ > **web-research (consumer & consent).** Single consumer today: `spec-refine-loop` § *Ideation gate* (the SPEC flow's divergent gate). Consent is **bundled into accepting that gate's offer** — one accepted offer authorizes that round's searches; never free browsing outside a consented round. It is *enhancement*, never a `must`: on degrade the loop ideates **offline and declares it** (unlike host-memory's silent omit — the user consented expecting the web, so silence would mislead).
75
+
72
76
  ## Leverage installed skills
73
77
 
74
78
  "Leverage whatever skills the harness has installed" resolves through the **same** `.workflow/skills.toml` binding: a role can point at a skill **installed on the host** (third-party, via skills.sh) instead of the built-in. Rule:
@@ -3,7 +3,8 @@ name: spec-refine-loop
3
3
  description: >-
4
4
  Refines a draft spec (docs/specs/NNN-spec-<slug>.md) by editing it IN PLACE
5
5
  until it is unambiguous. Heir of the chassis (loops/CHASSIS.md). Deltas:
6
- spec gap taxonomy, analyze gate, ## UI spec section via the ui-design
6
+ spec gap taxonomy, analyze gate, ideation gate (consented brainstorming,
7
+ optional web-research), ## UI spec section via the ui-design
7
8
  capability, and adds Refinement decisions + Q&A traceability — the refined
8
9
  mark plan-new detects. Started by /w:spec-refine (or the live escalation
9
10
  from quick-loop); resumable via CHECKPOINT and re-runnable on demand.
@@ -81,7 +82,7 @@ Structured Markdown description (screens → regions/components). See [`ui-spec`
81
82
 
82
83
  ## Refinement decisions ← NEW (ADDED)
83
84
  What was defined while refining and why. Includes what inline research
84
- resolved (with a reference to the session's CONCLUSIONS).
85
+ resolved (ref. the session's CONCLUSIONS) and the ideation verdicts (§ Ideation gate).
85
86
 
86
87
  ## Q&A traceability ← NEW (ADDED)
87
88
  Every doubt asked to the human + the chosen answer.
@@ -108,8 +109,18 @@ Every doubt asked to the human + the chosen answer.
108
109
  | Hidden assumptions | the spec assumes unstated things | **research** validates / **human** confirms |
109
110
  | Internal contradiction | sections contradict each other | **human** |
110
111
  | Over-specified requirement | scope/criteria gold-plated — beyond the actual need (chassis § *Minimality*) | **human** (AI proposes the cut, human ratifies) |
112
+ | Unexplored solution space | the spec settles on the first conceivable approach — no alternatives weighed nor adopted from the conversation | **human consents** → **ideation** (see *Ideation gate*) |
111
113
  | UI unspecified *(if it applies)* | the requirement involves UI but `## UI spec` is missing | **`ui-design` capability** |
112
114
 
115
+ ## Ideation gate (creativity)
116
+
117
+ The loop's one **divergent** gate: every other resolver closes a gap; this one widens the option space before the spec hardens around its first idea. It resolves **Unexplored solution space** in two consented steps:
118
+
119
+ 1. **Offer & consent.** The gap enters the batch as a content question — `Explorar ideas` vs `Seguir sin ideación` — carrying the AI's recommendation like any other. Declining marks the gap **exhausted** (never re-offered this run); an explicit user request for ideas at any point counts as an accepted offer (on-demand entry). Alternatives already weighed in the conversation are *adopted context* — the gap does not fire.
120
+ 2. **Ideation round** (one per consent). Propose fresh ideas and **combinations** (the user's + found ones). If the host exposes **web-research** ([`../../harness/HARNESS.md`](../../harness/HARNESS.md)), the accepted offer also authorizes that round's web searches — no per-search consent; findings + sources land in the session's `CONCLUSIONS`, like inline research. Without the capability, ideate offline (own knowledge + workspace + repos) and **declare it** — never silently.
121
+
122
+ **Verdicts (back to convergence).** Present the top ≤3 ideas via the same structured-choice, each with a recommended verdict: `Adoptar` → integrate into `Requirement`/`Scope`/criteria + trace in `## Refinement decisions` (idea, rationale, source/URL when web-found) · `Descartar` → one line + reason there · `Aparcar` → `## Open questions`. Ideas beyond the top 3 stay summarized in `CONCLUSIONS`. Divergence is bounded by *Minimality* (chassis): nothing enters the spec without an explicit `Adoptar`; the analyze gate keeps pruning gold-plating. This gate exists **only** in this loop — `spec-new` stays single-pass (no research, no web) and the plan/quick loops inherit none of it.
123
+
113
124
  ## Sequence
114
125
 
115
126
  ```
@@ -128,6 +139,8 @@ spec-refine-loop(spec):
128
139
  if gap = UI (requirement involves UI, ## UI spec missing):
129
140
  compose ui-design → author ## UI spec # design-system/theme via structured-choice (counts in the batch)
130
141
  work = integrate(work, ui) # → ## UI spec
142
+ else if gap = Unexplored solution space (creativity):
143
+ pending_human.push("ideation offer") # offer with AI recommendation: `Explorar ideas` | `Seguir sin ideación`
131
144
  else if factual(gap) and attempts[gap] < MAX:
132
145
  if it needs DB and >1 MCP without default → queue "MCP choice" in pending_human
133
146
  res = research_inline(gap) # in the current session: ANALYSIS-FILE → CONCLUSIONS (+read-only SCRIPTS.sql)
@@ -142,6 +155,8 @@ spec-refine-loop(spec):
142
155
  Compactar → write CHECKPOINT (refine_session) ; compact(harness) ; continue
143
156
  Cerrar → goto finalize
144
157
  work = integrate(work, ans) # → Q&A traceability / Open questions
158
+ ideation offer accepted → run the round NOW, then its verdicts as a NEW ≤3+flow batch (§ Ideation gate) → integrate
159
+ ideation offer declined → mark that gap exhausted # anti re-fire; on-demand entry stays open
145
160
  # no material gaps → analyze gate = Success criteria green (read-only) before offering Guardar:
146
161
  issues = analyze(work) # criteria trace to the Requirement · no contradictions · coherent Scope · Open questions closed/deferred · scenarios↔criteria · no gold-plating (minimality)
147
162
  if issues: gaps += issues ; continue # findings come back into the loop as gaps
@@ -172,6 +187,7 @@ Full mechanism (3 cases, `Compactar`, re-run on demand with `--reopen`) in the c
172
187
  ## Integration (where each resolution lands)
173
188
 
174
189
  - Resolved via **inline research** → the spec's `## Refinement decisions` (+ ref to the session's `CONCLUSIONS`).
190
+ - Resolved via **ideation** → per verdict (§ *Ideation gate*): `Adoptar` → the spec's sections + `## Refinement decisions` · `Descartar` → there · `Aparcar` → `## Open questions`.
175
191
  - Resolved via **human** → the spec's `## Q&A traceability`.
176
192
  - Resolved via the **`ui-design` capability** (UI gap) → the spec's `## UI spec` section.
177
193
  - **Inconclusive or unresolved research** → the spec's `## Open questions` (deferred) + the refine session's `BACKLOG.md` (only if something is deferred).