@my-life-buddies/cli 0.1.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 (158) hide show
  1. package/README.md +314 -0
  2. package/dist/bin/buddy.js +443 -0
  3. package/dist/bin/buddy.js.map +7 -0
  4. package/dist/bin/core.js +5638 -0
  5. package/dist/bin/core.js.map +7 -0
  6. package/dist/bin/preview.js +1429 -0
  7. package/dist/bin/preview.js.map +7 -0
  8. package/dist/web/app.css +508 -0
  9. package/dist/web/app.js +724 -0
  10. package/dist/web/assets/developer-platform-icon.png.base64 +1 -0
  11. package/dist/web/brand.css +100 -0
  12. package/dist/web/index.html +236 -0
  13. package/dist/web/tokens.css +15 -0
  14. package/package.json +45 -0
  15. package/resources/README.md +52 -0
  16. package/resources/agent-template/package-lock.json +1726 -0
  17. package/resources/agent-template/package.json +16 -0
  18. package/resources/brand/README.md +11 -0
  19. package/resources/brand/login-result.css +25 -0
  20. package/resources/brand/logo.png +0 -0
  21. package/resources/brand/tokens.css +100 -0
  22. package/resources/buddy-creator/INSTALL.md +25 -0
  23. package/resources/buddy-creator/PATCHES.md +33 -0
  24. package/resources/buddy-creator/SKILL.md +66 -0
  25. package/resources/buddy-creator/THIRD_PARTY_NOTICES.md +154 -0
  26. package/resources/buddy-creator/agents/openai.yaml +4 -0
  27. package/resources/buddy-creator/assets/licenses/bail.txt +26 -0
  28. package/resources/buddy-creator/assets/licenses/ccount.txt +26 -0
  29. package/resources/buddy-creator/assets/licenses/character-entities-html4.txt +26 -0
  30. package/resources/buddy-creator/assets/licenses/character-entities-legacy.txt +26 -0
  31. package/resources/buddy-creator/assets/licenses/character-entities.txt +26 -0
  32. package/resources/buddy-creator/assets/licenses/character-reference-invalid.txt +26 -0
  33. package/resources/buddy-creator/assets/licenses/comma-separated-tokens.txt +26 -0
  34. package/resources/buddy-creator/assets/licenses/debug.txt +24 -0
  35. package/resources/buddy-creator/assets/licenses/decode-named-character-reference.txt +26 -0
  36. package/resources/buddy-creator/assets/licenses/dequal.txt +25 -0
  37. package/resources/buddy-creator/assets/licenses/devlop.txt +26 -0
  38. package/resources/buddy-creator/assets/licenses/escape-string-regexp.txt +13 -0
  39. package/resources/buddy-creator/assets/licenses/estree-util-is-identifier-name.txt +26 -0
  40. package/resources/buddy-creator/assets/licenses/extend.txt +27 -0
  41. package/resources/buddy-creator/assets/licenses/hast-util-to-jsx-runtime.txt +26 -0
  42. package/resources/buddy-creator/assets/licenses/hast-util-whitespace.txt +26 -0
  43. package/resources/buddy-creator/assets/licenses/html-url-attributes.txt +25 -0
  44. package/resources/buddy-creator/assets/licenses/inline-style-parser.txt +13 -0
  45. package/resources/buddy-creator/assets/licenses/is-alphabetical.txt +26 -0
  46. package/resources/buddy-creator/assets/licenses/is-alphanumerical.txt +26 -0
  47. package/resources/buddy-creator/assets/licenses/is-decimal.txt +26 -0
  48. package/resources/buddy-creator/assets/licenses/is-hexadecimal.txt +26 -0
  49. package/resources/buddy-creator/assets/licenses/is-plain-obj.txt +13 -0
  50. package/resources/buddy-creator/assets/licenses/longest-streak.txt +26 -0
  51. package/resources/buddy-creator/assets/licenses/markdown-table.txt +26 -0
  52. package/resources/buddy-creator/assets/licenses/mdast-util-find-and-replace.txt +26 -0
  53. package/resources/buddy-creator/assets/licenses/mdast-util-from-markdown.txt +26 -0
  54. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-autolink-literal.txt +26 -0
  55. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-footnote.txt +26 -0
  56. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-strikethrough.txt +26 -0
  57. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-table.txt +26 -0
  58. package/resources/buddy-creator/assets/licenses/mdast-util-gfm-task-list-item.txt +26 -0
  59. package/resources/buddy-creator/assets/licenses/mdast-util-gfm.txt +26 -0
  60. package/resources/buddy-creator/assets/licenses/mdast-util-mdx-expression.txt +26 -0
  61. package/resources/buddy-creator/assets/licenses/mdast-util-mdx-jsx.txt +26 -0
  62. package/resources/buddy-creator/assets/licenses/mdast-util-mdxjs-esm.txt +26 -0
  63. package/resources/buddy-creator/assets/licenses/mdast-util-phrasing.txt +27 -0
  64. package/resources/buddy-creator/assets/licenses/mdast-util-to-hast.txt +26 -0
  65. package/resources/buddy-creator/assets/licenses/mdast-util-to-markdown.txt +26 -0
  66. package/resources/buddy-creator/assets/licenses/mdast-util-to-string.txt +26 -0
  67. package/resources/buddy-creator/assets/licenses/micromark-core-commonmark.txt +26 -0
  68. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-autolink-literal.txt +26 -0
  69. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-footnote.txt +26 -0
  70. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-strikethrough.txt +26 -0
  71. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-table.txt +26 -0
  72. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-tagfilter.txt +26 -0
  73. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm-task-list-item.txt +26 -0
  74. package/resources/buddy-creator/assets/licenses/micromark-extension-gfm.txt +26 -0
  75. package/resources/buddy-creator/assets/licenses/micromark-factory-destination.txt +26 -0
  76. package/resources/buddy-creator/assets/licenses/micromark-factory-label.txt +26 -0
  77. package/resources/buddy-creator/assets/licenses/micromark-factory-space.txt +26 -0
  78. package/resources/buddy-creator/assets/licenses/micromark-factory-title.txt +26 -0
  79. package/resources/buddy-creator/assets/licenses/micromark-factory-whitespace.txt +26 -0
  80. package/resources/buddy-creator/assets/licenses/micromark-util-character.txt +26 -0
  81. package/resources/buddy-creator/assets/licenses/micromark-util-chunked.txt +26 -0
  82. package/resources/buddy-creator/assets/licenses/micromark-util-classify-character.txt +26 -0
  83. package/resources/buddy-creator/assets/licenses/micromark-util-combine-extensions.txt +26 -0
  84. package/resources/buddy-creator/assets/licenses/micromark-util-decode-numeric-character-reference.txt +26 -0
  85. package/resources/buddy-creator/assets/licenses/micromark-util-decode-string.txt +26 -0
  86. package/resources/buddy-creator/assets/licenses/micromark-util-encode.txt +26 -0
  87. package/resources/buddy-creator/assets/licenses/micromark-util-html-tag-name.txt +26 -0
  88. package/resources/buddy-creator/assets/licenses/micromark-util-normalize-identifier.txt +26 -0
  89. package/resources/buddy-creator/assets/licenses/micromark-util-resolve-all.txt +26 -0
  90. package/resources/buddy-creator/assets/licenses/micromark-util-sanitize-uri.txt +26 -0
  91. package/resources/buddy-creator/assets/licenses/micromark-util-subtokenize.txt +26 -0
  92. package/resources/buddy-creator/assets/licenses/micromark-util-symbol.txt +26 -0
  93. package/resources/buddy-creator/assets/licenses/micromark-util-types.txt +26 -0
  94. package/resources/buddy-creator/assets/licenses/micromark.txt +26 -0
  95. package/resources/buddy-creator/assets/licenses/ms.txt +25 -0
  96. package/resources/buddy-creator/assets/licenses/parse-entities.txt +26 -0
  97. package/resources/buddy-creator/assets/licenses/phosphor-icons--react.txt +25 -0
  98. package/resources/buddy-creator/assets/licenses/property-information.txt +26 -0
  99. package/resources/buddy-creator/assets/licenses/react-dom.txt +25 -0
  100. package/resources/buddy-creator/assets/licenses/react-markdown.txt +25 -0
  101. package/resources/buddy-creator/assets/licenses/react.txt +25 -0
  102. package/resources/buddy-creator/assets/licenses/remark-gfm.txt +26 -0
  103. package/resources/buddy-creator/assets/licenses/remark-parse.txt +25 -0
  104. package/resources/buddy-creator/assets/licenses/remark-rehype.txt +26 -0
  105. package/resources/buddy-creator/assets/licenses/remark-stringify.txt +25 -0
  106. package/resources/buddy-creator/assets/licenses/scheduler.txt +25 -0
  107. package/resources/buddy-creator/assets/licenses/space-separated-tokens.txt +26 -0
  108. package/resources/buddy-creator/assets/licenses/stringify-entities.txt +26 -0
  109. package/resources/buddy-creator/assets/licenses/style-to-js.txt +26 -0
  110. package/resources/buddy-creator/assets/licenses/style-to-object.txt +26 -0
  111. package/resources/buddy-creator/assets/licenses/trim-lines.txt +26 -0
  112. package/resources/buddy-creator/assets/licenses/trough.txt +25 -0
  113. package/resources/buddy-creator/assets/licenses/types--debug.txt +25 -0
  114. package/resources/buddy-creator/assets/licenses/types--estree-jsx.txt +25 -0
  115. package/resources/buddy-creator/assets/licenses/types--estree.txt +25 -0
  116. package/resources/buddy-creator/assets/licenses/types--hast.txt +25 -0
  117. package/resources/buddy-creator/assets/licenses/types--mdast.txt +25 -0
  118. package/resources/buddy-creator/assets/licenses/types--ms.txt +25 -0
  119. package/resources/buddy-creator/assets/licenses/types--unist.txt +25 -0
  120. package/resources/buddy-creator/assets/licenses/ungap--structured-clone.txt +19 -0
  121. package/resources/buddy-creator/assets/licenses/unified.txt +25 -0
  122. package/resources/buddy-creator/assets/licenses/unist-util-is.txt +26 -0
  123. package/resources/buddy-creator/assets/licenses/unist-util-position.txt +26 -0
  124. package/resources/buddy-creator/assets/licenses/unist-util-stringify-position.txt +26 -0
  125. package/resources/buddy-creator/assets/licenses/unist-util-visit-parents.txt +26 -0
  126. package/resources/buddy-creator/assets/licenses/unist-util-visit.txt +26 -0
  127. package/resources/buddy-creator/assets/licenses/vfile-message.txt +26 -0
  128. package/resources/buddy-creator/assets/licenses/vfile.txt +25 -0
  129. package/resources/buddy-creator/assets/licenses/zwitch.txt +26 -0
  130. package/resources/buddy-creator/assets/preview/assets/index-B5VmkoSx.js +39 -0
  131. package/resources/buddy-creator/assets/preview/assets/index-DWKP6b-3.css +4 -0
  132. package/resources/buddy-creator/assets/preview/brand-logo.png +0 -0
  133. package/resources/buddy-creator/assets/preview/brand.css +100 -0
  134. package/resources/buddy-creator/assets/preview/index.html +5 -0
  135. package/resources/buddy-creator/assets/preview/reader.css +165 -0
  136. package/resources/buddy-creator/assets/preview/reader.js +135 -0
  137. package/resources/buddy-creator/references/artifact-schema.md +68 -0
  138. package/resources/buddy-creator/references/catalog.json +401 -0
  139. package/resources/buddy-creator/references/definition.md +24 -0
  140. package/resources/buddy-creator/references/dialogue-examples.md +133 -0
  141. package/resources/buddy-creator/references/host-guide.md +213 -0
  142. package/resources/buddy-creator/references/interview.md +235 -0
  143. package/resources/buddy-creator/references/knowledge.md +40 -0
  144. package/resources/buddy-creator/references/methods.md +77 -0
  145. package/resources/buddy-creator/references/opening.md +14 -0
  146. package/resources/buddy-creator/references/preview-panel.md +66 -0
  147. package/resources/buddy-creator/references/recovery.md +43 -0
  148. package/resources/buddy-creator/references/service.md +74 -0
  149. package/resources/buddy-creator/scripts/buddy.py +108 -0
  150. package/resources/buddy-creator/scripts/buddy_client.py +67 -0
  151. package/resources/buddy-creator/scripts/buddy_core.py +803 -0
  152. package/resources/buddy-creator/scripts/completion.py +240 -0
  153. package/resources/buddy-creator/scripts/interview.py +215 -0
  154. package/resources/buddy-creator/scripts/preview.py +577 -0
  155. package/resources/buddy-creator/scripts/preview_panel.py +80 -0
  156. package/resources/buddy-creator/scripts/sources.py +239 -0
  157. package/resources/buddy-creator/version.json +8 -0
  158. package/resources/buddy-creator.manifest.json +696 -0
