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 +10 -1
- package/dist/cli.js +25 -10
- package/dist/main.js +34 -9
- package/package.json +3 -3
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
|
|
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
|
-
|
|
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
|
-
${
|
|
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 = [
|
|
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
|
|
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
|
-
|
|
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
|
-
${
|
|
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.
|
|
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.
|
|
39
|
-
"@miketromba/issy-core": "^0.
|
|
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
|
}
|