@ramon-sg/issue-flow 0.2.6 → 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
@@ -2,7 +2,7 @@
2
2
 
3
3
  Flujo de trabajo de issue a PR para cualquier repo, en local y en las sesiones de Claude en la nube: nombra la rama de cada issue, crea su worktree con puertos y Docker propios, abre el PR en draft y limpia cuando se mergea. Trae las skills que usan ese flujo.
4
4
 
5
- > **Instalar en un repo:** `npx agent-kitchen`, que instala este flujo con sus skills, las skills generales, `claude-cloud` y `claude-repo-guard`, y los actualiza ([agent-kitchen](https://github.com/ramon-sg/agent-kitchen)). El paquete es `@ramon-sg/issue-flow` y el comando, `issue-flow`; sin el scope, `issue-flow` en npm es otro paquete.
5
+ > **Instalar en un repo:** `npx agent-kitchen apply`, que instala este flujo con sus skills, las skills generales, `claude-cloud` y `claude-repo-guard`, y los actualiza ([agent-kitchen](https://github.com/ramon-sg/agent-kitchen)). El paquete es `@ramon-sg/issue-flow` y el comando, `issue-flow`; sin el scope, `issue-flow` en npm es otro paquete.
6
6
 
7
7
  ## Qué va a tener
8
8
 
@@ -183,7 +183,7 @@ Es el hook `SessionStart` de Claude Code. Lo que imprime le llega a Claude como
183
183
 
184
184
  ## Lo que el flujo deja en el repo: `issue-flow init`
185
185
 
186
- `npx agent-kitchen` corre estos tres comandos en la versión que corresponde. Correrlos a mano sirve para probar el flujo en un repo sin lo demás.
186
+ `npx agent-kitchen apply` corre estos tres comandos en la versión que corresponde. Correrlos a mano sirve para probar el flujo en un repo sin lo demás.
187
187
 
188
188
  ```sh
189
189
  npx @ramon-sg/issue-flow init # pregunta cada receta y pide el OK
@@ -200,7 +200,7 @@ npx @ramon-sg/issue-flow@<versión> upgrade # mueve el repo a esa versión (--d
200
200
 
201
201
  **`doctor`** no cambia nada. Revisa la config, las dependencias y que los hooks estén en esta versión. Cada problema dice qué lo arregla.
202
202
 
203
- **`upgrade`** mueve el repo a la versión que corre: las dependencias a las que fija, los hooks y el `$schema`. No consulta npm, así que se corre con la versión: `npx @ramon-sg/issue-flow@<versión> upgrade`. Nunca baja de versión: si el repo ya tiene una más nueva (por ejemplo, una copia local vieja en `node_modules`), se detiene y dice qué correr. Las skills del flujo llaman a la CLI, así que tienen que ir a la misma tag: `agent-kitchen` las mueve después. `--dry-run` solo dice qué cambiaría.
203
+ **`upgrade`** mueve el repo a la versión que corre: `@ramon-sg/issue-flow`, los hooks y el `$schema`. `github-rest` y `skills-manager` solo suben si no llegan a la versión con que se probó issue-flow: una versión igual o más nueva, un rango que la permite (`^1.2.0` para 1.3.0, no `^0.1.0` para 0.3.0) o una fuente como `workspace:*` se deja como está y se avisa (`kept …`). No consulta npm, así que se corre con la versión: `npx @ramon-sg/issue-flow@<versión> upgrade`. Nunca baja de versión: si el repo ya tiene una más nueva (por ejemplo, una copia local vieja en `node_modules`), se detiene y dice qué correr. Las skills del flujo llaman a la CLI, así que tienen que ir a la misma tag: `agent-kitchen` las mueve después. `--dry-run` solo dice qué cambiaría.
204
204
 
205
205
  ### Recetas
206
206
 
@@ -11,7 +11,7 @@ import { dependencyVersion } from "../package-edits.js";
11
11
  import { hookVersions } from "../settings-hooks.js";
12
12
  import { ownVersions, PACKAGE, readJson, SETTINGS_FILE, SetupError } from "../setup-files.js";
13
13
  /** What fixes every problem: it runs init or upgrade at the right version. */
14
- const RUN_AGENT_KITCHEN = "run npx agent-kitchen";
14
+ const RUN_AGENT_KITCHEN = "run npx agent-kitchen apply";
15
15
  /**
16
16
  * Checks the config.
17
17
  * @param root - The repo.
@@ -11,7 +11,7 @@ import { CONFIG_PATH, isObject } from "../config-base.js";
11
11
  import { parseConfig } from "../config.js";
12
12
  import { checkoutRoot, locateRepo } from "../git.js";
13
13
  import { UsageError, warn } from "../output.js";
14
- import { withFlowPackages } from "../package-edits.js";
14
+ import { KEPT, withFlowPackages } from "../package-edits.js";
15
15
  import { applyRecipe, detectedRecipes, loadRecipes, projectPrefix } from "../recipes.js";
16
16
  import { registerHooks } from "../settings-hooks.js";
17
17
  import { FLOW_REPO, ownVersions, packageManager, readJson, SETTINGS_FILE, SetupError, writeJson } from "../setup-files.js";
@@ -68,8 +68,6 @@ async function pickRecipes(root, options, out) {
68
68
  picked.push(recipe);
69
69
  return picked;
70
70
  }
71
- /** How a line of a change that keeps what the repo had starts. */
72
- const KEPT = "kept ";
73
71
  /**
74
72
  * What `init` would write: the config, `package.json` and the settings' hooks.
75
73
  * @param root - The repo.
@@ -1,4 +1,4 @@
1
- import type { Output } from "../output.js";
1
+ import { type Output } from "../output.js";
2
2
  /** Options of `issue-flow upgrade`. */
3
3
  export interface UpgradeOptions {
4
4
  cwd: string;
@@ -1,36 +1,19 @@
1
1
  /**
2
2
  * @file `issue-flow upgrade [--dry-run]`: moves the repo's flow files to the version that
3
- * runs: the dev dependencies to the ones it pins, and the hooks and the config's schema to
4
- * it. `agent-kitchen` runs it as `npx @ramon-sg/issue-flow@<version> upgrade` and then
3
+ * runs: `@ramon-sg/issue-flow`, the hooks and the config's schema to it, and `github-rest`
4
+ * and `skills-manager` up to the versions it was tested with only if they fall short (a
5
+ * newer one, or a range that allows it, is kept and reported). `agent-kitchen` runs it as `npx @ramon-sg/issue-flow@<version> upgrade` and then
5
6
  * moves the flow's skills to the same tag, because the skills call this CLI.
6
7
  */
7
8
  import { CONFIG_PATH } from "../config-base.js";
8
9
  import { checkoutRoot, locateRepo } from "../git.js";
9
- import { dependencyVersion, withFlowPackages } from "../package-edits.js";
10
+ import { warn } from "../output.js";
11
+ import { dependencyVersion, isNewer, KEPT, withFlowPackages } from "../package-edits.js";
10
12
  import { hookVersions, registerHooks } from "../settings-hooks.js";
11
13
  import { FLOW_REPO, ownVersions, PACKAGE, packageManager, readJson, SETTINGS_FILE, SetupError, writeJson } from "../setup-files.js";
12
14
  import { schemaUrl } from "./init.js";
13
15
  /** The start of the schema URL `init` writes, at any version. */
14
16
  const SCHEMA_PREFIX = `https://raw.githubusercontent.com/${FLOW_REPO}/`;
15
- /** A release version, after an optional range sign. */
16
- const RELEASE = /^[\^~=]?(\d+)\.(\d+)\.(\d+)$/;
17
- /**
18
- * Whether a version is newer than another; false if either is not a release.
19
- * @param version - The version, maybe with a range sign.
20
- * @param than - The other.
21
- * @returns True if it is newer.
22
- */
23
- function isNewer(version, than) {
24
- const [left, right] = [RELEASE.exec(version), RELEASE.exec(than)];
25
- if (left === null || right === null)
26
- return false;
27
- for (let index = 1; index <= 3; index += 1) {
28
- const diff = Number(left[index]) - Number(right[index]);
29
- if (diff !== 0)
30
- return diff > 0;
31
- }
32
- return false;
33
- }
34
17
  /**
35
18
  * The newest version of the flow the repo already has, in package.json or a hook.
36
19
  * @param root - The repo.
@@ -59,13 +42,17 @@ export function upgrade(options, out) {
59
42
  const versions = ownVersions();
60
43
  const current = repoVersion(root);
61
44
  if (current !== null && isNewer(current, versions.issueFlow))
62
- throw new SetupError(`the repo is at issue-flow ${current}, newer than this ${versions.issueFlow}; run 'npx ${PACKAGE}@${current.replace(/^[\^~=]/, "")} upgrade' or 'npx agent-kitchen'.`);
45
+ throw new SetupError(`the repo is at issue-flow ${current}, newer than this ${versions.issueFlow}; run 'npx ${PACKAGE}@${current.replace(/^[\^~=]/, "")} upgrade' or 'npx agent-kitchen apply'.`);
63
46
  const writes = [];
64
47
  const lines = [];
65
48
  const pkg = withFlowPackages(readJson(root, "package.json"), versions, true);
66
- if (pkg.changes.length > 0)
49
+ const kept = pkg.changes.filter((change) => change.startsWith(KEPT));
50
+ const moved = pkg.changes.filter((change) => !change.startsWith(KEPT));
51
+ for (const change of kept)
52
+ warn(out, `package.json: ${change}`);
53
+ if (moved.length > 0)
67
54
  writes.push({ path: "package.json", value: pkg.pkg });
68
- lines.push(...pkg.changes.map((change) => `package.json: ${change}`));
55
+ lines.push(...moved.map((change) => `package.json: ${change}`));
69
56
  const hooks = registerHooks(readJson(root, SETTINGS_FILE), versions.issueFlow);
70
57
  if (hooks.changes.length > 0)
71
58
  writes.push({ path: SETTINGS_FILE, value: hooks.settings });
@@ -2,16 +2,46 @@
2
2
  * @file The repo's `package.json` as the flow needs it: `issue-flow`, `github-rest` and
3
3
  * `skills-manager` as exact dev dependencies (the skills call them with `npx`, which then
4
4
  * uses the repo's copy), and the scripts to start an issue, prune worktrees and review a PR.
5
- * A dependency or script the repo already has with another value stays as it is.
5
+ * A dependency or script the repo already has with another value stays as it is, except
6
+ * that `upgrade` moves `issue-flow` to the version that runs and raises the other two only
7
+ * when they fall short of it: a newer version or a range that allows it is never moved back.
6
8
  */
7
- import type { OwnVersions } from "./setup-files.js";
9
+ import { type OwnVersions } from "./setup-files.js";
8
10
  /**
9
- * The dependencies the flow pins, with their versions.
11
+ * Whether a version is newer than another; false if either is not a version. A leading
12
+ * range sign is dropped, so `^0.3.0` reads as 0.3.0.
13
+ * @param version - The version, maybe with a range sign.
14
+ * @param than - The other.
15
+ * @returns True if it is newer.
16
+ * @example isNewer("1.10.0", "1.9.0") // true
17
+ */
18
+ export declare function isNewer(version: string, than: string): boolean;
19
+ /**
20
+ * Whether the repo's version of a package reaches the one the flow was tested with, so
21
+ * `upgrade` keeps it: an exact version as new or newer, a range that allows it or newer
22
+ * (`^1.2.0` for 1.3.0, not `^0.1.0` for 0.3.0), or a source it cannot read (`workspace:*`,
23
+ * `github:…`, `latest`), which the repo chose on purpose.
24
+ * @param current - The repo's version or range.
25
+ * @param tested - The version the flow was tested with.
26
+ * @returns True to keep it.
27
+ * @example reaches("1.3.0", "1.2.0") // true
28
+ */
29
+ export declare function reaches(current: string, tested: string): boolean;
30
+ /** A dependency the flow pins: its version, and whether `upgrade` keeps one that reaches it. */
31
+ interface Pin {
32
+ version: string;
33
+ keepsReaching: boolean;
34
+ }
35
+ /** How a change that keeps what the repo had starts. */
36
+ export declare const KEPT = "kept ";
37
+ /**
38
+ * The dependencies the flow pins, with their versions. `issue-flow` always follows the
39
+ * version that runs; the other two are a floor, so `upgrade` keeps what reaches it.
10
40
  * @param versions - This package's versions.
11
- * @returns Package to version.
12
- * @example pinnedPackages(versions)["@ramon-sg/issue-flow"] // "0.1.0"
41
+ * @returns Package to pin.
42
+ * @example pinnedPackages(versions)["@ramon-sg/issue-flow"].version // "0.1.0"
13
43
  */
14
- export declare function pinnedPackages(versions: OwnVersions): Record<string, string>;
44
+ export declare function pinnedPackages(versions: OwnVersions): Record<string, Pin>;
15
45
  /**
16
46
  * The version of a package in the repo, as a dependency or a dev dependency.
17
47
  * @param pkg - The package.json.
@@ -33,3 +63,4 @@ export declare function withFlowPackages(pkg: Record<string, unknown> | null, ve
33
63
  pkg: Record<string, unknown>;
34
64
  changes: string[];
35
65
  };
66
+ export {};
@@ -1,3 +1,103 @@
1
+ /**
2
+ * @file The repo's `package.json` as the flow needs it: `issue-flow`, `github-rest` and
3
+ * `skills-manager` as exact dev dependencies (the skills call them with `npx`, which then
4
+ * uses the repo's copy), and the scripts to start an issue, prune worktrees and review a PR.
5
+ * A dependency or script the repo already has with another value stays as it is, except
6
+ * that `upgrade` moves `issue-flow` to the version that runs and raises the other two only
7
+ * when they fall short of it: a newer version or a range that allows it is never moved back.
8
+ */
9
+ import { PACKAGE } from "./setup-files.js";
10
+ /** A version: X.Y.Z, with an optional pre-release and build. */
11
+ const VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;
12
+ /** A range this file understands: a sign (`^`, `~`, `>=`, `=`) before a version. */
13
+ const SIMPLE_RANGE = /^(\^|~|>=|=)\s*(\S+)$/;
14
+ /**
15
+ * Parses a version.
16
+ * @param text - The version, without a range sign.
17
+ * @returns It, or null if it is not one.
18
+ */
19
+ function parse(text) {
20
+ const match = VERSION.exec(text);
21
+ if (match === null)
22
+ return null;
23
+ return { parts: [Number(match[1]), Number(match[2]), Number(match[3])], pre: match[4] ?? null };
24
+ }
25
+ /**
26
+ * Compares two versions, semver-style: by the numbers, then a pre-release before its release.
27
+ * @param left - One.
28
+ * @param right - The other.
29
+ * @returns Negative if left is older, 0 if equal, positive if newer.
30
+ */
31
+ function compare(left, right) {
32
+ for (let index = 0; index < 3; index += 1) {
33
+ const diff = left.parts[index] - right.parts[index];
34
+ if (diff !== 0)
35
+ return diff;
36
+ }
37
+ if (left.pre === right.pre)
38
+ return 0;
39
+ if (left.pre === null)
40
+ return 1;
41
+ if (right.pre === null)
42
+ return -1;
43
+ return left.pre.localeCompare(right.pre, "en", { numeric: true });
44
+ }
45
+ /**
46
+ * Whether a version is newer than another; false if either is not a version. A leading
47
+ * range sign is dropped, so `^0.3.0` reads as 0.3.0.
48
+ * @param version - The version, maybe with a range sign.
49
+ * @param than - The other.
50
+ * @returns True if it is newer.
51
+ * @example isNewer("1.10.0", "1.9.0") // true
52
+ */
53
+ export function isNewer(version, than) {
54
+ const [left, right] = [parse(version.replace(/^[\^~=]/, "")), parse(than.replace(/^[\^~=]/, ""))];
55
+ return left !== null && right !== null && compare(left, right) > 0;
56
+ }
57
+ /**
58
+ * The first version a simple range leaves out, or null if it has no ceiling (`>=`).
59
+ * @param sign - `^`, `~` or `>=`.
60
+ * @param floor - Its version.
61
+ * @returns The ceiling.
62
+ */
63
+ function ceiling(sign, floor) {
64
+ const [major, minor, patch] = floor.parts;
65
+ if (sign === ">=")
66
+ return null;
67
+ if (sign === "~")
68
+ return { parts: [major, minor + 1, 0], pre: null };
69
+ if (major > 0)
70
+ return { parts: [major + 1, 0, 0], pre: null };
71
+ return minor > 0 ? { parts: [0, minor + 1, 0], pre: null } : { parts: [0, 0, patch + 1], pre: null };
72
+ }
73
+ /**
74
+ * Whether the repo's version of a package reaches the one the flow was tested with, so
75
+ * `upgrade` keeps it: an exact version as new or newer, a range that allows it or newer
76
+ * (`^1.2.0` for 1.3.0, not `^0.1.0` for 0.3.0), or a source it cannot read (`workspace:*`,
77
+ * `github:…`, `latest`), which the repo chose on purpose.
78
+ * @param current - The repo's version or range.
79
+ * @param tested - The version the flow was tested with.
80
+ * @returns True to keep it.
81
+ * @example reaches("1.3.0", "1.2.0") // true
82
+ */
83
+ export function reaches(current, tested) {
84
+ const wanted = parse(tested);
85
+ if (wanted === null)
86
+ return true;
87
+ const exact = parse(current);
88
+ if (exact !== null)
89
+ return compare(exact, wanted) >= 0;
90
+ const range = SIMPLE_RANGE.exec(current.trim());
91
+ const floor = range === null ? null : parse(range[2]);
92
+ if (range === null || floor === null)
93
+ return true;
94
+ if (range[1] === "=")
95
+ return compare(floor, wanted) >= 0;
96
+ const top = ceiling(range[1], floor);
97
+ return top === null || compare(wanted, top) < 0;
98
+ }
99
+ /** How a change that keeps what the repo had starts. */
100
+ export const KEPT = "kept ";
1
101
  /** The scripts `init` adds. */
2
102
  const FLOW_SCRIPTS = {
3
103
  "issue:start": "issue-flow issue start",
@@ -5,16 +105,17 @@ const FLOW_SCRIPTS = {
5
105
  "pr:worktree": "issue-flow pr worktree",
6
106
  };
7
107
  /**
8
- * The dependencies the flow pins, with their versions.
108
+ * The dependencies the flow pins, with their versions. `issue-flow` always follows the
109
+ * version that runs; the other two are a floor, so `upgrade` keeps what reaches it.
9
110
  * @param versions - This package's versions.
10
- * @returns Package to version.
11
- * @example pinnedPackages(versions)["@ramon-sg/issue-flow"] // "0.1.0"
111
+ * @returns Package to pin.
112
+ * @example pinnedPackages(versions)["@ramon-sg/issue-flow"].version // "0.1.0"
12
113
  */
13
114
  export function pinnedPackages(versions) {
14
115
  return {
15
- "@ramon-sg/issue-flow": versions.issueFlow,
16
- "@ramon-sg/github-rest": versions.githubRest,
17
- "@ramon-sg/skills-manager": versions.skillsManager,
116
+ [PACKAGE]: { version: versions.issueFlow, keepsReaching: false },
117
+ "@ramon-sg/github-rest": { version: versions.githubRest, keepsReaching: true },
118
+ "@ramon-sg/skills-manager": { version: versions.skillsManager, keepsReaching: true },
18
119
  };
19
120
  }
20
121
  /**
@@ -55,12 +156,12 @@ export function withFlowPackages(pkg, versions, move) {
55
156
  const next = pkg === null ? { private: true } : { ...pkg };
56
157
  const scripts = { ...(next.scripts ?? {}) };
57
158
  const changes = [];
58
- for (const [name, version] of Object.entries(pinnedPackages(versions))) {
159
+ for (const [name, { version, keepsReaching }] of Object.entries(pinnedPackages(versions))) {
59
160
  const current = dependencyOf(next, name);
60
161
  if (current?.version === version)
61
162
  continue;
62
- if (current !== null && !move) {
63
- changes.push(`kept ${name} ${current.version} (issue-flow ${versions.issueFlow} was tested with ${version})`);
163
+ if (current !== null && (!move || (keepsReaching && reaches(current.version, version)))) {
164
+ changes.push(`${KEPT}${name} ${current.version} (issue-flow ${versions.issueFlow} was tested with ${version})`);
64
165
  continue;
65
166
  }
66
167
  const field = current?.field ?? "devDependencies";
package/dist/usage.d.ts CHANGED
@@ -2,4 +2,4 @@
2
2
  * @file The usage text of the CLI, printed with `--help` and after a usage error.
3
3
  */
4
4
  /** Usage text. */
5
- export declare const USAGE = "Usage:\n issue-flow issue branch <n>... [--namer claude|title] [--json] [-R owner/repo]\n issue-flow issue branch --missing [--limit <n>] [--namer claude|title] [--dry-run | --yes] [--json] [-R owner/repo]\n issue-flow issue start <n> [--branch] [--dry-run | --yes] [--resume <branch> | --new] [--no-launch]\n [--ask-permissions | --free] [--namer claude|title] [-R owner/repo]\n issue-flow issue start <n> --plan [--ask-permissions | --free] [--namer claude|title] [-R owner/repo]\n issue-flow issue start <n> --cloud | --here | --teleport | --adopt [...]\n issue-flow worktree setup [--only <step>]\n issue-flow worktree teardown [--path <dir>]\n issue-flow worktree ports [--next]\n issue-flow worktree cleanup [--path <dir>]\n issue-flow worktree prune [--only <dir>] [--yes] [-R owner/repo]\n issue-flow pr worktree <n> [--no-setup] [-R owner/repo] [-- [<command>...]]\n issue-flow adapter setup [--only <step>] | issue [<url>] | archive [-R owner/repo]\n issue-flow session\n issue-flow hook worktree-create | worktree-remove\n issue-flow init [--yes] [--recipe <name>,...]\n issue-flow doctor [--json]\n issue-flow upgrade [--dry-run]\n issue-flow labels sync [--update] [--dry-run] [--json] [-R owner/repo]\n\nThe slug comes from the issue's \"Slug de rama\" block, then from Claude, then from the title,\nand the branch from the repo's template (an older \"Rama sugerida\" block is used if it fits).\n--missing adds the slug block to every open issue without a block, after confirming.\n\nissue start makes the branch in a worktree (or, with --branch, in this checkout), the\nstart commit, the push, the draft PR and the assignment, after confirming, and opens\nClaude: in auto mode if the repo has claude-repo-guard, with your settings with\n--ask-permissions, and with no sandbox nor questions with --free. --plan prints the branch\nand the prompt as JSON and changes nothing.\n\n--cloud confirms here and opens a Claude cloud session that starts the issue there.\n--here, inside a cloud session, starts it in this checkout and opens nothing. --teleport\nbrings the cloud session noted in the PR to the worktree. --adopt starts it in the\nworktree another tool (Orca, Paseo) just made, without asking nor opening Claude.\n\nworktree runs the steps of \"worktrees\" in .agents/flow.json: setup prepares this worktree,\nteardown cleans it before it goes (steps, ports, Docker), ports prints or moves its block\nof ports, cleanup deletes the Docker of deleted worktrees, and prune deletes the worktrees\nwhose PR was merged or closed. session is the SessionStart hook of Claude Code.\n\npr worktree makes (or reuses) a worktree on a PR's own branch, to review and fix it; with\n--, it runs the command there (Claude if none). adapter is what Orca and Paseo run: setup\nwhen they make a worktree (its steps and, if it came from an issue, issue start --adopt),\nissue to start one by hand, and archive before they delete it. hook implements Claude\nCode's WorktreeCreate and WorktreeRemove for claude --worktree.\n\ninit sets the flow up in the repo: .agents/flow.json (with the recipes its files suggest),\nthe dev dependencies and scripts, and the hooks. doctor checks them at this version, and\nupgrade moves them to this version. npx agent-kitchen runs the three, along with the\nskills, claude-cloud and claude-repo-guard.\n\nlabels sync makes in GitHub the labels the flow wants (\"labels\" in .agents/flow.json: the\nissue types and P1 to P4 by default) that the repo lacks. Names ignore case and are never\nrenamed nor deleted; --update also fixes the color and description of those that differ.";
5
+ export declare const USAGE = "Usage:\n issue-flow issue branch <n>... [--namer claude|title] [--json] [-R owner/repo]\n issue-flow issue branch --missing [--limit <n>] [--namer claude|title] [--dry-run | --yes] [--json] [-R owner/repo]\n issue-flow issue start <n> [--branch] [--dry-run | --yes] [--resume <branch> | --new] [--no-launch]\n [--ask-permissions | --free] [--namer claude|title] [-R owner/repo]\n issue-flow issue start <n> --plan [--ask-permissions | --free] [--namer claude|title] [-R owner/repo]\n issue-flow issue start <n> --cloud | --here | --teleport | --adopt [...]\n issue-flow worktree setup [--only <step>]\n issue-flow worktree teardown [--path <dir>]\n issue-flow worktree ports [--next]\n issue-flow worktree cleanup [--path <dir>]\n issue-flow worktree prune [--only <dir>] [--yes] [-R owner/repo]\n issue-flow pr worktree <n> [--no-setup] [-R owner/repo] [-- [<command>...]]\n issue-flow adapter setup [--only <step>] | issue [<url>] | archive [-R owner/repo]\n issue-flow session\n issue-flow hook worktree-create | worktree-remove\n issue-flow init [--yes] [--recipe <name>,...]\n issue-flow doctor [--json]\n issue-flow upgrade [--dry-run]\n issue-flow labels sync [--update] [--dry-run] [--json] [-R owner/repo]\n\nThe slug comes from the issue's \"Slug de rama\" block, then from Claude, then from the title,\nand the branch from the repo's template (an older \"Rama sugerida\" block is used if it fits).\n--missing adds the slug block to every open issue without a block, after confirming.\n\nissue start makes the branch in a worktree (or, with --branch, in this checkout), the\nstart commit, the push, the draft PR and the assignment, after confirming, and opens\nClaude: in auto mode if the repo has claude-repo-guard, with your settings with\n--ask-permissions, and with no sandbox nor questions with --free. --plan prints the branch\nand the prompt as JSON and changes nothing.\n\n--cloud confirms here and opens a Claude cloud session that starts the issue there.\n--here, inside a cloud session, starts it in this checkout and opens nothing. --teleport\nbrings the cloud session noted in the PR to the worktree. --adopt starts it in the\nworktree another tool (Orca, Paseo) just made, without asking nor opening Claude.\n\nworktree runs the steps of \"worktrees\" in .agents/flow.json: setup prepares this worktree,\nteardown cleans it before it goes (steps, ports, Docker), ports prints or moves its block\nof ports, cleanup deletes the Docker of deleted worktrees, and prune deletes the worktrees\nwhose PR was merged or closed. session is the SessionStart hook of Claude Code.\n\npr worktree makes (or reuses) a worktree on a PR's own branch, to review and fix it; with\n--, it runs the command there (Claude if none). adapter is what Orca and Paseo run: setup\nwhen they make a worktree (its steps and, if it came from an issue, issue start --adopt),\nissue to start one by hand, and archive before they delete it. hook implements Claude\nCode's WorktreeCreate and WorktreeRemove for claude --worktree.\n\ninit sets the flow up in the repo: .agents/flow.json (with the recipes its files suggest),\nthe dev dependencies and scripts, and the hooks. doctor checks them at this version, and\nupgrade moves them to this version. npx agent-kitchen apply runs the three, along with the\nskills, claude-cloud and claude-repo-guard.\n\nlabels sync makes in GitHub the labels the flow wants (\"labels\" in .agents/flow.json: the\nissue types and P1 to P4 by default) that the repo lacks. Names ignore case and are never\nrenamed nor deleted; --update also fixes the color and description of those that differ.";
package/dist/usage.js CHANGED
@@ -51,7 +51,7 @@ Code's WorktreeCreate and WorktreeRemove for claude --worktree.
51
51
 
52
52
  init sets the flow up in the repo: .agents/flow.json (with the recipes its files suggest),
53
53
  the dev dependencies and scripts, and the hooks. doctor checks them at this version, and
54
- upgrade moves them to this version. npx agent-kitchen runs the three, along with the
54
+ upgrade moves them to this version. npx agent-kitchen apply runs the three, along with the
55
55
  skills, claude-cloud and claude-repo-guard.
56
56
 
57
57
  labels sync makes in GitHub the labels the flow wants ("labels" in .agents/flow.json: the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ramon-sg/issue-flow",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
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",