issy 0.9.0 → 0.10.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
@@ -18,7 +18,7 @@
18
18
 
19
19
  ## How It Works
20
20
 
21
- issy gives AI coding assistants a skill for managing issues. Just talk naturally:
21
+ issy gives AI coding assistants versioned instructions for managing issues. Add a small AGENTS.md rule or install the bootstrap skill, then just talk naturally:
22
22
 
23
23
  > "Create a bug for the login redirect issue, high priority"
24
24
 
@@ -28,19 +28,31 @@ issy gives AI coding assistants a skill for managing issues. Just talk naturally
28
28
 
29
29
  The assistant creates, searches, updates, and closes issues for you. Issues are stored as markdown files in `.issy/issues/` — readable, diffable, and committed with your code.
30
30
 
31
- ## Install the Skill
31
+ ## Teach Your AI Assistant
32
+
33
+ ```bash
34
+ issy learn
35
+ ```
36
+
37
+ `issy learn` prints the canonical AI-agent reference for your installed issy version. To make agents run it automatically, add this to AGENTS.md:
38
+
39
+ ```md
40
+ When the task involves creating, reading, updating, listing, searching, prioritizing, closing, reopening, or choosing project issues, tasks, bugs, improvements, or roadmap work, run `issy learn` first and follow its guidance.
41
+ ```
42
+
43
+ You can also install the lightweight bootstrap skill:
32
44
 
33
45
  ```bash
34
46
  issy skill install
35
47
  ```
36
48
 
37
- Or, if you haven't installed `issy` yet:
49
+ Or, without running the issy wrapper:
38
50
 
39
51
  ```bash
40
52
  npx skills add miketromba/issy
41
53
  ```
42
54
 
43
- That's it. Your AI assistant can now manage issues in any repo.
55
+ The skill contains only the relevance rule and tells compatible assistants to run `issy learn`, keeping the real agent guidance in one versioned place. The `issy` CLI still needs to be available when the assistant runs `issy learn`.
44
56
 
45
57
  ## Why Markdown?
46
58
 
@@ -81,6 +93,7 @@ issy list # List open issues (roadmap order)
81
93
  issy list --unblocked # List open issues with no open blockers
82
94
  issy next # Show next issue to work on
83
95
  issy create --title "Bug" # Create an issue
96
+ issy learn # Print AI-agent instructions
84
97
  ```
85
98
 
86
99
  ### Repository installation
@@ -137,7 +150,9 @@ issy update 0001 --depends-on 0012,0035 # Replace blockers
137
150
  issy update 0001 --body "New details" # Replace body content
138
151
  issy close 0001 # Close issue
139
152
  issy reopen 0001 --after 0004 # Reopen and place in roadmap
140
- issy skill install # Install the AI skill
153
+ issy learn # Print compact AI-agent instructions
154
+ issy learn roadmap # Print focused topic instructions
155
+ issy skill install # Install the AI bootstrap skill
141
156
  issy migrate # Migrate from .issues/ to .issy/
142
157
  issy --version # Check version
143
158
  ```
package/dist/cli.js CHANGED
@@ -2490,6 +2490,10 @@ Commands:
2490
2490
 
2491
2491
  next Show the next issue to work on
2492
2492
 
2493
+ learn [topic] Print AI-agent instructions for this issy version
2494
+ --all Print the full reference
2495
+ --list List focused topics
2496
+
2493
2497
  create Create a new issue
2494
2498
  --title, -t <t> Issue title
2495
2499
  --body, -b <b> Markdown body content
@@ -2524,13 +2528,15 @@ Commands:
2524
2528
  --first Insert at the beginning of the roadmap
2525
2529
  --last Insert at the end of the roadmap
2526
2530
 
2527
- skill install Install the issy skill for your AI coding assistant
2531
+ skill install Install the issy bootstrap skill
2528
2532
 
2529
2533
  Examples:
2530
2534
  issy list
2531
2535
  issy list --unblocked
2532
2536
  issy list --priority high --type bug
