@seanyao/roll 3.609.2 → 3.610.2

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.
Files changed (103) hide show
  1. package/CHANGELOG.md +44 -1
  2. package/README.md +5 -6
  3. package/dist/roll.mjs +16146 -16186
  4. package/package.json +3 -2
  5. package/skills/README.md +14 -1
  6. package/skills/docs/skill-authoring.md +66 -0
  7. package/skills/reports/skill-audit-summary.md +53 -0
  8. package/skills/roll-.changelog/SKILL.md +25 -443
  9. package/skills/roll-.changelog/references/full-contract.md +462 -0
  10. package/skills/roll-.clarify/SKILL.md +6 -4
  11. package/skills/roll-.dream/SKILL.md +26 -353
  12. package/skills/roll-.dream/references/full-contract.md +365 -0
  13. package/skills/roll-.echo/SKILL.md +6 -4
  14. package/skills/roll-.qa/SKILL.md +25 -236
  15. package/skills/roll-.qa/references/full-contract.md +256 -0
  16. package/skills/roll-.review/SKILL.md +6 -2
  17. package/skills/roll-brief/SKILL.md +6 -8
  18. package/skills/roll-build/SKILL.md +28 -864
  19. package/skills/roll-build/references/full-contract.md +883 -0
  20. package/skills/roll-debug/SKILL.md +26 -585
  21. package/skills/roll-debug/references/full-contract.md +607 -0
  22. package/skills/roll-design/SKILL.md +28 -903
  23. package/skills/roll-design/references/full-contract.md +923 -0
  24. package/skills/roll-doc/SKILL.md +25 -574
  25. package/skills/roll-doc/references/full-contract.md +594 -0
  26. package/skills/roll-doctor/SKILL.md +21 -2
  27. package/skills/roll-fix/SKILL.md +28 -621
  28. package/skills/roll-fix/references/full-contract.md +640 -0
  29. package/skills/roll-idea/SKILL.md +6 -2
  30. package/skills/roll-loop/SKILL.md +27 -543
  31. package/skills/roll-loop/references/full-contract.md +555 -0
  32. package/skills/roll-notes/SKILL.md +6 -2
  33. package/skills/roll-onboard/SKILL.md +6 -2
  34. package/skills/roll-peer/SKILL.md +27 -316
  35. package/skills/roll-peer/references/full-contract.md +329 -0
  36. package/skills/roll-propose/SKILL.md +6 -8
  37. package/skills/roll-review-pr/SKILL.md +6 -2
  38. package/skills/roll-sentinel/SKILL.md +26 -344
  39. package/skills/roll-sentinel/references/full-contract.md +363 -0
  40. package/skills/roll-spar/SKILL.md +27 -269
  41. package/skills/roll-spar/references/full-contract.md +288 -0
  42. package/skills/route-cases/skills.json +235 -0
  43. package/skills/scripts/audit-skills.mjs +272 -0
  44. package/skills/scripts/test-audit-skills.mjs +39 -0
  45. package/skills/tests/fixtures/skill-audit/block-skill/SKILL.md +12 -0
  46. package/skills/tests/fixtures/skill-audit/minimal-skill/SKILL.md +8 -0
  47. package/skills/tests/fixtures/skill-audit/quoted-skill/SKILL.md +10 -0
  48. package/skills/tests/fixtures/skill-audit/route-cases.json +21 -0
  49. package/skills/tests/fixtures/skill-audit/spoke-skill/SKILL.md +12 -0
  50. package/skills/tests/fixtures/skill-audit/spoke-skill/references/runbook.md +3 -0
  51. package/bin/roll +0 -15361
  52. package/lib/backfill-pi-usage.py +0 -243
  53. package/lib/changelog_audit.py +0 -149
  54. package/lib/changelog_generate.py +0 -470
  55. package/lib/consistency_check.py +0 -409
  56. package/lib/context_feed_budget.sh +0 -194
  57. package/lib/github_sync.py +0 -876
  58. package/lib/i18n/slides.sh +0 -3
  59. package/lib/i18n/slides_build.sh +0 -38
  60. package/lib/i18n/slides_delete.sh +0 -19
  61. package/lib/i18n/slides_list.sh +0 -14
  62. package/lib/i18n/slides_logs.sh +0 -12
  63. package/lib/i18n/slides_new.sh +0 -15
  64. package/lib/i18n/slides_preview.sh +0 -14
  65. package/lib/i18n/slides_templates.sh +0 -7
  66. package/lib/i18n.sh +0 -211
  67. package/lib/loop-exit-summary.py +0 -393
  68. package/lib/loop-fmt.py +0 -589
  69. package/lib/loop_pick_agent.py +0 -316
  70. package/lib/loop_result_eval.py +0 -469
  71. package/lib/loop_unstick.py +0 -180
  72. package/lib/model_prices.py +0 -194
  73. package/lib/prices_fetcher.py +0 -534
  74. package/lib/roll-backlog.py +0 -225
  75. package/lib/roll-brief.py +0 -286
  76. package/lib/roll-help.py +0 -158
  77. package/lib/roll-home.py +0 -556
  78. package/lib/roll-init.py +0 -156
  79. package/lib/roll-loop-status.py +0 -1691
  80. package/lib/roll-loop-story.py +0 -191
  81. package/lib/roll-peer.py +0 -252
  82. package/lib/roll-setup.py +0 -102
  83. package/lib/roll-status.py +0 -367
  84. package/lib/roll_git.py +0 -41
  85. package/lib/roll_render.py +0 -414
  86. package/lib/slides/components/README.md +0 -123
  87. package/lib/slides/components/cards-2.html +0 -9
  88. package/lib/slides/components/cards-3.html +0 -9
  89. package/lib/slides/components/cards-4.html +0 -9
  90. package/lib/slides/components/compare.html +0 -22
  91. package/lib/slides/components/highlight.html +0 -9
  92. package/lib/slides/components/pipeline.html +0 -12
  93. package/lib/slides/components/plain.html +0 -7
  94. package/lib/slides/components/quote.html +0 -4
  95. package/lib/slides/components/timeline.html +0 -9
  96. package/lib/slides/templates/introduction-v3.html +0 -571
  97. package/lib/slides/templates/pitch.html +0 -0
  98. package/lib/slides-render.py +0 -778
  99. package/lib/slides-validate.py +0 -357
  100. package/lib/test_quality_gate.py +0 -143
  101. package/skills/roll-deck/SKILL.md +0 -296
  102. /package/skills/roll-debug/{injectable-bb.js → assets/injectable-bb.js} +0 -0
  103. /package/skills/roll-design/{ENGINEERING_CHECKLIST.md → references/engineering-checklist.md} +0 -0
