issy 0.5.6 → 0.6.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/README.md CHANGED
@@ -29,6 +29,12 @@ The assistant creates, searches, updates, and closes issues for you. Issues are
29
29
 
30
30
  ## Install the Skill
31
31
 
32
+ ```bash
33
+ issy skill install
34
+ ```
35
+
36
+ Or, if you haven't installed `issy` yet:
37
+
32
38
  ```bash
33
39
  npx skills add miketromba/issy
34
40
  ```
@@ -72,7 +78,7 @@ Once installed globally, you can run commands from your terminal:
72
78
  issy # Start the web UI
73
79
  issy list # List open issues (roadmap order)
74
80
  issy next # Show next issue to work on
75
- issy create --title "Bug" # Create issue
81
+ issy create --title "Bug" # Create an issue
76
82
  ```
77
83
 
78
84
  ### Repository installation
@@ -121,9 +127,12 @@ issy next # Show next issue to work on
121
127
  issy search "auth" # Fuzzy search
122
128
  issy read 0001 # View issue
123
129
  issy create --title "Bug" --after 0002 # Create issue after #0002
130
+ issy create --title "Bug" --body "Details here" --last # Create with body content
124
131
  issy update 0001 --before 0003 # Reposition in roadmap
132
+ issy update 0001 --body "New details" # Replace body content
125
133
  issy close 0001 # Close issue
126
134
  issy reopen 0001 --after 0004 # Reopen and place in roadmap
135
+ issy skill install # Install the AI skill
127
136
  issy migrate # Migrate from .issues/ to .issy/
128
137
  issy --version # Check version
129
138
  ```
package/dist/cli.js CHANGED
@@ -490,12 +490,13 @@ async function createIssue(input) {
490
490
  order: input.order || undefined,
491
491
  created: formatDate()
492
492
  };
493
- const content = `${generateFrontmatter(frontmatter)}
494
-
493
+ const body = input.body ?? `
495
494
  ## Details
496
495
 
497
496
  <!-- Add detailed description here -->
498
-
497
+ `;
498
+ const content = `${generateFrontmatter(frontmatter)}
499
+ ${body}
499
500
  `;
500
501
  await writeFile(join(getIssuesDir(), filename), content);
501
502
  return {
@@ -503,10 +504,7 @@ async function createIssue(input) {
503
504
  filename,
504
505
  frontmatter,
505
506
  content: `
506
- ## Details
507
-
508
- <!-- Add detailed description here -->
509
-
507
+ ${body}
510
508
  `
511
509
  };
512
510
  }
@@ -529,12 +527,16 @@ async function updateIssue(id, input) {
529
527
  ...input.order && { order: input.order },
530
528
  updated: formatDate()
531
529
  };
530
+ const updatedContent = input.body !== undefined ? `
531
+ ${input.body}
532
+ ` : issue.content;
532
533
  const content = `${generateFrontmatter(updatedFrontmatter)}
533
- ${issue.content}`;
534
+ ${updatedContent}`;
534
535
  await writeFile(join(getIssuesDir(), issue.filename), content);
535
536
  return {
536
537
  ...issue,
537
- frontmatter: updatedFrontmatter
538
+ frontmatter: updatedFrontmatter,
539
+ content: updatedContent
538
540
  };
539
541
  }