@@ -0,0 +1,4 @@
1
+ :root{font-family:var(--font-body);font-synthesis:none;color:var(--color-ink);background:var(--color-paper);--accent:var(--color-accent);--line:var(--color-rule);--line-strong:var(--color-rule-strong);--muted:var(--color-muted);--muted-strong:var(--color-ink-soft);--text:var(--color-ink-strong);--surface:var(--color-paper-raised);--document:var(--color-paper-raised)}*{box-sizing:border-box}body{margin:0}button,a,summary{-webkit-tap-highlight-color:transparent}button{font:inherit;color:inherit;cursor:pointer}a{color:inherit}button:focus-visible,a:focus-visible,summary:focus-visible,[tabindex="-1"]:focus-visible{outline:2px solid var(--accent);outline-offset:3px}h1,h2,h3,p{margin-top:0}p{line-height:1.8}button,summary{touch-action:manipulation}button:active{opacity:.85}.shell{min-height:100dvh}.preview-header{position:sticky;top:0;z-index:10;background:var(--color-paper-raised);border-bottom:1px solid var(--line)}.header-inner,.workspace{width:100%;max-width:880px;margin:0 auto;padding:0 28px}.header-inner{padding-bottom:12px}.brand-row{height:48px;display:flex;align-items:center;justify-content:space-between;gap:18px}.brand{display:flex;align-items:center;gap:9px;min-width:0}.brand strong{font-size:15px;letter-spacing:-.4px}.project-name{font-size:12px;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-left:7px;padding-left:16px;border-left:1px solid var(--line)}.activity-status{flex:none;max-width:52%;display:flex;flex-direction:column;align-items:flex-end;gap:3px;font-size:12px;line-height:1.4;color:var(--muted)}.activity-line{display:flex;align-items:center;gap:7px;white-space:nowrap}.activity-status small{color:var(--muted);font-size:10px;line-height:1.3}.activity-status.working,.activity-status.ready{color:var(--accent)}.activity-status.attention,.activity-status.offline{color:var(--color-warning)}.activity-dot{width:5px;height:5px;border-radius:50%;background:currentColor;flex:none}.activity-status.online .activity-dot{background:var(--accent)}.activity-dots{display:inline-flex;align-items:center;gap:3px;height:12px;flex:none}.activity-dots i{width:4px;height:4px;border-radius:50%;background:currentColor;animation:activity-pulse 1.5s ease-in-out infinite}.activity-dots i:nth-child(2){animation-delay:.18s}.activity-dots i:nth-child(3){animation-delay:.36s}@keyframes activity-pulse{0%,70%,to{opacity:.35;transform:translateY(0)}35%{opacity:1;transform:translateY(-2px)}}.stage-nav{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px}.stage-link{display:flex;align-items:center;gap:9px;padding:10px 12px;border:1px solid transparent;border-radius:var(--radius-md);background:transparent;text-align:left;min-width:0}.stage-link:hover{background:var(--color-accent-soft)}.stage-link.selected{background:var(--color-accent-soft);border-color:var(--color-accent)}.stage-link.selected.in-progress{background:var(--color-accent-soft);border-color:var(--color-accent)}.step-number{color:var(--muted-strong);display:flex;align-items:center;justify-content:center;flex:none;width:23px;height:23px;border:1px solid var(--color-rule-strong);border-radius:50%;font-size:12px;font-variant-numeric:tabular-nums}.in-progress .step-number{color:var(--color-accent-ink);background:var(--accent);border-color:var(--accent);font-weight:650}.stage-copy{min-width:0}.stage-name{display:block;font-size:15px;line-height:1.3;font-weight:600}.stage-link small{display:block;color:var(--muted);font-size:12px;margin-top:5px;white-space:nowrap}.in-progress small{color:var(--accent)}.position-row{display:flex;align-items:center;justify-content:space-between;gap:8px 14px;font-size:12px;padding-top:12px;flex-wrap:wrap}.position-row .muted{margin-right:8px}.position-count{color:var(--accent);margin-left:10px;font-variant-numeric:tabular-nums;white-space:nowrap}.muted{color:var(--muted)}.text-button{display:inline-flex;align-items:center;justify-content:center;gap:5px;background:transparent;border:0;padding:4px 0;font-size:12px;color:var(--muted-strong);flex:none}.text-button:hover{color:var(--accent)}.workspace{padding-top:26px;padding-bottom:20px}.stage-heading{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px}.stage-heading>div{display:flex;align-items:center;gap:12px}.stage-heading h1{font-size:26px;line-height:1.4;font-weight:650;letter-spacing:-.5px;margin:0}.stage-heading-status{color:var(--muted);font-size:12px}.structure-button{display:inline-flex;align-items:center;gap:6px;font-size:12px;background:transparent;border:1px solid var(--color-rule-strong);border-radius:var(--radius-md);padding:8px 10px;color:var(--muted-strong)}.structure-button:hover{background:var(--color-accent-soft);color:var(--text)}.view-tabs{display:flex;align-items:stretch;gap:28px;border-bottom:1px solid var(--line);margin-bottom:24px}.view-tabs button{display:inline-flex;gap:8px;align-items:center;padding:12px 0;background:none;border:0;border-bottom:2px solid transparent;color:var(--muted);font-size:14px;white-space:nowrap}.view-tabs button[aria-selected=true]{color:var(--text);font-weight:600;border-bottom-color:var(--accent)}.tab-count{font-size:11px;line-height:1.4;padding:2px 6px;border-radius:var(--radius-xs);color:var(--muted-strong);background:var(--color-paper-soft);font-weight:400}.current-section{margin-bottom:28px}.focus-paper{border:1px solid var(--color-accent);background:var(--color-brand-panel);border-radius:var(--radius-lg);overflow:hidden}.focus-context{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 22px;border-bottom:1px solid var(--color-accent);background:var(--color-brand-panel);font-size:12px}.focus-context strong{font-weight:600;color:var(--color-accent)}.focus-context>span{color:var(--color-ink-soft)}.focus-content{padding:22px 24px 17px}.focus-title{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:17px}.focus-title h2{font-size:22px;font-weight:650;letter-spacing:-.4px;line-height:1.5;margin:0}.focus-title .status{margin-top:4px}.status{display:inline-flex;align-items:center;gap:4px;color:var(--muted-strong);font-size:12px;white-space:nowrap;line-height:1.5}.status.pending,.status.revised{background:var(--color-accent-soft);border:1px solid var(--color-accent);border-radius:var(--radius-xs);padding:2px 7px;color:var(--color-ink-soft)}.status.accepted,.status.confirmed,.status.ready{color:var(--color-success)}.status.rejected{color:var(--muted)}.status.failed{color:var(--color-danger)}.focus-summary h2{font-size:22px;font-weight:600;line-height:1.5;margin:0 0 10px}.focus-summary p{margin:0;color:var(--muted-strong);font-size:15px;white-space:pre-wrap}.focus-summary .text-button{margin-top:14px;color:var(--accent)}.prose{font-size:15px;line-height:1.85;color:var(--color-ink-soft);overflow-wrap:anywhere}.prose p{margin:0 0 13px}.prose>:last-child{margin-bottom:0}.prose h1,.prose h2,.prose h3,.prose h4{font-family:inherit;font-size:16px;font-weight:600;color:var(--text);margin:22px 0 10px}.prose pre{white-space:pre-wrap}.prose ul,.prose ol{padding-left:23px}.prose table{border-collapse:collapse;width:100%;font-size:13px;table-layout:fixed}.prose td,.prose th{border:1px solid var(--line);padding:8px;text-align:left}.prose blockquote{border-left:2px solid var(--color-accent);padding-left:15px;margin-left:0;color:var(--color-ink-soft)}.prose dt{color:var(--muted);font-size:12px;margin-top:13px}.prose dd{margin:3px 0 0}.paper-footer{display:flex;align-items:flex-start;flex-wrap:wrap;gap:8px 20px;margin-top:20px;padding-top:12px;border-top:1px solid var(--color-rule);color:var(--muted);font-size:12px}.paper-footer>button{margin-left:auto}.paper-footer summary{cursor:pointer;padding:4px 0}.paper-footer details{flex:1;min-width:0}.paper-footer blockquote{margin:13px 0;border-left:1px solid var(--line-strong);padding-left:12px;line-height:1.7;overflow-wrap:anywhere}.paper-footer blockquote small{display:block;margin-top:6px;font-size:12px;color:var(--muted)}.copy-error{color:var(--color-danger);font-size:12px;margin:10px 0 0}.unresolved{border-top:1px dashed var(--line-strong);margin-top:18px;padding-top:13px;font-size:13px;color:var(--color-warning)}.unresolved strong{font-size:12px;font-weight:500}.unresolved p{margin:6px 0 0}.record-group,.notes-group,.sources{border:1px solid var(--line);background:var(--color-paper-raised);border-radius:var(--radius-lg);overflow:hidden;margin:0 0 26px}.record-heading{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:15px 20px;background:var(--color-paper-soft)}.record-heading h2{font-size:13px;font-weight:600;margin:0;color:var(--color-ink-soft)}.record-heading>span{font-size:12px;color:var(--muted)}.artifact-fold{margin:0 20px;border-top:1px solid var(--line)}.artifact-fold:first-of-type{border-top:0}.artifact-fold>summary{display:flex;align-items:center;gap:12px;padding:18px 0;list-style:none;cursor:pointer}.artifact-fold>summary>span:first-child{flex:1;font-size:14px;line-height:1.65;color:var(--color-ink)}.artifact-fold>summary>svg{color:var(--muted);transition:transform .14s ease}summary::-webkit-details-marker{display:none}details[open]>summary>svg:last-child{transform:rotate(180deg)}.fold-body{padding:0 0 20px}.fold-body .prose{font-size:14px}.notes-group dl{margin:0;padding:0 20px}.notes-group dl>div{padding:18px 0;border-top:1px solid var(--line)}.notes-group dl>div:first-child{border-top:0}.notes-group dt{font-size:13px;font-weight:600;margin-bottom:8px}.notes-group dd{margin:0;color:var(--muted-strong);font-size:14px;line-height:1.8;white-space:pre-wrap}.booklet-document{background:var(--document);border:1px solid var(--color-rule-strong);border-radius:var(--radius-lg);overflow:hidden}.booklet-cover{display:flex;align-items:center;gap:14px;padding:26px 28px;background:var(--color-paper-soft);border-bottom:1px solid var(--color-rule-strong)}.booklet-cover>svg{color:var(--accent);flex:none}.booklet-cover h2{margin:0 0 6px;font-size:22px;line-height:1.4;font-weight:600}.booklet-cover p{font-size:12px;color:var(--color-ink-soft);margin:0}.document-count{margin-left:auto;color:var(--color-ink-soft);font-size:12px;white-space:nowrap}.chapter{padding:28px 0;margin:0 28px;border-top:1px solid var(--color-rule)}.chapter:first-of-type{border-top:0}.chapter-head{display:flex;align-items:baseline;gap:12px;margin-bottom:13px}.chapter-head h3{flex:1;font-size:18px;font-weight:650;line-height:1.5;margin:0}.chapter-number{flex:none;width:22px;font-size:12px;color:var(--color-ink-soft);font-variant-numeric:tabular-nums}.chapter-body{margin-left:34px}.chapter-current .chapter-number{color:var(--accent)}.chapter .paper-footer{border-top:0;margin-top:15px;padding-top:0}.booklet-empty,.view-empty{padding:28px;border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--surface)}.booklet-empty>svg,.view-empty>svg{color:var(--muted-strong);margin-bottom:18px}.booklet-empty h2,.view-empty h2{font-size:20px;font-weight:550;margin:0 0 10px}.booklet-empty p,.view-empty p{color:var(--muted);font-size:13px;margin:0}.booklet-empty ol{margin:24px 0 0;padding:22px 0 0;border-top:1px solid var(--line);list-style:none;counter-reset:chapters;display:grid;grid-template-columns:1fr 1fr;gap:17px 25px}.booklet-empty li{counter-increment:chapters;font-size:14px;color:var(--color-ink-soft)}.booklet-empty li:before{content:counter(chapters,decimal-leading-zero);font-size:11px;color:var(--muted);margin-right:12px}.view-empty{margin-bottom:26px}.view-empty .text-button{color:var(--accent);margin-top:14px}[data-buddy-object-id]{scroll-margin-top:calc(var(--header-height, 130px) + 22px)}.draft{padding:18px;border:1px dashed var(--line-strong);border-radius:var(--radius-lg);margin-bottom:26px}.draft h2{font-size:18px;margin:10px 0}.sources article{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:18px 20px;border-top:1px solid var(--line)}.sources strong{font-size:14px;font-weight:500;overflow-wrap:anywhere}.sources p{font-size:12px;color:var(--muted);margin:8px 0 0}.sources>.empty{padding:0 20px 18px;margin:0}.empty{color:var(--muted);font-size:13px}.notice{background:var(--color-paper-soft);border-left:2px solid var(--accent);padding:12px 16px;margin:0 0 20px;color:var(--muted-strong);font-size:13px;line-height:1.6}.page-footer{font-size:12px;color:var(--muted);padding:8px 0;margin-top:24px}.section-title{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:16px}.section-title h1,.section-title h2{font-size:16px;margin:0;font-weight:600}.section-title>span{font-size:12px;color:var(--muted)}.structure-dialog{width:min(560px,calc(100vw - 24px));max-width:none;max-height:calc(100dvh - 24px);padding:0;border:1px solid var(--color-rule-strong);border-radius:var(--radius-lg);background:var(--color-paper-raised);color:var(--text)}.structure-dialog::backdrop{background:var(--color-overlay)}.structure-dialog .dialog-header{position:sticky;top:0;background:var(--color-paper-soft);z-index:1}.dialog-context{display:block;margin-bottom:5px;font-size:12px;color:var(--muted-strong)}.icon-button{display:flex;align-items:center;justify-content:center;padding:6px;border-radius:var(--radius-md);border:1px solid var(--color-rule-strong);background:none;color:var(--muted-strong)}.icon-button:hover{background:var(--color-accent-soft);color:var(--text)}.structure-content{padding:24px}.structure-group+.structure-group{margin-top:26px}.structure-group-title{display:flex;align-items:center;gap:12px;margin-bottom:9px}.structure-index{width:23px;height:23px;display:flex;align-items:center;justify-content:center;border:1px solid var(--color-rule-strong);border-radius:50%;font-size:12px;color:var(--color-ink-soft)}.structure-group-title h3{font-size:15px;font-weight:600;margin:0}.structure-topics{margin-left:11px;padding-left:24px;border-left:1px solid var(--color-rule)}.structure-group>.empty{margin-left:36px}.outline-topic{display:flex;align-items:baseline;gap:12px;padding:10px 0;font-size:13px}.outline-topic>span,.outline-topic button{flex:1;min-width:0}.outline-topic button{display:flex;gap:6px;align-items:baseline;text-align:left;border:0;padding:0;background:none;line-height:1.65}.outline-topic button>svg{flex:none;color:var(--muted)}.outline-topic button:hover{color:var(--accent)}.outline-topic small{font-size:12px;color:var(--muted);flex:none;display:inline-flex;align-items:center;gap:4px}.outline-topic.current>*{color:var(--accent)}.loading{min-height:100dvh;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;padding:24px}.loading h1{font-size:20px;font-weight:500;margin:0}.loading p{font-size:13px;color:var(--muted);margin:0}.loading-lines{width:min(100%,340px);display:grid;gap:12px}.loading-lines i{background:var(--color-paper-soft);height:12px;border-radius:var(--radius-xs)}.loading-lines i:last-child{width:60%}@media(max-width:640px){.header-inner,.workspace{padding-left:18px;padding-right:18px}.stage-link{gap:7px;padding:9px 8px}.project-name{padding-left:10px;margin-left:2px}.focus-context{padding:12px 18px}.focus-content{padding:19px 18px 15px}.focus-title{flex-wrap:wrap;gap:9px}.focus-title h2{font-size:21px}.focus-title .status{margin-top:0}.booklet-cover{padding:22px}.chapter{margin:0 22px}.chapter-body{margin-left:0}}@media(max-width:420px){.header-inner,.workspace{padding-left:14px;padding-right:14px}.stage-nav{gap:5px}.stage-link{padding:8px 6px;gap:4px}.step-number{width:20px;height:20px}.stage-name{font-size:14px}.stage-link small{font-size:10px}.activity-status{font-size:11px}.position-row .muted{display:none}.focus-context{align-items:flex-start}.focus-context>span{max-width:65%;text-align:right}.booklet-empty ol{grid-template-columns:1fr}.view-tabs{gap:23px}.artifact-fold{margin:0 16px}.artifact-fold>summary{gap:8px}.chapter-head{flex-wrap:wrap;gap:9px}.structure-content{padding:20px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}.completion-notice{padding:16px 20px;margin-bottom:24px;border-left:2px solid var(--accent);background:var(--color-brand-panel)}.completion-notice h2{margin:0 0 6px;font-size:17px;line-height:1.5}.completion-notice p{margin:0;color:var(--muted-strong);font-size:13px;line-height:1.7}.completion-notice.failed{border-left-color:var(--color-danger)}.service-section{margin:24px 0}.map-frame{border:1px solid var(--line);border-radius:var(--radius-lg);overflow:hidden;background:var(--color-paper-raised)}.map-caption{display:flex;justify-content:space-between;gap:12px;font-size:12px;color:var(--muted);padding:16px 18px 0}.service-stage-guide{margin:18px;display:grid;gap:16px}.service-stage-guide>div{display:grid;grid-template-columns:56px minmax(0,1fr);gap:14px;align-items:baseline}.service-stage-guide dt{font-size:12px;color:var(--muted)}.service-stage-guide dd{margin:0;font-size:13px;line-height:1.65}.service-stage-guide strong{font-weight:550;color:var(--text)}.service-stage-guide p{margin:3px 0 0;color:var(--muted)}.service-stage-meaning{color:var(--muted);font-size:13px;line-height:1.7}.service-policy-update{margin:0 18px;padding:12px 0;border-top:1px solid var(--line);color:var(--accent);font-size:12px;line-height:1.65}.subscription-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:0;padding:14px 18px 0}.subscription-summary dt{color:var(--muted);font-size:12px}.subscription-summary dd{margin:5px 0 0;font-size:14px;line-height:1.5;overflow-wrap:anywhere}.service-blueprint-pane{min-width:0;background:var(--color-paper-raised)}.service-pane-head{padding:20px 24px 12px}.service-pane-head span{display:block;font-size:12px;color:var(--muted);margin-bottom:8px}.service-pane-head strong{font-size:17px;font-weight:550}.service-blueprint-status{display:flex;gap:20px;padding:6px 24px 0;font-size:12px;color:var(--muted)}.service-blueprint-status span{display:flex;align-items:center;gap:6px}.service-blueprint-status i{height:6px;width:6px;border:1px solid var(--muted);border-radius:50%}.service-blueprint-status .status-suggested{background:var(--muted)}.service-blueprint-status .status-confirmed{background:var(--accent);border-color:var(--accent)}.service-map{position:relative;height:640px}.service-transition-lines{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;opacity:0}.service-map.connectors-ready .service-transition-lines{opacity:1}.service-transition-lines path:not([d^=M0]){fill:none;stroke:var(--color-rule-strong);stroke-width:1.3;vector-effect:non-scaling-stroke;marker-end:var(--service-arrow)}.service-transition-lines marker path{fill:var(--color-rule-strong)}.service-transition-lines .line-paid-renewal{stroke:var(--accent)}.service-transition-lines .system-line{stroke-dasharray:4 4}.service-stage-card{position:absolute;z-index:2;width:34%;height:218px;display:flex;flex-direction:column;align-items:flex-start;padding:18px;border:1px solid var(--color-rule-strong);border-radius:var(--radius-lg);background:var(--color-paper-raised);text-align:left}.service-stage-card:hover{border-color:var(--accent)}.service-stage-card.selected{border-color:var(--accent);background:var(--color-accent-soft)}.service-stage-card>span{font-size:13px;font-weight:550;color:var(--accent)}.service-stage-card>strong{margin-top:12px;color:var(--text);font-size:15px;font-weight:500;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.service-stage-card>small{font-size:12px;color:var(--muted);margin-top:8px;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.service-stage-card>em{font-size:12px;font-style:normal;color:var(--muted);margin-top:auto;padding-top:8px}.service-stage-card.status-confirmed>em{color:var(--accent)}.service-stage-card.stage-acquisition{top:11%;left:4%}.service-stage-card.stage-paid{top:11%;right:4%}.service-stage-card.stage-maintenance{bottom:8%;left:31%}.service-stage-core{width:100%;display:grid;gap:7px;margin:12px 0 0}.service-stage-core>div{display:grid;grid-template-columns:90px 1fr;gap:8px}.service-stage-core dt{color:var(--muted);font-size:12px;line-height:1.5}.service-stage-core dd{margin:0;font-size:12px;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.service-stage-card.has-core-plan{height:270px}.service-stage-card.has-core-plan.stage-maintenance{height:185px}.transition-chip{position:absolute;z-index:3;display:inline-flex;align-items:center;gap:4px;padding:6px 8px;border:1px solid var(--color-rule-strong);border-radius:var(--radius-pill);background:var(--color-accent-soft);color:var(--color-ink-soft);font-size:12px;white-space:nowrap;opacity:0}.service-map.connectors-ready .transition-chip{opacity:1}.transition-chip:hover,.transition-chip.selected{border-color:var(--accent);color:var(--accent);background:var(--color-accent-soft)}.transition-chip.system-transition{border-style:dashed}.compact-blueprint .service-map{height:400px}.compact-blueprint .service-stage-card{width:34%;height:126px;padding:13px}.compact-blueprint .service-stage-card>strong{font-size:13px;margin-top:8px}.compact-blueprint .service-stage-card>em{font-size:12px}.compact-blueprint .service-stage-card.stage-maintenance{bottom:11%}.compact-blueprint .transition-chip{font-size:11px;padding:5px 7px}.service-blueprint-summary{display:grid;grid-template-columns:repeat(4,1fr);padding:18px 24px;gap:18px;border-top:1px solid var(--line)}.service-blueprint-summary span{display:block;color:var(--muted);font-size:12px;margin-bottom:8px}.service-blueprint-summary strong{font-size:13px;font-weight:500;line-height:1.6;overflow-wrap:anywhere}.map-hint{text-align:center;margin:0;padding:0 16px 18px;font-size:12px;color:var(--muted)}.service-detail{border-top:1px solid var(--line);padding:20px}.service-detail h3{font-size:16px;font-weight:550;margin:0}.service-detail dl{margin:0}.service-detail dl>div{display:grid;grid-template-columns:92px 1fr;gap:12px;margin-top:12px;font-size:14px;line-height:1.7}.service-detail dt{color:var(--muted);font-size:12px}.service-detail dd{margin:0;overflow-wrap:anywhere}.service-detail .empty{font-size:12px;margin:18px 0 0}.blueprint-dialog{width:min(1140px,calc(100vw - 24px));max-width:none;max-height:calc(100dvh - 24px);padding:0;border:1px solid var(--line-strong);border-radius:var(--radius-lg);background:var(--color-paper-raised);color:var(--text)}.blueprint-dialog::backdrop{background:var(--color-overlay)}.dialog-header{display:flex;align-items:center;justify-content:space-between;padding:14px 22px;border-bottom:1px solid var(--line)}.dialog-header h2{margin:0;font-size:17px;font-weight:550}.dialog-scroll{overflow:auto;max-height:calc(100dvh - 95px)}.large-map{min-width:740px}.large-map .service-stage-core{display:none}.large-map .service-stage-card.has-core-plan{height:218px}@media(max-width:480px){.map-caption{padding:14px 12px 0;font-size:11px}.subscription-summary{padding:12px 12px 0}.service-stage-guide{margin:16px 12px;gap:14px}.service-stage-guide>div{gap:10px}.compact-blueprint .service-stage-card{padding:10px}.compact-blueprint .service-stage-card>span{font-size:12px}.compact-blueprint .transition-chip{font-size:10px;padding:5px;gap:2px}.service-detail dl>div{grid-template-columns:74px 1fr;gap:10px}}
2
+
3
+ /* Platform brand patch; retain upstream layout and read-only behavior. */
4
+ .brand::before{content:"";width:28px;height:28px;flex:none;background:url("../brand-logo.png") center/contain no-repeat}.brand>svg{display:none}.stage-link.selected,.stage-link.selected.in-progress{color:var(--color-accent)}.structure-button,.icon-button{min-height:40px}.brand-row{height:64px}
@@ -0,0 +1,100 @@
1
+ /* Dada product palette: cool white, ink and the supplied cyan brand mark.
2
+ Controls: 12px; content panels: 20px; brand surfaces: 28px; status: pill. */
3
+ :root {
4
+ color-scheme: light;
5
+ --color-paper: #f4f8fc;
6
+ --color-paper-soft: #eaf1f7;
7
+ --color-paper-raised: #ffffff;
8
+ --color-ink: #203344;
9
+ --color-ink-strong: #102738;
10
+ --color-ink-soft: #506577;
11
+ --color-muted: #566d80;
12
+ --color-rule: #dce6ee;
13
+ --color-rule-strong: #b5c9d8;
14
+ --color-accent: #007399;
15
+ --color-accent-hover: #006889;
16
+ --color-accent-soft: #e0f5fd;
17
+ --color-accent-ink: #ffffff;
18
+ --color-brand-bright: #24c9f1;
19
+ --color-brand-panel: #e3f5fc;
20
+ --color-focus: #007399;
21
+ --color-success: #13704e;
22
+ --color-success-soft: #e5f5ed;
23
+ --color-warning: #85531b;
24
+ --color-warning-soft: #fff1da;
25
+ --color-danger: #b33845;
26
+ --color-danger-soft: #ffedf0;
27
+ --color-overlay: rgb(12 31 48 / 38%);
28
+ --color-shadow: rgb(27 74 106 / 8%);
29
+ --color-transparent: transparent;
30
+ --font-display: "SF Pro Display", "PingFang SC", "Microsoft YaHei", sans-serif;
31
+ --font-body: "SF Pro Text", "PingFang SC", "Microsoft YaHei", sans-serif;
32
+ --font-mono: "SFMono-Regular", Consolas, monospace;
33
+ --space-3xs: .125rem;
34
+ --space-2xs: .25rem;
35
+ --space-xs: .5rem;
36
+ --space-sm: .75rem;
37
+ --space-md: 1rem;
38
+ --space-lg: 1.5rem;
39
+ --space-xl: 2.5rem;
40
+ --space-2xl: 4rem;
41
+ --space-3xl: 6rem;
42
+ --space-4xl: 9rem;
43
+ --text-xs: .75rem;
44
+ --text-sm: .875rem;
45
+ --text-base: 1rem;
46
+ --text-md: 1.125rem;
47
+ --text-lg: 1.25rem;
48
+ --text-xl: 1.625rem;
49
+ --text-2xl: 2rem;
50
+ --text-display: clamp(2rem, 3.2vw, 2.75rem);
51
+ --ease-out: cubic-bezier(.16, 1, .3, 1);
52
+ --dur-micro: 100ms;
53
+ --dur-short: 180ms;
54
+ --dur-long: 320ms;
55
+ --rule-thin: 1px;
56
+ --radius-xs: .5rem;
57
+ --radius-sm: .75rem;
58
+ --radius-md: .75rem;
59
+ --radius-lg: 1.25rem;
60
+ --radius-xl: 1.75rem;
61
+ --radius-pill: 999px;
62
+ --control-height: 3rem;
63
+ --shadow-whisper: 0 4px 16px var(--color-shadow);
64
+ --shadow-sheet: 0 16px 48px var(--color-shadow);
65
+ --z-base: 1;
66
+ --z-raised: 10;
67
+ --z-dropdown: 100;
68
+ --z-sticky: 200;
69
+ --z-modal: 400;
70
+ --z-toast: 500;
71
+ --z-tooltip: 600;
72
+ }
73
+ @media (prefers-color-scheme: dark) {
74
+ :root {
75
+ color-scheme: dark;
76
+ --color-paper: #101922;
77
+ --color-paper-soft: #203240;
78
+ --color-paper-raised: #17242f;
79
+ --color-ink: #e3edf5;
80
+ --color-ink-strong: #f4faff;
81
+ --color-ink-soft: #b1c3d1;
82
+ --color-muted: #98afc0;
83
+ --color-rule: #2d4252;
84
+ --color-rule-strong: #4b677b;
85
+ --color-accent: #46cef0;
86
+ --color-accent-hover: #82e5ff;
87
+ --color-accent-soft: #143b4b;
88
+ --color-accent-ink: #092e3b;
89
+ --color-brand-panel: #14303f;
90
+ --color-focus: #46cef0;
91
+ --color-success: #7ae0b0;
92
+ --color-success-soft: #173b31;
93
+ --color-warning: #efc787;
94
+ --color-warning-soft: #3b3021;
95
+ --color-danger: #ff9aa5;
96
+ --color-danger-soft: #402a33;
97
+ --color-overlay: rgb(2 10 18 / 65%);
98
+ --color-shadow: rgb(0 8 18 / 25%);
99
+ }
100
+ }
@@ -0,0 +1,5 @@
1
+ <!doctype html><html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="color-scheme" content="light dark"><link rel="icon" type="image/png" href="./brand-logo.png"><link rel="stylesheet" href="./brand.css"><title>Buddy · 创作手册</title> <script type="module" crossorigin src="./assets/index-B5VmkoSx.js"></script>
2
+ <link rel="stylesheet" crossorigin href="./assets/index-DWKP6b-3.css">
3
+ <link rel="stylesheet" href="./reader.css?v=1">
4
+ <script type="module" src="./reader.js?v=1"></script>
5
+ </head><body><div id="root"></div></body></html>
@@ -0,0 +1,165 @@
1
+ /* Booklet reading experience. Shared colors and type come from brand.css. */
2
+ .header-inner, .workspace { max-width: 1184px; padding-inline: 32px; }
3
+ .preview-header { box-shadow: 0 4px 16px var(--color-shadow); }
4
+ .header-inner { padding-bottom: 12px; }
5
+ .brand-row { height: 58px; }
6
+ .brand { gap: 12px; }
7
+ .brand::before { width: 30px; height: 30px; }
8
+ .brand strong { font-size: 16px; letter-spacing: -.02em; }
9
+ .project-name { max-width: 32ch; font-size: 13px; }
10
+ .activity-status { font-size: 12px; }
11
+ .stage-nav { gap: 8px; }
12
+ .stage-link { min-height: 52px; padding: 9px 14px; gap: 10px; }
13
+ .stage-link.selected, .stage-link.selected.in-progress { border-color: transparent; }
14
+ .stage-link small { margin-top: 3px; font-size: 11px; }
15
+ .step-number { width: 28px; height: 28px; border-radius: 9px; background: var(--color-paper); border: 0; }
16
+ .selected .step-number { background: var(--color-accent); color: var(--color-accent-ink); }
17
+ .position-row { padding-top: 10px; }
18
+ .workspace { padding-top: 24px; padding-bottom: 24px; }
19
+ .stage-heading { margin-bottom: 16px; }
20
+ .stage-heading h1 { font-size: 27px; letter-spacing: -.035em; }
21
+ .stage-heading-status { padding: 5px 10px; border-radius: var(--radius-pill); background: var(--color-paper-soft); }
22
+ .structure-button, .icon-button { min-height: 38px; background: var(--color-paper-raised); }
23
+ .structure-button { padding: 8px 12px; }
24
+ .view-tabs { display: inline-flex; gap: 4px; padding: 4px; margin-bottom: 20px; border: 1px solid var(--color-rule); border-radius: 16px; background: var(--color-paper-raised); max-width: 100%; }
25
+ .view-tabs button { min-height: 36px; padding: 7px 16px; border: 0; border-radius: 11px; }
26
+ .view-tabs button[aria-selected=true] { background: var(--color-accent-soft); color: var(--color-accent); }
27
+ .view-tabs button[aria-selected=true] .tab-count { background: var(--color-paper-raised); color: var(--color-accent); }
28
+ .view-tabs button:hover { color: var(--color-accent); }
29
+ .tab-count { padding: 3px 7px; border-radius: var(--radius-pill); }
30
+ .booklet:has(.reader-navigation) { display: grid; grid-template-columns: minmax(0, 1fr) 200px; gap: 20px; align-items: start; }
31
+ .booklet > .draft { grid-column: 1 / -1; }
32
+ .booklet-document { min-width: 0; border-color: var(--color-rule); border-radius: 20px; box-shadow: var(--shadow-whisper); }
33
+ .booklet-cover { padding: 20px 26px; gap: 12px; background: var(--color-brand-panel); border-color: var(--color-rule); }
34
+ .booklet-cover > svg { width: 26px; height: 26px; }
35
+ .booklet-cover h2 { font-size: 22px; letter-spacing: -.025em; }
36
+ .booklet-cover p { font-size: 13px; line-height: 1.7; }
37
+ .document-count { background: var(--color-paper-raised); border-radius: 10px; padding: 7px 10px; color: var(--color-accent); }
38
+ .chapter { margin: 0 26px; padding: 24px 0; }
39
+ .chapter-head { align-items: center; gap: 10px; margin-bottom: 14px; }
40
+ .chapter-number { display: grid; place-items: center; width: 26px; height: 26px; border-radius: 8px; background: var(--color-paper); color: var(--color-muted); }
41
+ .chapter-current .chapter-number { background: var(--color-accent-soft); color: var(--color-accent); }
42
+ .chapter-head h3 { font-size: 18px; letter-spacing: -.02em; }
43
+ .chapter-body { margin-left: 0; }
44
+ .chapter .prose { color: var(--color-ink); font-size: 14px; line-height: 1.8; }
45
+ .prose p { margin-bottom: 12px; }
46
+ .prose h1, .prose h2, .prose h3, .prose h4 { margin-top: 18px; margin-bottom: 9px; }
47
+ .prose li + li { margin-top: 5px; }
48
+ .prose a { color: var(--color-accent); text-underline-offset: 3px; }
49
+ .prose blockquote { padding: 10px 14px; margin: 14px 0; background: var(--color-accent-soft); border-radius: 0 12px 12px 0; }
50
+ .prose pre { padding: 16px; border-radius: 12px; background: var(--color-paper); font: 13px/1.8 var(--font-mono); }
51
+ .prose table { line-height: 1.7; }
52
+ .prose th { background: var(--color-paper); }
53
+ .status { font-size: 12px; }
54
+ .status.pending, .status.revised { padding: 5px 9px; border: 0; border-radius: var(--radius-pill); color: var(--color-accent); }
55
+ .status.accepted, .status.confirmed, .status.ready { padding: 5px 9px; background: var(--color-success-soft); border-radius: var(--radius-pill); }
56
+ .paper-footer { align-items: center; gap: 12px; }
57
+ .chapter .paper-footer { margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--color-rule); }
58
+ .paper-footer > .text-button { min-height: 36px; padding: 7px 10px; border-radius: 11px; background: var(--color-paper); color: var(--color-accent); }
59
+ .paper-footer > .text-button:hover { background: var(--color-accent-soft); }
60
+ .paper-footer summary { display: inline-flex; align-items: center; min-height: 40px; padding: 8px 0; }
61
+ .unresolved { margin-top: 16px; padding: 12px 14px; border: 0; border-radius: 12px; background: var(--color-warning-soft); }
62
+ .unresolved strong { font-weight: 600; }
63
+ .reader-navigation { position: sticky; top: calc(var(--header-height, 160px) + 24px); min-width: 0; padding: 14px 10px 12px; border: 1px solid var(--color-rule); border-radius: 16px; background: var(--color-paper-raised); max-height: calc(100dvh - var(--header-height, 160px) - 48px); overflow-y: auto; }
64
+ .reader-navigation > summary { display: flex; align-items: center; gap: 10px; padding: 0 8px 10px; list-style: none; cursor: pointer; }
65
+ .reader-navigation > summary strong { flex: 1; font-size: 13px; font-weight: 600; }
66
+ .reader-navigation > summary > span { font-size: 12px; color: var(--color-muted); }
67
+ .reader-navigation > summary::after { content: "+"; font-size: 18px; color: var(--color-muted); }
68
+ .reader-navigation[open] > summary::after { content: "−"; }
69
+ .reader-navigation:not([open]) > summary { padding-bottom: 0; }
70
+ .reader-navigation ol { padding: 0; margin: 0; list-style: none; display: grid; gap: 4px; }
71
+ .reader-navigation a { display: flex; gap: 10px; align-items: baseline; padding: 8px 10px; min-height: 38px; border-radius: 11px; font-size: 13px; line-height: 1.6; text-decoration: none; color: var(--color-ink-soft); }
72
+ .reader-navigation a:hover { background: var(--color-paper); color: var(--color-accent); }
73
+ .reader-navigation a[aria-current] { background: var(--color-accent-soft); color: var(--color-accent); font-weight: 600; }
74
+ .reader-chapter-number { flex: none; color: var(--color-muted); font-size: 11px; font-variant-numeric: tabular-nums; }
75
+ .reader-navigation a[aria-current] .reader-chapter-number { color: var(--color-accent); }
76
+ .reader-pending { display: block; font-size: 11px; font-weight: 400; color: var(--color-muted); }
77
+ .reader-hint { margin: 12px 8px 0; padding-top: 12px; border-top: 1px solid var(--color-rule); font-size: 12px; color: var(--color-muted); line-height: 1.8; }
78
+ .focus-paper { border-color: var(--color-rule); background: var(--color-paper-raised); box-shadow: var(--shadow-whisper); }
79
+ .focus-context { padding: 12px 22px; border-color: var(--color-rule); }
80
+ .focus-content { padding: 20px 24px; }
81
+ .record-heading { padding: 14px 20px; background: var(--color-paper-raised); }
82
+ .record-heading h2 { font-size: 14px; color: var(--color-ink); }
83
+ .artifact-fold > summary { min-height: 52px; padding-block: 13px; border-radius: 8px; }
84
+ .artifact-fold > summary:hover { color: var(--color-accent); }
85
+ .artifact-fold > summary:hover > span:first-child { color: var(--color-accent); }
86
+ .booklet-empty, .view-empty { padding: 28px; }
87
+ .booklet-empty > svg, .view-empty > svg { width: 36px; height: 36px; color: var(--color-accent); }
88
+ .booklet-empty h2, .view-empty h2 { font-size: 21px; }
89
+ .booklet-empty ol { gap: 16px 24px; }
90
+ .notice, .completion-notice { border: 1px solid var(--color-rule); border-radius: 16px; background: var(--color-brand-panel); }
91
+ .structure-dialog { width: min(620px, calc(100vw - 32px)); border: 1px solid var(--color-rule); border-radius: 24px; box-shadow: var(--shadow-sheet); }
92
+ .structure-dialog .dialog-header { padding: 16px 22px; background: var(--color-paper-raised); }
93
+ .structure-content { padding: 20px; }
94
+ .structure-group + .structure-group { margin-top: 22px; }
95
+ .outline-topic { align-items: center; padding: 5px 0; gap: 14px; }
96
+ .outline-topic button, .outline-topic > span { min-height: 44px; padding: 10px; border-radius: 10px; }
97
+ .outline-topic button:hover { background: var(--color-accent-soft); }
98
+ .page-footer { padding-top: 20px; text-align: center; line-height: 1.8; }
99
+ button, a, summary { transition: color var(--dur-short) ease, background-color var(--dur-short) ease, border-color var(--dur-short) ease; }
100
+ button:active { opacity: 1; }
101
+ button:focus-visible, a:focus-visible, summary:focus-visible, .chapter:focus-visible { outline: 2px solid var(--color-focus); outline-offset: 4px; }
102
+ @media (max-width: 900px) {
103
+ .header-inner, .workspace { padding-inline: 24px; }
104
+ .booklet:has(.reader-navigation) { display: flex; flex-direction: column; gap: 16px; }
105
+ .booklet > * { width: 100%; }
106
+ .booklet > .draft { order: -2; }
107
+ .reader-navigation { order: -1; position: static; max-height: none; padding: 16px; border-radius: 16px; }
108
+ .reader-navigation > summary { padding: 0; min-height: 24px; }
109
+ .reader-navigation[open] > summary { padding-bottom: 14px; }
110
+ .reader-navigation ol { grid-template-columns: repeat(2, minmax(0, 1fr)); }
111
+ .reader-hint { margin-inline: 8px; }
112
+ .stage-link { padding: 11px 12px; gap: 9px; }
113
+ }
114
+ @media (max-width: 600px) {
115
+ .header-inner, .workspace { padding-inline: 16px; }
116
+ .brand-row { height: 56px; gap: 12px; }
117
+ .brand { gap: 8px; flex-wrap: wrap; }
118
+ .brand::before { width: 28px; height: 28px; }
119
+ .brand strong { font-size: 16px; }
120
+ .project-name { max-width: 15ch; font-size: 11px; border: 0; margin: 0; padding-left: 0; }
121
+ .activity-status { max-width: 40%; font-size: 11px; }
122
+ .activity-status small { max-width: 16ch; }
123
+ .stage-nav { gap: 6px; }
124
+ .stage-link { flex-direction: column; align-items: flex-start; gap: 6px; padding: 8px 10px; min-height: 82px; }
125
+ .stage-name { font-size: 14px; }
126
+ .stage-link small { font-size: 11px; }
127
+ .step-number { width: 24px; height: 24px; font-size: 11px; border-radius: 8px; }
128
+ .workspace { padding-top: 20px; }
129
+ .stage-heading { gap: 10px; margin-bottom: 14px; }
130
+ .stage-heading > div { gap: 8px; }
131
+ .stage-heading h1 { font-size: 25px; }
132
+ .stage-heading-status { font-size: 11px; padding: 4px 7px; }
133
+ .structure-button { font-size: 12px; padding: 9px 11px; }
134
+ .view-tabs { width: 100%; margin-bottom: 20px; gap: 4px; }
135
+ .view-tabs button { flex: 1; justify-content: center; padding: 9px 8px; gap: 6px; font-size: 13px; }
136
+ .tab-count { font-size: 10px; }
137
+ .view-tabs button, .structure-button, .icon-button, .paper-footer > .text-button, .reader-navigation a { min-height: 44px; }
138
+ .booklet-document { border-radius: 20px; }
139
+ .booklet-cover { padding: 18px 20px; gap: 12px; }
140
+ .booklet-cover h2 { font-size: 21px; }
141
+ .booklet-cover > svg { width: 26px; height: 26px; }
142
+ .document-count { font-size: 11px; padding: 6px 8px; }
143
+ .chapter { margin-inline: 20px; padding-block: 22px; }
144
+ .chapter-head { flex-wrap: wrap; gap: 10px; }
145
+ .chapter-head h3 { font-size: 18px; }
146
+ .chapter-head .status { margin-left: auto; }
147
+ .chapter .prose { font-size: 14px; }
148
+ .focus-context { padding: 14px 18px; }
149
+ .focus-content { padding: 18px 20px; }
150
+ .booklet-empty, .view-empty { padding: 26px 22px; }
151
+ .booklet-empty h2, .view-empty h2 { font-size: 21px; }
152
+ .structure-content { padding: 20px; }
153
+ .structure-dialog .dialog-header { padding: 18px 20px; }
154
+ }
155
+ @media (max-width: 374px) {
156
+ .project-name { display: none; }
157
+ .activity-status { max-width: 48%; }
158
+ .stage-link { padding: 9px 7px; }
159
+ .view-tabs button { gap: 4px; padding-inline: 6px; }
160
+ .reader-navigation ol { grid-template-columns: 1fr; }
161
+ .chapter { margin-inline: 16px; }
162
+ }
163
+ @media (prefers-reduced-motion: reduce) {
164
+ *, *::before, *::after { scroll-behavior: auto !important; transition: none !important; animation: none !important; }
165
+ }
@@ -0,0 +1,135 @@
1
+ // Progressive reading controls for the pinned Creator preview. Content and
2
+ // confirmations remain owned by the upstream application and Coding Agent.
3
+ const root = document.getElementById("root");
4
+ const compact = window.matchMedia("(max-width: 900px)");
5
+ const reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
6
+ let currentDocument;
7
+ let navigation;
8
+ let signature = "";
9
+ let frame;
10
+ let chapterObserver;
11
+ let headerObserver;
12
+ let activeId;
13
+
14
+ function markActive(id) {
15
+ activeId = id;
16
+ navigation?.querySelectorAll("a[data-chapter]").forEach(link => {
17
+ if (link.dataset.chapter === id) link.setAttribute("aria-current", "location");
18
+ else link.removeAttribute("aria-current");
19
+ });
20
+ }
21
+
22
+ function observeChapters(chapters) {
23
+ chapterObserver?.disconnect();
24
+ const headerHeight = document.querySelector(".preview-header")?.getBoundingClientRect().height || 0;
25
+ chapterObserver = new IntersectionObserver(entries => {
26
+ const visible = entries.filter(entry => entry.isIntersecting).sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);
27
+ if (visible[0]) markActive(visible[0].target.id);
28
+ }, { rootMargin: `-${Math.ceil(headerHeight + 20)}px 0px -45% 0px` });
29
+ chapters.forEach(chapter => chapterObserver.observe(chapter));
30
+ }
31
+
32
+ function clearNavigation() {
33
+ chapterObserver?.disconnect();
34
+ headerObserver?.disconnect();
35
+ navigation?.remove();
36
+ navigation = undefined;
37
+ currentDocument = undefined;
38
+ signature = "";
39
+ activeId = undefined;
40
+ }
41
+
42
+ function syncNavigation() {
43
+ const book = root.querySelector(".booklet-document");
44
+ if (!book) {
45
+ if (navigation) clearNavigation();
46
+ return;
47
+ }
48
+ const chapters = [...book.querySelectorAll(".chapter[id]")];
49
+ const nextSignature = JSON.stringify(chapters.map(chapter => [chapter.id, chapter.querySelector("h3")?.textContent, chapter.querySelector(".status")?.textContent]));
50
+ if (book === currentDocument && navigation?.isConnected && signature === nextSignature) return;
51
+ const previousOpen = book === currentDocument ? navigation?.open : undefined;
52
+ const previousActive = book === currentDocument ? activeId : undefined;
53
+ clearNavigation();
54
+ currentDocument = book;
55
+ signature = nextSignature;
56
+ if (!chapters.length) return;
57
+
58
+ navigation = document.createElement("details");
59
+ navigation.className = "reader-navigation";
60
+ navigation.open = previousOpen ?? !compact.matches;
61
+ const summary = document.createElement("summary");
62
+ const title = document.createElement("strong");
63
+ title.textContent = "本册目录";
64
+ const count = document.createElement("span");
65
+ count.textContent = `${chapters.length} 章`;
66
+ summary.append(title, count);
67
+ const nav = document.createElement("nav");
68
+ nav.setAttribute("aria-label", "本册章节");
69
+ const list = document.createElement("ol");
70
+ for (const chapter of chapters) {
71
+ const item = document.createElement("li");
72
+ const link = document.createElement("a");
73
+ link.href = `#${encodeURIComponent(chapter.id)}`;
74
+ link.dataset.chapter = chapter.id;
75
+ const number = document.createElement("span");
76
+ number.className = "reader-chapter-number";
77
+ number.textContent = chapter.querySelector(".chapter-number")?.textContent || "";
78
+ const label = document.createElement("span");
79
+ label.textContent = chapter.querySelector("h3")?.textContent || chapter.id;
80
+ const status = chapter.querySelector(".status");
81
+ if (status) link.setAttribute("aria-label", `${label.textContent},${status.textContent}`);
82
+ if (status?.matches(".pending, .revised")) {
83
+ const pending = document.createElement("small");
84
+ pending.className = "reader-pending";
85
+ pending.textContent = status.textContent;
86
+ label.append(pending);
87
+ }
88
+ link.append(number, label);
89
+ item.append(link);
90
+ list.append(item);
91
+ }
92
+ nav.append(list);
93
+ const hint = document.createElement("p");
94
+ hint.className = "reader-hint";
95
+ hint.textContent = "想调整某一章?复制章节下方的修改引用,回到 Coding Agent 继续。";
96
+ navigation.append(summary, nav, hint);
97
+ navigation.addEventListener("click", event => {
98
+ const link = event.target.closest("a[data-chapter]");
99
+ if (!link || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
100
+ const target = document.getElementById(link.dataset.chapter);
101
+ if (!target) return;
102
+ event.preventDefault();
103
+ // Tell upstream to preserve this reading position on the next live update.
104
+ document.dispatchEvent(new Event("buddy:reader-browse"));
105
+ if (compact.matches) navigation.open = false;
106
+ requestAnimationFrame(() => {
107
+ if (!target.isConnected) return;
108
+ target.focus({ preventScroll: true });
109
+ target.scrollIntoView({ behavior: reducedMotion.matches ? "instant" : "smooth", block: "start" });
110
+ markActive(target.id);
111
+ });
112
+ });
113
+ book.after(navigation);
114
+ markActive(previousActive && chapters.some(chapter => chapter.id === previousActive) ? previousActive : chapters[0].id);
115
+ observeChapters(chapters);
116
+ const header = document.querySelector(".preview-header");
117
+ if (header) {
118
+ headerObserver = new ResizeObserver(() => observeChapters(chapters));
119
+ headerObserver.observe(header);
120
+ }
121
+ }
122
+
123
+ function scheduleSync() {
124
+ cancelAnimationFrame(frame);
125
+ frame = requestAnimationFrame(syncNavigation);
126
+ }
127
+
128
+ // Status text, stage changes and replacement snapshots update the outline.
129
+ // Attribute changes from our active marker do not retrigger this observer.
130
+ const observer = new MutationObserver(scheduleSync);
131
+ observer.observe(root, { childList: true, characterData: true, subtree: true });
132
+ compact.addEventListener("change", () => {
133
+ if (navigation) navigation.open = !compact.matches;
134
+ });
135
+ scheduleSync();
@@ -0,0 +1,68 @@
1
+ # 产物与服务蓝图字段
2
+
3
+ 此文件只在形成章节、方法候选、案例或服务方案时读取。所有内容由当前项目真实原话和来源生成;这里定义字段,不提供默认作品或默认服务方案。
4
+
5
+ ## 公共产物结构
6
+
7
+ 每个 artifacts 数组元素严格包含以下必填字段:
8
+
9
+ - id、stage、kind、title、markdown:字符串。
10
+ - evidence:Ref 数组,记录真实输入或资料依据。
11
+ - dependencies:Ref 数组,记录已确认的上游产物。
12
+ - unresolved:影响当前版本确认的未决事项字符串数组;非空时禁止正式确认。已经明确排除在本次范围外的后续版本计划写入正文的范围说明,不重复放入此数组。仍影响当前结论的缺口必须保留。
13
+ - data:可选对象;没有特殊结构时使用 {}。
14
+
15
+ 不要提交 hash 或 revision,工具负责计算。evidence 或 dependencies 至少有一项实际依据。知识、方法、服务产物的 dependencies 应分别引用每个上游阶段实际使用的已确认章节;下游章节还要引用实际使用的方法候选、场景或蓝图。引用对象 hash 必须是当前版本。未决项如允许延后,应在正文准确说明缺口并让创作者校准这个范围;不能为了确认清空仍待解决的具体问题。
16
+
17
+ | kind | stage | 固定 id | data |
18
+ | --- | --- | --- | --- |
19
+ | chapter | definition | definition.1 至 definition.6 | 可留 {},正文对应 catalog 的六章 |
20
+ | chapter | knowledge | knowledge.1 至 knowledge.7 | 可留 {},正文对应七章 |
21
+ | chapter | methods | methods.1 至 methods.5 | 可留 {},正文对应五章 |
22
+ | chapter | service | service.1 至 service.9 | 可留 {},正文对应九章 |
23
+ | hypothesis | methods | hypothesis.H1 至 hypothesis.H4 | 可留 {};先形成 3—4 条不同候选 |
24
+ | scenario | methods | scenario.M01 至 scenario.M04;scenario.E01 至 scenario.E03 | 具体执行写 markdown |
25
+ | blueprint | service | service.blueprint | 使用下节结构 |
26
+ | transition | service | transition.acquisition-paid、transition.acquisition-maintenance、transition.paid-paid、transition.paid-maintenance | trigger、rightsChange、dataInheritance、message 均为非空字符串 |
27
+
28
+ 四册是固定章节的组合,没有 kind:booklet 产物,也不使用 data.chapters。整册确认通过 delivery.confirmationScope=booklet 和该册全部章节 ID;逐章确认用 scope=object 及对应章节。一次不能跨册。
29
+
30
+ 方法候选正式反馈使用 decision:accepted 或 rejected,其他对象使用 confirmed。3—4 条候选均处理且至少一条 accepted 才进入基础场景。基础场景可在创作者回答足够具体时忠实记录,其 data.capture=faithful_user_answer 仅用于刚回答的对应 M01—M04,必须引用本轮精确原话,正文不能新增条件、顺序或推断。新增推导应走正常展示、下一轮确认。E01—E03 必须在四基础有效确认之后生成,并依赖对应基础场景;每次只变一个条件。
31
+
32
+ ## service.blueprint 的 data
33
+
34
+ 可以先保存带未决项的草案;以下字段与业务判断齐备后才能正式确认。字段是内部记录格式,不把这张表变成一次询问用户的清单。智能规划基于已有信息给完整建议,只有实际缺口才追问。
35
+
36
+ | 字段 | 形状与含义 |
37
+ | --- | --- |
38
+ | platformRules | 原样使用 context.catalog.serviceRules;不能复制旧限制 |
39
+ | valueStatement | 非空字符串:持续使用能得到什么 |
40
+ | recurrenceDrivers | 非空字符串数组:持续求助的真实原因 |
41
+ | renewalEvidence | 非空字符串数组:1—3 项可观察成果、变化或下一周期目标 |
42
+ | serviceLoop | 对象,trigger、requiredInput、decision、action、result、feedback、nextCycleUpdate 均为非空字符串 |
43
+ | acquisitionContract | 对象,trigger、requiredInput、completionCriteria、conversionBridge 均为非空字符串;includedSteps 非空字符串数组;excludedSteps 字符串数组,可为 [] |
44
+ | stages | acquisition、paid、maintenance 三个阶段对象;各用 result/service/limit 描述帮助和范围,付费阶段不能将 limit 写成 AI 对话次数 |
45
+ | transitions | 五个键:acquisition-paid、acquisition-maintenance、paid-paid、paid-maintenance、maintenance-paid;每项含 trigger、rightsChange、dataInheritance、message 非空字符串,可另给 title |
46
+ | billingCycle | 严格为 {count:正整数,unit:"day"或"week"或"month"或"year"};用户定义,不默认月度 |
47
+ | price | 这一整个订阅周期对应的正数价格 |
48
+ | cadence | 非空字符串:交付频率,与订阅周期分开 |
49
+ | deliveries | 非空字符串:交付内容与明确时间范围;不能限制普通 AI 对话 |
50
+ | toolLimit | 非空字符串:工具范围及对应时间,未使用额度限制时如实说明,不变相限制聊天 |
51
+ | conversationLimit | 固定为 "unlimited" |
52
+ | humanConversationLimit | 真人服务次数、时长和响应安排的具体说明,与 AI 对话分开;没有真人服务如实说明 |
53
+ | maintenanceContract | basicConversation:true;allowedQuestions 非空字符串,说明实际可答的基础问题,不能只留历史或付费提示 |
54
+ | humanReview | 布尔值,表示是否创作者本人复核 |
55
+ | reviewCapacity | 有本人复核时必填非空字符串,基于真实产能与时间范围;没有依据则保留未决,不能编造 |
56
+ | multiUser | 固定 false,当前单用户单档订阅设计 |
57
+ | experienceMode | "conversation" 或 "custom-component";后者另填 customComponentDescription 具体说明组件 |
58
+ | semanticChecks | 下节各项公开业务判断与真实证据 |
59
+
60
+ semanticChecks 包含 coherentLoop、paidDeliverable、freeScopeAgreed、maintenanceBoundary、transitionsConfirmed、valueBeforePaywall、executableContract;存在本人复核时还包含 creatorCapacity。每项结构为 `{pass:布尔值,evidence:Ref数组}`。pass=true 必须有非空真实依据,不能靠通过结构校验证明语义正确。未通过写 false 并在产物 unresolved 说明待明确内容。
61
+
62
+ guided 模式需四条非默认 transition 产物逐条有效确认,其 data 与 blueprint.data.transitions 中对应对象保持一致。maintenance-paid 为恢复订阅默认路径,保留完整权益与历史继承说明,不新增第五组采访。smart 模式整体展示蓝图、根据反馈修订;正式确认前仍核对五条路径、产能和服务约定,不以模型推测替代创作者意见。
63
+
64
+ 为避免重复生成路径正文,提交 blueprint 时,`data.transitions` 中的四条非默认路径可以使用对应已确认产物的 Ref:`{type:"artifact",id:"transition.paid-paid",hash:已保存版本hash}`。例如宿主可将 `client.artifact_ref('transition.paid-paid')` 赋给 `blueprint['data']['transitions']['paid-paid']`。工具验证 ID、hash 和有效确认后,复制该产物的完整 data,并登记版本依赖,再计算蓝图 hash。保存、预览、导出仍使用展开后的原有蓝图结构;引用不改写源路径,也不会代替用户确认。旧版提交完整路径对象的方式继续有效。
65
+
66
+ 引用必须对应同名路径;不存在、已失效或尚未确认的版本会被拒绝。maintenance-paid 仍提交完整路径对象。显式提交的完整对象不会被工具悄悄纠正;出现“每周”与“每 7 天”等文字差异时,仍按版本一致性门槛拒绝,并返回具体字段差异。路径确实需要变化时,先修订路径并重新展示确认,再据新版本整理蓝图。
67
+
68
+ 服务蓝图正式确认且门槛满足后,才能定稿九章服务手册。订阅时长变化同步核对价格、交付、工具或真人额度和路径文案,不自动等比例涨价或扩大承诺。付费 AI 对话不限次数、维持基础对话与历史、免费范围可持续跟进始终有效。