issy 0.6.0 → 0.7.1

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
@@ -195,7 +195,6 @@ This moves your issues to `.issy/issues/` and assigns roadmap order to all open
195
195
  ```markdown
196
196
  ---
197
197
  title: Fix login redirect
198
- description: Users get stuck after OAuth callback
199
198
  priority: high
200
199
  scope: medium
201
200
  type: bug
package/dist/cli.js CHANGED
@@ -325,7 +325,6 @@ function parseFrontmatter(content) {
325
325
  function generateFrontmatter(data) {
326
326
  const lines = ["---"];
327
327
  lines.push(`title: ${data.title}`);
328
- lines.push(`description: ${data.description}`);
329
328
  lines.push(`priority: ${data.priority}`);
330
329
  if (data.scope) {
331
330
  lines.push(`scope: ${data.scope}`);
@@ -481,7 +480,6 @@ async function createIssue(input) {
481
480
  const filename = `${issueNumber}-${slug}.md`;
482
481
  const frontmatter = {
483
482
  title: input.title,
484
- description: input.description || input.title,
485
483
  priority,
486
484
  scope: scope || undefined,
487
485
  type,
@@ -516,7 +514,6 @@ async function updateIssue(id, input) {
516
514
  const updatedFrontmatter = {
517
515
  ...issue.frontmatter,
518
516
  ...input.title && { title: input.title },
519
- ...input.description && { description: input.description },
520
517
  ...input.priority && { priority: input.priority },
521
518
  ...input.scope && { scope: input.scope },
522
519
  ...input.type && { type: input.type },
@@ -1917,7 +1914,6 @@ Fuse.config = Config;
1917
1914
  var FUSE_OPTIONS = {
1918
1915
  keys: [
1919
1916
  { name: "frontmatter.title", weight: 1 },
1920
- { name: "frontmatter.description", weight: 0.7 },
1921
1917
  { name: "frontmatter.labels", weight: 0.5 },
1922
1918
  { name: "content", weight: 0.3 }
1923
1919
  ],
@@ -2130,6 +2126,9 @@ async function resolvePosition(opts) {
2130
2126
  last: opts.last
2131
2127
  }, opts.excludeId);
2132
2128
  }
2129
+ function hasHelpFlag(commandArgs) {
2130
+ return commandArgs.includes("--help") || commandArgs.includes("-h");
2131
+ }
2133
2132
  async function listIssues(options) {
2134
2133
  const allIssues = await getAllIssues();
2135
2134
  const queryParts = [];
@@ -2214,35 +2213,7 @@ async function searchIssuesCommand(query, options) {
2214
2213
  }
2215
2214
  async function createIssueCommand(options) {
2216
2215
  if (!options.title) {
2217
- console.log(`
2218
- Create New Issue`);
2219
- console.log("-".repeat(40));
2220
- const prompt = (question) => {
2221
- process.stdout.write(question);
2222
- return new Promise((resolve2) => {
2223
- let input = "";
2224
- process.stdin.setRawMode?.(false);
2225
- process.stdin.resume();
2226
- process.stdin.setEncoding("utf8");
2227
- process.stdin.once("data", (data) => {
2228
- input = data.toString().trim();
2229
- resolve2(input);
2230
- });
2231
- });
2232
- };
2233
- options.title = await prompt("Title: ");
2234
- options.description = await prompt("Description: ");
2235
- options.priority = await prompt("Priority (high/medium/low) [medium]: ");
2236
- options.scope = await prompt("Scope (small/medium/large) []: ");
2237
- options.type = await prompt("Type (bug/improvement) [improvement]: ");
2238
- options.labels = await prompt("Labels (comma-separated) []: ");
2239
- if (!options.priority)
2240
- options.priority = "medium";
2241
- if (!options.type)
2242
- options.type = "improvement";
2243
- }
2244
- if (!options.title) {
2245
- console.error("Title is required");
2216
+ console.error("Title is required. Use --title or -t to specify.");
2246
2217
  process.exit(1);
2247
2218
  }
2248
2219
  try {
@@ -2255,7 +2226,6 @@ Create New Issue`);
2255
2226
  });