540
542
  async function closeIssue(id) {
@@ -2107,7 +2109,12 @@ function formatIssueRow(issue) {
2107
2109
  async function resolvePosition(opts) {
2108
2110
  const openIssues = await getOpenIssuesByOrder();
2109
2111
  const relevantIssues = opts.excludeId ? openIssues.filter((i) => i.id !== opts.excludeId?.padStart(4, "0")) : openIssues;
2110
- const positionFlags = [opts.before, opts.after, opts.first, opts.last].filter(Boolean).length;
2112
+ const positionFlags = [
2113
+ opts.before,
2114
+ opts.after,
2115
+ opts.first,
2116
+ opts.last
2117
+ ].filter(Boolean).length;
2111
2118
  if (positionFlags > 1) {
2112
2119
  throw new Error("Only one of --before, --after, --first, or --last can be specified.");
2113
2120
  }
@@ -2249,6 +2256,7 @@ Create New Issue`);
2249
2256
  const input = {
2250
2257
  title: options.title,
2251
2258
  description: options.description,
2259
+ body: options.body,
2252
2260
  priority: options.priority,
2253
2261
  scope: options.scope,
2254
2262
  type: options.type,
@@ -2279,6 +2287,7 @@ async function updateIssueCommand(id, options) {
2279
2287
  const issue = await updateIssue(id, {
2280
2288
  title: options.title,
2281
2289
  description: options.description,
2290
+ body: options.body,
2282
2291
  priority: options.priority,
2283
2292
  scope: options.scope,
2284
2293
  type: options.type,
@@ -2370,6 +2379,7 @@ Commands:
2370
2379
  create Create a new issue
2371
2380
  --title, -t <t> Issue title
2372
2381
  --description, -d <d> Short description
2382
+ --body, -b <b> Markdown body content
2373
2383
  --priority, -p <p> Priority (high, medium, low)
2374
2384
  --scope <s> Scope (small, medium, large)
2375
2385
  --type <t> Type (bug, improvement)
@@ -2382,6 +2392,7 @@ Commands:
2382
2392
  update <id> Update an issue
2383
2393
  --title, -t <t> New title
2384
2394
  --description, -d <d> New description
2395
+ --body, -b <b> New markdown body content
2385
2396
  --priority, -p <p> New priority
2386
2397
  --scope <s> New scope
2387
2398
  --type <t> New type
@@ -2399,6 +2410,8 @@ Commands:
2399
2410
  --first Insert at the beginning of the roadmap
2400
2411
  --last Insert at the end of the roadmap
2401
2412
 
2413
+ skill install Install the issy skill for your AI coding assistant
2414
+
2402
2415
  Examples:
2403
2416
  issy list
2404
2417
  issy list --priority high --type bug
@@ -2465,6 +2478,7 @@ Examples:
2465
2478
  options: {
2466
2479
  title: { type: "string", short: "t" },
2467
2480
  description: { type: "string", short: "d" },
2481
+ body: { type: "string", short: "b" },
2468
2482
  priority: { type: "string", short: "p" },
2469
2483
  scope: { type: "string" },
2470
2484
  type: { type: "string" },
@@ -2490,6 +2504,7 @@ Examples:
2490
2504
  options: {
2491
2505
  title: { type: "string", short: "t" },
2492
2506
  description: { type: "string", short: "d" },
2507
+ body: { type: "string", short: "b" },
2493
2508
  priority: { type: "string", short: "p" },
2494
2509
  scope: { type: "string" },
2495
2510
  type: { type: "string" },
package/dist/main.js CHANGED
@@ -2,6 +2,7 @@ import { createRequire } from "node:module";
2
2
  var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
3
 
4
4
  // src/main.ts
5
+ import { execSync } from "node:child_process";
5
6
  import {
6
7
  cpSync,
7
8
  existsSync as existsSync2,
@@ -500,12 +501,13 @@ async function createIssue(input) {
500
501
  order: input.order || undefined,
501
502
  created: formatDate()
502
503
  };
503
- const content = `${generateFrontmatter(frontmatter)}
504
-
504
+ const body = input.body ?? `
505
505
  ## Details
506
506
 
507
507
  <!-- Add detailed description here -->
508
-
508
+ `;
509
+ const content = `${generateFrontmatter(frontmatter)}
510
+ ${body}
509
511
  `;
510
512
  await writeFile(join(getIssuesDir(), filename), content);
511
513
  return {
@@ -513,10 +515,7 @@ async function createIssue(input) {
513
515
  filename,
514
516
  frontmatter,
515
517
  content: `
516
- ## Details
517
-
518
- <!-- Add detailed description here -->
519
-
518
+ ${body}
520
519
  `
521
520
  };
522
521
  }
@@ -539,12 +538,16 @@ async function updateIssue(id, input) {
539
538
  ...input.order && { order: input.order },
540
539
  updated: formatDate()
541
540
  };
541
+ const updatedContent = input.body !== undefined ? `
542
+ ${input.body}
543
+ ` : issue.content;
542
544
  const content = `${generateFrontmatter(updatedFrontmatter)}
543
- ${issue.content}`;
545
+ ${updatedContent}`;
544
546
  await writeFile(join(getIssuesDir(), issue.filename), content);
545
547
  return {
546
548
  ...issue,
547
- frontmatter: updatedFrontmatter
549
+ frontmatter: updatedFrontmatter,
550
+ content: updatedContent
548
551
  };
549
552
  }
550
553
  async function closeIssue(id) {
@@ -2128,6 +2131,8 @@ if (args[0] === "migrate") {
2128
2131
  migrate();
2129
2132
  } else if (args[0] === "init") {
2130
2133
  init();
2134
+ } else if (args[0] === "skill") {
2135
+ skill();
2131
2136
  } else if (CLI_COMMANDS.has(args[0] || "")) {
2132
2137
  const dir = dirname2(fileURLToPath(import.meta.url));
2133
2138
  const cli = await import(resolve2(dir, "cli.js"));
@@ -2188,6 +2193,26 @@ order: ${orderKey}`);
2188
2193
  console.log(` Removed ${legacy}`);
2189
2194
  process.exit(0);
2190
2195
  }
2196
+ function skill() {
2197
+ const subcommand = args[1];
2198
+ if (subcommand !== "install") {
2199
+ console.log(`
2200
+ Usage: issy skill <command>
2201
+
2202
+ Commands:
2203
+ install Install the issy skill for your AI coding assistant
2204
+ `);
2205
+ process.exit(subcommand ? 1 : 0);
2206
+ }
2207
+ console.log(`Installing issy skill via skills CLI...
2208
+ `);
2209
+ try {
2210
+ execSync("npx skills add miketromba/issy", { stdio: "inherit" });
2211
+ } catch {
2212
+ process.exit(1);
2213
+ }
2214
+ process.exit(0);
2215
+ }
2191
2216
  function init() {
2192
2217
  const shouldSeed = args.includes("--seed");
2193
2218
  if (!existsSync2(issuesDir2)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "issy",
3
- "version": "0.5.6",
3
+ "version": "0.6.0",
4
4
  "description": "AI-native issue tracking. Markdown files in .issues/, managed by your coding assistant.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -35,8 +35,8 @@
35
35
  "lint": "biome check src bin"
36
36
  },
37
37
  "dependencies": {
38
- "@miketromba/issy-app": "^0.5.6",
39
- "@miketromba/issy-core": "^0.5.6",
38
+ "@miketromba/issy-app": "^0.6.0",
39
+ "@miketromba/issy-core": "^0.6.0",
40
40
  "update-notifier": "^7.3.1"
41
41
  }
42
42
  }