2533
2537
  issy next
2538
+ issy learn
2539
+ issy learn roadmap
2534
2540
  issy read 0001
2535
2541
  issy create --title "Fix login bug" --type bug --priority high --after 0002
2536
2542
  issy create --title "Add dark mode" --last
package/dist/main.js CHANGED
@@ -2175,12 +2175,359 @@ function filterByQuery(issues, query) {
2175
2175
  }
2176
2176
  return result;
2177
2177
  }
2178
+ // src/learn.ts
2179
+ function markdown(lines) {
2180
+ return `${lines.join(`
2181
+ `).trim()}
2182
+ `;
2183
+ }
2184
+ var compact = markdown([
2185
+ "# issy agent instructions",
2186
+ "",
2187
+ "Use issy for project issue tracking when the user asks to create, read, update, list, search, prioritize, close, reopen, or choose issue/task/bug work.",
2188
+ "",
2189
+ "## First action",
2190
+ "",
2191
+ "- If this request is about issue tracking, run `issy learn` before acting unless you already ran it in this session.",
2192
+ "- Use the returned guidance as the source of truth for this installed issy version.",
2193
+ "- For focused details, run `issy learn <topic>` instead of loading everything.",
2194
+ "",
2195
+ "## Essential workflow",
2196
+ "",
2197
+ "- List work: `issy list`, `issy list --all`, or `issy list --unblocked`.",
2198
+ '- Search work: `issy search "query"` or `issy search "query" --all`.',
2199
+ "- Read before changing: `issy read <id>`.",
2200
+ "- Pick next work: `issy next`.",
2201
+ '- Create work: `issy create --title "..." --type bug|improvement --priority high|medium|low <position>`.',
2202
+ '- Create blocked work: `issy create --title "..." --depends-on 0001,0002 <position>`.',
2203
+ "- Update work: `issy update <id> [options]`, including `--depends-on <ids>` to replace blockers.",
2204
+ "- Close work: `issy close <id>` after the work is complete and verified.",
2205
+ "- Reopen work: `issy reopen <id> <position>`.",
2206
+ "",
2207
+ "## Issue authoring",
2208
+ "",
2209
+ "- Capture what needs to be done and why. Keep implementation details out unless the user provides them.",
2210
+ "- Good bodies usually include Problem/Overview, Proposed Solution, optional Acceptance Criteria, optional Verification, optional Future Considerations, and optional References.",
2211
+ "- Include verification guidance when possible so the implementing agent can prove completion with commands, UI flows, queries, or expected behavior.",
2212
+ "- Issues should be completable and verifiable in one focused session. Split only when a child issue is independently closeable.",
2213
+ "",
2214
+ "## Roadmap ordering",
2215
+ "",
2216
+ "- Open issues form a strict roadmap order.",
2217
+ "- When creating an issue and open issues already exist, include exactly one position flag: `--before <id>`, `--after <id>`, `--first`, or `--last`.",
2218
+ "- When reopening an issue and other open issues exist, include exactly one position flag.",
2219
+ "- Use dependency order: prerequisites first, dependent/user-facing work later. Use `--last` when placement is unclear.",
2220
+ "- Use `depends_on` / `--depends-on` when an issue cannot start until specific blocking issues are closed.",
2221
+ "- `issy list` shows a `Blk` column with open blocker counts; `-` means unblocked.",
2222
+ "- `issy list --unblocked` shows only open issues with no open blockers.",
2223
+ "",
2224
+ "## Closing",
2225
+ "",
2226
+ "- Before closing, verify the issue is actually resolved.",
2227
+ "- If useful context was discovered, append a brief `## Resolution Notes` section before closing.",
2228
+ "- If the repo tracks issues in git, consider committing `.issy/` changes after mutations.",
2229
+ "",
2230
+ "## More focused context",
2231
+ "",
2232
+ "- `issy learn topics` lists available topics.",
2233
+ "- `issy learn authoring` covers issue writing rules.",
2234
+ "- `issy learn roadmap` covers placement rules.",
2235
+ "- `issy learn commands` covers CLI command syntax.",
2236
+ "- `issy learn hooks` covers hook files.",
2237
+ "- `issy learn agents` prints AGENTS.md and skill bootstrap guidance.",
2238
+ "- `issy learn --all` prints the full agent reference."
2239
+ ]);
2240
+ var topics = [
2241
+ {
2242
+ name: "authoring",
2243
+ description: "Issue writing, sizing, verification, and resolution notes.",
2244
+ content: markdown([
2245
+ "# issy issue authoring",
2246
+ "",
2247
+ "Issues describe what needs to be done and why. Keep them high-level unless the user provides specific implementation details.",
2248
+ "",
2249
+ "## What to include",
2250
+ "",
2251
+ "- Problem/Overview: what is wrong or needed, usually one or two paragraphs.",
2252
+ "- Proposed Solution: high-level approach.",
2253
+ "- Acceptance Criteria: optional, from the user perspective.",
2254
+ "- Verification: optional but encouraged; explain how to prove the issue is resolved.",
2255
+ "- Future Considerations: optional related ideas for later.",
2256
+ "- References: optional links to related docs, issues, PRs, or resources.",
2257
+ "",
2258
+ "## Verification guidance",
2259
+ "",
2260
+ "When possible, include verification steps or hints. Agents should not claim work is done without evidence.",
2261
+ "",
2262
+ "Useful verification examples:",
2263
+ "",
2264
+ "- Commands to run and expected output, such as `bun test`, `npm test`, `curl`, or a project CLI.",
2265
+ "- UI flows to test, including browser automation when available.",
2266
+ "- Database queries or API calls that confirm state changes.",
2267
+ "- Specific behavior to observe.",
2268
+ "- Edge cases to check.",
2269
+ "",
2270
+ "## Implementation details rule",
2271
+ "",
2272
+ "Only include implementation details if the user explicitly provides them. Do not invent task lists, phases, file paths, code changes, or step-by-step technical breakdowns.",
2273
+ "",
2274
+ "The issue should capture the user intent. The engineer or agent implementing it can plan the implementation later.",
2275
+ "",
2276
+ "## Sizing",
2277
+ "",
2278
+ "An issue should be completable and verifiable in a single focused session. Split large work along verification boundaries so each child issue can be independently completed and closed. Do not split when it adds overhead without clarity.",
2279
+ "",
2280
+ "## Closing with learnings",
2281
+ "",
2282
+ "When closing an issue, append a brief `## Resolution Notes` section if useful context was discovered during implementation:",
2283
+ "",
2284
+ "- Alternative approaches considered or rejected.",
2285
+ "- Unexpected gotchas or edge cases.",
2286
+ "- Decisions that differ from the original plan.",
2287
+ "- Useful context for future maintainers."
2288
+ ])
2289
+ },
2290
+ {
2291
+ name: "roadmap",
2292
+ description: "Strict roadmap ordering and position flag rules.",
2293
+ aliases: ["ordering"],
2294
+ content: markdown([
2295
+ "# issy roadmap ordering",
2296
+ "",
2297
+ "issy maintains a strict roadmap order for all open issues. `issy next` returns the first open issue in that order. `issy list` sorts by roadmap order by default.",
2298
+ "",
2299
+ "## Required position flags",
2300
+ "",
2301
+ "- Creating an issue: if open issues already exist, provide exactly one of `--before <id>`, `--after <id>`, `--first`, or `--last`.",
2302
+ "- Reopening an issue: if other open issues exist, provide exactly one position flag.",
2303
+ "- Updating an issue: position flags are optional and reposition the issue when provided.",
2304
+ "- Never provide more than one position flag.",
2305
+ "",
2306
+ "## Explicit blockers",
2307
+ "",
2308
+ "- Use `depends_on` when an issue cannot start until specific blocking issues are closed.",
2309
+ '- Create blocked work with `issy create --title "..." --depends-on 0001,0002 --last`.',
2310
+ "- Replace blockers with `issy update <id> --depends-on 0001,0003`.",
2311
+ '- Clear blockers with `issy update <id> --depends-on ""`.',
2312
+ "- Missing or malformed dependency IDs are ignored.",
2313
+ "- `issy list` shows a compact `Blk` column. `-` means unblocked; otherwise the value is the number of open blockers.",
2314
+ "- `issy list --unblocked` shows only open issues with no open blockers.",
2315
+ "",
2316
+ "## Choosing placement",
2317
+ "",
2318
+ "- Place prerequisites before dependent issues.",
2319
+ "- Place foundational or infrastructure work before user-facing work that depends on it.",
2320
+ "- Use `--first` for urgent work that should be tackled immediately.",
2321
+ "- Use `--last` when placement is unclear.",
2322
+ "- Use `--before <id>` or `--after <id>` for precise placement.",
2323
+ "",
2324
+ "## Useful commands",
2325
+ "",
2326
+ "- `issy list` shows open issues in roadmap order.",
2327
+ "- `issy list --unblocked` shows open issues with no open blockers.",
2328
+ "- `issy next` shows the first open issue in roadmap order.",
2329
+ '- `issy create --title "..." --last` appends a new issue.',
2330
+ '- `issy create --title "..." --depends-on 0001,0002 --last` creates an issue blocked by other issues.',
2331
+ "- `issy update <id> --before <other-id>` repositions an issue.",
2332
+ "- `issy update <id> --depends-on 0001,0003` replaces blockers.",
2333
+ "- `issy reopen <id> --after <other-id>` reopens and places a closed issue."
2334
+ ])
2335
+ },
2336
+ {
2337
+ name: "commands",
2338
+ description: "CLI command syntax for issue operations.",
2339
+ aliases: ["cli", "reference"],
2340
+ content: markdown([
2341
+ "# issy CLI command reference",
2342
+ "",
2343
+ "Use the `issy` CLI. If it is not installed, install it with the project package manager, for example `npm install issy --global`, `pnpm add issy --global`, or `bun install issy --global`.",
2344
+ "",
2345
+ "## List and search",
2346
+ "",
2347
+ "- `issy list`: list open issues in roadmap order.",
2348
+ "- `issy list --all`: include closed issues.",
2349
+ "- `issy list --unblocked`: list open issues with no open blockers.",
2350
+ "- `issy list --priority high|medium|low`: filter by priority.",
2351
+ "- `issy list --scope small|medium|large`: filter by scope.",
2352
+ "- `issy list --type bug|improvement`: filter by type.",
2353
+ '- `issy list --search "keyword"`: fuzzy search while listing.',
2354
+ "- `issy list --sort roadmap|priority|created|updated|id`: choose sort order.",
2355
+ '- `issy search "query"`: fuzzy search open issues.',
2356
+ '- `issy search "query" --all`: include closed issues.',
2357
+ "",
2358
+ "## Read and choose work",
2359
+ "",
2360
+ "- `issy read <id>`: read a full issue.",
2361
+ "- `issy next`: show the next open issue in roadmap order.",
2362
+ "",
2363
+ "## Create",
2364
+ "",
2365
+ '- `issy create --title "Fix login bug" --type bug --priority high --after 0002`.',
2366
+ '- `issy create --title "Add dark mode" --type improvement --last --labels "ui, frontend"`.',
2367
+ '- `issy create --title "Add export" --depends-on 0001,0002 --last`.',
2368
+ '- `issy create --title "Urgent fix" --first`.',
2369
+ '- `issy create --title "Fix crash" --body "## Problem\\n\\nApp crashes on startup." --last`.',
2370
+ "",
2371
+ "Create options: `--title`, `--body`, `--priority`, `--scope`, `--type`, `--labels`, `--depends-on`, `--before`, `--after`, `--first`, `--last`.",
2372
+ "",
2373
+ "## Update",
2374
+ "",
2375
+ "- `issy update <id> --priority low`.",
2376
+ "- `issy update <id> --after 0003`.",
2377
+ "- `issy update <id> --first`.",
2378
+ '- `issy update <id> --labels "api, backend"`.',
2379
+ "- `issy update <id> --depends-on 0001,0003`.",
2380
+ '- `issy update <id> --body "## Problem\\n\\nUpdated description."`.',
2381
+ "",
2382
+ "Update options: `--title`, `--body`, `--priority`, `--scope`, `--type`, `--labels`, `--depends-on`, `--before`, `--after`, `--first`, `--last`.",
2383
+ "",
2384
+ "## Close and reopen",
2385
+ "",
2386
+ "- `issy close <id>`.",
2387
+ "- `issy reopen <id> --last`.",
2388
+ "- `issy reopen <id> --after 0004`.",
2389
+ "",
2390
+ "When reopening and other open issues exist, include exactly one position flag."
2391
+ ])
2392
+ },
2393
+ {
2394
+ name: "hooks",
2395
+ description: "Optional `.issy/` hook files that print agent context after mutations.",
2396
+ content: markdown([
2397
+ "# issy hooks",
2398
+ "",
2399
+ "issy supports optional hook files in `.issy/`. After a successful mutation, issy prints the matching hook file contents to stdout so agents can see project-specific reminders.",
2400
+ "",
2401
+ "## Hook files",
2402
+ "",
2403
+ "- `.issy/on_create.md`: printed after `issy create`.",
2404
+ "- `.issy/on_update.md`: printed after `issy update`.",
2405
+ "- `.issy/on_close.md`: printed after `issy close`.",
2406
+ "",
2407
+ "## Good hook uses",
2408
+ "",
2409
+ "- Remind agents to update docs for user-facing behavior changes.",
2410
+ "- Remind agents to run project-specific checks.",
2411
+ "- Add team conventions for issue mutations.",
2412
+ "- Surface release or changelog requirements.",
2413
+ "",
2414
+ "Hook content should be concise because it is injected directly into command output."
2415
+ ])
2416
+ },
2417
+ {
2418
+ name: "agents",
2419
+ description: "Bootstrap instructions for AGENTS.md and shell skills.",
2420
+ aliases: ["skill", "bootstrap"],
2421
+ content: markdown([
2422
+ "# issy agent bootstrap",
2423
+ "",
2424
+ "`issy learn` is the canonical AI-agent reference for the installed issy version. Skills and AGENTS.md files should bootstrap agents into this command instead of duplicating the full reference.",
2425
+ "",
2426
+ "## Relevance rule",
2427
+ "",
2428
+ "Use issy when creating, reading, updating, listing, searching, prioritizing, closing, reopening, or choosing project issues, tasks, bugs, improvements, or roadmap work.",
2429
+ "",
2430
+ "## AGENTS.md snippet",
2431
+ "",
2432
+ "Add this to AGENTS.md:",
2433
+ "",
2434
+ "```md",
2435
+ "When the task involves creating, reading, updating, listing, searching, prioritizing, closing, reopening, or choosing project issues, tasks, bugs, improvements, or roadmap work, run `issy learn` first and follow its guidance.",
2436
+ "```",
2437
+ "",
2438
+ "## Skill bootstrap behavior",
2439
+ "",
2440
+ "A compatible skill should only define the relevance rule and instruct the agent to run `issy learn` when relevant. The operational reference belongs in the CLI output."
2441
+ ])
2442
+ }
2443
+ ];
2444
+ var aliases = new Map;
2445
+ for (const topic of topics) {
2446
+ aliases.set(topic.name, topic);
2447
+ for (const alias of topic.aliases ?? []) {
2448
+ aliases.set(alias, topic);
2449
+ }
2450
+ }
2451
+ function topicList() {
2452
+ return markdown([
2453
+ "# issy learn topics",
2454
+ "",
2455
+ "Run `issy learn <topic>` for focused agent context.",
2456
+ "",
2457
+ ...topics.map((topic) => `- \`${topic.name}\`: ${topic.description}`),
2458
+ "",
2459
+ "Other options:",
2460
+ "",
2461
+ "- `issy learn`: compact default instructions.",
2462
+ "- `issy learn --all`: full reference.",
2463
+ "- `issy learn --help`: command usage."
2464
+ ]);
2465
+ }
2466
+ function usage() {
2467
+ return markdown([
2468
+ "Usage: issy learn [topic] [options]",
2469
+ "",
2470
+ "Print AI-agent instructions for using issy.",
2471
+ "",
2472
+ "Topics:",
2473
+ ...topics.map((topic) => ` ${topic.name.padEnd(10)} ${topic.description}`),
2474
+ "",
2475
+ "Options:",
2476
+ " --all Print the compact guidance and all topics",
2477
+ " --list List available topics",
2478
+ " --help, -h Show this help",
2479
+ "",
2480
+ "Examples:",
2481
+ " issy learn",
2482
+ " issy learn roadmap",
2483
+ " issy learn commands",
2484
+ " issy learn --all"
2485
+ ]);
2486
+ }
2487
+ function getLearnOutput(args = []) {
2488
+ if (args.includes("--help") || args.includes("-h")) {
2489
+ return usage();
2490
+ }
2491
+ if (args.includes("--list")) {
2492
+ return topicList();
2493
+ }
2494
+ if (args.includes("--all")) {
2495
+ return [compact, ...topics.map((topic2) => topic2.content)].join(`
2496
+ ---
2497
+
2498
+ `);
2499
+ }
2500
+ const topicArg = args.find((arg) => !arg.startsWith("-"));
2501
+ if (!topicArg) {
2502
+ return compact;
2503
+ }
2504
+ if (topicArg === "topics" || topicArg === "list") {
2505
+ return topicList();
2506
+ }
2507
+ const topic = aliases.get(topicArg);
2508
+ if (!topic) {
2509
+ throw new Error(`Unknown learn topic: ${topicArg}
2510
+
2511
+ ${topicList()}`);
2512
+ }
2513
+ return topic.content;
2514
+ }
2515
+
2178
2516
  // src/main.ts