package/lib/roll-init.py DELETED
@@ -1,156 +0,0 @@
1
- #!/usr/bin/env python3
2
- """roll-init — v2 terminal view for `roll init`.
3
-
4
- Reads a single JSON document from stdin describing real step outcomes
5
- captured by the bash flow in `bin/roll cmd_init`. Renders the v2 UI
6
- (banner + horizontal rule + numbered steps + NEXT block) preserving the
7
- visual style of US-VIEW-008 but reflecting what actually happened.
8
-
9
- Input schema (single JSON object on stdin):
10
- {
11
- "kind": "init", # informational; UI label uses header_label
12
- "header_label": "INIT", # banner label (e.g. "INIT" / "REINIT")
13
- "subtitle": "项目初始化", # banner subtitle
14
- "project_path": "/path/to/project", # right-aligned banner text
15
- "steps": [
16
- {"num": 1, "label": "Detect project type", "status": "ok"},
17
- {"num": 2, "label": "Create AGENTS.md", "status": "ok",
18
- "files": [["+", "AGENTS.md"]]},
19
- {"num": 3, "label": "...", "status": "skip", "note": "already exists"},
20
- {"num": 4, "label": "...", "status": "fail", "error": "permission denied"}
21
- ],
22
- "footer": {"status": "ok", "label": "Project ready"},
23
- "next": [["Edit .roll/backlog.md", "open the backlog and add your first US"]]
24
- }
25
-
26
- `status` values: ok | skip | fail.
27
- `files` ops: "+" created "~" merged "·" unchanged "✗" failed.
28
-
29
- If stdin is empty or invalid JSON, exit 1 with a short message — the
30
- renderer is no longer runnable standalone, it always renders real data.
31
- """
32
- from __future__ import annotations
33
-
34
- import argparse
35
- import json
36
- import os
37
- import sys
38
-
39
- _LIB_DIR = os.path.dirname(os.path.realpath(__file__))
40
- if _LIB_DIR not in sys.path:
41
- sys.path.insert(0, _LIB_DIR)
42
- import roll_render
43
- from roll_render import c, row, COLS
44
-
45
-
46
- def _divider(char: str = "─") -> None:
47
- print(c("dim", char * min(COLS, 80)))
48
-
49
-
50
- def _op_marker(op: str) -> str:
51
- if op == "+":
52
- return c("green", "+", bold=True)
53
- if op == "~":
54
- return c("amber", "~", bold=True)
55
- if op == "·":
56
- return c("dim", "·")
57
- if op == "✗":
58
- return c("red", "✗", bold=True)
59
- return c("dim", op)
60
-
61
-
62
- def _step_icon(status: str) -> str:
63
- if status == "ok":
64
- return c("green", "✓")
65
- if status == "skip":
66
- return c("amber", "↷")
67
- if status == "fail":
68
- return c("red", "✗", bold=True)
69
- return c("dim", "·")
70
-
71
-
72
- def _file_color(op: str) -> str:
73
- if op == "+":
74
- return "green"
75
- if op == "~":
76
- return "amber"
77
- if op == "✗":
78
- return "red"
79
- return "dim"
80
-
81
-
82
- def render(payload: dict) -> None:
83
- header_label = payload.get("header_label", "INIT")
84
- subtitle = payload.get("subtitle", "项目初始化")
85
- project_path = payload.get("project_path", "")
86
-
87
- left = " " + c("blue", header_label, bold=True) + c("dim", " · ") + c("dim", subtitle)
88
- right = c("dim", project_path) + " "
89
- print(row(left, right))
90
- _divider()
91
- print()
92
-
93
- for step in payload.get("steps", []):
94
- num = c("dim", f" {step.get('num', 0)}.")
95
- icon = _step_icon(step.get("status", "ok"))
96
- label = step.get("label", "")
97
- print(f"{num} {icon} {label}")
98
- for entry in step.get("files", []) or []:
99
- op, fname = entry[0], entry[1]
100
- mark = _op_marker(op)
101
- color = _file_color(op)
102
- print(" " + mark + " " + c(color, fname))
103
- note = step.get("note") or step.get("error")
104
- if note:
105
- tone = "red" if step.get("status") == "fail" else "dim"
106
- print(" " + c(tone, str(note)))
107
-
108
- print()
109
- _divider()
110
-
111
- footer = payload.get("footer") or {}
112
- f_status = footer.get("status", "ok")
113
- f_label = footer.get("label", "Done")
114
- icon_color = "green" if f_status == "ok" else "red"
115
- icon = "✓" if f_status == "ok" else "✗"
116
- print(" " + c(icon_color, icon) + " " + c(icon_color, f_label, bold=True))
117
-
118
- next_items = payload.get("next") or []
119
- if next_items:
120
- print()
121
- print(" " + c("pink", "NEXT", bold=True) + c("dim", " · 下一步"))
122
- for i, entry in enumerate(next_items, start=1):
123
- label = entry[0]
124
- hint = entry[1] if len(entry) > 1 else ""
125
- num = c("dim", f" {i}.")
126
- print(f"{num} {c('fg', label, bold=True)}")
127
- if hint:
128
- print(" " + c("dim", hint))
129
- _divider("═")
130
-
131
-
132
- def _read_payload() -> dict:
133
- raw = sys.stdin.read()
134
- if not raw.strip():
135
- sys.stderr.write("roll-init.py: expected JSON on stdin\n")
136
- sys.exit(1)
137
- try:
138
- return json.loads(raw)
139
- except json.JSONDecodeError as exc:
140
- sys.stderr.write(f"roll-init.py: invalid JSON on stdin: {exc}\n")
141
- sys.exit(1)
142
-
143
-
144
- def main() -> None:
145
- ap = argparse.ArgumentParser(add_help=False)
146
- ap.add_argument("--no-color", dest="no_color", action="store_true")
147
- args, _ = ap.parse_known_args()
148
-
149
- if args.no_color or os.environ.get("NO_COLOR") or not sys.stdout.isatty():
150
- roll_render.USE_COLOR = False
151
-
152
- render(_read_payload())
153
-
154
-
155
- if __name__ == "__main__":
156
- main()