@litfamily/lithermes 1.0.29 → 1.0.31
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 +12 -9
- package/README_Ko-KR.md +12 -9
- package/assets/lithermes-plugin/README.md +15 -2
- package/assets/lithermes-plugin/__init__.py +49 -10
- package/assets/lithermes-plugin/adhd_stack.py +272 -0
- package/assets/lithermes-plugin/bounded_work.py +41 -0
- package/assets/lithermes-plugin/core.py +53 -4
- package/assets/lithermes-plugin/core_commands.py +99 -0
- package/assets/lithermes-plugin/core_contexts.py +54 -4
- package/assets/lithermes-plugin/core_contract.py +2 -2
- package/assets/lithermes-plugin/core_plans.py +80 -0
- package/assets/lithermes-plugin/core_routing.py +126 -0
- package/assets/lithermes-plugin/core_workflow_commands.py +11 -5
- package/assets/lithermes-plugin/diagnostics.py +3 -2
- package/assets/lithermes-plugin/lit_mark.py +75 -0
- package/assets/lithermes-plugin/payload-version.json +473 -61
- package/assets/lithermes-plugin/plugin.yaml +1 -1
- package/assets/lithermes-plugin/scientific_visualization.py +23 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/SKILL.md +7 -7
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/components.css +414 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/fonts.json +42 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/landing.html +164 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/settings.html +114 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/layouts/workspace.html +115 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/computational-brutalism.json +227 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/field-notes.json +205 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/graphite.json +200 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/meadow.json +199 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/styles/neo-brutalism.json +222 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/kit/ui.js +226 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/README.md +2 -4
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/complete-contract.md +4 -4
- package/assets/lithermes-plugin/skills/frontend-ui-ux/references/craft-floor.md +10 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/design-lock.mjs +400 -0
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe-rules.json +6 -1
- package/assets/lithermes-plugin/skills/frontend-ui-ux/scripts/probe.mjs +76 -4
- package/assets/lithermes-plugin/skills/lit-adhd/SKILL.md +202 -0
- package/assets/lithermes-plugin/skills/lit-adhd/references/brief-contract.md +78 -0
- package/assets/lithermes-plugin/skills/lit-adhd/references/card-examples.md +97 -0
- package/assets/lithermes-plugin/skills/lit-adhd/references/status-taxonomy.md +56 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/adhd.mjs +11 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/collect.mjs +650 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/gauge.mjs +89 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/hermes-sessions.mjs +219 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/next-step.mjs +101 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/plan-task-rows.mjs +32 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/redact.mjs +42 -0
- package/assets/lithermes-plugin/skills/lit-adhd/scripts/lib/secret-shapes.mjs +59 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/SKILL.md +7 -4
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/style-guide.md +20 -11
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-architecture.md +3 -3
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-dependency.md +1 -1
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-tree.md +3 -3
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/type-wardley.md +1 -1
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/references/verifier-guide.md +5 -0
- package/assets/lithermes-plugin/skills/lit-diagram-drawer/scripts/diagram_quality.py +4 -4
- package/assets/lithermes-plugin/skills/lit-docx/SKILL.md +1 -1
- package/assets/lithermes-plugin/skills/lit-hijack/SKILL.md +239 -0
- package/assets/lithermes-plugin/skills/lit-hijack/references/capture-and-provenance.md +123 -0
- package/assets/lithermes-plugin/skills/lit-hijack/references/clean-room-build.md +128 -0
- package/assets/lithermes-plugin/skills/lit-hijack/references/distil-and-licence.md +128 -0
- package/assets/lithermes-plugin/skills/lit-hijack/references/gap-and-port-design.md +152 -0
- package/assets/lithermes-plugin/skills/lit-hijack/references/parity-and-report.md +131 -0
- package/assets/lithermes-plugin/skills/lit-hijack/scripts/hijack.mjs +995 -0
- package/assets/lithermes-plugin/skills/lit-plan/SKILL.md +34 -1
- package/assets/lithermes-plugin/skills/lit-pptx/SKILL.md +11 -6
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Bold.ttf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/JetBrainsMono-Regular.ttf +0 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/jetbrains-mono/OFL.txt +93 -0
- package/assets/lithermes-plugin/skills/lit-pptx/fonts/provenance.json +1 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/anti-slop-checklist.md +3 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/authoring-guide.md +1 -1
- package/assets/lithermes-plugin/skills/lit-pptx/references/consensus-protocol.md +1 -1
- package/assets/lithermes-plugin/skills/lit-pptx/references/direction-step.md +8 -2
- package/assets/lithermes-plugin/skills/lit-pptx/references/examples/13-engineering-review-computational-brutalism-ko.md +175 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/examples/14-launch-pitch-neo-brutalism-ko.md +156 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/examples/15-design-lecture-bauhaus-ko.md +141 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/examples/16-community-programme-riso-ko.md +160 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/examples/17-public-data-briefing-newsroom-ko.md +183 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/layout-families.md +1 -1
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/bauhaus.md +105 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/computational-brutalism.md +111 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/neo-brutalism.md +114 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/newsroom.md +106 -0
- package/assets/lithermes-plugin/skills/lit-pptx/references/tonalities/riso.md +101 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/craft_extras.py +49 -0
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/deck_output.py +4 -2
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/render-pack.js +96 -10
- package/assets/lithermes-plugin/skills/lit-pptx/scripts/lib/template-registry.js +50 -6
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/bauhaus/pack.yaml +103 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/computational-brutalism/pack.yaml +99 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/neo-brutalism/pack.yaml +107 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/newsroom/pack.yaml +99 -0
- package/assets/lithermes-plugin/skills/lit-pptx/templates/tonalities/riso/pack.yaml +99 -0
- package/assets/lithermes-plugin/skills/lit-recap/SKILL.md +1 -1
- package/assets/lithermes-plugin/skills/lit-schematic/SKILL.md +144 -0
- package/assets/lithermes-plugin/skills/lit-schematic/examples/iso-heat-exchanger/build.mjs +38 -0
- package/assets/lithermes-plugin/skills/lit-schematic/examples/iso-heat-exchanger/scene.mjs +133 -0
- package/assets/lithermes-plugin/skills/lit-schematic/examples/journal-adsorption-rig/build.mjs +87 -0
- package/assets/lithermes-plugin/skills/lit-schematic/examples/pid-dosing-skid/build.mjs +85 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/cutaway-outputs.md +70 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/isometric-craft.md +101 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/journal-figures.md +72 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/kit-api.md +134 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/pfd-and-layout.md +53 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/pid-drafting.md +103 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/pid-symbols.md +163 -0
- package/assets/lithermes-plugin/skills/lit-schematic/references/verification.md +100 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/doctor.mjs +57 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/figure.mjs +81 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/fonts.mjs +27 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/geom.mjs +113 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/interactive.mjs +292 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/isa.mjs +115 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/iso.mjs +719 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/legend-sheet.mjs +162 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/pid.mjs +937 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/png.mjs +132 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/qa-core.mjs +658 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/route.mjs +218 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/sheet.mjs +890 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/svg.mjs +82 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/lib/theme.mjs +115 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/motion.mjs +129 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/qa.mjs +92 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/render.mjs +233 -0
- package/assets/lithermes-plugin/skills/lit-schematic/scripts/scaffold.mjs +60 -0
- package/assets/lithermes-plugin/skills/lit-scientific-visualization/SKILL.md +19 -1
- package/assets/lithermes-plugin/skills/lit-typographic-motion/SKILL.md +12 -11
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/motion.mjs +56 -2
- package/assets/lithermes-plugin/skills/lit-typographic-motion/bin/runtime.mjs +129 -4
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/THIRD_PARTY_NOTICES +9 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/blender/runner.py +218 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/blender.mjs +154 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/board.mjs +132 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/completion.mjs +48 -5
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/gate.mjs +13 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/house.mjs +44 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/scaffold.mjs +238 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/score.mjs +643 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound-dsp.mjs +21 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/sound.mjs +171 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage-qa.mjs +23 -3
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/stage.mjs +124 -17
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/styles.mjs +240 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/treatment.mjs +152 -10
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/LICENSE +21 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/addons/environments/RoomEnvironment.js +144 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/addons/geometries/RoundedBoxGeometry.js +155 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/engine/vendor/three/three.module.js +54571 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/hero-3d/expected.json +67 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/recipes/hero-3d/index.html +139 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/depth.md +74 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/studio.md +87 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/style-bibles.md +9 -2
- package/assets/lithermes-plugin/skills/lit-typographic-motion/references/treatment.md +24 -8
- package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/paper.json +41 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/swiss-signal.json +41 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/terminalcore.json +42 -0
- package/assets/lithermes-plugin/skills/lit-typographic-motion/styles/tidal.json +41 -0
- package/assets/lithermes-plugin/skills/litresearch/SKILL.md +4 -0
- package/assets/lithermes-plugin/skills/readme-studio/SKILL.md +1 -1
- package/assets/lithermes-plugin/skills/review-work/SKILL.md +2 -0
- package/assets/lithermes-plugin/skills/start-work/SKILL.md +2 -1
- package/assets/lithermes-plugin/skills/visual-qa/references/complete-contract.md +3 -3
- package/package.json +1 -1
- package/readme-assets/badge-version.svg +1 -1
- package/src/lib/skillPayload.js +1 -1
|
@@ -103,8 +103,12 @@ _BARE_SKILL_PREFIXES = (
|
|
|
103
103
|
# reached by an ordinary English sentence; see the token-shape note below.
|
|
104
104
|
("frontend-ui-ux", "frontend-ui-ux"),
|
|
105
105
|
("lit-diagram-drawer", "lit-diagram-drawer"),
|
|
106
|
+
("lit-schematic", "lit-schematic"),
|
|
106
107
|
("lit-pptx", "lit-pptx"),
|
|
107
108
|
("lit-docx", "lit-docx"),
|
|
109
|
+
("lit-hijack", "lit-hijack"),
|
|
110
|
+
("lit-adhd", "lit-adhd"),
|
|
111
|
+
("lit-rewind", "lit-adhd"),
|
|
108
112
|
("lit-typographic-motion", "lit-typographic-motion"),
|
|
109
113
|
("readme-studio", "readme-studio"),
|
|
110
114
|
("visual-qa", "visual-qa"),
|
|
@@ -158,8 +162,20 @@ _LIT_SKILL_SUFFIXES = (
|
|
|
158
162
|
("rules", "rules"),
|
|
159
163
|
("frontend-ui-ux", "frontend-ui-ux"),
|
|
160
164
|
("lit-diagram-drawer", "lit-diagram-drawer"),
|
|
165
|
+
("lit-schematic", "lit-schematic"),
|
|
161
166
|
("lit-pptx", "lit-pptx"),
|
|
162
167
|
("lit-docx", "lit-docx"),
|
|
168
|
+
("lit-hijack", "lit-hijack"),
|
|
169
|
+
("hijack", "lit-hijack"),
|
|
170
|
+
("hijacking", "lit-hijack"),
|
|
171
|
+
("lit-adhd", "lit-adhd"),
|
|
172
|
+
("lit-rewind", "lit-adhd"),
|
|
173
|
+
("adhd", "lit-adhd"),
|
|
174
|
+
("rewind", "lit-adhd"),
|
|
175
|
+
# Korean hijack words are safe here: the user already typed `lit`, and neither
|
|
176
|
+
# opens an ordinary sentence without it.
|
|
177
|
+
("하이재킹", "lit-hijack"),
|
|
178
|
+
("하이잭", "lit-hijack"),
|
|
163
179
|
("lit-typographic-motion", "lit-typographic-motion"),
|
|
164
180
|
("readme-studio", "readme-studio"),
|
|
165
181
|
("visual-qa", "visual-qa"),
|
|
@@ -486,6 +502,84 @@ def detect_ui_mode(text: str) -> str | None:
|
|
|
486
502
|
return "build" if detect_ui_intent(value) else None
|
|
487
503
|
|
|
488
504
|
|
|
505
|
+
# SCHEMATIC route: drawings of real equipment (P&ID, PFD, apparatus figure,
|
|
506
|
+
# isometric cutaway). It is reachable by name, and after an explicit `lit` by
|
|
507
|
+
# intent. A STRONG noun names a drawing by itself (P&ID, 계장도, 모식도, 장치도,
|
|
508
|
+
# 피앤아이디, 컷어웨이); a WEAK noun (schematic, isometric, apparatus, 도면)
|
|
509
|
+
# also names documents and pictures of other things, so it needs a drawing or
|
|
510
|
+
# making verb and no web container. Hangul terms are bare substrings for the
|
|
511
|
+
# reason given at the UI route. Owners keep what is theirs: a report or deck
|
|
512
|
+
# ABOUT a drawing goes to the office skills, a page that SHOWS one goes to
|
|
513
|
+
# frontend-ui-ux, a chart or graph goes to the data-figure skill.
|
|
514
|
+
SCHEMATIC_MODE = "lit-schematic"
|
|
515
|
+
_SCHEMATIC_STRONG = re.compile(
|
|
516
|
+
r"\bp\s?&\s?i\s?ds?\b|\bpfds?\b|\bbfds?\b|piping\s+(?:and|&)\s+instrumentation|"
|
|
517
|
+
r"process\s+flow\s+(?:diagram|sheet)s?|block\s+flow\s+diagrams?|\bplot\s+plans?\b|equipment\s+layouts?|"
|
|
518
|
+
r"experimental\s+(?:set\s?up|apparatus)|\bcut\s?aways?\b|컷어웨이|배관\s?계장도|계장도|공정\s?흐름도|공정도|"
|
|
519
|
+
r"모식도|장치도|실험\s?장치|피앤아이디|배치도|계통도|단면도",
|
|
520
|
+
re.IGNORECASE,
|
|
521
|
+
)
|
|
522
|
+
# 도면 alone also names a document topic ("도면 번호 체계 정리"), so it needs a verb.
|
|
523
|
+
_SCHEMATIC_WEAK = re.compile(r"\bschematics?\b|\bisometric\b|\bapparatus\b|사시도|개략도|아이소메트릭|도면", re.IGNORECASE)
|
|
524
|
+
_SCHEMATIC_CHART = re.compile(r"차트|그래프|\b(?:charts?|graphs?|plots?(?!\s+plans?\b))\b", re.IGNORECASE)
|
|
525
|
+
_SCHEMATIC_DRAW_VERB = re.compile(
|
|
526
|
+
r"\b(?:draw|drawing|drew|sketch|sketching|illustrate|illustrating|render|rendering|redraw)\b|그려|그리|그림|도식|작도",
|
|
527
|
+
re.IGNORECASE,
|
|
528
|
+
)
|
|
529
|
+
_SCHEMATIC_MAKE_VERB = re.compile(r"\b(?:make|making|create|creating|design|designing|build|lay\s?out)\b|만들|만드", re.IGNORECASE)
|
|
530
|
+
# Whole interfaces a schematic can sit inside. 레이아웃/layout stay out: an
|
|
531
|
+
# equipment layout is a drawing.
|
|
532
|
+
_SCHEMATIC_INTERFACE = re.compile(
|
|
533
|
+
r"\b(?:dashboards?|landing\s?pages?|web\s?pages?|websites?|homepages?|web\s?apps?|apps?|screens?|"
|
|
534
|
+
r"admin\s?(?:panel|console)|user\s?interface|ui)\b|대시보드|웹사이트|랜딩|페이지|화면|앱",
|
|
535
|
+
re.IGNORECASE,
|
|
536
|
+
)
|
|
537
|
+
_SCHEMATIC_WEB_CONTAINER = re.compile(
|
|
538
|
+
r"페이지|웹사이트|랜딩|화면|컴포넌트|버튼|\b(?:page|pages|website|landing|screen|component|button)\b", re.IGNORECASE
|
|
539
|
+
)
|
|
540
|
+
_SCHEMATIC_AUTHORING = re.compile(
|
|
541
|
+
r"만들|작성|써\s*줘|써줘|제작|생성|정리|(?:^|[^A-Za-z])(?:make|create|write|draft|prepare|build|produce|generate)(?![A-Za-z])",
|
|
542
|
+
re.IGNORECASE,
|
|
543
|
+
)
|
|
544
|
+
_SCHEMATIC_OFFICE = re.compile(
|
|
545
|
+
r"발표자료|발표|슬라이드|피피티|보고서|리포트|기획서|제안서|문서|워드|"
|
|
546
|
+
r"(?:^|[^A-Za-z])(?:slides?|deck|presentation|pptx?|report|docx?|word)(?![A-Za-z])",
|
|
547
|
+
re.IGNORECASE,
|
|
548
|
+
)
|
|
549
|
+
# Code, tooling and software contexts a schematic never owns: a parser, a
|
|
550
|
+
# regression, an app or widget is built or fixed elsewhere, so a request that
|
|
551
|
+
# names one without a drawing verb keeps its owner's route.
|
|
552
|
+
_SCHEMATIC_CODE = re.compile(
|
|
553
|
+
r"\b(?:fix|fixed|fixing|parser|regression|bug|error|refactor|tests?|editor|apps?|widgets?|tools?|apis?|components?|plugins?)\b|파서|회귀|버그|에러|테스트|편집기",
|
|
554
|
+
re.IGNORECASE,
|
|
555
|
+
)
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def detect_schematic_intent(text: str) -> bool:
|
|
559
|
+
"""True when a request after `lit` asks for a drawing of real equipment."""
|
|
560
|
+
value = str(text or "")
|
|
561
|
+
strong = _SCHEMATIC_STRONG.search(value)
|
|
562
|
+
# A cutaway or P&ID asked for as a film stays here: this skill draws the
|
|
563
|
+
# equipment and renders its own loop; a film about anything else is the motion skill's.
|
|
564
|
+
if strong and detect_motion_video_intent(value):
|
|
565
|
+
return True
|
|
566
|
+
if not strong and not (
|
|
567
|
+
_SCHEMATIC_WEAK.search(value)
|
|
568
|
+
and (_SCHEMATIC_DRAW_VERB.search(value) or _SCHEMATIC_MAKE_VERB.search(value))
|
|
569
|
+
and not _SCHEMATIC_WEB_CONTAINER.search(value)
|
|
570
|
+
):
|
|
571
|
+
return False
|
|
572
|
+
if _SCHEMATIC_CHART.search(value):
|
|
573
|
+
return False
|
|
574
|
+
draws = bool(_SCHEMATIC_DRAW_VERB.search(value))
|
|
575
|
+
if not draws and _SCHEMATIC_CODE.search(value):
|
|
576
|
+
return False
|
|
577
|
+
if detect_ui_mode(value) is not None and _SCHEMATIC_INTERFACE.search(value) and not draws:
|
|
578
|
+
return False
|
|
579
|
+
office = bool(_SCHEMATIC_AUTHORING.search(value) and _SCHEMATIC_OFFICE.search(value))
|
|
580
|
+
return draws or not office
|
|
581
|
+
|
|
582
|
+
|
|
489
583
|
# MO-C-18..20: the motion trigger is a creation verb plus a compound
|
|
490
584
|
# motion-video noun, or plus a bare video noun, with none of five exclusions.
|
|
491
585
|
# The verb half reuses this product's office/UI creation verbs and adds a small
|
|
@@ -524,6 +618,12 @@ _MOTION_EMBED = re.compile(r"넣|삽입|(?<![A-Za-z])(?:embed\w*|insert\w*)(?![A
|
|
|
524
618
|
_MOTION_BACKGROUND = re.compile(r"배경\s*영상|(?<![A-Za-z])background\s+videos?(?![A-Za-z])", re.IGNORECASE)
|
|
525
619
|
# (iii) an office deliverable other than a bare 발표, with an embed/insert verb
|
|
526
620
|
_MOTION_SLIDES = re.compile(r"발표\s*자료|슬라이드|피피티|덱|(?<![A-Za-z])(?:pptx?|slides?|decks?)(?![A-Za-z])", re.IGNORECASE)
|
|
621
|
+
# A slide count next to a slide noun ("덱 10장", "10-slide deck").
|
|
622
|
+
_SLIDE_COUNT = re.compile(
|
|
623
|
+
r"\d+\s*장\s*(?:덱|슬라이드|피피티|발표)|(?:덱|슬라이드|피피티|발표\s*자료|발표)\s*\d+\s*장|"
|
|
624
|
+
r"(?<![A-Za-z])\d+\s*-\s*slide\s+decks?(?![A-Za-z])|(?<![A-Za-z])\d+\s+slides?(?![A-Za-z])",
|
|
625
|
+
re.IGNORECASE,
|
|
626
|
+
)
|
|
527
627
|
_MOTION_DOCS = re.compile(r"보고서|문서|(?<![A-Za-z])(?:reports?|documents?)(?![A-Za-z])", re.IGNORECASE)
|
|
528
628
|
# (iv) a text or image artifact about a video
|
|
529
629
|
_MOTION_ABOUT = re.compile(
|
|
@@ -648,11 +748,21 @@ def _bare_lit_mode(objective: str) -> str:
|
|
|
648
748
|
slide = re.search(r"발표자료|발표|슬라이드|피피티|(?:^|[^A-Za-z])(?:slides?|deck|presentation|pptx?)(?![A-Za-z])", first, re.IGNORECASE)
|
|
649
749
|
document = re.search(r"보고서|리포트|기획서|제안서|문서|워드|(?:^|[^A-Za-z])(?:report|docx?|word)(?![A-Za-z])", first, re.IGNORECASE)
|
|
650
750
|
authoring = re.search(r"만들|작성|써\s*줘|써줘|제작|생성|정리|(?:^|[^A-Za-z])(?:make|create|write|draft|prepare|build|produce|generate)(?![A-Za-z])", first, re.IGNORECASE)
|
|
751
|
+
# A drawing of real equipment is decided before motion and office, with the
|
|
752
|
+
# owner exclusions inside detect_schematic_intent, so "P&ID 그려줘" is a
|
|
753
|
+
# drawing while "P&ID 설명 보고서 작성" stays a document.
|
|
754
|
+
if detect_schematic_intent(first):
|
|
755
|
+
return SCHEMATIC_MODE
|
|
651
756
|
# The motion check runs before the office and UI checks (MO-C-18), so a
|
|
652
757
|
# video noun beside a bare 발표 or 타이포그래피 still reaches motion.
|
|
653
758
|
motion = motion_route(first)
|
|
654
759
|
if motion is not None:
|
|
655
760
|
return motion
|
|
761
|
+
# A slide count beside a slide noun is deck intent even without a making
|
|
762
|
+
# verb ("신규 서비스 투자 피칭 덱 10장, 네오 브루탈리즘 스타일로"). A bare
|
|
763
|
+
# photo count ("사진 10장 보정") names no slide noun and stays out.
|
|
764
|
+
if _SLIDE_COUNT.search(first):
|
|
765
|
+
return "lit-pptx"
|
|
656
766
|
if authoring and slide:
|
|
657
767
|
return "lit-pptx"
|
|
658
768
|
if authoring and document:
|
|
@@ -782,6 +892,18 @@ def detect_lit_mode(message: str) -> NaturalLitRoute | None:
|
|
|
782
892
|
block_message=block,
|
|
783
893
|
)
|
|
784
894
|
|
|
895
|
+
# Hijack words sit ahead of plan/review/research: "lit hijack this plan"
|
|
896
|
+
# ports a plan, it does not plan.
|
|
897
|
+
for word in ("lit-hijack", "hijack", "hijacking", "하이재킹", "하이잭"):
|
|
898
|
+
rest = _after_mode_word(after, word)
|
|
899
|
+
if rest is not None:
|
|
900
|
+
return NaturalLitRoute(mode="lit-hijack", objective=_clamp_task(rest), visible_message=visible)
|
|
901
|
+
# ADHD words sit ahead of plan/review/research the same way: "lit adhd
|
|
902
|
+
# this plan" is a brief over the plan, it does not plan.
|
|
903
|
+
for word in ("lit-adhd", "lit-rewind", "adhd", "rewind"):
|
|
904
|
+
rest = _after_mode_word(after, word)
|
|
905
|
+
if rest is not None:
|
|
906
|
+
return NaturalLitRoute(mode="lit-adhd", objective=_clamp_task(rest), visible_message=visible)
|
|
785
907
|
for word, mode in (
|
|
786
908
|
("plan", "lit-plan"),
|
|
787
909
|
("review", "review-work"),
|
|
@@ -794,6 +916,10 @@ def detect_lit_mode(message: str) -> NaturalLitRoute | None:
|
|
|
794
916
|
if rest is not None:
|
|
795
917
|
return NaturalLitRoute(mode=mode, objective=_clamp_task(rest), visible_message=visible)
|
|
796
918
|
|
|
919
|
+
# After the named routes and before the motion and `design` checks: a
|
|
920
|
+
# cutaway or P&ID asked for as a film or a design stays a drawing.
|
|
921
|
+
if detect_schematic_intent(_first_sentence(after)):
|
|
922
|
+
return NaturalLitRoute(mode=SCHEMATIC_MODE, objective=_clamp_task(after), visible_message=visible)
|
|
797
923
|
# After the named routes and before `design` (which names the UI skill):
|
|
798
924
|
# "lit design a lyric video" is a film request (MO-C-18).
|
|
799
925
|
if detect_motion_video_intent(_first_sentence(after)):
|
|
@@ -6,7 +6,7 @@ try:
|
|
|
6
6
|
LITGOAL_MEANING, _skill_body_block, conditional_uiux_skill_blocks, contract_route_block,
|
|
7
7
|
reader_facing_contract_block,
|
|
8
8
|
)
|
|
9
|
-
from .core_plans import plan_structure_issues, unchecked_items
|
|
9
|
+
from .core_plans import plan_structure_issues, scope_root_issues, unchecked_items
|
|
10
10
|
from .core_reader_args import parse_reader_facing_command_args
|
|
11
11
|
from .core_routing import bind_goal_marker
|
|
12
12
|
from .core_runs import build_run_agent_message, find_plan, latest_start_work_run, load_run_state, write_run_state
|
|
@@ -17,7 +17,7 @@ except (ImportError, ModuleNotFoundError):
|
|
|
17
17
|
LITGOAL_MEANING, _skill_body_block, conditional_uiux_skill_blocks, contract_route_block,
|
|
18
18
|
reader_facing_contract_block,
|
|
19
19
|
)
|
|
20
|
-
from core_plans import plan_structure_issues, unchecked_items
|
|
20
|
+
from core_plans import plan_structure_issues, scope_root_issues, unchecked_items
|
|
21
21
|
from core_reader_args import parse_reader_facing_command_args
|
|
22
22
|
from core_routing import bind_goal_marker
|
|
23
23
|
from core_runs import build_run_agent_message, find_plan, latest_start_work_run, load_run_state, write_run_state
|
|
@@ -144,14 +144,20 @@ def command_start_work(raw_args: str) -> str | dict[str, str]:
|
|
|
144
144
|
raise ValueError(msg)
|
|
145
145
|
conditional_uiux = conditional_uiux_skill_blocks(text)
|
|
146
146
|
open_items = unchecked_items(text)
|
|
147
|
+
outside = scope_root_issues(text, workspace)
|
|
148
|
+
scope_note = (
|
|
149
|
+
"\nScope roots advisory (Hermes grants nothing outside the worktree; settle these "
|
|
150
|
+
"with the user before the todos reach them):\n" + "\n".join(f"- {issue}" for issue in outside[:8])
|
|
151
|
+
if outside else ""
|
|
152
|
+
)
|
|
147
153
|
if dry_run:
|
|
148
154
|
preview = "\n".join(f"- {item}" for item in open_items[:8]) or "- no unchecked items found"
|
|
149
155
|
if resume:
|
|
150
156
|
run_dir = latest_start_work_run(workspace, plan)
|
|
151
157
|
if not run_dir:
|
|
152
158
|
return f"BLOCKED: /start-work --resume found no prior run for {plan}."
|
|
153
|
-
return f"LitHermes resume dry-run for {plan}: would resume {run_dir}\n{preview}"
|
|
154
|
-
return f"LitHermes dry-run for {plan}:\n{preview}"
|
|
159
|
+
return f"LitHermes resume dry-run for {plan}: would resume {run_dir}\n{preview}{scope_note}"
|
|
160
|
+
return f"LitHermes dry-run for {plan}:\n{preview}{scope_note}"
|
|
155
161
|
|
|
156
162
|
if resume:
|
|
157
163
|
run_dir = latest_start_work_run(workspace, plan)
|
|
@@ -189,7 +195,7 @@ def command_start_work(raw_args: str) -> str | dict[str, str]:
|
|
|
189
195
|
display = (
|
|
190
196
|
f"Started LitHermes work run from approved plan: {run_dir}\n"
|
|
191
197
|
f"Plan: {plan}\n"
|
|
192
|
-
f"Open items:\n{first_items}"
|
|
198
|
+
f"Open items:\n{first_items}{scope_note}"
|
|
193
199
|
)
|
|
194
200
|
return {
|
|
195
201
|
"display": display,
|
|
@@ -52,7 +52,8 @@ SLASH_COMMANDS = (
|
|
|
52
52
|
"lit-recap", "lit-handoff",
|
|
53
53
|
"lit-scientific-visualization",
|
|
54
54
|
"lit-diagram-drawer",
|
|
55
|
-
"lit-
|
|
55
|
+
"lit-schematic",
|
|
56
|
+
"lit-pptx", "lit-docx", "lit-hijack", "lit-adhd", "lit-typographic-motion",
|
|
56
57
|
)
|
|
57
58
|
GOAL_TOOLS = (
|
|
58
59
|
"goal_set", "goal_status", "goal_add_criterion", "goal_evidence",
|
|
@@ -538,7 +539,7 @@ def doctor_report(host_version: str | None = None) -> tuple[list[str], int]:
|
|
|
538
539
|
else:
|
|
539
540
|
lines.append("[WARN] lit-diagram-drawer entrypoint missing")
|
|
540
541
|
healthy = False
|
|
541
|
-
for name in ("lit-pptx", "lit-docx", "lit-typographic-motion"):
|
|
542
|
+
for name in ("lit-schematic", "lit-pptx", "lit-docx", "lit-typographic-motion"):
|
|
542
543
|
entrypoint = PLUGIN_ROOT / "skills" / name / "SKILL.md"
|
|
543
544
|
if entrypoint.is_file():
|
|
544
545
|
lines.append(f"[OK] {name} entrypoint present")
|
|
@@ -95,6 +95,81 @@ def probe_line(route: str) -> str:
|
|
|
95
95
|
return f"🔥 **LIT IGNITED · {discipline(route)}** 🔥"
|
|
96
96
|
|
|
97
97
|
|
|
98
|
+
# Skill looks for the Hermes text surface (BRIEF-mod-looks). A skill or state maps
|
|
99
|
+
# to a look = corner label + marker style, mirroring LitClaude lib/mod/motion.mjs
|
|
100
|
+
# lookOf keyed on discipline. Hermes shows no colour or animation, so every look
|
|
101
|
+
# is label/marker text only; NO_COLOR and reduced motion hold by construction.
|
|
102
|
+
# Blocks are plain text with inline-code markers, so the natural router (which
|
|
103
|
+
# only matches whole words at message start, outside code spans) stays inert.
|
|
104
|
+
_LOOK_DISCIPLINES = {"lit-adhd": "rewind", "lit-rewind": "rewind", "review-work": "lanes"}
|
|
105
|
+
|
|
106
|
+
_LOOK_BLOCKS = {
|
|
107
|
+
"rewind": (
|
|
108
|
+
"Look: REWIND <<. Open the brief with `REWIND <<` on its own line "
|
|
109
|
+
"(badges and gauges follow the skill). A wait opens with `YOUR TURN` "
|
|
110
|
+
"(plain text); done closes once with `✦ done`."
|
|
111
|
+
),
|
|
112
|
+
"lanes": (
|
|
113
|
+
"Look: review-work lanes. One strip: `[lane[goal] ✓]` with a verdict, "
|
|
114
|
+
"`[lane[goal] ·]` without; keys goal, qa, code-quality, security, context. "
|
|
115
|
+
"Never fill a lane without its report. A wait opens with `YOUR TURN`; "
|
|
116
|
+
"done closes once with `✦ done`."
|
|
117
|
+
),
|
|
118
|
+
"waiting": (
|
|
119
|
+
"Look: YOUR TURN. While the session waits on the user — a question, an approval, "
|
|
120
|
+
"a typed start-work boundary, a BLOCKED report — open the reply with the label "
|
|
121
|
+
"`YOUR TURN` on its own line. Plain text on this host: no amber, no breathing, "
|
|
122
|
+
"no flashing. Emit only while the wait holds; the user's next message ends it."
|
|
123
|
+
),
|
|
124
|
+
"done": (
|
|
125
|
+
"Look: done burst. When a plan or goal reaches done, or a release is published, "
|
|
126
|
+
"close with one `✦ done` line, once. Never on routine turns, never repeated, "
|
|
127
|
+
"never looped."
|
|
128
|
+
),
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
_WORK_LANE_KEYS = ("goal", "qa", "code-quality", "security", "context")
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def lookOf(discipline: str) -> str | None:
|
|
135
|
+
"""Return the look name for a skill discipline, or None when it keeps no look."""
|
|
136
|
+
return _LOOK_DISCIPLINES.get(discipline)
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def look_block(name: str) -> str:
|
|
140
|
+
"""Return the text-only look block for a look or state name, or '' when unknown."""
|
|
141
|
+
body = _LOOK_BLOCKS.get(name)
|
|
142
|
+
if not body:
|
|
143
|
+
return ""
|
|
144
|
+
return f'<lithermes-look name="{name}">\n{body}\n</lithermes-look>'
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def route_look_block(route: str) -> str:
|
|
148
|
+
"""Return the discipline look block for a route, or '' when it keeps no look.
|
|
149
|
+
|
|
150
|
+
Never raises: an unparsable route simply selects no look.
|
|
151
|
+
"""
|
|
152
|
+
try:
|
|
153
|
+
name = lookOf(discipline(route))
|
|
154
|
+
except ValueError:
|
|
155
|
+
return ""
|
|
156
|
+
return look_block(name) if name else ""
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def lanes_strip(reported: dict) -> str:
|
|
160
|
+
"""Format the five review-work lanes from real report flags.
|
|
161
|
+
|
|
162
|
+
reported maps lane key -> True when that lane reported its verdict. Lanes
|
|
163
|
+
without a report render dim (`·`); a lane is never filled without its report.
|
|
164
|
+
Unknown keys are ignored so a caller typo cannot invent a lane.
|
|
165
|
+
"""
|
|
166
|
+
parts = []
|
|
167
|
+
for key in _WORK_LANE_KEYS:
|
|
168
|
+
mark = "✓" if reported.get(key) is True else "·"
|
|
169
|
+
parts.append(f"[lane[{key}] {mark}]")
|
|
170
|
+
return " ".join(parts)
|
|
171
|
+
|
|
172
|
+
|
|
98
173
|
def harness_banner(route: str) -> str:
|
|
99
174
|
return f"🔥 LIT IGNITED · {discipline(route)} 🔥"
|
|
100
175
|
|