2256
2227
  const input = {
2257
2228
  title: options.title,
2258
- description: options.description,
2259
2229
  body: options.body,
2260
2230
  priority: options.priority,
2261
2231
  scope: options.scope,
@@ -2286,7 +2256,6 @@ async function updateIssueCommand(id, options) {
2286
2256
  }
2287
2257
  const issue = await updateIssue(id, {
2288
2258
  title: options.title,
2289
- description: options.description,
2290
2259
  body: options.body,
2291
2260
  priority: options.priority,
2292
2261
  scope: options.scope,
@@ -2342,9 +2311,6 @@ async function nextIssueCommand() {
2342
2311
  Next issue:`);
2343
2312
  console.log(` ${"-".repeat(60)}`);
2344
2313
  console.log(` #${issue.id} ${prioritySymbol(issue.frontmatter.priority)} ${typeSymbol(issue.frontmatter.type)} ${issue.frontmatter.title}`);
2345
- if (issue.frontmatter.description !== issue.frontmatter.title) {
2346
- console.log(` ${issue.frontmatter.description}`);
2347
- }
2348
2314
  console.log();
2349
2315
  }
2350
2316
  async function main() {
@@ -2378,7 +2344,6 @@ Commands:
2378
2344
 
2379
2345
  create Create a new issue
2380
2346
  --title, -t <t> Issue title
2381
- --description, -d <d> Short description
2382
2347
  --body, -b <b> Markdown body content
2383
2348
  --priority, -p <p> Priority (high, medium, low)
2384
2349
  --scope <s> Scope (small, medium, large)
@@ -2391,7 +2356,6 @@ Commands:
2391
2356
 
2392
2357
  update <id> Update an issue
2393
2358
  --title, -t <t> New title
2394
- --description, -d <d> New description
2395
2359
  --body, -b <b> New markdown body content
2396
2360
  --priority, -p <p> New priority
2397
2361
  --scope <s> New scope
@@ -2428,6 +2392,21 @@ Examples:
2428
2392
  }
2429
2393
  switch (command) {
2430
2394
  case "list": {
2395
+ if (hasHelpFlag(args.slice(1))) {
2396
+ console.log(`Usage: issy list [options]
2397
+
2398
+ List all open issues in roadmap order.
2399
+
2400
+ Options:
2401
+ --all, -a Include closed issues
2402
+ --priority, -p <p> Filter by priority (high, medium, low)
2403
+ --scope <s> Filter by scope (small, medium, large)
2404
+ --type, -t <t> Filter by type (bug, improvement)
2405
+ --search, -s <q> Fuzzy search issues
2406
+ --sort <s> Sort: roadmap (default), priority, created, updated, id
2407
+ `);
2408
+ return;
2409
+ }
2431
2410
  const { values } = parseArgs({
2432
2411
  args: args.slice(1),
2433
2412
  options: {
@@ -2444,6 +2423,16 @@ Examples:
2444
2423
  break;
2445
2424
  }
2446
2425
  case "search": {
2426
+ if (hasHelpFlag(args.slice(1))) {
2427
+ console.log(`Usage: issy search <query> [options]
2428
+
2429
+ Fuzzy search issues by title and content.
2430
+
2431
+ Options:
2432
+ --all, -a Include closed issues (default: open only)
2433
+ `);
2434
+ return;
2435
+ }
2447
2436
  const query = args[1];
2448
2437
  if (!query) {
2449
2438
  console.error("Usage: issy search <query>");
@@ -2460,6 +2449,13 @@ Examples:
2460
2449
  break;
2461
2450
  }
2462
2451
  case "read": {
2452
+ if (hasHelpFlag(args.slice(1))) {
2453
+ console.log(`Usage: issy read <id>
2454
+
2455
+ Display a specific issue and all its details.
2456
+ `);
2457
+ return;
2458
+ }
2463
2459
  const id = args[1];
2464
2460
  if (!id) {
2465
2461
  console.error("Usage: issy read <id>");
@@ -2469,15 +2465,44 @@ Examples:
2469
2465
  break;
2470
2466
  }
2471
2467
  case "next": {
2468
+ if (hasHelpFlag(args.slice(1))) {
2469
+ console.log(`Usage: issy next
2470
+
2471
+ Show the next issue to work on (first open issue in roadmap order).
2472
+ `);
2473
+ return;
2474
+ }
2472
2475
  await nextIssueCommand();
2473
2476
  break;
2474
2477
  }
2475
2478
  case "create": {
2479
+ if (hasHelpFlag(args.slice(1))) {
2480
+ console.log(`Usage: issy create [options]
2481
+
2482
+ Create a new issue. --title is required.
2483
+
2484
+ Options:
2485
+ --title, -t <t> Issue title
2486
+ --body, -b <b> Markdown body content
2487
+ --priority, -p <p> Priority: high, medium, low (default: medium)
2488
+ --scope <s> Scope: small, medium, large
2489
+ --type <t> Type: bug, improvement (default: improvement)
2490
+ --labels, -l <l> Comma-separated labels
2491
+ --before <id> Insert before this issue in roadmap
2492
+ --after <id> Insert after this issue in roadmap
2493
+ --first Insert at the beginning of the roadmap
2494
+ --last Insert at the end of the roadmap
2495
+
2496
+ Examples:
2497
+ issy create --title "Fix login bug" --type bug --priority high --after 0002
2498
+ issy create --title "Add dark mode" --last
2499
+ `);
2500
+ return;
2501
+ }
2476
2502
  const { values } = parseArgs({
2477
2503
  args: args.slice(1),
2478
2504
  options: {
2479
2505
  title: { type: "string", short: "t" },
2480
- description: { type: "string", short: "d" },
2481
2506
  body: { type: "string", short: "b" },
2482
2507
  priority: { type: "string", short: "p" },
2483
2508
  scope: { type: "string" },
@@ -2494,6 +2519,29 @@ Examples:
2494
2519
  break;
2495
2520
  }
2496
2521
  case "update": {
2522
+ if (hasHelpFlag(args.slice(1))) {
2523
+ console.log(`Usage: issy update <id> [options]
2524
+
2525
+ Update an existing issue.
2526
+
2527
+ Options:
2528
+ --title, -t <t> New title
2529
+ --body, -b <b> New markdown body content
2530
+ --priority, -p <p> New priority: high, medium, low
2531
+ --scope <s> New scope: small, medium, large
2532
+ --type <t> New type: bug, improvement
2533
+ --labels, -l <l> New labels (comma-separated)
2534
+ --before <id> Move before this issue in roadmap
2535
+ --after <id> Move after this issue in roadmap
2536
+ --first Move to the beginning of the roadmap
2537
+ --last Move to the end of the roadmap
2538
+
2539
+ Examples:
2540
+ issy update 0001 --priority low --after 0003
2541
+ issy update 0002 --title "Renamed issue" --first
2542
+ `);
2543
+ return;
2544
+ }
2497
2545
  const id = args[1];
2498
2546
  if (!id) {
2499
2547
  console.error("Usage: issy update <id> [options]");
@@ -2503,7 +2551,6 @@ Examples:
2503
2551
  args: args.slice(2),
2504
2552
  options: {
2505
2553
  title: { type: "string", short: "t" },
2506
- description: { type: "string", short: "d" },
2507
2554
  body: { type: "string", short: "b" },
2508
2555
  priority: { type: "string", short: "p" },
2509
2556
  scope: { type: "string" },
@@ -2520,6 +2567,13 @@ Examples:
2520
2567
  break;
2521
2568
  }
2522
2569
  case "close": {
2570
+ if (hasHelpFlag(args.slice(1))) {
2571
+ console.log(`Usage: issy close <id>
2572
+
2573
+ Close an issue by ID.
2574
+ `);
2575
+ return;
2576
+ }
2523
2577
  const id = args[1];
2524
2578
  if (!id) {
2525
2579
  console.error("Usage: issy close <id>");
@@ -2529,6 +2583,23 @@ Examples:
2529
2583
  break;
2530
2584
  }
2531
2585
  case "reopen": {
2586
+ if (hasHelpFlag(args.slice(1))) {
2587
+ console.log(`Usage: issy reopen <id> [options]
2588
+
2589
+ Reopen a closed issue.
2590
+
2591
+ Options:
2592
+ --before <id> Insert before this issue in roadmap
2593
+ --after <id> Insert after this issue in roadmap
2594
+ --first Insert at the beginning of the roadmap
2595
+ --last Insert at the end of the roadmap
2596
+
2597
+ Examples:
2598
+ issy reopen 0001 --last
2599
+ issy reopen 0001 --before 0003
2600
+ `);
2601
+ return;
2602
+ }
2532
2603
  const id = args[1];
2533
2604
  if (!id) {
2534
2605
  console.error("Usage: issy reopen <id>");
package/dist/main.js CHANGED
@@ -336,7 +336,6 @@ function parseFrontmatter(content) {
336
336
  function generateFrontmatter(data) {
337
337
  const lines = ["---"];
338
338
  lines.push(`title: ${data.title}`);
339
- lines.push(`description: ${data.description}`);
340
339
  lines.push(`priority: ${data.priority}`);
341
340
  if (data.scope) {
342
341
  lines.push(`scope: ${data.scope}`);
@@ -492,7 +491,6 @@ async function createIssue(input) {
492
491
  const filename = `${issueNumber}-${slug}.md`;
493
492
  const frontmatter = {
494
493
  title: input.title,
495
- description: input.description || input.title,
496
494
  priority,
497
495
  scope: scope || undefined,
498
496
  type,
@@ -527,7 +525,6 @@ async function updateIssue(id, input) {
527
525
  const updatedFrontmatter = {
528
526
  ...issue.frontmatter,
529
527
  ...input.title && { title: input.title },
530
- ...input.description && { description: input.description },
531
528
  ...input.priority && { priority: input.priority },
532
529
  ...input.scope && { scope: input.scope },
533
530
  ...input.type && { type: input.type },
@@ -1928,7 +1925,6 @@ Fuse.config = Config;
1928
1925
  var FUSE_OPTIONS = {
1929
1926
  keys: [
1930
1927
  { name: "frontmatter.title", weight: 1 },
1931
- { name: "frontmatter.description", weight: 0.7 },
1932
1928
  { name: "frontmatter.labels", weight: 0.5 },
1933
1929
  { name: "content", weight: 0.3 }
1934
1930
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "issy",
3
- "version": "0.6.0",
3
+ "version": "0.7.1",
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.6.0",
39
- "@miketromba/issy-core": "^0.6.0",
38
+ "@miketromba/issy-app": "^0.7.1",
39
+ "@miketromba/issy-core": "^0.7.1",
40
40
  "update-notifier": "^7.3.1"
41
41
  }
42
42
  }