2179
2517
  var args = process.argv.slice(2);
2180
2518
  if (args[0] === "--version" || args[0] === "-v") {
2181
2519
  console.log(`issy v${process.env.ISSY_PKG_VERSION || "unknown"}`);
2182
2520
  process.exit(0);
2183
2521
  }
2522
+ if (args[0] === "learn") {
2523
+ try {
2524
+ process.stdout.write(getLearnOutput(args.slice(1)));
2525
+ } catch (error) {
2526
+ console.error(error instanceof Error ? error.message : "Failed to learn");
2527
+ process.exit(1);
2528
+ }
2529
+ process.exit(0);
2530
+ }
2184
2531
  var issyDir2 = resolveIssyDir();
2185
2532
  var issuesDir2 = join2(issyDir2, "issues");
2186
2533
  process.env.ISSY_DIR = issyDir2;
@@ -2279,11 +2626,11 @@ function skill() {
2279
2626
  Usage: issy skill <command>
2280
2627
 
2281
2628
  Commands:
2282
- install Install the issy skill for your AI coding assistant
2629
+ install Install the issy bootstrap skill for your AI coding assistant
2283
2630
  `);
2284
2631
  process.exit(subcommand ? 1 : 0);
2285
2632
  }
2286
- console.log(`Installing issy skill via skills CLI...
2633
+ console.log(`Installing issy bootstrap skill via skills CLI...
2287
2634
  `);
2288
2635
  try {
2289
2636
  execSync("npx skills add miketromba/issy", { stdio: "inherit" });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "issy",
3
- "version": "0.9.0",
3
+ "version": "0.10.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.9.0",
39
- "@miketromba/issy-core": "^0.9.0",
38
+ "@miketromba/issy-app": "^0.10.1",
39
+ "@miketromba/issy-core": "^0.10.1",
40
40
  "update-notifier": "^7.3.1"
41
41
  }
42
42
  }