@ramon-sg/issue-flow 0.2.3 → 0.2.5

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
@@ -14,7 +14,7 @@ Flujo de trabajo de issue a PR para cualquier repo, en local y en las sesiones d
14
14
  - **`issue-flow adapter setup|issue|archive`:** lo que corren Orca y Paseo al crear o borrar un worktree.
15
15
  - **`issue-flow session`:** el hook `SessionStart`; en la nube llama a [`claude-cloud`](https://github.com/ramon-sg/claude-cloud).
16
16
  - **`issue-flow hook worktree-create|worktree-remove`:** los hooks `WorktreeCreate` y `WorktreeRemove` de Claude Code, para `claude --worktree`.
17
- - **Skills:** `github-issues`, `start-issue`, `close-pr`, `pr-review-comments` y `pr-worktree`.
17
+ - **Skills:** `github-issues`, `start-issue`, `finish-pr`, `close-pr`, `pr-review-comments` y `pr-worktree`.
18
18
 
19
19
  ## Nombre de la rama
20
20
 
@@ -44,6 +44,8 @@ La rama se arma con la plantilla del repo y el slug sale, en este orden:
44
44
 
45
45
  ## Empezar una issue
46
46
 
47
+ Las cuatro formas de empezar una issue (terminal, la skill en una sesión, la nube de Claude, Orca y Paseo), paso a paso: [docs/flujos.md](docs/flujos.md).
48
+
47
49
  ```sh
48
50
  issue-flow issue start 42 # worktree en .claude/worktrees/, PR en draft y Claude
49
51
  issue-flow issue start 42 --dry-run # el resumen, sin cambiar nada (solo hace git fetch)
@@ -220,11 +222,12 @@ Viven en `skills/` y `skills-catalog.json` las lista. Se instalan con [`skills-m
220
222
  |---|---|---|---|
221
223
  | `github-issues` | Issues | Una issue corta con cabecera de tres líneas, criterios comprobables y el slug de su rama; comprueba duplicados y el tope de palabras | — |
222
224
  | `start-issue` | Issues | Empieza una issue desde una sesión con `issue-flow issue start`, en local, en un worktree o en la nube | — |
223
- | `close-pr` | PRs | Auditoría, documentos al día, ready, revisión y CI, y merge con merge commit solo con un review aprobado | `pr-review-comments` |
225
+ | `finish-pr` | PRs | Auditoría, documentos al día, ready, revisión y CI, y el chequeo de que se puede mergear; se detiene antes del merge con un reporte de qué falta y cómo limpiar | `pr-review-comments` |
226
+ | `close-pr` | PRs | Corre `finish-pr` y, si quedó listo, mergea con merge commit y limpia la rama y el worktree | `finish-pr` |
224
227
  | `pr-review-comments` | PRs | Verifica cada comentario y check contra el código, propone un plan, aplica lo aprobado y responde los hilos | `github-issues` |
225
228
  | `pr-worktree` | PRs | Revisa un PR en su worktree con `issue-flow pr worktree`, sin tocar el checkout principal | `close-pr` |
226
229
 
227
- `agent-kitchen` las instala con el catálogo en la tag de la versión del flujo y las mueve con él. `close-pr` y `pr-worktree` usan `code-audit`, del catálogo [`agent-skills`](https://github.com/ramon-sg/agent-skills): `agent-kitchen` ofrece los dos.
230
+ `agent-kitchen` las instala con el catálogo en la tag de la versión del flujo y las mueve con él. `finish-pr` (y con ella `close-pr`) y `pr-worktree` usan `code-audit`, del catálogo [`agent-skills`](https://github.com/ramon-sg/agent-skills): `agent-kitchen` ofrece los dos.
228
231
 
229
232
  **Lo propio de cada repo va en `project.md`**, que cada skill (salvo `pr-worktree`) crea desde su plantilla al instalarse: los labels y el assignee, qué flujo sigue cada issue, qué corre sin preguntar al cerrar, qué bots revisan y qué cuenta como review aprobado. Ese archivo es del repo: `check` no lo marca y las actualizaciones lo conservan.
230
233
 
@@ -261,7 +264,7 @@ Todo es opcional; sin el archivo valen los valores por defecto. Una clave descon
261
264
  | `worktrees.ports` | Apagado | `true` para bloques de 10 desde 20000, o `{ start, blockSize, blocks }` |
262
265
  | `worktrees.dockerProjects` | Ninguno | Prefijos de los proyectos de Compose de los worktrees |
263
266
  | `start.commitMessage` | `chore: empieza el trabajo en la issue #{number} [skip ci]` | Commit vacío inicial |
264
- | `start.prBody` | `{keyword} #{number}` y "En progreso." | Cuerpo del PR en draft |
267
+ | `start.prBody` | `{keyword} #{number}`, la URL de la issue (`{url}`) y "En progreso." | Cuerpo del PR en draft |
265
268
  | `start.prompt`, `start.resumePrompt` | Resumir la issue y seguir `start-issue`, o retomar desde `{plan}` | Pedido con que se abre Claude |
266
269
  | `start.summaryPrompt`, `start.summaryPlanPrompt` | Resumir y esperar | Pedido de `--plan` |
267
270
  | `start.cloudPrompt` | `/start-issue {number} --yes{flags}` | Lo que `--cloud` le pide a la sesión; `{flags}` es `--new` o `--resume <rama>` |
package/dist/config.js CHANGED
@@ -34,7 +34,7 @@ export const DEFAULT_CONFIG = {
34
34
  worktrees: { dir: ".claude/worktrees", setup: [], teardown: [], ports: null, dockerProjects: [] },
35
35
  start: {
36
36
  commitMessage: "chore: empieza el trabajo en la issue #{number} [skip ci]",
37
- prBody: "{keyword} #{number}\n\nEn progreso.",
37
+ prBody: "{keyword} #{number}\n\nIssue: {url}\n\nEn progreso.",
38
38
  prompt: "Issue #{number}. Lee la issue con `npx @ramon-sg/github-rest issue view {number}`, resúmela en lenguaje llano y sigue la skill start-issue para elegir el flujo.",
39
39
  resumePrompt: "Issue #{number}. Lee la issue con `npx @ramon-sg/github-rest issue view {number}`, resúmela en lenguaje llano y retoma el trabajo según {plan}: revisa qué tareas quedan.",
40
40
  summaryPrompt: "Issue #{number}. Lee la issue con `npx @ramon-sg/github-rest issue view {number}` y resúmela en lenguaje llano. No empieces a trabajar ni a planificar: espera mi pedido.",
@@ -69,13 +69,14 @@ export declare function nextBranch(proposed: string, used: string[]): string;
69
69
  export declare function fill(template: string, values: Record<string, string>): string;
70
70
  /**
71
71
  * The draft PR's body from the config's template.
72
- * @param template - The template, with `{keyword}` and `{number}`.
72
+ * @param template - The template, with `{keyword}`, `{number}` and `{url}`.
73
73
  * @param number - The issue.
74
74
  * @param kind - Whether the PR closes the issue or is part of it.
75
+ * @param url - The issue's URL.
75
76
  * @returns The body.
76
- * @example prBody("{keyword} #{number}", 4, "part") // "Part of #4"
77
+ * @example prBody("{keyword} #{number}", 4, "part", url) // "Part of #4"
77
78
  */
78
- export declare function prBody(template: string, number: number, kind: PrKind): string;
79
+ export declare function prBody(template: string, number: number, kind: PrKind, url: string): string;
79
80
  /**
80
81
  * The body of a PR with the words that close the issue (`Closes`, `Fixes`, `Resolves` and
81
82
  * their forms, with or without `:`) changed to `Part of`, because the issue now has more
@@ -121,14 +121,15 @@ export function fill(template, values) {
121
121
  }
122
122
  /**
123
123
  * The draft PR's body from the config's template.
124
- * @param template - The template, with `{keyword}` and `{number}`.
124
+ * @param template - The template, with `{keyword}`, `{number}` and `{url}`.
125
125
  * @param number - The issue.
126
126
  * @param kind - Whether the PR closes the issue or is part of it.
127
+ * @param url - The issue's URL.
127
128
  * @returns The body.
128
- * @example prBody("{keyword} #{number}", 4, "part") // "Part of #4"
129
+ * @example prBody("{keyword} #{number}", 4, "part", url) // "Part of #4"
129
130
  */
130
- export function prBody(template, number, kind) {
131
- return fill(template, { keyword: kind === "part" ? "Part of" : "Closes", number: String(number) });
131
+ export function prBody(template, number, kind, url) {
132
+ return fill(template, { keyword: kind === "part" ? "Part of" : "Closes", number: String(number), url });
132
133
  }
133
134
  /**
134
135
  * The body of a PR with the words that close the issue (`Closes`, `Fixes`, `Resolves` and
@@ -142,7 +142,7 @@ export async function publish(state) {
142
142
  head: branch,
143
143
  base: state.base,
144
144
  title: state.issue.title,
145
- body: prBody(options.config.start.prBody, options.number, state.kind),
145
+ body: prBody(options.config.start.prBody, options.number, state.kind, state.issue.url),
146
146
  draft: true,
147
147
  });
148
148
  state.out.stdout(`${created.url}\n`);
@@ -67,7 +67,7 @@ export function plannedActions(state) {
67
67
  if (commit || !onOrigin(mainRoot, branch))
68
68
  actions.push("push -u");
69
69
  if (state.pr === null) {
70
- const first = prBody(state.options.config.start.prBody, number, state.kind).split("\n")[0];
70
+ const first = prBody(state.options.config.start.prBody, number, state.kind, state.issue.url).split("\n")[0];
71
71
  actions.push(`draft PR (${first})`);
72
72
  const others = openPrsElsewhere(state.work.prs, branch);
73
73
  if (state.kind === "part" && others.length > 0)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ramon-sg/issue-flow",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "description": "Issue-to-PR workflow for any repo: names each issue's branch, creates its worktree, opens the draft PR and launches Claude Code, locally and in Claude's cloud.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/schema.json CHANGED
@@ -188,10 +188,10 @@
188
188
  "default": "chore: empieza el trabajo en la issue #{number} [skip ci]"
189
189
  },
190
190
  "prBody": {
191
- "description": "Body of the draft PR; {keyword} is Closes, or Part of when the issue has another live branch.",
191
+ "description": "Body of the draft PR; {keyword} is Closes, or Part of when the issue has another live branch; {number} and {url} are the issue's. The session that starts the issue changes \"En progreso.\" for a short summary.",
192
192
  "type": "string",
193
193
  "minLength": 1,
194
- "default": "{keyword} #{number}\n\nEn progreso."
194
+ "default": "{keyword} #{number}\n\nIssue: {url}\n\nEn progreso."
195
195
  },
196
196
  "prompt": {
197
197
  "description": "Prompt Claude opens with on a new branch; {number}, {title} (text anyone can write in the issue: better left out).",