skilldrop-cli 0.16.41 → 0.16.43

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "0.16.41",
3
+ "version": "0.16.43",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "interactive-diagram",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
4
4
  "description": "Turn a codebase, a system description, a process or a database schema into one self-contained interactive HTML diagram (architecture, workflow, data flow, lifecycle, ERD, sequence, class, tree, timeline or waterfall) where every box and arrow cites the file and line or the words it came from, anything inferred is drawn dashed as an assumption, and each cited line is checked against the repository before the page is written. Laid out automatically, opens offline with no CDN, and exports SVG, PNG and Mermaid. Use when the user asks to \"visualize\", \"map\" or \"make an interactive diagram of\" a repo, a request path, a pipeline, an approval process, a set of tables, an incident's events or a slow trace, or wants a diagram they can click through and share as one file.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -2498,6 +2498,17 @@ def load(path):
2498
2498
  return json.load(fh)
2499
2499
 
2500
2500
 
2501
+
2502
+ def shown(path):
2503
+ """The output path for the reply's first line: relative when it is under the current folder,
2504
+ absolute otherwise. On Windows a path on another drive has no relative form at all."""
2505
+ full = os.path.abspath(path)
2506
+ try:
2507
+ rel = os.path.relpath(full)
2508
+ except ValueError:
2509
+ return full
2510
+ return full if rel.startswith("..") else rel
2511
+
2501
2512
  def main(argv=None):
2502
2513
  ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
2503
2514
  ap.add_argument("spec", help="diagram spec (JSON)")
@@ -2569,7 +2580,7 @@ def main(argv=None):
2569
2580
  receipt["output"] = os.path.abspath(a.out)
2570
2581
  receipt["bytes"] = len(out.encode("utf-8"))
2571
2582
  receipt["edges"] = len([e for e in spec["edges"] if not e.get("tree")]) or len(spec["edges"])
2572
- shown_path = os.path.relpath(os.path.abspath(a.out)) if not os.path.relpath(os.path.abspath(a.out)).startswith("..") else os.path.abspath(a.out)
2583
+ shown_path = shown(a.out)
2573
2584
  receipt["reply_first_line"] = "[%s](%s)" % (spec["title"].replace("]", ")"), shown_path)
2574
2585
  receipt["findings"] = spec.get("_findings", [])
2575
2586
  if a.mermaid:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tracker-brief-sync",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Turn a brief or PRD (such as prd-draft output) into tracker-ready epics and issues — title, description, acceptance criteria, labels and a link back to the doc section — as a CSV for Jira, a mapped CSV for other importers, or gh commands for GitHub; and in reverse, report drift between the doc and the tracker (issues with no section, sections with no issue, issues for Won't-have requirements). Use when the user wants to load a PRD into Jira, Linear or GitHub, says \"create tickets from this brief\", or asks \"does the tracker still match the PRD?\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -334,11 +334,19 @@ def cmd_export(args) -> int:
334
334
  it.get("parent") or "", by_id[it["parent"]]["title"] if it.get("parent") else "",
335
335
  source_line(spec, it, doc_info)])
336
336
  text = out.getvalue()
337
+ # Written as built, with no newline translation: the CSV's rows end in \r\n, as CSV
338
+ # requires, and on Windows a text-mode write would turn each into \r\r\n, which an
339
+ # importer reads as a blank row between every issue.
337
340
  if args.output:
338
- args.output.write_text(text, encoding="utf-8")
341
+ with open(args.output, "w", encoding="utf-8", newline="") as fh:
342
+ fh.write(text)
339
343
  n_epics = sum(1 for it in items if it["type"].lower() == "epic")
340
344
  sys.stderr.write("wrote {}: {} items ({} epics, {} others)\n".format(
341
345
  args.output, len(items), n_epics, len(items) - n_epics))
346
+ elif hasattr(sys.stdout, "buffer"):
347
+ sys.stdout.flush()
348
+ sys.stdout.buffer.write(text.encode("utf-8"))
349
+ sys.stdout.buffer.flush()
342
350
  else:
343
351
  sys.stdout.write(text)
344
352
  return 0