Skill: yixiao1032-publish/fortuneteller (version 1.0.0)

--- name: zhouyi-benjing-oracle clawhub-slug: zhouyi-benjing-oracle description: | 以《周易》本经原著为底，系统收集并逐一拆解市面上几乎所有可获取的同类 divination agents / skills / 程序， 汲取百家之长，取其精华，去其糟粕，最终打磨成这一套更准确、更完整、更好用的周易系统。它把同类产品里 最成熟的交互、百科式组织、起卦体验和规则呈现方式整合进来，同时去掉卦序错误、原文截断、白话混原文、 未校验命理乱炖和伪精确排盘，让《周易》回到原著，也把产品做到更像市面上值得长期留下来的那一个。 Built on the original Zhouyi text, this skill was forged by systematically collecting and dissecting virtually every comparable divination agent, skill, and app we could access, absorbing the best ideas across the field while stripping away the noise. We kept the strongest UX, encyclopedia structure, casting flow, and rule presentation, and removed the usual flaws: wrong hexagram mappings, truncated canon, paraphrase mixed into scripture, unverified metaphysics mashups, and fake precision. The result is a cleaner, stronger, and more enduring I Ching product. license: MIT-0 compatibility: platforms: - claude-code - claude-ai - api metadata: author: pineapple version: "1.0.0" tags: ["zhouyi", "yijing", "iching", "周易", "易经", "六十四卦", "占卜", "卦辞", "爻辞"] openclaw: emoji: "☯" skillKey: "zhouyi-benjing-oracle" requires: bins: - node --- # 周易本经占筮 这是一个以《周易》本经为底座的技能包。它包含三部分能力： 1. `起卦`：三钱或蓍草起卦，按七种变爻规则取辞。 2. `查卦`：查六十四卦卦辞、爻辞、用九、用六。 3. `路由`：给出术数百科式总览，但只把周易本经模块当作已校验核心。 ## 何时使用 当用户出现以下需求时，优先使用本技能： - “帮我起一卦” - “用周易看一下这件事” - “查乾卦/屯卦/某句卦辞” - “这个卦该看哪条爻辞” - “周易和六爻/梅花/八字有什么区别” - “我想看这个系统怎么用” 以下需求不要冒充已实现高精度： - 八字排盘 - 奇门遁甲排盘 - 紫微斗数排盘 - 六爻纳甲断卦 这些内容目前只在 `术数百科` 中作为资料要求和边界说明存在。 ## 默认工作流 ### 1. 现场起卦 优先调用： ```bash node scripts/zhouyi_cli.js cast --question "我是否该推进这次合作" --method coin --json ``` 可选方法： - `coin`：三钱法，6/7/8/9 概率为 1/8、3/8、3/8、1/8 - `yarrow`：蓍草概率模拟，6/7/8/9 概率为 1/16、5/16、7/16、3/16 如果需要复现结果，可带种子： ```bash node scripts/zhouyi_cli.js cast --question "测试" --method coin --seed demo --json ``` ### 2. 查某一卦 ```bash node scripts/zhouyi_cli.js lookup --name 乾 --json node scripts/zhouyi_cli.js lookup --number 3 --json ``` ### 3. 按关键词搜原文 ```bash node scripts/zhouyi_cli.js search --query "十年乃字" --json node scripts/zhouyi_cli.js search --query "利涉大川" --json ``` ### 4. 看术数百科路由 ```bash node scripts/zhouyi_cli.js catalog --json node scripts/zhouyi_cli.js catalog --grade S --query 周易 --json ``` ### 5. 打开内置网页 如果用户想要直接操作本地网页，打开根目录的 `index.html` 即可。网页包含： - 周易本经占筮界面 - 六十四卦本经库 - 术数百科导航 - 近占记录 ## 解读规则 调用 `cast` 后，按下列规则取辞： 1. 六爻不变：用本卦卦辞。 2. 一爻变：用该动爻爻辞。 3. 二爻变：用两个动爻爻辞，以上爻为主。 4. 三爻变：用本卦卦辞与变卦卦辞。 5. 四爻变：用两个静爻爻辞，以下爻为主。 6. 五爻变：用变卦中唯一静爻所对应的爻辞。 7. 六爻皆变：乾用用九，坤用用六，其余用变卦卦辞。 ## 输出原则 1. 先交代本次取辞规则。 2. 再引用本经原文。 3. 最后给白话解释。 4. 不把解释说成确定命令。 5. 不用未校验体系污染周易本经结论。 ## 参考资源 - 产品与验证说明：`references/README.md` - 小白使用说明：`references/user-guide-zh.md` - 本经底本：`references/zhouyi-benjing-source.txt` ## 维护命令 重建本经数据： ```bash python3 scripts/build_zhouyi_data.py ``` 运行校验： ```bash node tests/verify_zhouyi_system.js node tests/verify_system_catalog.js node tests/verify_cli.js ```

path: _meta.json
content: slug: zhouyi-benjing-oracle
version: 1.0.0

path: index.html
content: <!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>周易本经占筮</title>
    <link rel="stylesheet" href="./styles.css" />
  </head>
  <body>
    <main class="shell">
      <section class="oracle">
        <header class="masthead">
          <div>
            <p class="eyebrow">周易本经 · 六爻取辞 · 易问</p>
            <h1>周易本经占筮</h1>
          </div>
          <div class="bagua-ring" aria-hidden="true">
            <span>☰</span><span>☱</span><span>☲</span><span>☳</span>
            <span>☴</span><span>☵</span><span>☶</span><span>☷</span>
          </div>
        </header>

        <section class="casting-panel">
          <label class="question-label" for="question">当下之问</label>
          <textarea
            id="question"
            rows="4"
            placeholder="例如：我是否应该在这个月推进新的合作？"
          ></textarea>

          <div class="controls">
            <div class="mode-switch" role="group" aria-label="起卦方式">
              <button class="mode-button active" type="button" data-method="coin">三钱</button>
              <button class="mode-button" type="button" data-method="yarrow">蓍草</button>
            </div>
            <button class="cast-button" id="castButton" type="button">
              <span class="button-icon" aria-hidden="true">◎</span>
              起卦
            </button>
          </div>
        </section>
      </section>

      <section class="atlas-section">
        <div class="section-heading">
          <div>
            <p class="eyebrow">全体系导航</p>
            <h2>术数百科</h2>
          </div>
          <div class="atlas-search">
            <input id="catalogSearch" type="search" placeholder="搜索体系、用途或资料要求" />
          </div>
        </div>
        <div class="grade-filter" id="catalogFilters" role="group" aria-label="精度筛选">
          <button class="filter-button active" type="button" data-grade="all">全部</button>
          <button class="filter-button" type="button" data-grade="S">S 级</button>
          <button class="filter-button" type="button" data-grade="B">B 级</button>
          <button class="filter-button" type="button" data-grade="C">C 级</button>
        </div>
        <div id="catalogGrid" class="catalog-grid"></div>
      </section>

      <section class="library-section">
        <div class="section-heading">
          <div>
            <p class="eyebrow">六十四卦</p>
            <h2>本经卦库</h2>
          </div>
          <div class="atlas-search">
            <input id="hexagramSearch" type="search" placeholder="搜索卦名、卦辞或爻辞" />
          </div>
        </div>
        <div id="hexagramLibrary" class="hexagram-library"></div>
      </section>

      <section class="result-layout" id="resultLayout" hidden>
        <section class="hexagram-stage" aria-live="polite">
          <div class="hexagram-visuals">
            <div class="hex-block">
              <p class="block-label">本卦</p>
              <div class="hexagram" id="primaryHexagram"></div>
              <h2 id="primaryTitle">-</h2>
              <p id="primaryTrigrams">-</p>
            </div>
            <div class="change-arrow" id="changeArrow">→</div>
            <div class="hex-block secondary" id="changedBlock">
              <p class="block-label">变卦</p>
              <div class="hexagram" id="changedHexagram"></div>
              <h2 id="changedTitle">-</h2>
              <p id="changedTrigrams">-</p>
            </div>
          </div>
        </section>

        <aside class="reading-panel">
          <div class="reading-header">
            <p class="eyebrow">本经取辞</p>
            <button class="icon-button" id="copyButton" type="button" title="复制解读">
              ⧉
            </button>
          </div>
          <div id="readingText" class="reading-text"></div>
        </aside>
      </section>

      <section class="detail-grid" id="detailGrid" hidden>
        <article class="detail-panel">
          <h3>六爻</h3>
          <div id="lineList" class="line-list"></div>
        </article>
        <article class="detail-panel">
          <h3>本经线索</h3>
          <div id="symbolList" class="symbol-list"></div>
        </article>
        <article class="detail-panel journal-panel">
          <div class="panel-title-row">
            <h3>近占</h3>
            <button class="icon-button" id="clearJournalButton" type="button" title="清空记录">
              ×
            </button>
          </div>
          <div id="journalList" class="journal-list"></div>
        </article>
      </section>
    </main>

    <script src="./data/zhouyi-benjing.js"></script>
    <script src="./data/system-catalog.js"></script>
    <script src="./app.js"></script>
  </body>
</html>


path: styles.css
content: :root {
  color-scheme: light;
  --ink: #171614;
  --muted: #67605a;
  --paper: #f8f5ef;
  --paper-deep: #ece2d2;
  --line: #d8c8b1;
  --jade: #1f6f63;
  --jade-soft: #dceae5;
  --cinnabar: #b5432f;
  --gold: #b88738;
  --night: #202428;
  --white: #fffdfa;
  --shadow: 0 22px 70px rgba(49, 39, 25, 0.14);
}

* {
  box-sizing: border-box;
}

body {
  margin: 0;
  min-height: 100vh;
  color: var(--ink);
  background:
    linear-gradient(90deg, rgba(31, 111, 99, 0.08) 1px, transparent 1px),
    linear-gradient(0deg, rgba(184, 135, 56, 0.08) 1px, transparent 1px),
    var(--paper);
  background-size: 42px 42px;
  font-family:
    Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
    "PingFang SC", "Microsoft YaHei", sans-serif;
}

button,
textarea,
input {
  font: inherit;
}

button {
  cursor: pointer;
}

.shell {
  width: min(1180px, calc(100vw - 32px));
  margin: 0 auto;
  padding: 28px 0 44px;
}

.oracle {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(320px, 1.1fr);
  gap: 28px;
  align-items: stretch;
  min-height: 42vh;
}

.masthead {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  overflow: hidden;
  min-height: 360px;
  padding: 32px;
  color: var(--white);
  background:
    linear-gradient(rgba(23, 22, 20, 0.45), rgba(23, 22, 20, 0.3)),
    radial-gradient(circle at 74% 30%, rgba(184, 135, 56, 0.62), transparent 34%),
    linear-gradient(135deg, #1f6f63 0%, #273136 58%, #612d25 100%);
  border-radius: 8px;
  box-shadow: var(--shadow);
}

.masthead::before {
  content: "";
  position: absolute;
  inset: 18px;
  border: 1px solid rgba(255, 253, 250, 0.24);
  pointer-events: none;
}

.eyebrow {
  margin: 0 0 10px;
  color: inherit;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0;
  opacity: 0.72;
}

h1 {
  position: relative;
  z-index: 1;
  margin: 0;
  font-size: clamp(3rem, 8vw, 6.8rem);
  line-height: 0.92;
  letter-spacing: 0;
}

.bagua-ring {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: repeat(4, minmax(42px, 1fr));
  gap: 10px;
  width: min(100%, 360px);
  color: rgba(255, 253, 250, 0.9);
}

.bagua-ring span {
  display: grid;
  place-items: center;
  aspect-ratio: 1;
  border: 1px solid rgba(255, 253, 250, 0.25);
  background: rgba(255, 253, 250, 0.08);
  font-size: clamp(1.8rem, 4vw, 3rem);
}

.casting-panel {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 16px;
  padding: 30px;
  background: rgba(255, 253, 250, 0.82);
  border: 1px solid var(--line);
  border-radius: 8px;
  box-shadow: var(--shadow);
}

.question-label {
  color: var(--muted);
  font-weight: 750;
}

textarea {
  width: 100%;
  min-height: 160px;
  resize: vertical;
  padding: 18px;
  color: var(--ink);
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: 8px;
  outline: none;
  line-height: 1.7;
}

textarea:focus {
  border-color: var(--jade);
  box-shadow: 0 0 0 4px rgba(31, 111, 99, 0.12);
}

input[type="search"] {
  width: 100%;
  min-height: 44px;
  padding: 0 14px;
  color: var(--ink);
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: 8px;
  outline: none;
}

input[type="search"]:focus {
  border-color: var(--jade);
  box-shadow: 0 0 0 4px rgba(31, 111, 99, 0.12);
}

.controls {
  display: flex;
  gap: 14px;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
}

.mode-switch {
  display: inline-grid;
  grid-template-columns: repeat(2, minmax(78px, 1fr));
  padding: 4px;
  background: var(--paper-deep);
  border: 1px solid var(--line);
  border-radius: 8px;
}

.mode-button {
  min-height: 42px;
  padding: 0 16px;
  color: var(--muted);
  background: transparent;
  border: 0;
  border-radius: 6px;
  font-weight: 750;
}

.mode-button.active {
  color: var(--white);
  background: var(--jade);
}

.cast-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  min-width: 148px;
  min-height: 52px;
  padding: 0 22px;
  color: var(--white);
  background: var(--cinnabar);
  border: 0;
  border-radius: 8px;
  font-weight: 850;
  box-shadow: 0 12px 24px rgba(181, 67, 47, 0.22);
}

.button-icon {
  font-size: 1.35rem;
}

.result-layout {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(340px, 0.95fr);
  gap: 24px;
  margin-top: 26px;
}

.atlas-section,
.library-section {
  margin-top: 26px;
  padding: 24px;
  background: rgba(255, 253, 250, 0.88);
  border: 1px solid var(--line);
  border-radius: 8px;
  box-shadow: var(--shadow);
}

.section-heading {
  display: flex;
  align-items: end;
  justify-content: space-between;
  gap: 18px;
  margin-bottom: 16px;
}

.section-heading h2 {
  margin: 0;
  font-size: clamp(1.6rem, 3vw, 2.4rem);
}

.atlas-search {
  width: min(100%, 360px);
}

.grade-filter {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  margin-bottom: 16px;
}

.filter-button {
  min-height: 38px;
  padding: 0 14px;
  color: var(--muted);
  background: var(--paper-deep);
  border: 1px solid var(--line);
  border-radius: 8px;
  font-weight: 800;
}

.filter-button.active {
  color: var(--white);
  background: var(--jade);
  border-color: var(--jade);
}

.catalog-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 14px;
}

.system-card,
.hex-card {
  min-height: 100%;
  padding: 16px;
  background: rgba(255, 253, 250, 0.82);
  border: 1px solid rgba(216, 200, 177, 0.82);
  border-radius: 8px;
}

.system-card header,
.hex-card header {
  display: flex;
  align-items: start;
  justify-content: space-between;
  gap: 12px;
}

.system-card h3,
.hex-card h3 {
  margin: 0;
  font-size: 1.05rem;
}

.system-card p,
.hex-card p {
  margin: 8px 0 0;
  color: var(--muted);
  line-height: 1.62;
  font-size: 0.94rem;
}

.grade-badge,
.status-badge {
  display: inline-flex;
  align-items: center;
  min-height: 26px;
  padding: 0 8px;
  color: var(--white);
  background: var(--night);
  border-radius: 6px;
  font-size: 0.76rem;
  font-weight: 850;
  white-space: nowrap;
}

.grade-s {
  background: var(--jade);
}

.grade-b {
  background: var(--gold);
}

.grade-c {
  background: var(--muted);
}

.status-badge {
  margin-top: 10px;
  color: var(--ink);
  background: var(--paper-deep);
}

.tag-list {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
  margin-top: 12px;
}

.tag-list span {
  padding: 4px 7px;
  color: var(--jade);
  background: var(--jade-soft);
  border-radius: 6px;
  font-size: 0.78rem;
  font-weight: 760;
}

.hexagram-library {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 12px;
  max-height: 520px;
  overflow: auto;
  padding-right: 4px;
}

.hex-card {
  min-height: 170px;
}

.hex-card .source-line {
  color: var(--ink);
  font-family: "Songti SC", "STSong", "Noto Serif CJK SC", serif;
}

.hexagram-stage,
.reading-panel,
.detail-panel {
  background: rgba(255, 253, 250, 0.88);
  border: 1px solid var(--line);
  border-radius: 8px;
  box-shadow: var(--shadow);
}

.hexagram-stage {
  padding: 26px;
}

.hexagram-visuals {
  display: grid;
  grid-template-columns: minmax(220px, 1fr) 48px minmax(220px, 1fr);
  gap: 16px;
  align-items: center;
}

.hex-block {
  min-height: 430px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 24px;
  border: 1px solid rgba(216, 200, 177, 0.72);
  background: linear-gradient(180deg, #fffdfa, #f4ecdf);
  border-radius: 8px;
}

.hex-block.secondary {
  background: linear-gradient(180deg, #fbfaf6, #e9f1ed);
}

.block-label {
  margin: 0 0 18px;
  color: var(--muted);
  font-size: 0.8rem;
  font-weight: 800;
}

.hexagram {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 12px;
  width: min(100%, 240px);
  min-height: 248px;
}

.yao {
  position: relative;
  display: grid;
  grid-template-columns: 1fr;
  align-items: center;
  min-height: 28px;
}

.yao::before,
.yao::after {
  content: "";
  height: 14px;
  background: var(--night);
  border-radius: 2px;
}

.yao.yin {
  grid-template-columns: 1fr 34px 1fr;
}

.yao.yin::before,
.yao.yin::after {
  display: block;
}

.yao.yin::before {
  grid-column: 1;
}

.yao.yin::after {
  grid-column: 3;
}

.yao.yang::after {
  display: none;
}

.yao.moving::before,
.yao.moving::after {
  background: var(--cinnabar);
}

.yao.moving::marker {
  color: var(--cinnabar);
}

.yao .move-dot {
  position: absolute;
  right: -24px;
  width: 10px;
  height: 10px;
  border-radius: 999px;
  background: var(--gold);
  box-shadow: 0 0 0 5px rgba(184, 135, 56, 0.18);
}

.hex-block h2 {
  margin: 18px 0 8px;
  text-align: center;
  font-size: clamp(1.35rem, 3vw, 2rem);
}

.hex-block p:last-child {
  margin: 0;
  color: var(--muted);
  text-align: center;
  line-height: 1.6;
}

.change-arrow {
  display: grid;
  place-items: center;
  width: 48px;
  aspect-ratio: 1;
  color: var(--jade);
  border: 1px solid var(--line);
  border-radius: 50%;
  background: var(--jade-soft);
  font-size: 1.7rem;
  font-weight: 900;
}

.reading-panel {
  padding: 24px;
}

.reading-header,
.panel-title-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}

.icon-button {
  display: inline-grid;
  place-items: center;
  width: 38px;
  height: 38px;
  color: var(--ink);
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: 8px;
  font-size: 1.2rem;
}

.reading-text {
  display: grid;
  gap: 16px;
  margin-top: 12px;
}

.reading-text section {
  padding-top: 14px;
  border-top: 1px solid rgba(216, 200, 177, 0.7);
}

.reading-text h3,
.detail-panel h3 {
  margin: 0 0 10px;
  font-size: 1rem;
}

.reading-text p {
  margin: 0;
  color: var(--muted);
  line-height: 1.8;
}

.reading-text blockquote {
  margin: 0;
  padding: 12px 14px;
  color: var(--ink);
  background: #fff8ea;
  border-left: 3px solid var(--gold);
  line-height: 1.8;
}

.reading-text blockquote strong {
  display: block;
  margin-bottom: 4px;
  color: var(--cinnabar);
}

.reading-text blockquote.primary-source {
  background: var(--jade-soft);
  border-left-color: var(--jade);
}

.source-stack {
  display: grid;
  gap: 10px;
  margin-top: 10px;
}

.rule-badge {
  display: inline-flex;
  align-items: center;
  min-height: 26px;
  margin-right: 8px;
  padding: 0 9px;
  color: var(--white);
  background: var(--jade);
  border-radius: 6px;
  font-size: 0.82rem;
  font-weight: 800;
}

.detail-grid {
  display: grid;
  grid-template-columns: 1fr 1fr 0.9fr;
  gap: 18px;
  margin-top: 18px;
}

.detail-panel {
  min-height: 220px;
  padding: 22px;
}

.line-list,
.symbol-list,
.journal-list {
  display: grid;
  gap: 10px;
}

.line-item,
.symbol-item,
.journal-item {
  padding: 12px 0;
  color: inherit;
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(216, 200, 177, 0.78);
  border-radius: 0;
}

.line-item strong,
.symbol-item strong,
.journal-item strong {
  display: block;
  margin-bottom: 4px;
}

.line-item p,
.symbol-item p,
.journal-item p {
  margin: 0;
  color: var(--muted);
  line-height: 1.6;
  font-size: 0.94rem;
}

.line-item.moving {
  padding-left: 12px;
  box-shadow: inset 3px 0 0 var(--cinnabar);
}

.line-item.selected {
  padding-left: 12px;
  background: rgba(31, 111, 99, 0.06);
  box-shadow: inset 3px 0 0 var(--jade);
}

.line-item.moving.selected {
  box-shadow:
    inset 3px 0 0 var(--cinnabar),
    inset 7px 0 0 var(--jade);
}

.source-text {
  color: var(--ink) !important;
  font-family: "Songti SC", "STSong", "Noto Serif CJK SC", serif;
}

.journal-panel {
  max-height: 420px;
  overflow: auto;
}

.journal-item {
  width: 100%;
  text-align: left;
  cursor: pointer;
}

.journal-item:hover {
  color: var(--jade);
}

@media (max-width: 980px) {
  .oracle,
  .result-layout,
  .detail-grid {
    grid-template-columns: 1fr;
  }

  .catalog-grid,
  .hexagram-library {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .masthead {
    min-height: 300px;
  }

  .hexagram-visuals {
    grid-template-columns: 1fr;
  }

  .change-arrow {
    justify-self: center;
    transform: rotate(90deg);
  }
}

@media (max-width: 620px) {
  .shell {
    width: min(100% - 18px, 1180px);
    padding-top: 10px;
  }

  .masthead,
  .casting-panel,
  .hexagram-stage,
  .reading-panel,
  .detail-panel {
    padding: 18px;
  }

  .controls {
    align-items: stretch;
  }

  .mode-switch,
  .cast-button {
    width: 100%;
  }

  .section-heading {
    align-items: stretch;
    flex-direction: column;
  }

  .atlas-search,
  .catalog-grid,
  .hexagram-library {
    width: 100%;
    grid-template-columns: 1fr;
  }

  .hex-block {
    min-height: 360px;
    padding: 18px;
  }

  .hexagram {
    width: min(100%, 210px);
  }
}


path: references/zhouyi-benjing-source.txt
content: 周易本经

整理日期：2026-04-19
来源：Project Gutenberg eBook #25501《易經》。
整理范围：六十四卦卦辞、爻辞；不含《彖传》《象传》《文言》《系辞》《说卦》《序卦》《杂卦》。

第 一 卦

乾

乾：元，亨，利，貞。

初九：潛龍，勿用。
九二：見龍在田，利見大人。
九三：君子終日乾乾，夕惕，若厲，無咎。
九四：或躍在淵，無咎。
九五：飛龍在天，利見大人。
上九：亢龍有悔。
用九：見群龍無首，吉。

第 二 卦

坤

坤：元，亨，利牝馬之貞。
君子有攸往，先迷後得主，利西南得朋，東北喪朋。安貞，吉。

初六：履霜，堅冰至。
六二：直，方，大，不習無不利。
六三：含章可貞。或從王事，無成有終。
六四：括囊；無咎，無譽。
六五：黃裳，元吉。
上六：戰龍於野，其血玄黃。
用六：利永貞。

第 三 卦

屯

屯：元，亨，利，貞，勿用，有攸往，利建侯。

初九：磐桓；利居貞，利建侯。
六二：屯如邅如，乘馬班如。匪寇婚媾，女子貞不字，十年乃字。
六三：既鹿無虞，惟入于林中，君子幾不如舍，往吝。
六四：乘馬班如，求婚媾，往吉，無不利。
九五：屯其膏，小貞吉，大貞凶。
上六：乘馬班如，泣血漣如。

第 四 卦

蒙

蒙：亨。匪我求童蒙，童蒙求我。初噬告，再三瀆，瀆則不告。利貞。

初六：發蒙，利用刑人，用說桎梏，以往吝。
九二：包蒙，吉；納婦，吉；子克家。
六三：勿用娶女；見金夫，不有躬，無攸利。
六四：困蒙，吝。
六五：童蒙，吉。
上九：擊蒙；不利為寇，利御寇。

第 五 卦

需

需：有孚，光亨，貞吉。利涉大川。

初九：需于郊。利用恆，無咎。
九二：需于沙。小有言，終吉。
九三：需于泥，致寇至。
六四：需于血，出自穴。
九五：需于酒食，貞吉。
上六：入于穴，有不速之客三人來，敬之終吉。

第 六 卦

訟

訟：有孚，窒。惕中吉。終凶。利見大人，不利涉大川。

初六：不永所事，小有言，終吉。
九二：不克訟，歸而逋，其邑人三百戶，無眚。
六三：食舊德，貞厲，終吉，或從王事，無成。
九四：不克訟，復即命，渝安貞，吉。
九五：訟元吉。
上九：或錫之鞶帶，終朝三褫之。

第 七 卦

師

師：貞，丈人，吉無咎。

初六：師出以律，否臧凶。
九二：在師中，吉無咎，王三錫命。
六三：師或輿尸，凶。
六四：師左次，無咎。
六五：田有禽，利執言，無咎。長子帥師，弟子輿尸，貞凶。
上六：大君有命，開國承家，小人勿用。

第 八 卦

比

比：吉。原筮元永貞，無咎。不寧方來，後夫凶。

初六：有孚比之，無咎。有孚盈缶，終來有他，吉。
六二：比之自內，貞吉。
六三：比之匪人。
六四：外比之，貞吉。
九五：顯比，王用三驅，失前禽。邑人不誡，吉。
上六：比之無首，凶。

第 九 卦

小畜

小畜：亨。密雲不雨，自我西郊。

初九：復自道，何其咎，吉。
九二：牽復，吉。
九三：輿說輻，夫妻反目。
六四：有孚，血去。惕出，無咎。
九五：有孚攣如，富以其鄰。
上九：既雨既處，尚德載婦，貞厲。月幾望，君子征凶。

第 十 卦

履

履：履虎尾，不咥人，亨。

初九：素履，往無咎。
九二：履道坦坦，幽人貞吉。
六三：眇能視，跛能履，履虎尾，咥人，凶。武人為于大君。
九四：履虎尾，愬愬，終吉。
九五：夬履，貞厲。
上九：視履考祥，其旋元吉。

第 十一 卦

泰

泰：小往大來，吉亨。

初九：拔茅茹，以其彙，征吉。
九二：包荒，用馮河，不遐遺，朋亡，得尚于中行。
九三：無平不陂，無往不復，艱貞無咎。勿恤其孚，于食有福。
六四：翩翩不富，以其鄰，不戒以孚。
六五：帝乙歸妹，以祉元吉。
上六：城復于隍，勿用師。自邑告命，貞吝。

第 十二 卦

否

否：否之匪人，不利君子貞，大往小來。

初六：拔茅茹，以其彙，貞吉亨。
六二：包承。小人吉，大人否亨。
六三：包羞。
九四：有命無咎，疇離祉。
九五：休否，大人吉。其亡其亡，繫于苞桑。
上九：傾否，先否後喜。

第 十三 卦

同人

同人：同人于野，亨。利涉大川，利君子貞。

初九：同人于門，無咎。
六二：同人于宗，吝。
九三：伏戎于莽，升其高陵，三歲不興。
九四：乘其墉，弗克攻，吉。
九五：同人，先號咷而後笑。大師克相遇。
上九：同人于郊，無悔。

第 十四 卦

大有

大有：元亨。

初九：無交害，匪咎，艱則無咎。
九二：大車以載，有攸往，無咎。
九三：公用亨于天子，小人弗克。
九四：匪其彭，無咎。
六五：厥孚交如，威如；吉。
上九：自天佑之，吉無不利。

第 十五 卦

謙

謙：亨，君子有終。

初六：謙謙君子，用涉大川，吉。
六二：鳴謙，貞吉。
九三：勞謙君子，有終吉。
六四：無不利，撝謙。
六五：不富，以其鄰，利用侵伐，無不利。
上六：鳴謙，利用行師，征邑國。

第 十六 卦

豫

豫：利建侯行師。

初六：鳴豫，凶。
六二：介于石，不終日，貞吉。
六三：盱豫，悔。遲有悔。
九四：由豫，大有得。勿疑。朋盍簪。
六五：貞疾，恆不死。
上六：冥豫，成有渝，無咎。

第 十七 卦

隨

隨：元亨利貞，無咎。

初九：官有渝，貞吉。出門交有功。
六二：係小子，失丈夫。
六三：係丈夫，失小子。隨有求得，利居貞。
九四：隨有獲，貞凶。有孚在道，以明，何咎。
九五：孚于嘉，吉。
上六：拘系之，乃從維之。王用亨于西山。

第 十八 卦

蠱

蠱：元亨，利涉大川。先甲三日，後甲三日。

初六：幹父之蠱，有子，考無咎，厲終吉。
九二：幹母之蠱，不可貞。
九三：幹父小有晦，無大咎。
六四：裕父之蠱，往見吝。
六五：幹父之蠱，用譽。
上九：不事王侯，高尚其事。

第 十九 卦

臨

臨：元，亨，利，貞。至于八月有凶。

初九：咸臨，貞吉。
九二：咸臨，吉無不利。
六三：甘臨，無攸利。既憂之，無咎。
六四：至臨，無咎。
六五：知臨，大君之宜，吉。
上六：敦臨，吉無咎。

第 二十 卦

觀

觀：盥而不薦，有孚顒若。

初六：童觀，小人無咎，君子吝。
六二：窺觀，利女貞。
六三：觀我生，進退。
六四：觀國之光，利用賓于王。
九五：觀我生，君子無咎。
上九：觀其生，君子無咎。

第二十一卦

噬嗑

噬嗑：亨。利用獄。

初九：履校滅趾，無咎。
六二：噬膚滅鼻，無咎。
六三：噬臘肉，遇毒；小吝，無咎。
九四：噬乾胏，得金矢，利艱貞，吉。
六五：噬乾肉，得黃金，貞厲，無咎。
上九：何校滅耳，凶。

第二十二卦

賁

賁：亨。小利有所往。

初九：賁其趾，舍車而徒。
六二：賁其須。
九三：賁如濡如，永貞吉。
六四：賁如皤如，白馬翰如，匪寇婚媾。
六五：賁于丘園，束帛戔戔，吝，終吉。
上九：白賁，無咎。

第二十三卦

剝

剝：不利有攸往。

初六：剝床以足，蔑貞凶。
六二：剝床以辨，蔑貞凶。
六三：剝之，無咎。
六四：剝床以膚，凶。
六五：貫魚，以宮人寵，無不利。
上九：碩果不食，君子得輿，小人剝廬。

第二十四卦

復

復：亨。出入無疾，朋來無咎。反復其道，七日來復，利有攸往。

初九：不復遠，無祗悔，元吉。
六二：休復，吉。
六三：頻復厲，無咎。
六四：中行獨復。
六五：敦復，無悔。
上六：迷復，凶，有災眚。用行師，終有大敗，以其國君，凶；至于十年，不克征。

第二十五卦

無妄

無妄：元，亨，利，貞。其匪正有眚，不利有攸往。

初九：無妄，往吉。
六二：不耕獲，不菑畬，則利有攸往。
六三：無妄之災，或繫之牛，行人之得，邑人之災。
九四：可貞，無咎。
九五：無妄之疾，勿藥有喜。
上九：無妄，行有眚，無攸利。

第二十六卦

大畜

大畜：利貞，不家食吉，利涉大川。

初九：有厲利已。
九二：輿說輻。
九三：良馬逐，利艱貞。日閑輿衛，利有攸往。
六四：童牛之牿，元吉。
六五：豶豕之牙，吉。
上九：何天之衢，亨。

第二十七卦

頤

頤：貞吉。觀頤，自求口實。

初九：舍爾靈龜，觀我朵頤，凶。
六二：顛頤，拂經于丘頤，征凶。
六三：拂頤，貞凶，十年勿用，無攸利。
六四：顛頤吉，虎視眈眈，其欲逐逐，無咎。
六五：拂經，居貞吉，不可涉大川。
上九：由頤，厲吉，利涉大川。

第二十八卦

大過

大過：棟橈，利有攸往，亨。

初六：藉用白茅，無咎。
九二：枯楊生稊，老夫得其女妻，無不利。
九三：棟橈，凶。
九四：棟隆，吉；有它吝。
九五：枯楊生華，老婦得士夫，無咎無譽。
上六：過涉滅頂，凶，無咎。

第二十九卦

坎

坎：習坎，有孚，維心亨，行有尚。

初六：習坎，入于坎窞，凶。
九二：坎有險，求小得。
六三：來之坎坎，險且枕，入于坎窞，勿用。
六四：樽酒簋貳，用缶，納約自牖，終無咎。
九五：坎不盈，祗既平，無咎。
上六：係用徽纆，寘于叢棘，三歲不得，凶。

第 三十 卦

離

離：利貞，亨。畜牝牛，吉。

初九：履錯然，敬之無咎。
六二：黃離，元吉。
九三：日昃之離，不鼓缶而歌，則大耋之嗟，凶。
九四：突如其來如，焚如，死如，棄如。
六五：出涕沱若，戚嗟若，吉。
上九：王用出征，有嘉折首，獲匪其醜，無咎。

第三十一卦

咸

咸：亨，利貞，取女吉。

初六：咸其拇。
六二：咸其腓，凶，居吉。
九三：咸其股，執其隨，往吝。
九四：貞吉悔亡，憧憧往來，朋從爾思。
九五：咸其脢，無悔。
上六：咸其輔，頰，舌。

第三十二卦

恆：亨，無咎，利貞，利有攸往。


初六：浚恆，貞凶，無攸利。
九二：悔亡。
九三：不恆其德，或承之羞，貞吝。
九四：田無禽。
六五：恆其德，貞，婦人吉，夫子凶。
上六：振恆，凶。

第三十三卦

遯

遯：亨，小利貞。

初六：遯尾，厲，勿用有攸往。
六二：執之用黃牛之革，莫之勝說。
九三：係遯，有疾厲，畜臣妾吉。
九四：好遯君子吉，小人否。
九五：嘉遯，貞吉。
上九：肥遯，無不利。

第三十四卦

大壯

大壯：利貞。

初九：壯于趾，征凶，有孚。
九二：貞吉。
九三：小人用壯，君子用罔，貞厲。羝羊觸藩，羸其角。
九四：貞吉悔亡，藩決不羸，壯于大輿之輹。
六五：喪羊于易，無悔。
上六：羝羊觸藩，不能退，不能遂，無攸利，艱則吉。

第三十五卦

晉

晉：康侯用錫馬蕃庶，晝日三接。

初六：晉如，摧如，貞吉。罔孚，裕無咎。
六二：晉如，愁如，貞吉。受茲介福，于其王母。
六三：眾允，悔亡。
九四：晉如鼫鼠，貞厲。
六五：悔亡，失得勿恤，往吉無不利。
上九：晉其角，維用伐邑，厲吉無咎，貞吝。

第三十六卦

明夷

明夷：利艱貞。

初九：明夷于飛，垂其翼。君子于行，三日不食，有攸往，主人有言。
六二：明夷，夷于左股，用拯馬壯，吉。
九三：明夷于南狩，得其大首，不可疾貞。
六四：入于左腹，獲明夷之心，于出門庭。
六五：箕子之明夷，利貞。
上六：不明晦，初登于天，後入于地。

第三十七卦

家人

家人：利女貞。

初九：閑有家，悔亡。
六二：無攸遂，在中饋，貞吉。
九三：家人嗃嗃，悔厲吉；婦子嘻嘻，終吝。
六四：富家，大吉。
九五：王假有家，勿恤吉。
上九：有孚威如，終吉。

第三十八卦

睽

睽：小事吉。

初九：悔亡，喪馬勿逐，自復；見惡人無咎。
九二：遇主于巷，無咎。
六三：見輿曳，其牛掣，其人天且劓，無初有終。
九四：睽孤，遇元夫，交孚，厲無咎。
六五：悔亡，厥宗噬膚，往何咎。
上九：睽孤，見豕負塗，載鬼一車，先張之弧，後說之弧，匪寇婚媾，往遇雨則吉。

第三十九卦

蹇

蹇：利西南，不利東北；利見大人，貞吉。

初六：往蹇，來譽。
六二：王臣蹇蹇，匪躬之故。
九三：往蹇來反。
六四：往蹇來連。
九五：大蹇朋來。
上六：往蹇來碩，吉；利見大人。

第 四十 卦

解

解：利西南，無所往，其來復吉。有攸往，夙吉。

初六：無咎。
九二：田獲三狐，得黃矢，貞吉。
六三：負且乘，致寇至，貞吝。
九四：解而拇，朋至斯孚。
六五：君子維有解，吉；有孚于小人。
上六：公用射隼，于高墉之上，獲之，無不利。

第四十一卦

損

損：有孚，元吉，無咎，可貞，利有攸往？曷之用，二簋可用享。

初九：已事遄往，無咎，酌損之。
九二：利貞，征凶，弗損益之。
六三：三人行，則損一人；一人行，則得其友。
六四：損其疾，使遄有喜，無咎。
六五：或益之，十朋之龜弗克違，元吉。
上九：弗損益之，無咎，貞吉，利有攸往，得臣無家。

第四十二卦

益

益：利有攸往，利涉大川。

初九：利用為大作，元吉，無咎。
六二：或益之，十朋之龜弗克違，永貞吉。王用享于帝，吉。
六三：益之用凶事，無咎。有孚中行，告公用圭。
六四：中行，告公從。利用為依遷國。
九五：有孚惠心，勿問元吉。有孚惠我德。
上九：莫益之，或擊之，立心勿恆，凶。

第四十三卦

夬

夬：揚于王庭，孚號，有厲，告自邑，不利即戎，利有攸往。

初九：壯于前趾，往不勝為吝。
九二：惕號，莫夜有戎，勿恤。
九三：壯于頄，有凶。君子夬夬，獨行遇雨，若濡有慍，無咎。
九四：臀無膚，其行次且。牽羊悔亡，聞言不信。
九五：莧陸夬夬，中行無咎。
上六：無號，終有凶。

第四十四卦

姤

姤：女壯，勿用取女。

初六：繫于金柅，貞吉，有攸往，見凶，羸豕孚蹢躅。
九二：包有魚，無咎，不利賓。
九三：臀無膚，其行次且，厲，無大咎。
九四：包無魚，起凶。
九五：以杞包瓜，含章，有隕自天。
上九：姤其角，吝，無咎。

第四十五卦

萃

萃：亨。王假有廟，利見大人，亨，利貞。用大牲吉，利有攸往。

初六：有孚不終，乃亂乃萃，若號一握為笑，勿恤，往無咎。
六二：引吉，無咎，孚乃利用禴。
六三：萃如，嗟如，無攸利，往無咎，小吝。
九四：大吉，無咎。
九五：萃有位，無咎。匪孚，元永貞，悔亡。
上六：齎咨涕洟，無咎。

第四十六卦

升

升：元亨，用見大人，勿恤，南征吉。

初六：允升，大吉。
九二：孚乃利用禴，無咎。
九三：升虛邑。
六四：王用亨于岐山，吉無咎。
六五：貞吉，升階。
上六：冥升，利于不息之貞。

第四十七卦

困

困：亨，貞，大人吉，無咎，有言不信。

初六：臀困于株木，入于幽谷，三歲不覿。
九二：困于酒食，朱紱方來，利用亨祀，征凶，無咎。
六三：困于石，據于蒺藜，入于其宮，不見其妻，凶。
九四：來徐徐，困于金車，吝，有終。
九五：劓刖，困于赤紱，乃徐有說，利用祭祀。
上六：困于葛藟，于臲卼，曰動悔。有悔，征吉。

第四十八卦

井

井：改邑不改井，無喪無得，往來井井。汔至，亦未繘井，羸其瓶，凶。

初六：井泥不食，舊井無禽。
九二：井谷射鮒，甕敝漏。
九三：井渫不食，為我民惻，可用汲，王明，並受其福。
六四：井甃，無咎。
九五：井冽，寒泉食。
上六：井收勿幕，有孚無吉。

第四十九卦

革

革：己日乃孚，元亨利貞，悔亡。

初九：鞏用黃牛之革。
六二：己日乃革之，征吉，無咎。
九三：征凶，貞厲，革言三就，有孚。
九四：悔亡，有孚改命，吉。
九五：大人虎變，未占有孚。
上六：君子豹變，小人革面，征凶，居貞吉。

第 五十 卦

鼎

鼎：元吉，亨。

初六：鼎顛趾，利出否，得妾以其子，無咎。
九二：鼎有實，我仇有疾，不我能即，吉。
九三：鼎耳革，其行塞，雉膏不食，方雨虧悔，終吉。
九四：鼎折足，覆公餗，其形渥，凶。
六五：鼎黃耳金鉉，利貞。
上九：鼎玉鉉，大吉，無不利。

第五十一卦

震

震：亨。震來虩虩，笑言啞啞。震驚百里，不喪匕鬯。

初九：震來虩虩，後笑言啞啞，吉。
六二：震來厲，億喪貝，躋于九陵，勿逐，七日得。
六三：震蘇蘇，震行無眚。
九四：震遂泥。
六五：震往來厲，億無喪，有事。
上六：震索索，視矍矍，征凶。震不于其躬，于其鄰，無咎。婚媾有言。

第五十二卦

艮

艮：艮其背，不獲其身，行其庭，不見其人，無咎。

初六：艮其趾，無咎，利永貞。
六二：艮其腓，不拯其隨，其心不快。
九三：艮其限，列其夤，厲薰心。
六四：艮其身，無咎。
六五：艮其輔，言有序，悔亡。
上九：敦艮，吉。

第五十三卦

漸

漸：女歸吉，利貞。

初六：鴻漸于干，小子厲，有言，無咎。
六二：鴻漸于磐，飲食衎衎，吉。
九三：鴻漸于陸，夫征不復，婦孕不育，凶；利御寇。
六四：鴻漸于木，或得其桷，無咎。
九五：鴻漸于陵，婦三歲不孕，終莫之勝，吉。
上九：鴻漸于逵，其羽可用為儀，吉。

第五十四卦

歸妹

歸妹：征凶，無攸利。

初九：歸妹以娣，跛能履，征吉。
九二：眇能視，利幽人之貞。
六三：歸妹以須，反歸以娣。
九四：歸妹愆期，遲歸有時。
六五：帝乙歸妹，其君之袂，不如其娣之袂良，月幾望，吉。
上六：女承筐無實，士刲羊無血，無攸利。

第五十五卦

豐

豐：亨，王假之，勿憂，宜日中。

初九：遇其配主，雖旬無咎，往有尚。
六二：豐其蔀，日中見斗，往得疑疾，有孚發若，吉。
九三：豐其沛，日中見沫，折其右肱，無咎。
九四：豐其蔀，日中見斗，遇其夷主，吉。
六五：來章，有慶譽，吉。
上六：豐其屋，蔀其家，窺其戶，闃其無人，三歲不覿，凶。

第五十六卦

旅

旅：小亨，旅貞吉。

初六：旅瑣瑣，斯其所取災。
六二：旅即次，懷其資，得童僕貞。
九三：旅焚其次，喪其童僕，貞厲。
九四：旅于處，得其資斧，我心不快。
六五：射雉一矢亡，終以譽命。
上九：鳥焚其巢，旅人先笑後號咷。喪牛于易，凶。

第五十七卦

巽

巽：小亨，利攸往，利見大人。

初六：進退，利武人之貞。
九二：巽在床下，用史巫紛若，吉無咎。
九三：頻巽，吝。
六四：悔亡，田獲三品。
九五：貞吉悔亡，無不利。無初有終，先庚三日，後庚三日，吉。
上九：巽在床下，喪其資斧，貞凶。

第五十八卦

兌

兌：亨，利貞。

初九：和兌，吉。
九二：孚兌，吉，悔亡。
六三：來兌，凶。
九四：商兌，未寧，介疾有喜。
九五：孚于剝，有厲。
上六：引兌。

第五十九卦

渙

渙：亨。王假有廟，利涉大川，利貞。

初六：用拯馬壯，吉。
九二：渙奔其機，悔亡。
六三：渙其躬，無悔。
六四：渙其群，元吉。渙有丘，匪夷所思。
九五：渙汗其大號，渙王居，無咎。
上九：渙其血，去逖出，無咎。

第 六十 卦

節

節：亨。苦節不可貞。

初九：不出戶庭，無咎。
九二：不出門庭，凶。
六三：不節若，則嗟若，無咎。
六四：安節，亨。
九五：甘節，吉；往有尚。
上六：苦節，貞凶，悔亡。

第六十一卦

中孚

中孚：豚魚，吉，利涉大川，利貞。

初九：虞吉，有他不燕。
九二：鳴鶴在陰，其子和之，我有好爵，吾與爾靡之。
六三：得敵，或鼓或罷，或泣或歌。
六四：月幾望，馬匹亡，無咎。
九五：有孚攣如，無咎。
上九：翰音登于天，貞凶。

第六十二卦

小過

小過：亨，利貞，可小事，不可大事。飛鳥遺之音，不宜上宜下，大吉。

初六：飛鳥以凶。
六二：過其祖，遇其妣；不及其君，遇其臣；無咎。
九三：弗過防之，從或戕之，凶。
九四：無咎，弗過遇之。往厲必戒，勿用永貞。
六五：密雲不雨，自我西郊，公弋取彼在穴。
上六：弗遇過之，飛鳥離之，凶，是謂災眚。

第六十三卦

既濟

既濟：亨，小利貞，初吉終亂。

初九：曳其輪，濡其尾，無咎。
六二：婦喪其茀，勿逐，七日得。
九三：高宗伐鬼方，三年克之，小人勿用。
六四：繻有衣袽，終日戒。
九五：東鄰殺牛，不如西鄰之禴祭，實受其福。
上六：濡其首，厲。

第六十四卦

未濟

未濟：亨，小狐汔濟，濡其尾，無攸利。

初六：濡其尾，吝。
九二：曳其輪，貞吉。
六三：未濟，征凶，利涉大川。
九四：貞吉，悔亡，震用伐鬼方，三年有賞于大國。
六五：貞吉，無悔，君子之光，有孚，吉。
上九：有孚于飲酒，無咎，濡其首，有孚失是。


path: references/user-guide-zh.md
content: # 周易本经占筮：使用说明

这不是一个只会“给吉凶”的算卦玩具，而是一套基于《周易》本经原著、适合做决策整理和处境判断的系统。

你可以把它当成三种工具来用：

1. `起卦`：问一件事现在该怎么推进。
2. `查卦`：查六十四卦原文、卦辞、爻辞。
3. `导航`：看周易和六爻、梅花、八字、奇门等体系有什么区别。

## 一、最适合拿来问什么

这套系统最适合的问题是：

- 我该不该推进这次合作？
- 这份工作现在该继续，还是先缓一缓？
- 这段关系下一步适合主动沟通，还是先观察？
- 这个项目目前最大的风险点是什么？
- 我现在应该进，还是守？

不适合的问题是：

- 我什么时候一定发财？
- 对方百分百会不会回来？
- 哪只股票一定涨？
- 医疗、法律、投资上的确定指令

一句话：它更适合看`处境`、`节奏`、`取舍`和`提醒`，不适合替你承担现实决策责任。

## 二、在 ClawHub / 对话里怎么用

你可以直接对它说下面这些话。

### 1. 直接起卦

示例：

- 帮我起一卦，问这次合作要不要推进
- 用周易看一下我现在是否适合换工作
- 用三钱起卦，看看这段关系接下来该怎么处理
- 用蓍草法帮我问一下这个项目的时机

推荐说法：

```text
帮我起一卦，问题是：我这个月是否应该主动推进新的合作？
```

### 2. 直接查某一卦

示例：

- 查乾卦
- 第三卦是什么
- 给我看屯卦的卦辞和六二爻辞
- 查一下“利涉大川”出自哪些卦

### 3. 让它解释一个结果

示例：

- 这个卦为什么取这一条爻辞？
- 两爻变应该怎么看？
- 请先给我原文，再给白话解释
- 不要鸡汤，直接说这卦提醒我什么

### 4. 让它做体系导航

示例：

- 周易和六爻有什么区别？
- 小六壬是不是基于周易原文？
- 这个问题更适合用周易、八字还是奇门？

## 三、问得越好，结果越准

最好的提问方式是：`一事一问`。

好问题：

- 我这个月要不要推进新的合作？
- 我现在是否适合离开这份工作？
- 这段关系接下来该不该主动沟通？

不好的问法：

- 我的整个人生怎么样？
- 我什么时候一定暴富？
- 他到底爱不爱我、会不会回来、会不会娶我？

你可以照着这个模板问：

```text
我想问的是：
现在这件事的核心问题是：
我最想判断的是：该推进 / 该等待 / 该止损 / 该沟通？
```

## 四、结果出来后怎么看

结果里最重要的是四部分：

- `本卦`：你现在的处境是什么
- `变卦`：事情接下来可能往哪里转
- `动爻`：变化最关键的位置
- `本经取辞`：真正该看的《周易》原文

最简单的读法：

1. 先看系统说这次用了哪条规则取辞。
2. 再看引用的卦辞或爻辞原文。
3. 最后再看它对现实问题的白话解释。

不要一上来只盯着“吉”还是“凶”。  
真正有用的是：它提醒你现在该进、该守、该改，还是该停。

## 五、七种取辞规则

这套系统严格按传统的变爻规则来，不会乱选一句听起来顺耳的话：

1. 六爻不变：看本卦卦辞  
2. 一爻变：看该动爻爻辞  
3. 二爻变：看两条动爻，以上爻为主  
4. 三爻变：看本卦卦辞和变卦卦辞  
5. 四爻变：看两条静爻，以下爻为主  
6. 五爻变：看变卦中唯一静爻  
7. 六爻皆变：乾看用九，坤看用六，其余看变卦卦辞

这也是它和很多“会起卦但不会严格取辞”的同类 agent 最大的不同之一。

## 六、如果你是本地打开网页用

打开：

`index.html`

你会看到三个主要区域：

### 1. 周易本经占筮

- 输入问题
- 选择 `三钱` 或 `蓍草`
- 点击 `起卦`

### 2. 本经卦库

可以搜索：

- 卦名：乾、坤、屯、需……
- 卦辞关键词：利涉大川、元亨利贞……
- 爻辞关键词：十年乃字、无咎……

### 3. 术数百科

这里会告诉你：

- 哪些体系已经校验过
- 哪些体系暂时只做百科导航
- 每个体系适合解决什么问题

## 七、推荐的使用姿势

如果你是第一次用，最推荐这三种方式：

### 方式一：直接问现实问题

```text
帮我起一卦，问这次合作还要不要继续推进。
```

### 方式二：先查卦再理解

```text
查一下谦卦，并告诉我它为什么常被理解成“有利于长期发展”。
```

### 方式三：先问体系差异

```text
我现在的问题到底适合用周易本经、六爻还是八字？
```

## 八、边界说明

这套系统有一个很重要的原则：

`宁可说清边界，也不冒充高精度。`

所以它会坚持这些做法：

- 周易部分只以本经原文为底
- 不把八字、奇门、紫微、小六壬硬混进周易解释
- 不把白话改写伪装成原文
- 不把未校验的命理模块装成“全都能算”

这也是它和很多市面上“什么都想算、但每样都不够扎实”的 agent 不一样的地方。

## 九、一句话总结

最好的使用方法不是把它当神谕机，而是把它当一面镜子：

先用《周易》帮你把问题照清楚，再回到现实里做真正的选择。


path: references/README.md
content: # 周易本经占筮

一个以 `sources/zhouyi/zhouyi_benjing.txt` 为底座的本地《周易》占筮系统，同时提供百科式术数导航。

如果你只是想知道怎么使用，请先看：`使用说明-小白版.md`。

## 核心原则

- 以《周易》本经卦辞、爻辞、用九、用六为第一数据源。
- 起卦只负责生成六爻，不把随机结果包装成确定命令。
- 解读必须先说明取辞规则，再引用本经原文，再给出现代语境建议。
- 其他术数体系只做百科导航和资料要求说明；未通过校验前不冒充高精度排盘。
- 高风险问题只给决策提示，不替代医疗、法律、投资等专业意见。

## 已吸收并修正的点

- 保留 `gua` 包里较好的 64 卦映射、三钱概率和七种取辞规则。
- 修正之前多个包里出现的卦序反置、原文截断、白话混入原文等问题。
- 放弃不可靠的八字、六爻纳甲、奇门、紫微混搭，不让非周易体系污染本经解释。
- 增加数据构建校验，确保 64 卦完整、每卦 6 爻、乾坤特殊用辞存在。
- 新增全体系百科导航，按 S/B/C 级标明可信度、资料要求和边界。
- 新增本经卦库检索，可按卦名、卦辞、爻辞关键词查找。

## 使用

直接用浏览器打开 `index.html`。

如果想接到 Telegram，见：`TELEGRAM部署.md`。

可选起卦方式：

- `三钱`：三枚铜钱法，6/7/8/9 概率为 1/8、3/8、3/8、1/8。
- `蓍草`：按蓍草法常用概率模拟，6/7/8/9 概率为 1/16、5/16、7/16、3/16。

## 取辞规则

- 六爻不变：用本卦卦辞。
- 一爻变：用该动爻爻辞。
- 二爻变：用两个动爻爻辞，以上爻为主。
- 三爻变：用本卦卦辞与变卦卦辞。
- 四爻变：用两个静爻爻辞，以下爻为主。
- 五爻变：用变卦中唯一静爻所对应的爻辞。
- 六爻皆变：乾用用九，坤用用六，其他卦用变卦卦辞。

## 数据构建

```bash
python3 tools/build_zhouyi_data.py
```

这会从 `sources/zhouyi/zhouyi_benjing.txt` 生成 `data/zhouyi-benjing.js`。

## 验证

```bash
node tests/verify_zhouyi_system.js
node tests/verify_system_catalog.js
```

验证内容包括：64 卦数量、每卦 6 爻、乾坤用辞、关键原文、乾坤泰否既济未济等卦象映射。
百科验证内容包括：体系数量、字段完整性、已启用模块范围、待校验体系边界。


path: tests/verify_zhouyi_system.js
content: #!/usr/bin/env node
const assert = require("node:assert/strict");
const zhouyi = require("../data/zhouyi-benjing.js");

const trigrams = {
  "111": "乾",
  "110": "兑",
  "101": "离",
  "100": "震",
  "011": "巽",
  "010": "坎",
  "001": "艮",
  "000": "坤"
};

const lookup = {
  "乾|乾": 1, "乾|兑": 43, "乾|离": 14, "乾|震": 34, "乾|巽": 9, "乾|坎": 5, "乾|艮": 26, "乾|坤": 11,
  "兑|乾": 10, "兑|兑": 58, "兑|离": 38, "兑|震": 54, "兑|巽": 61, "兑|坎": 60, "兑|艮": 41, "兑|坤": 19,
  "离|乾": 13, "离|兑": 49, "离|离": 30, "离|震": 55, "离|巽": 37, "离|坎": 63, "离|艮": 22, "离|坤": 36,
  "震|乾": 25, "震|兑": 17, "震|离": 21, "震|震": 51, "震|巽": 42, "震|坎": 3, "震|艮": 27, "震|坤": 24,
  "巽|乾": 44, "巽|兑": 28, "巽|离": 50, "巽|震": 32, "巽|巽": 57, "巽|坎": 48, "巽|艮": 18, "巽|坤": 46,
  "坎|乾": 6, "坎|兑": 47, "坎|离": 64, "坎|震": 40, "坎|巽": 59, "坎|坎": 29, "坎|艮": 4, "坎|坤": 7,
  "艮|乾": 33, "艮|兑": 31, "艮|离": 56, "艮|震": 62, "艮|巽": 53, "艮|坎": 39, "艮|艮": 52, "艮|坤": 15,
  "坤|乾": 12, "坤|兑": 45, "坤|离": 35, "坤|震": 16, "坤|巽": 20, "坤|坎": 8, "坤|艮": 23, "坤|坤": 2
};

function resolve(bits) {
  const lower = trigrams[bits.slice(0, 3)];
  const upper = trigrams[bits.slice(3, 6)];
  return zhouyi[lookup[`${lower}|${upper}`] - 1];
}

assert.equal(zhouyi.length, 64);
for (const hex of zhouyi) {
  assert.equal(hex.lines.length, 6, `${hex.number} ${hex.name} should have 6 lines`);
  assert.ok(hex.judgment, `${hex.number} ${hex.name} should have judgment`);
}

assert.equal(zhouyi[0].name, "乾");
assert.equal(zhouyi[0].extras[0].label, "用九");
assert.equal(zhouyi[1].name, "坤");
assert.equal(zhouyi[1].extras[0].label, "用六");
assert.equal(zhouyi[2].lines[1].text, "屯如邅如，乘馬班如。匪寇婚媾，女子貞不字，十年乃字。");

assert.equal(resolve("111111").name, "乾");
assert.equal(resolve("000000").name, "坤");
assert.equal(resolve("111000").name, "泰");
assert.equal(resolve("000111").name, "否");
assert.equal(resolve("101010").name, "既濟");
assert.equal(resolve("010101").name, "未濟");
assert.equal(resolve("011101").name, "鼎");
assert.equal(resolve("001101").name, "旅");

const sourceRules = [
  "六爻不变：本卦卦辞",
  "一爻变：该动爻爻辞",
  "二爻变：两条动爻爻辞，以上爻为主",
  "三爻变：本卦卦辞与变卦卦辞",
  "四爻变：两条静爻爻辞，以下爻为主",
  "五爻变：变卦中唯一静爻所对应的爻辞",
  "六爻皆变：乾用用九，坤用用六，其他用变卦卦辞"
];
assert.equal(sourceRules.length, 7);

console.log("zhouyi system verification passed");


path: tests/verify_cli.js
content: const { execFileSync } = require("child_process");
const path = require("path");

const root = path.join(__dirname, "..");
const cli = path.join(root, "scripts", "zhouyi_cli.js");

function run(args) {
  return execFileSync("node", [cli, ...args], {
    cwd: root,
    encoding: "utf-8"
  });
}

function assert(condition, message) {
  if (!condition) throw new Error(message);
}

const cast = JSON.parse(run(["cast", "--question", "测试", "--method", "coin", "--seed", "demo", "--json"]));
assert(cast.primary && cast.primary.number >= 1 && cast.primary.number <= 64, "cast should resolve primary hexagram");
assert(cast.changed && cast.changed.number >= 1 && cast.changed.number <= 64, "cast should resolve changed hexagram");
assert(Array.isArray(cast.lines) && cast.lines.length === 6, "cast should return 6 lines");
assert(cast.decision && cast.decision.entries.length >= 1, "cast should return decision entries");

const lookup = JSON.parse(run(["lookup", "--name", "乾", "--json"]));
assert(lookup.number === 1, "lookup by name should return 乾卦");
assert(lookup.extras[0].label === "用九", "乾卦 should retain 用九");

const search = JSON.parse(run(["search", "--query", "十年乃字", "--json"]));
assert(search.some((item) => item.number === 3), "search should find 屯卦");

const catalog = JSON.parse(run(["catalog", "--grade", "S", "--json"]));
assert(catalog.length >= 3, "catalog S grade should include enabled core systems");

console.log("cli verification passed");


path: tests/verify_system_catalog.js
content: #!/usr/bin/env node
const assert = require("node:assert/strict");
const systems = require("../data/system-catalog.js");

assert.ok(systems.length >= 10, "catalog should feel encyclopedic");

for (const item of systems) {
  assert.ok(item.id, "system id required");
  assert.ok(item.name, `${item.id} name required`);
  assert.ok(["S", "B", "C"].includes(item.grade), `${item.id} invalid grade`);
  assert.ok(item.status, `${item.id} status required`);
  assert.ok(item.basis, `${item.id} basis required`);
  assert.ok(item.capability, `${item.id} capability required`);
  assert.ok(item.guardrail, `${item.id} guardrail required`);
  assert.ok(Array.isArray(item.bestFor) && item.bestFor.length > 0, `${item.id} bestFor required`);
  assert.ok(Array.isArray(item.inputs) && item.inputs.length > 0, `${item.id} inputs required`);
}

const active = systems.filter((item) => item.status === "已启用").map((item) => item.id).sort();
assert.deepEqual(active, ["routing", "yijing-library", "zhouyi-benjing"].sort());

const zhouyi = systems.find((item) => item.id === "zhouyi-benjing");
assert.equal(zhouyi.grade, "S");
assert.match(zhouyi.basis, /周易/);

const qimen = systems.find((item) => item.id === "qimen");
assert.equal(qimen.status, "待校验");
assert.match(qimen.guardrail, /基准盘/);

console.log("system catalog verification passed");


path: agents/openai.yaml
content: interface:
  display_name: "周易本经占筮"
  short_description: "汲取百家之长，打磨成更完整的《周易》系统 | A more complete I Ching system distilled from the best of the field"
  default_prompt: "Use $zhouyi-benjing-oracle to cast a Zhouyi hexagram or look up hexagram source text, cite the original judgment or line text first, and then explain it in plain Chinese."


path: package.json
content: {
  "name": "zhouyi-benjing-oracle",
  "version": "1.0.0",
  "description": "以《周易》本经原著为底，系统收集并拆解市面上几乎所有可获取的同类 divination agents / skills / 程序，汲取百家之长，取其精华、去其糟粕，最终打磨成更准确、更完整、更好用的周易系统。Built on the original Zhouyi text and refined by absorbing the best ideas across virtually every comparable divination agent we could access.",
  "main": "SKILL.md",
  "keywords": [
    "openclaw",
    "skill",
    "zhouyi",
    "yijing",
    "iching",
    "周易",
    "易经",
    "六十四卦",
    "占卜",
    "卦辞",
    "爻辞"
  ],
  "author": "pineapple",
  "license": "MIT-0",
  "engines": {
    "node": ">=18"
  },
  "scripts": {
    "cast": "node scripts/zhouyi_cli.js cast",
    "lookup": "node scripts/zhouyi_cli.js lookup",
    "search": "node scripts/zhouyi_cli.js search",
    "catalog": "node scripts/zhouyi_cli.js catalog",
    "build:data": "python3 scripts/build_zhouyi_data.py",
    "test": "node tests/verify_zhouyi_system.js && node tests/verify_system_catalog.js && node tests/verify_cli.js"
  }
}


path: scripts/zhouyi_cli.js
content: #!/usr/bin/env node

const crypto = require("crypto");
const ZHOUYI_BENJING = require("../data/zhouyi-benjing");
const DIVINATION_SYSTEMS = require("../data/system-catalog");

const TRIGRAMS = {
  "111": { name: "乾", symbol: "☰", nature: "天", image: "健" },
  "110": { name: "兑", symbol: "☱", nature: "泽", image: "悦" },
  "101": { name: "离", symbol: "☲", nature: "火", image: "丽" },
  "100": { name: "震", symbol: "☳", nature: "雷", image: "动" },
  "011": { name: "巽", symbol: "☴", nature: "风", image: "入" },
  "010": { name: "坎", symbol: "☵", nature: "水", image: "险" },
  "001": { name: "艮", symbol: "☶", nature: "山", image: "止" },
  "000": { name: "坤", symbol: "☷", nature: "地", image: "顺" }
};

const HEXAGRAM_LOOKUP = {
  "乾|乾": 1, "乾|兑": 43, "乾|离": 14, "乾|震": 34, "乾|巽": 9, "乾|坎": 5, "乾|艮": 26, "乾|坤": 11,
  "兑|乾": 10, "兑|兑": 58, "兑|离": 38, "兑|震": 54, "兑|巽": 61, "兑|坎": 60, "兑|艮": 41, "兑|坤": 19,
  "离|乾": 13, "离|兑": 49, "离|离": 30, "离|震": 55, "离|巽": 37, "离|坎": 63, "离|艮": 22, "离|坤": 36,
  "震|乾": 25, "震|兑": 17, "震|离": 21, "震|震": 51, "震|巽": 42, "震|坎": 3, "震|艮": 27, "震|坤": 24,
  "巽|乾": 44, "巽|兑": 28, "巽|离": 50, "巽|震": 32, "巽|巽": 57, "巽|坎": 48, "巽|艮": 18, "巽|坤": 46,
  "坎|乾": 6, "坎|兑": 47, "坎|离": 64, "坎|震": 40, "坎|巽": 59, "坎|坎": 29, "坎|艮": 4, "坎|坤": 7,
  "艮|乾": 33, "艮|兑": 31, "艮|离": 56, "艮|震": 62, "艮|巽": 53, "艮|坎": 39, "艮|艮": 52, "艮|坤": 15,
  "坤|乾": 12, "坤|兑": 45, "坤|离": 35, "坤|震": 16, "坤|巽": 20, "坤|坎": 8, "坤|艮": 23, "坤|坤": 2
};

const POSITION_NAMES = ["初爻", "二爻", "三爻", "四爻", "五爻", "上爻"];

function usage() {
  console.log(`
Usage:
  node scripts/zhouyi_cli.js cast --question "..." --method coin|yarrow [--seed demo] [--json]
  node scripts/zhouyi_cli.js lookup --name 乾 [--json]
  node scripts/zhouyi_cli.js lookup --number 1 [--json]
  node scripts/zhouyi_cli.js search --query "利涉大川" [--json]
  node scripts/zhouyi_cli.js catalog [--grade S|B|C] [--query 关键词] [--json]
`);
}

function parseArgs(argv) {
  const options = {};
  for (let i = 0; i < argv.length; i += 1) {
    const item = argv[i];
    if (!item.startsWith("--")) continue;
    const key = item.slice(2);
    const next = argv[i + 1];
    if (!next || next.startsWith("--")) {
      options[key] = true;
    } else {
      options[key] = next;
      i += 1;
    }
  }
  return options;
}

function createSeededRng(seedInput) {
  let seed = 0x811c9dc5;
  for (const ch of String(seedInput)) {
    seed ^= ch.charCodeAt(0);
    seed = Math.imul(seed, 16777619);
  }
  if (!seed) seed = 0x9e3779b9;
  return () => {
    seed += 0x6d2b79f5;
    let t = seed;
    t = Math.imul(t ^ (t >>> 15), t | 1);
    t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
  };
}

function randomRng() {
  return () => {
    if (typeof crypto.randomInt === "function") {
      return crypto.randomInt(0, 1_000_000) / 1_000_000;
    }
    return Math.random();
  };
}

function weightedPick(items, rng) {
  const total = items.reduce((sum, item) => sum + item.weight, 0);
  let cursor = rng() * total;
  for (const item of items) {
    cursor -= item.weight;
    if (cursor < 0) return item.value;
  }
  return items[items.length - 1].value;
}

function createLine(value, coins = []) {
  return {
    value,
    coins,
    yang: value === 7 || value === 9,
    moving: value === 6 || value === 9,
    label: value === 6 ? "老阴" : value === 7 ? "少阳" : value === 8 ? "少阴" : "老阳"
  };
}

function tossLine(method, rng) {
  if (method === "yarrow") {
    return createLine(
      weightedPick(
        [
          { value: 6, weight: 1 },
          { value: 7, weight: 5 },
          { value: 8, weight: 7 },
          { value: 9, weight: 3 }
        ],
        rng
      )
    );
  }

  const coins = Array.from({ length: 3 }, () => (rng() < 0.5 ? 2 : 3));
  return createLine(coins.reduce((sum, coin) => sum + coin, 0), coins);
}

function sameTrigramName(sourceName, trigramName) {
  const aliases = { 兑: "兌", 离: "離" };
  return sourceName === trigramName || sourceName === aliases[trigramName];
}

function fullHexagramName(name, upper, lower) {
  if (upper.name === lower.name && sameTrigramName(name, upper.name)) {
    return `${name}为${upper.nature}`;
  }
  return `${upper.nature}${lower.nature}${name}`;
}

function resolveHexagram(lines) {
  const lowerBits = lines.slice(0, 3).map((line) => (line.yang ? "1" : "0")).join("");
  const upperBits = lines.slice(3, 6).map((line) => (line.yang ? "1" : "0")).join("");
  const lower = TRIGRAMS[lowerBits];
  const upper = TRIGRAMS[upperBits];
  const number = HEXAGRAM_LOOKUP[`${lower.name}|${upper.name}`];
  const benjing = ZHOUYI_BENJING[number - 1];

  return {
    number,
    name: benjing.name,
    fullName: fullHexagramName(benjing.name, upper, lower),
    judgment: benjing.judgment,
    lines: benjing.lines,
    extras: benjing.extras,
    lower,
    upper
  };
}

function lineEntry(hexagram, index, priority) {
  return {
    title: `${hexagram.name}${hexagram.lines[index].label}`,
    label: hexagram.lines[index].label,
    text: hexagram.lines[index].text,
    priority
  };
}

function decideTextSource(primary, changed, moving) {
  const count = moving.length;

  if (count === 0) {
    return {
      rule: "六爻不变：以本卦卦辞为主。",
      focus: "本卦卦辞",
      entries: [{ title: `${primary.name}卦辞`, text: primary.judgment, priority: true }]
    };
  }

  if (count === 1) {
    const item = moving[0];
    return {
      rule: "一爻变：以该动爻爻辞为主。",
      focus: primary.lines[item.index].label,
      entries: [lineEntry(primary, item.index, true)]
    };
  }

  if (count === 2) {
    const indexes = moving.map((item) => item.index).sort((a, b) => a - b);
    const upperIndex = indexes[indexes.length - 1];
    return {
      rule: "二爻变：取两条动爻爻辞，以上爻为主。",
      focus: primary.lines[upperIndex].label,
      entries: indexes.map((index) => lineEntry(primary, index, index === upperIndex))
    };
  }

  if (count === 3) {
    return {
      rule: "三爻变：以本卦卦辞与变卦卦辞合看。",
      focus: "本卦与变卦卦辞",
      entries: [
        { title: `${primary.name}卦辞`, text: primary.judgment, priority: true },
        { title: `${changed.name}卦辞`, text: changed.judgment, priority: false }
      ]
    };
  }

  if (count === 4) {
    const staticIndexes = [0, 1, 2, 3, 4, 5].filter((index) => !moving.some((item) => item.index === index));
    const lowerIndex = staticIndexes[0];
    return {
      rule: "四爻变：取两条静爻爻辞，以下爻为主。",
      focus: primary.lines[lowerIndex].label,
      entries: staticIndexes.map((index) => lineEntry(primary, index, index === lowerIndex))
    };
  }

  if (count === 5) {
    const staticIndex = [0, 1, 2, 3, 4, 5].find((index) => !moving.some((item) => item.index === index));
    return {
      rule: "五爻变：取变卦中唯一静爻所对应的爻辞。",
      focus: changed.lines[staticIndex].label,
      entries: [lineEntry(changed, staticIndex, true)]
    };
  }

  const special =
    primary.number === 1
      ? primary.extras.find((item) => item.label === "用九")
      : primary.number === 2
        ? primary.extras.find((item) => item.label === "用六")
        : null;

  if (special) {
    return {
      rule: "六爻皆变：乾用用九，坤用用六。",
      focus: special.label,
      entries: [{ title: special.label, text: special.text, priority: true }]
    };
  }

  return {
    rule: "六爻皆变：乾坤之外，以变卦卦辞为主。",
    focus: `${changed.name}卦辞`,
    entries: [{ title: `${changed.name}卦辞`, text: changed.judgment, priority: true }]
  };
}

function renderLineGlyph(line) {
  if (line.yang) {
    return line.moving ? "⚊ ○" : "⚊";
  }
  return line.moving ? "⚋ ×" : "⚋";
}

function castHexagram(question, method, seed) {
  const rng = seed ? createSeededRng(seed) : randomRng();
  const lines = Array.from({ length: 6 }, () => tossLine(method, rng));
  const changedLines = lines.map((line) => ({
    ...line,
    yang: line.moving ? !line.yang : line.yang,
    moving: false
  }));

  const primary = resolveHexagram(lines);
  const changed = resolveHexagram(changedLines);
  const moving = lines
    .map((line, index) => ({ index, line }))
    .filter((item) => item.line.moving)
    .map((item) => ({
      index: item.index,
      position: POSITION_NAMES[item.index],
      originalLabel: primary.lines[item.index].label,
      lineType: item.line.label,
      text: primary.lines[item.index].text
    }));

  return {
    question,
    method,
    seed: seed || null,
    lines: lines.map((line, index) => ({
      index,
      position: POSITION_NAMES[index],
      lineType: line.label,
      value: line.value,
      moving: line.moving,
      yang: line.yang,
      coins: line.coins,
      glyph: renderLineGlyph(line)
    })),
    primary,
    changed,
    moving,
    decision: decideTextSource(primary, changed, moving)
  };
}

function lookupHexagramByName(name) {
  return ZHOUYI_BENJING.find((item) => item.name === name) || null;
}

function lookupHexagramByNumber(number) {
  const value = Number(number);
  if (!Number.isInteger(value) || value < 1 || value > 64) return null;
  return ZHOUYI_BENJING[value - 1];
}

function searchHexagrams(query) {
  const keyword = String(query || "").trim();
  return ZHOUYI_BENJING.filter((item) => {
    if (item.name.includes(keyword) || item.judgment.includes(keyword)) return true;
    if (item.lines.some((line) => line.text.includes(keyword) || line.label.includes(keyword))) return true;
    if (item.extras.some((extra) => extra.text.includes(keyword) || extra.label.includes(keyword))) return true;
    return false;
  }).map((item) => ({
    number: item.number,
    name: item.name,
    judgment: item.judgment
  }));
}

function filterCatalog(query, grade) {
  return DIVINATION_SYSTEMS.filter((item) => {
    const gradeOk = !grade || grade === "all" || item.grade === grade;
    if (!gradeOk) return false;
    if (!query) return true;
    const haystack = [
      item.name,
      item.family,
      item.basis,
      item.capability,
      item.guardrail,
      ...(item.bestFor || []),
      ...(item.inputs || [])
    ].join(" ");
    return haystack.includes(query);
  });
}

function print(payload, asJson, formatter) {
  if (asJson) {
    console.log(JSON.stringify(payload, null, 2));
    return;
  }
  console.log(formatter(payload));
}

function formatCast(payload) {
  const lines = payload.lines
    .slice()
    .reverse()
    .map((line) => `${line.position} ${line.glyph} ${line.lineType}`)
    .join("\n");
  const selected = payload.decision.entries
    .map((entry) => `${entry.title}${entry.priority ? " [主]" : ""}\n${entry.text}`)
    .join("\n\n");
  return [
    `问题：${payload.question || "未填写"}`,
    `方法：${payload.method}`,
    `本卦：${payload.primary.number}. ${payload.primary.fullName}`,
    `变卦：${payload.changed.number}. ${payload.changed.fullName}`,
    `动爻：${payload.moving.length ? payload.moving.map((item) => item.originalLabel).join("、") : "无"}`,
    "",
    lines,
    "",
    `取辞规则：${payload.decision.rule}`,
    selected
  ].join("\n");
}

function formatLookup(payload) {
  const lines = payload.lines.map((line) => `${line.label}：${line.text}`).join("\n");
  const extras = payload.extras.length ? `\n${payload.extras.map((item) => `${item.label}：${item.text}`).join("\n")}` : "";
  return `${payload.number}. ${payload.name}\n卦辞：${payload.judgment}\n${lines}${extras}`;
}

function formatSearch(results) {
  if (!results.length) return "未找到匹配卦象。";
  return results.map((item) => `${item.number}. ${item.name}：${item.judgment}`).join("\n");
}

function formatCatalog(results) {
  if (!results.length) return "未找到匹配体系。";
  return results
    .map((item) => `${item.grade} ${item.name} [${item.status}]\n依据：${item.basis}\n能力：${item.capability}\n边界：${item.guardrail}`)
    .join("\n\n");
}

function main() {
  const command = process.argv[2];
  const options = parseArgs(process.argv.slice(3));
  const asJson = Boolean(options.json || options.format === "json");

  if (!command || command === "help" || command === "--help" || command === "-h") {
    usage();
    process.exit(command ? 0 : 1);
  }

  if (command === "cast") {
    const method = options.method === "yarrow" ? "yarrow" : "coin";
    const payload = castHexagram(options.question || "", method, options.seed || "");
    print(payload, asJson, formatCast);
    return;
  }

  if (command === "lookup") {
    const result = options.name ? lookupHexagramByName(options.name) : lookupHexagramByNumber(options.number);
    if (!result) {
      console.error("未找到指定卦象。请提供 --name 或 --number。");
      process.exit(1);
    }
    print(result, asJson, formatLookup);
    return;
  }

  if (command === "search") {
    if (!options.query) {
      console.error("search 需要 --query。");
      process.exit(1);
    }
    const results = searchHexagrams(options.query);
    print(results, asJson, formatSearch);
    return;
  }

  if (command === "catalog") {
    const results = filterCatalog(options.query || "", options.grade || "all");
    print(results, asJson, formatCatalog);
    return;
  }

  console.error(`未知命令：${command}`);
  usage();
  process.exit(1);
}

main();


path: scripts/publish.sh
content: #!/usr/bin/env bash

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
DIST_DIR="$(cd "$PROJECT_DIR/.." && pwd)/dist"
VERSION=""
DISPLAY_NAME=""

usage() {
  echo "Usage: $(basename "$0") --version <semver> [--name <display-name>]"
  exit 1
}

while [[ $# -gt 0 ]]; do
  case "$1" in
    --version)
      VERSION="${2:-}"
      shift 2
      ;;
    --name)
      DISPLAY_NAME="${2:-}"
      shift 2
      ;;
    *)
      usage
      ;;
  esac
done

[[ -n "$VERSION" ]] || usage

python3 - <<PY
import json
from pathlib import Path

project = Path(r"$PROJECT_DIR")
version = "$VERSION"

for filename in ("package.json", "_meta.json"):
    path = project / filename
    data = json.loads(path.read_text(encoding="utf-8"))
    data["version"] = version
    path.write_text(json.dumps(data, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")

skill_path = project / "SKILL.md"
text = skill_path.read_text(encoding="utf-8")
if "version: " in text:
    import re
    text = re.sub(
        r'(^\s*version:\s*")[^"]+(")',
        lambda m: f'{m.group(1)}{version}{m.group(2)}',
        text,
        flags=re.M,
    )
skill_path.write_text(text, encoding="utf-8")
PY

mkdir -p "$DIST_DIR"
ZIP_PATH="$DIST_DIR/zhouyi-benjing-oracle-$VERSION.zip"
rm -f "$ZIP_PATH"

cd "$(dirname "$PROJECT_DIR")"
zip -rq "$ZIP_PATH" "$(basename "$PROJECT_DIR")" -x "*/__pycache__/*" "*/.DS_Store"

echo "Built $ZIP_PATH"
echo ""
echo "ClawHub CLI publish command:"
if [[ -n "$DISPLAY_NAME" ]]; then
  echo "clawhub publish \"$PROJECT_DIR\" --version \"$VERSION\" --name \"$DISPLAY_NAME\""
else
  echo "clawhub publish \"$PROJECT_DIR\" --version \"$VERSION\""
fi


path: scripts/build_zhouyi_data.py
content: #!/usr/bin/env python3
"""Build a browser-loadable Zhouyi Benjing data file from the local source text."""

from __future__ import annotations

import json
import re
from pathlib import Path


ROOT = Path(__file__).resolve().parents[1]
SOURCE = ROOT / "references" / "zhouyi-benjing-source.txt"
OUTPUT = ROOT / "data" / "zhouyi-benjing.js"

LINE_LABELS = ("初九", "初六", "九二", "六二", "九三", "六三", "九四", "六四", "九五", "六五", "上九", "上六")
EXTRA_LABELS = ("用九", "用六")


def compact(value: str) -> str:
    return re.sub(r"\s+", "", value.strip())


def parse_source(text: str) -> list[dict]:
    lines = [line.strip() for line in text.splitlines()]
    hexagrams: list[dict] = []
    i = 0

    while i < len(lines):
        if not re.match(r"^第\s*\S+\s*卦$", lines[i]):
            i += 1
            continue

        number = len(hexagrams) + 1
        i += 1
        while i < len(lines) and not lines[i]:
            i += 1

        name_line = lines[i]
        inline_judgment = ""
        inline_match = re.match(r"^([^：]+)：(.+)$", name_line)
        if inline_match:
            name = inline_match.group(1).strip()
            inline_judgment = inline_match.group(2).strip()
        else:
            name = name_line
        i += 1
        while i < len(lines) and not lines[i]:
            i += 1

        judgment_parts: list[str] = [inline_judgment] if inline_judgment else []
        yao_lines: list[dict] = []
        extra_lines: list[dict] = []

        while i < len(lines):
            line = lines[i]
            if re.match(r"^第\s*\S+\s*卦$", line):
                break
            i += 1
            if not line:
                continue

            match = re.match(r"^([^：]+)：(.+)$", line)
            if not match:
                if judgment_parts and not yao_lines and not extra_lines:
                    judgment_parts.append(line)
                continue

            label, text_part = match.group(1), match.group(2)
            if label in LINE_LABELS:
                yao_lines.append({"label": label, "text": text_part.strip()})
            elif label in EXTRA_LABELS:
                extra_lines.append({"label": label, "text": text_part.strip()})
            elif compact(label) == compact(name):
                judgment_parts.append(text_part.strip())
            elif judgment_parts and not yao_lines and not extra_lines:
                judgment_parts.append(line)

        hexagrams.append(
            {
                "number": number,
                "name": name,
                "judgment": "".join(judgment_parts),
                "lines": yao_lines,
                "extras": extra_lines,
            }
        )

    return hexagrams


def validate(hexagrams: list[dict]) -> None:
    if len(hexagrams) != 64:
        raise SystemExit(f"expected 64 hexagrams, got {len(hexagrams)}")

    for item in hexagrams:
        if not item["judgment"]:
            raise SystemExit(f"hexagram {item['number']} {item['name']} has no judgment")
        if len(item["lines"]) != 6:
            raise SystemExit(
                f"hexagram {item['number']} {item['name']} expected 6 lines, got {len(item['lines'])}"
            )

    if hexagrams[0]["name"] != "乾" or hexagrams[0]["extras"][0]["label"] != "用九":
        raise SystemExit("乾卦 or 用九 parse failed")
    if hexagrams[1]["name"] != "坤" or hexagrams[1]["extras"][0]["label"] != "用六":
        raise SystemExit("坤卦 or 用六 parse failed")
    if hexagrams[2]["lines"][1]["text"] != "屯如邅如，乘馬班如。匪寇婚媾，女子貞不字，十年乃字。":
        raise SystemExit("屯六二 source text was not preserved exactly")


def main() -> None:
    text = SOURCE.read_text(encoding="utf-8")
    hexagrams = parse_source(text)
    validate(hexagrams)
    OUTPUT.parent.mkdir(parents=True, exist_ok=True)

    payload = json.dumps(hexagrams, ensure_ascii=False, indent=2)
    OUTPUT.write_text(
        "const ZHOUYI_BENJING = "
        + payload
        + ";\n\n"
        + "if (typeof window !== \"undefined\") window.ZHOUYI_BENJING = ZHOUYI_BENJING;\n"
        + "if (typeof module !== \"undefined\") module.exports = ZHOUYI_BENJING;\n",
        encoding="utf-8",
    )
    print(f"wrote {OUTPUT.relative_to(ROOT)} with {len(hexagrams)} hexagrams")


if __name__ == "__main__":
    main()


path: data/system-catalog.js
content: const DIVINATION_SYSTEMS = [
  {
    id: "zhouyi-benjing",
    name: "周易本经占筮",
    family: "易",
    grade: "S",
    status: "已启用",
    basis: "《周易》本经卦辞、爻辞、用九、用六",
    bestFor: ["当下决策", "时机判断", "关系与事业抉择", "自我复盘"],
    inputs: ["一个明确问题", "起卦方式"],
    capability: "可起卦、取辞、引用本经原文并给出现代解释。",
    guardrail: "只作解释性参考，不替代专业判断。"
  },
  {
    id: "yijing-library",
    name: "六十四卦本经库",
    family: "易",
    grade: "S",
    status: "已启用",
    basis: "本地 Gutenberg《易經》整理文本",
    bestFor: ["查卦辞", "查爻辞", "校验卦序", "学习原文"],
    inputs: ["卦名、卦序或关键词"],
    capability: "可检索六十四卦卦辞和六爻原文。",
    guardrail: "当前只含本经，不混入彖象传和后世注解。"
  },
  {
    id: "meihua",
    name: "梅花易数",
    family: "易象",
    grade: "B",
    status: "知识库",
    basis: "以卦象、体用、生克、动爻为主的后世易占体系",
    bestFor: ["快速起象", "当下气机", "小事趋势"],
    inputs: ["数、时间、物象或随机触发"],
    capability: "当前只提供体系说明和路由建议，暂不自动断梅花盘。",
    guardrail: "避免把数字取卦与《周易》本经取辞混为一谈。"
  },
  {
    id: "liuyao",
    name: "六爻纳甲",
    family: "易占",
    grade: "B",
    status: "待校验",
    basis: "纳甲、六亲、世应、月建日辰、动变生克",
    bestFor: ["具体事项成败", "失物", "官司", "短期应期"],
    inputs: ["六爻结果", "起卦时间", "明确用神"],
    capability: "暂不开放自动断卦，只保留未来高精度实现入口。",
    guardrail: "必须先校验纳甲、世应、六亲、月日旺衰，否则不输出结论。"
  },
  {
    id: "xiaoliuren",
    name: "小六壬",
    family: "民间时占",
    grade: "C",
    status: "知识库",
    basis: "大安、留连、速喜、赤口、小吉、空亡六神课",
    bestFor: ["轻量日常问事", "出门前判断", "粗略吉凶"],
    inputs: ["月、日、时或指定数字"],
    capability: "当前只解释体系差异，不作为周易本经断语依据。",
    guardrail: "小六壬不是《周易》原文体系，不能冒充易经本经。"
  },
  {
    id: "qimen",
    name: "奇门遁甲",
    family: "三式",
    grade: "B",
    status: "待校验",
    basis: "节气、阴阳遁、局数、九星八门八神、三奇六仪",
    bestFor: ["择时", "方位", "项目推进窗口", "行动策略"],
    inputs: ["精确时间", "地点/时区", "问事类别"],
    capability: "只纳入百科与路由，不使用未校验日柱和定局算法。",
    guardrail: "四柱、节气、值符值使必须通过基准盘测试后才能开放排盘。"
  },
  {
    id: "bazi",
    name: "八字四柱",
    family: "命理",
    grade: "B",
    status: "待校验",
    basis: "年、月、日、时四柱与十神、旺衰、大运",
    bestFor: ["长期人格底色", "阶段节奏", "职业倾向"],
    inputs: ["出生年月日时", "出生地", "性别/历法说明"],
    capability: "当前只记录资料要求和解释边界。",
    guardrail: "必须使用可靠历法库和流派说明，不能用简化干支表替代。"
  },
  {
    id: "ziwei",
    name: "紫微斗数",
    family: "命理",
    grade: "B",
    status: "待校验",
    basis: "农历生日、时辰、命宫身宫、十四主星、辅煞、四化",
    bestFor: ["人生阶段", "十二宫主题", "关系与事业结构"],
    inputs: ["农历/公历生日", "时辰", "性别", "历法转换规则"],
    capability: "当前不自动排盘，避免命宫、五行局、安星错误。",
    guardrail: "必须通过成熟排盘库交叉验证后才输出命盘解释。"
  },
  {
    id: "fengshui",
    name: "风水与九宫飞星",
    family: "环境",
    grade: "C",
    status: "知识库",
    basis: "空间方位、流年飞星、住宅格局与现实动线",
    bestFor: ["居住调整", "办公布局", "空间复盘"],
    inputs: ["户型图", "朝向", "入住时间", "实际使用方式"],
    capability: "只提供知识框架，不用缺资料的脚本给方位断语。",
    guardrail: "没有户型和朝向时，只能做一般环境建议。"
  },
  {
    id: "tarot",
    name: "塔罗",
    family: "西方象征",
    grade: "C",
    status: "知识库",
    basis: "牌阵、牌义、关系与短期趋势象征",
    bestFor: ["心理镜像", "关系觉察", "短期选择题"],
    inputs: ["牌阵", "抽牌结果", "问题"],
    capability: "作为百科补充，不参与周易本经结论。",
    guardrail: "塔罗不是周易体系，不能与本经原文互相冒充依据。"
  },
  {
    id: "astrology",
    name: "西方星盘",
    family: "西方占星",
    grade: "C",
    status: "知识库",
    basis: "出生星图、行运、合盘",
    bestFor: ["人格模式", "关系合盘", "阶段性主题"],
    inputs: ["出生年月日时", "出生地"],
    capability: "当前只作为百科条目和未来扩展方向。",
    guardrail: "需要精确天文计算库，不使用泛星座替代星盘。"
  },
  {
    id: "routing",
    name: "综合问事路由",
    family: "产品层",
    grade: "S",
    status: "已启用",
    basis: "问题类型、资料完整度、体系可信度",
    bestFor: ["选择体系", "明确资料缺口", "避免误用"],
    inputs: ["用户问题", "已有资料"],
    capability: "帮助判断该用本经占筮、查卦库，还是等待更完整资料。",
    guardrail: "宁可降级说明，也不冒充高精度。"
  }
];

if (typeof window !== "undefined") window.DIVINATION_SYSTEMS = DIVINATION_SYSTEMS;
if (typeof module !== "undefined") module.exports = DIVINATION_SYSTEMS;


path: data/zhouyi-benjing.js
content: const ZHOUYI_BENJING = [
  {
    "number": 1,
    "name": "乾",
    "judgment": "元，亨，利，貞。",
    "lines": [
      {
        "label": "初九",
        "text": "潛龍，勿用。"
      },
      {
        "label": "九二",
        "text": "見龍在田，利見大人。"
      },
      {
        "label": "九三",
        "text": "君子終日乾乾，夕惕，若厲，無咎。"
      },
      {
        "label": "九四",
        "text": "或躍在淵，無咎。"
      },
      {
        "label": "九五",
        "text": "飛龍在天，利見大人。"
      },
      {
        "label": "上九",
        "text": "亢龍有悔。"
      }
    ],
    "extras": [
      {
        "label": "用九",
        "text": "見群龍無首，吉。"
      }
    ]
  },
  {
    "number": 2,
    "name": "坤",
    "judgment": "元，亨，利牝馬之貞。君子有攸往，先迷後得主，利西南得朋，東北喪朋。安貞，吉。",
    "lines": [
      {
        "label": "初六",
        "text": "履霜，堅冰至。"
      },
      {
        "label": "六二",
        "text": "直，方，大，不習無不利。"
      },
      {
        "label": "六三",
        "text": "含章可貞。或從王事，無成有終。"
      },
      {
        "label": "六四",
        "text": "括囊；無咎，無譽。"
      },
      {
        "label": "六五",
        "text": "黃裳，元吉。"
      },
      {
        "label": "上六",
        "text": "戰龍於野，其血玄黃。"
      }
    ],
    "extras": [
      {
        "label": "用六",
        "text": "利永貞。"
      }
    ]
  },
  {
    "number": 3,
    "name": "屯",
    "judgment": "元，亨，利，貞，勿用，有攸往，利建侯。",
    "lines": [
      {
        "label": "初九",
        "text": "磐桓；利居貞，利建侯。"
      },
      {
        "label": "六二",
        "text": "屯如邅如，乘馬班如。匪寇婚媾，女子貞不字，十年乃字。"
      },
      {
        "label": "六三",
        "text": "既鹿無虞，惟入于林中，君子幾不如舍，往吝。"
      },
      {
        "label": "六四",
        "text": "乘馬班如，求婚媾，往吉，無不利。"
      },
      {
        "label": "九五",
        "text": "屯其膏，小貞吉，大貞凶。"
      },
      {
        "label": "上六",
        "text": "乘馬班如，泣血漣如。"
      }
    ],
    "extras": []
  },
  {
    "number": 4,
    "name": "蒙",
    "judgment": "亨。匪我求童蒙，童蒙求我。初噬告，再三瀆，瀆則不告。利貞。",
    "lines": [
      {
        "label": "初六",
        "text": "發蒙，利用刑人，用說桎梏，以往吝。"
      },
      {
        "label": "九二",
        "text": "包蒙，吉；納婦，吉；子克家。"
      },
      {
        "label": "六三",
        "text": "勿用娶女；見金夫，不有躬，無攸利。"
      },
      {
        "label": "六四",
        "text": "困蒙，吝。"
      },
      {
        "label": "六五",
        "text": "童蒙，吉。"
      },
      {
        "label": "上九",
        "text": "擊蒙；不利為寇，利御寇。"
      }
    ],
    "extras": []
  },
  {
    "number": 5,
    "name": "需",
    "judgment": "有孚，光亨，貞吉。利涉大川。",
    "lines": [
      {
        "label": "初九",
        "text": "需于郊。利用恆，無咎。"
      },
      {
        "label": "九二",
        "text": "需于沙。小有言，終吉。"
      },
      {
        "label": "九三",
        "text": "需于泥，致寇至。"
      },
      {
        "label": "六四",
        "text": "需于血，出自穴。"
      },
      {
        "label": "九五",
        "text": "需于酒食，貞吉。"
      },
      {
        "label": "上六",
        "text": "入于穴，有不速之客三人來，敬之終吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 6,
    "name": "訟",
    "judgment": "有孚，窒。惕中吉。終凶。利見大人，不利涉大川。",
    "lines": [
      {
        "label": "初六",
        "text": "不永所事，小有言，終吉。"
      },
      {
        "label": "九二",
        "text": "不克訟，歸而逋，其邑人三百戶，無眚。"
      },
      {
        "label": "六三",
        "text": "食舊德，貞厲，終吉，或從王事，無成。"
      },
      {
        "label": "九四",
        "text": "不克訟，復即命，渝安貞，吉。"
      },
      {
        "label": "九五",
        "text": "訟元吉。"
      },
      {
        "label": "上九",
        "text": "或錫之鞶帶，終朝三褫之。"
      }
    ],
    "extras": []
  },
  {
    "number": 7,
    "name": "師",
    "judgment": "貞，丈人，吉無咎。",
    "lines": [
      {
        "label": "初六",
        "text": "師出以律，否臧凶。"
      },
      {
        "label": "九二",
        "text": "在師中，吉無咎，王三錫命。"
      },
      {
        "label": "六三",
        "text": "師或輿尸，凶。"
      },
      {
        "label": "六四",
        "text": "師左次，無咎。"
      },
      {
        "label": "六五",
        "text": "田有禽，利執言，無咎。長子帥師，弟子輿尸，貞凶。"
      },
      {
        "label": "上六",
        "text": "大君有命，開國承家，小人勿用。"
      }
    ],
    "extras": []
  },
  {
    "number": 8,
    "name": "比",
    "judgment": "吉。原筮元永貞，無咎。不寧方來，後夫凶。",
    "lines": [
      {
        "label": "初六",
        "text": "有孚比之，無咎。有孚盈缶，終來有他，吉。"
      },
      {
        "label": "六二",
        "text": "比之自內，貞吉。"
      },
      {
        "label": "六三",
        "text": "比之匪人。"
      },
      {
        "label": "六四",
        "text": "外比之，貞吉。"
      },
      {
        "label": "九五",
        "text": "顯比，王用三驅，失前禽。邑人不誡，吉。"
      },
      {
        "label": "上六",
        "text": "比之無首，凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 9,
    "name": "小畜",
    "judgment": "亨。密雲不雨，自我西郊。",
    "lines": [
      {
        "label": "初九",
        "text": "復自道，何其咎，吉。"
      },
      {
        "label": "九二",
        "text": "牽復，吉。"
      },
      {
        "label": "九三",
        "text": "輿說輻，夫妻反目。"
      },
      {
        "label": "六四",
        "text": "有孚，血去。惕出，無咎。"
      },
      {
        "label": "九五",
        "text": "有孚攣如，富以其鄰。"
      },
      {
        "label": "上九",
        "text": "既雨既處，尚德載婦，貞厲。月幾望，君子征凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 10,
    "name": "履",
    "judgment": "履虎尾，不咥人，亨。",
    "lines": [
      {
        "label": "初九",
        "text": "素履，往無咎。"
      },
      {
        "label": "九二",
        "text": "履道坦坦，幽人貞吉。"
      },
      {
        "label": "六三",
        "text": "眇能視，跛能履，履虎尾，咥人，凶。武人為于大君。"
      },
      {
        "label": "九四",
        "text": "履虎尾，愬愬，終吉。"
      },
      {
        "label": "九五",
        "text": "夬履，貞厲。"
      },
      {
        "label": "上九",
        "text": "視履考祥，其旋元吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 11,
    "name": "泰",
    "judgment": "小往大來，吉亨。",
    "lines": [
      {
        "label": "初九",
        "text": "拔茅茹，以其彙，征吉。"
      },
      {
        "label": "九二",
        "text": "包荒，用馮河，不遐遺，朋亡，得尚于中行。"
      },
      {
        "label": "九三",
        "text": "無平不陂，無往不復，艱貞無咎。勿恤其孚，于食有福。"
      },
      {
        "label": "六四",
        "text": "翩翩不富，以其鄰，不戒以孚。"
      },
      {
        "label": "六五",
        "text": "帝乙歸妹，以祉元吉。"
      },
      {
        "label": "上六",
        "text": "城復于隍，勿用師。自邑告命，貞吝。"
      }
    ],
    "extras": []
  },
  {
    "number": 12,
    "name": "否",
    "judgment": "否之匪人，不利君子貞，大往小來。",
    "lines": [
      {
        "label": "初六",
        "text": "拔茅茹，以其彙，貞吉亨。"
      },
      {
        "label": "六二",
        "text": "包承。小人吉，大人否亨。"
      },
      {
        "label": "六三",
        "text": "包羞。"
      },
      {
        "label": "九四",
        "text": "有命無咎，疇離祉。"
      },
      {
        "label": "九五",
        "text": "休否，大人吉。其亡其亡，繫于苞桑。"
      },
      {
        "label": "上九",
        "text": "傾否，先否後喜。"
      }
    ],
    "extras": []
  },
  {
    "number": 13,
    "name": "同人",
    "judgment": "同人于野，亨。利涉大川，利君子貞。",
    "lines": [
      {
        "label": "初九",
        "text": "同人于門，無咎。"
      },
      {
        "label": "六二",
        "text": "同人于宗，吝。"
      },
      {
        "label": "九三",
        "text": "伏戎于莽，升其高陵，三歲不興。"
      },
      {
        "label": "九四",
        "text": "乘其墉，弗克攻，吉。"
      },
      {
        "label": "九五",
        "text": "同人，先號咷而後笑。大師克相遇。"
      },
      {
        "label": "上九",
        "text": "同人于郊，無悔。"
      }
    ],
    "extras": []
  },
  {
    "number": 14,
    "name": "大有",
    "judgment": "元亨。",
    "lines": [
      {
        "label": "初九",
        "text": "無交害，匪咎，艱則無咎。"
      },
      {
        "label": "九二",
        "text": "大車以載，有攸往，無咎。"
      },
      {
        "label": "九三",
        "text": "公用亨于天子，小人弗克。"
      },
      {
        "label": "九四",
        "text": "匪其彭，無咎。"
      },
      {
        "label": "六五",
        "text": "厥孚交如，威如；吉。"
      },
      {
        "label": "上九",
        "text": "自天佑之，吉無不利。"
      }
    ],
    "extras": []
  },
  {
    "number": 15,
    "name": "謙",
    "judgment": "亨，君子有終。",
    "lines": [
      {
        "label": "初六",
        "text": "謙謙君子，用涉大川，吉。"
      },
      {
        "label": "六二",
        "text": "鳴謙，貞吉。"
      },
      {
        "label": "九三",
        "text": "勞謙君子，有終吉。"
      },
      {
        "label": "六四",
        "text": "無不利，撝謙。"
      },
      {
        "label": "六五",
        "text": "不富，以其鄰，利用侵伐，無不利。"
      },
      {
        "label": "上六",
        "text": "鳴謙，利用行師，征邑國。"
      }
    ],
    "extras": []
  },
  {
    "number": 16,
    "name": "豫",
    "judgment": "利建侯行師。",
    "lines": [
      {
        "label": "初六",
        "text": "鳴豫，凶。"
      },
      {
        "label": "六二",
        "text": "介于石，不終日，貞吉。"
      },
      {
        "label": "六三",
        "text": "盱豫，悔。遲有悔。"
      },
      {
        "label": "九四",
        "text": "由豫，大有得。勿疑。朋盍簪。"
      },
      {
        "label": "六五",
        "text": "貞疾，恆不死。"
      },
      {
        "label": "上六",
        "text": "冥豫，成有渝，無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 17,
    "name": "隨",
    "judgment": "元亨利貞，無咎。",
    "lines": [
      {
        "label": "初九",
        "text": "官有渝，貞吉。出門交有功。"
      },
      {
        "label": "六二",
        "text": "係小子，失丈夫。"
      },
      {
        "label": "六三",
        "text": "係丈夫，失小子。隨有求得，利居貞。"
      },
      {
        "label": "九四",
        "text": "隨有獲，貞凶。有孚在道，以明，何咎。"
      },
      {
        "label": "九五",
        "text": "孚于嘉，吉。"
      },
      {
        "label": "上六",
        "text": "拘系之，乃從維之。王用亨于西山。"
      }
    ],
    "extras": []
  },
  {
    "number": 18,
    "name": "蠱",
    "judgment": "元亨，利涉大川。先甲三日，後甲三日。",
    "lines": [
      {
        "label": "初六",
        "text": "幹父之蠱，有子，考無咎，厲終吉。"
      },
      {
        "label": "九二",
        "text": "幹母之蠱，不可貞。"
      },
      {
        "label": "九三",
        "text": "幹父小有晦，無大咎。"
      },
      {
        "label": "六四",
        "text": "裕父之蠱，往見吝。"
      },
      {
        "label": "六五",
        "text": "幹父之蠱，用譽。"
      },
      {
        "label": "上九",
        "text": "不事王侯，高尚其事。"
      }
    ],
    "extras": []
  },
  {
    "number": 19,
    "name": "臨",
    "judgment": "元，亨，利，貞。至于八月有凶。",
    "lines": [
      {
        "label": "初九",
        "text": "咸臨，貞吉。"
      },
      {
        "label": "九二",
        "text": "咸臨，吉無不利。"
      },
      {
        "label": "六三",
        "text": "甘臨，無攸利。既憂之，無咎。"
      },
      {
        "label": "六四",
        "text": "至臨，無咎。"
      },
      {
        "label": "六五",
        "text": "知臨，大君之宜，吉。"
      },
      {
        "label": "上六",
        "text": "敦臨，吉無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 20,
    "name": "觀",
    "judgment": "盥而不薦，有孚顒若。",
    "lines": [
      {
        "label": "初六",
        "text": "童觀，小人無咎，君子吝。"
      },
      {
        "label": "六二",
        "text": "窺觀，利女貞。"
      },
      {
        "label": "六三",
        "text": "觀我生，進退。"
      },
      {
        "label": "六四",
        "text": "觀國之光，利用賓于王。"
      },
      {
        "label": "九五",
        "text": "觀我生，君子無咎。"
      },
      {
        "label": "上九",
        "text": "觀其生，君子無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 21,
    "name": "噬嗑",
    "judgment": "亨。利用獄。",
    "lines": [
      {
        "label": "初九",
        "text": "履校滅趾，無咎。"
      },
      {
        "label": "六二",
        "text": "噬膚滅鼻，無咎。"
      },
      {
        "label": "六三",
        "text": "噬臘肉，遇毒；小吝，無咎。"
      },
      {
        "label": "九四",
        "text": "噬乾胏，得金矢，利艱貞，吉。"
      },
      {
        "label": "六五",
        "text": "噬乾肉，得黃金，貞厲，無咎。"
      },
      {
        "label": "上九",
        "text": "何校滅耳，凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 22,
    "name": "賁",
    "judgment": "亨。小利有所往。",
    "lines": [
      {
        "label": "初九",
        "text": "賁其趾，舍車而徒。"
      },
      {
        "label": "六二",
        "text": "賁其須。"
      },
      {
        "label": "九三",
        "text": "賁如濡如，永貞吉。"
      },
      {
        "label": "六四",
        "text": "賁如皤如，白馬翰如，匪寇婚媾。"
      },
      {
        "label": "六五",
        "text": "賁于丘園，束帛戔戔，吝，終吉。"
      },
      {
        "label": "上九",
        "text": "白賁，無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 23,
    "name": "剝",
    "judgment": "不利有攸往。",
    "lines": [
      {
        "label": "初六",
        "text": "剝床以足，蔑貞凶。"
      },
      {
        "label": "六二",
        "text": "剝床以辨，蔑貞凶。"
      },
      {
        "label": "六三",
        "text": "剝之，無咎。"
      },
      {
        "label": "六四",
        "text": "剝床以膚，凶。"
      },
      {
        "label": "六五",
        "text": "貫魚，以宮人寵，無不利。"
      },
      {
        "label": "上九",
        "text": "碩果不食，君子得輿，小人剝廬。"
      }
    ],
    "extras": []
  },
  {
    "number": 24,
    "name": "復",
    "judgment": "亨。出入無疾，朋來無咎。反復其道，七日來復，利有攸往。",
    "lines": [
      {
        "label": "初九",
        "text": "不復遠，無祗悔，元吉。"
      },
      {
        "label": "六二",
        "text": "休復，吉。"
      },
      {
        "label": "六三",
        "text": "頻復厲，無咎。"
      },
      {
        "label": "六四",
        "text": "中行獨復。"
      },
      {
        "label": "六五",
        "text": "敦復，無悔。"
      },
      {
        "label": "上六",
        "text": "迷復，凶，有災眚。用行師，終有大敗，以其國君，凶；至于十年，不克征。"
      }
    ],
    "extras": []
  },
  {
    "number": 25,
    "name": "無妄",
    "judgment": "元，亨，利，貞。其匪正有眚，不利有攸往。",
    "lines": [
      {
        "label": "初九",
        "text": "無妄，往吉。"
      },
      {
        "label": "六二",
        "text": "不耕獲，不菑畬，則利有攸往。"
      },
      {
        "label": "六三",
        "text": "無妄之災，或繫之牛，行人之得，邑人之災。"
      },
      {
        "label": "九四",
        "text": "可貞，無咎。"
      },
      {
        "label": "九五",
        "text": "無妄之疾，勿藥有喜。"
      },
      {
        "label": "上九",
        "text": "無妄，行有眚，無攸利。"
      }
    ],
    "extras": []
  },
  {
    "number": 26,
    "name": "大畜",
    "judgment": "利貞，不家食吉，利涉大川。",
    "lines": [
      {
        "label": "初九",
        "text": "有厲利已。"
      },
      {
        "label": "九二",
        "text": "輿說輻。"
      },
      {
        "label": "九三",
        "text": "良馬逐，利艱貞。日閑輿衛，利有攸往。"
      },
      {
        "label": "六四",
        "text": "童牛之牿，元吉。"
      },
      {
        "label": "六五",
        "text": "豶豕之牙，吉。"
      },
      {
        "label": "上九",
        "text": "何天之衢，亨。"
      }
    ],
    "extras": []
  },
  {
    "number": 27,
    "name": "頤",
    "judgment": "貞吉。觀頤，自求口實。",
    "lines": [
      {
        "label": "初九",
        "text": "舍爾靈龜，觀我朵頤，凶。"
      },
      {
        "label": "六二",
        "text": "顛頤，拂經于丘頤，征凶。"
      },
      {
        "label": "六三",
        "text": "拂頤，貞凶，十年勿用，無攸利。"
      },
      {
        "label": "六四",
        "text": "顛頤吉，虎視眈眈，其欲逐逐，無咎。"
      },
      {
        "label": "六五",
        "text": "拂經，居貞吉，不可涉大川。"
      },
      {
        "label": "上九",
        "text": "由頤，厲吉，利涉大川。"
      }
    ],
    "extras": []
  },
  {
    "number": 28,
    "name": "大過",
    "judgment": "棟橈，利有攸往，亨。",
    "lines": [
      {
        "label": "初六",
        "text": "藉用白茅，無咎。"
      },
      {
        "label": "九二",
        "text": "枯楊生稊，老夫得其女妻，無不利。"
      },
      {
        "label": "九三",
        "text": "棟橈，凶。"
      },
      {
        "label": "九四",
        "text": "棟隆，吉；有它吝。"
      },
      {
        "label": "九五",
        "text": "枯楊生華，老婦得士夫，無咎無譽。"
      },
      {
        "label": "上六",
        "text": "過涉滅頂，凶，無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 29,
    "name": "坎",
    "judgment": "習坎，有孚，維心亨，行有尚。",
    "lines": [
      {
        "label": "初六",
        "text": "習坎，入于坎窞，凶。"
      },
      {
        "label": "九二",
        "text": "坎有險，求小得。"
      },
      {
        "label": "六三",
        "text": "來之坎坎，險且枕，入于坎窞，勿用。"
      },
      {
        "label": "六四",
        "text": "樽酒簋貳，用缶，納約自牖，終無咎。"
      },
      {
        "label": "九五",
        "text": "坎不盈，祗既平，無咎。"
      },
      {
        "label": "上六",
        "text": "係用徽纆，寘于叢棘，三歲不得，凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 30,
    "name": "離",
    "judgment": "利貞，亨。畜牝牛，吉。",
    "lines": [
      {
        "label": "初九",
        "text": "履錯然，敬之無咎。"
      },
      {
        "label": "六二",
        "text": "黃離，元吉。"
      },
      {
        "label": "九三",
        "text": "日昃之離，不鼓缶而歌，則大耋之嗟，凶。"
      },
      {
        "label": "九四",
        "text": "突如其來如，焚如，死如，棄如。"
      },
      {
        "label": "六五",
        "text": "出涕沱若，戚嗟若，吉。"
      },
      {
        "label": "上九",
        "text": "王用出征，有嘉折首，獲匪其醜，無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 31,
    "name": "咸",
    "judgment": "亨，利貞，取女吉。",
    "lines": [
      {
        "label": "初六",
        "text": "咸其拇。"
      },
      {
        "label": "六二",
        "text": "咸其腓，凶，居吉。"
      },
      {
        "label": "九三",
        "text": "咸其股，執其隨，往吝。"
      },
      {
        "label": "九四",
        "text": "貞吉悔亡，憧憧往來，朋從爾思。"
      },
      {
        "label": "九五",
        "text": "咸其脢，無悔。"
      },
      {
        "label": "上六",
        "text": "咸其輔，頰，舌。"
      }
    ],
    "extras": []
  },
  {
    "number": 32,
    "name": "恆",
    "judgment": "亨，無咎，利貞，利有攸往。",
    "lines": [
      {
        "label": "初六",
        "text": "浚恆，貞凶，無攸利。"
      },
      {
        "label": "九二",
        "text": "悔亡。"
      },
      {
        "label": "九三",
        "text": "不恆其德，或承之羞，貞吝。"
      },
      {
        "label": "九四",
        "text": "田無禽。"
      },
      {
        "label": "六五",
        "text": "恆其德，貞，婦人吉，夫子凶。"
      },
      {
        "label": "上六",
        "text": "振恆，凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 33,
    "name": "遯",
    "judgment": "亨，小利貞。",
    "lines": [
      {
        "label": "初六",
        "text": "遯尾，厲，勿用有攸往。"
      },
      {
        "label": "六二",
        "text": "執之用黃牛之革，莫之勝說。"
      },
      {
        "label": "九三",
        "text": "係遯，有疾厲，畜臣妾吉。"
      },
      {
        "label": "九四",
        "text": "好遯君子吉，小人否。"
      },
      {
        "label": "九五",
        "text": "嘉遯，貞吉。"
      },
      {
        "label": "上九",
        "text": "肥遯，無不利。"
      }
    ],
    "extras": []
  },
  {
    "number": 34,
    "name": "大壯",
    "judgment": "利貞。",
    "lines": [
      {
        "label": "初九",
        "text": "壯于趾，征凶，有孚。"
      },
      {
        "label": "九二",
        "text": "貞吉。"
      },
      {
        "label": "九三",
        "text": "小人用壯，君子用罔，貞厲。羝羊觸藩，羸其角。"
      },
      {
        "label": "九四",
        "text": "貞吉悔亡，藩決不羸，壯于大輿之輹。"
      },
      {
        "label": "六五",
        "text": "喪羊于易，無悔。"
      },
      {
        "label": "上六",
        "text": "羝羊觸藩，不能退，不能遂，無攸利，艱則吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 35,
    "name": "晉",
    "judgment": "康侯用錫馬蕃庶，晝日三接。",
    "lines": [
      {
        "label": "初六",
        "text": "晉如，摧如，貞吉。罔孚，裕無咎。"
      },
      {
        "label": "六二",
        "text": "晉如，愁如，貞吉。受茲介福，于其王母。"
      },
      {
        "label": "六三",
        "text": "眾允，悔亡。"
      },
      {
        "label": "九四",
        "text": "晉如鼫鼠，貞厲。"
      },
      {
        "label": "六五",
        "text": "悔亡，失得勿恤，往吉無不利。"
      },
      {
        "label": "上九",
        "text": "晉其角，維用伐邑，厲吉無咎，貞吝。"
      }
    ],
    "extras": []
  },
  {
    "number": 36,
    "name": "明夷",
    "judgment": "利艱貞。",
    "lines": [
      {
        "label": "初九",
        "text": "明夷于飛，垂其翼。君子于行，三日不食，有攸往，主人有言。"
      },
      {
        "label": "六二",
        "text": "明夷，夷于左股，用拯馬壯，吉。"
      },
      {
        "label": "九三",
        "text": "明夷于南狩，得其大首，不可疾貞。"
      },
      {
        "label": "六四",
        "text": "入于左腹，獲明夷之心，于出門庭。"
      },
      {
        "label": "六五",
        "text": "箕子之明夷，利貞。"
      },
      {
        "label": "上六",
        "text": "不明晦，初登于天，後入于地。"
      }
    ],
    "extras": []
  },
  {
    "number": 37,
    "name": "家人",
    "judgment": "利女貞。",
    "lines": [
      {
        "label": "初九",
        "text": "閑有家，悔亡。"
      },
      {
        "label": "六二",
        "text": "無攸遂，在中饋，貞吉。"
      },
      {
        "label": "九三",
        "text": "家人嗃嗃，悔厲吉；婦子嘻嘻，終吝。"
      },
      {
        "label": "六四",
        "text": "富家，大吉。"
      },
      {
        "label": "九五",
        "text": "王假有家，勿恤吉。"
      },
      {
        "label": "上九",
        "text": "有孚威如，終吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 38,
    "name": "睽",
    "judgment": "小事吉。",
    "lines": [
      {
        "label": "初九",
        "text": "悔亡，喪馬勿逐，自復；見惡人無咎。"
      },
      {
        "label": "九二",
        "text": "遇主于巷，無咎。"
      },
      {
        "label": "六三",
        "text": "見輿曳，其牛掣，其人天且劓，無初有終。"
      },
      {
        "label": "九四",
        "text": "睽孤，遇元夫，交孚，厲無咎。"
      },
      {
        "label": "六五",
        "text": "悔亡，厥宗噬膚，往何咎。"
      },
      {
        "label": "上九",
        "text": "睽孤，見豕負塗，載鬼一車，先張之弧，後說之弧，匪寇婚媾，往遇雨則吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 39,
    "name": "蹇",
    "judgment": "利西南，不利東北；利見大人，貞吉。",
    "lines": [
      {
        "label": "初六",
        "text": "往蹇，來譽。"
      },
      {
        "label": "六二",
        "text": "王臣蹇蹇，匪躬之故。"
      },
      {
        "label": "九三",
        "text": "往蹇來反。"
      },
      {
        "label": "六四",
        "text": "往蹇來連。"
      },
      {
        "label": "九五",
        "text": "大蹇朋來。"
      },
      {
        "label": "上六",
        "text": "往蹇來碩，吉；利見大人。"
      }
    ],
    "extras": []
  },
  {
    "number": 40,
    "name": "解",
    "judgment": "利西南，無所往，其來復吉。有攸往，夙吉。",
    "lines": [
      {
        "label": "初六",
        "text": "無咎。"
      },
      {
        "label": "九二",
        "text": "田獲三狐，得黃矢，貞吉。"
      },
      {
        "label": "六三",
        "text": "負且乘，致寇至，貞吝。"
      },
      {
        "label": "九四",
        "text": "解而拇，朋至斯孚。"
      },
      {
        "label": "六五",
        "text": "君子維有解，吉；有孚于小人。"
      },
      {
        "label": "上六",
        "text": "公用射隼，于高墉之上，獲之，無不利。"
      }
    ],
    "extras": []
  },
  {
    "number": 41,
    "name": "損",
    "judgment": "有孚，元吉，無咎，可貞，利有攸往？曷之用，二簋可用享。",
    "lines": [
      {
        "label": "初九",
        "text": "已事遄往，無咎，酌損之。"
      },
      {
        "label": "九二",
        "text": "利貞，征凶，弗損益之。"
      },
      {
        "label": "六三",
        "text": "三人行，則損一人；一人行，則得其友。"
      },
      {
        "label": "六四",
        "text": "損其疾，使遄有喜，無咎。"
      },
      {
        "label": "六五",
        "text": "或益之，十朋之龜弗克違，元吉。"
      },
      {
        "label": "上九",
        "text": "弗損益之，無咎，貞吉，利有攸往，得臣無家。"
      }
    ],
    "extras": []
  },
  {
    "number": 42,
    "name": "益",
    "judgment": "利有攸往，利涉大川。",
    "lines": [
      {
        "label": "初九",
        "text": "利用為大作，元吉，無咎。"
      },
      {
        "label": "六二",
        "text": "或益之，十朋之龜弗克違，永貞吉。王用享于帝，吉。"
      },
      {
        "label": "六三",
        "text": "益之用凶事，無咎。有孚中行，告公用圭。"
      },
      {
        "label": "六四",
        "text": "中行，告公從。利用為依遷國。"
      },
      {
        "label": "九五",
        "text": "有孚惠心，勿問元吉。有孚惠我德。"
      },
      {
        "label": "上九",
        "text": "莫益之，或擊之，立心勿恆，凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 43,
    "name": "夬",
    "judgment": "揚于王庭，孚號，有厲，告自邑，不利即戎，利有攸往。",
    "lines": [
      {
        "label": "初九",
        "text": "壯于前趾，往不勝為吝。"
      },
      {
        "label": "九二",
        "text": "惕號，莫夜有戎，勿恤。"
      },
      {
        "label": "九三",
        "text": "壯于頄，有凶。君子夬夬，獨行遇雨，若濡有慍，無咎。"
      },
      {
        "label": "九四",
        "text": "臀無膚，其行次且。牽羊悔亡，聞言不信。"
      },
      {
        "label": "九五",
        "text": "莧陸夬夬，中行無咎。"
      },
      {
        "label": "上六",
        "text": "無號，終有凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 44,
    "name": "姤",
    "judgment": "女壯，勿用取女。",
    "lines": [
      {
        "label": "初六",
        "text": "繫于金柅，貞吉，有攸往，見凶，羸豕孚蹢躅。"
      },
      {
        "label": "九二",
        "text": "包有魚，無咎，不利賓。"
      },
      {
        "label": "九三",
        "text": "臀無膚，其行次且，厲，無大咎。"
      },
      {
        "label": "九四",
        "text": "包無魚，起凶。"
      },
      {
        "label": "九五",
        "text": "以杞包瓜，含章，有隕自天。"
      },
      {
        "label": "上九",
        "text": "姤其角，吝，無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 45,
    "name": "萃",
    "judgment": "亨。王假有廟，利見大人，亨，利貞。用大牲吉，利有攸往。",
    "lines": [
      {
        "label": "初六",
        "text": "有孚不終，乃亂乃萃，若號一握為笑，勿恤，往無咎。"
      },
      {
        "label": "六二",
        "text": "引吉，無咎，孚乃利用禴。"
      },
      {
        "label": "六三",
        "text": "萃如，嗟如，無攸利，往無咎，小吝。"
      },
      {
        "label": "九四",
        "text": "大吉，無咎。"
      },
      {
        "label": "九五",
        "text": "萃有位，無咎。匪孚，元永貞，悔亡。"
      },
      {
        "label": "上六",
        "text": "齎咨涕洟，無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 46,
    "name": "升",
    "judgment": "元亨，用見大人，勿恤，南征吉。",
    "lines": [
      {
        "label": "初六",
        "text": "允升，大吉。"
      },
      {
        "label": "九二",
        "text": "孚乃利用禴，無咎。"
      },
      {
        "label": "九三",
        "text": "升虛邑。"
      },
      {
        "label": "六四",
        "text": "王用亨于岐山，吉無咎。"
      },
      {
        "label": "六五",
        "text": "貞吉，升階。"
      },
      {
        "label": "上六",
        "text": "冥升，利于不息之貞。"
      }
    ],
    "extras": []
  },
  {
    "number": 47,
    "name": "困",
    "judgment": "亨，貞，大人吉，無咎，有言不信。",
    "lines": [
      {
        "label": "初六",
        "text": "臀困于株木，入于幽谷，三歲不覿。"
      },
      {
        "label": "九二",
        "text": "困于酒食，朱紱方來，利用亨祀，征凶，無咎。"
      },
      {
        "label": "六三",
        "text": "困于石，據于蒺藜，入于其宮，不見其妻，凶。"
      },
      {
        "label": "九四",
        "text": "來徐徐，困于金車，吝，有終。"
      },
      {
        "label": "九五",
        "text": "劓刖，困于赤紱，乃徐有說，利用祭祀。"
      },
      {
        "label": "上六",
        "text": "困于葛藟，于臲卼，曰動悔。有悔，征吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 48,
    "name": "井",
    "judgment": "改邑不改井，無喪無得，往來井井。汔至，亦未繘井，羸其瓶，凶。",
    "lines": [
      {
        "label": "初六",
        "text": "井泥不食，舊井無禽。"
      },
      {
        "label": "九二",
        "text": "井谷射鮒，甕敝漏。"
      },
      {
        "label": "九三",
        "text": "井渫不食，為我民惻，可用汲，王明，並受其福。"
      },
      {
        "label": "六四",
        "text": "井甃，無咎。"
      },
      {
        "label": "九五",
        "text": "井冽，寒泉食。"
      },
      {
        "label": "上六",
        "text": "井收勿幕，有孚無吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 49,
    "name": "革",
    "judgment": "己日乃孚，元亨利貞，悔亡。",
    "lines": [
      {
        "label": "初九",
        "text": "鞏用黃牛之革。"
      },
      {
        "label": "六二",
        "text": "己日乃革之，征吉，無咎。"
      },
      {
        "label": "九三",
        "text": "征凶，貞厲，革言三就，有孚。"
      },
      {
        "label": "九四",
        "text": "悔亡，有孚改命，吉。"
      },
      {
        "label": "九五",
        "text": "大人虎變，未占有孚。"
      },
      {
        "label": "上六",
        "text": "君子豹變，小人革面，征凶，居貞吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 50,
    "name": "鼎",
    "judgment": "元吉，亨。",
    "lines": [
      {
        "label": "初六",
        "text": "鼎顛趾，利出否，得妾以其子，無咎。"
      },
      {
        "label": "九二",
        "text": "鼎有實，我仇有疾，不我能即，吉。"
      },
      {
        "label": "九三",
        "text": "鼎耳革，其行塞，雉膏不食，方雨虧悔，終吉。"
      },
      {
        "label": "九四",
        "text": "鼎折足，覆公餗，其形渥，凶。"
      },
      {
        "label": "六五",
        "text": "鼎黃耳金鉉，利貞。"
      },
      {
        "label": "上九",
        "text": "鼎玉鉉，大吉，無不利。"
      }
    ],
    "extras": []
  },
  {
    "number": 51,
    "name": "震",
    "judgment": "亨。震來虩虩，笑言啞啞。震驚百里，不喪匕鬯。",
    "lines": [
      {
        "label": "初九",
        "text": "震來虩虩，後笑言啞啞，吉。"
      },
      {
        "label": "六二",
        "text": "震來厲，億喪貝，躋于九陵，勿逐，七日得。"
      },
      {
        "label": "六三",
        "text": "震蘇蘇，震行無眚。"
      },
      {
        "label": "九四",
        "text": "震遂泥。"
      },
      {
        "label": "六五",
        "text": "震往來厲，億無喪，有事。"
      },
      {
        "label": "上六",
        "text": "震索索，視矍矍，征凶。震不于其躬，于其鄰，無咎。婚媾有言。"
      }
    ],
    "extras": []
  },
  {
    "number": 52,
    "name": "艮",
    "judgment": "艮其背，不獲其身，行其庭，不見其人，無咎。",
    "lines": [
      {
        "label": "初六",
        "text": "艮其趾，無咎，利永貞。"
      },
      {
        "label": "六二",
        "text": "艮其腓，不拯其隨，其心不快。"
      },
      {
        "label": "九三",
        "text": "艮其限，列其夤，厲薰心。"
      },
      {
        "label": "六四",
        "text": "艮其身，無咎。"
      },
      {
        "label": "六五",
        "text": "艮其輔，言有序，悔亡。"
      },
      {
        "label": "上九",
        "text": "敦艮，吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 53,
    "name": "漸",
    "judgment": "女歸吉，利貞。",
    "lines": [
      {
        "label": "初六",
        "text": "鴻漸于干，小子厲，有言，無咎。"
      },
      {
        "label": "六二",
        "text": "鴻漸于磐，飲食衎衎，吉。"
      },
      {
        "label": "九三",
        "text": "鴻漸于陸，夫征不復，婦孕不育，凶；利御寇。"
      },
      {
        "label": "六四",
        "text": "鴻漸于木，或得其桷，無咎。"
      },
      {
        "label": "九五",
        "text": "鴻漸于陵，婦三歲不孕，終莫之勝，吉。"
      },
      {
        "label": "上九",
        "text": "鴻漸于逵，其羽可用為儀，吉。"
      }
    ],
    "extras": []
  },
  {
    "number": 54,
    "name": "歸妹",
    "judgment": "征凶，無攸利。",
    "lines": [
      {
        "label": "初九",
        "text": "歸妹以娣，跛能履，征吉。"
      },
      {
        "label": "九二",
        "text": "眇能視，利幽人之貞。"
      },
      {
        "label": "六三",
        "text": "歸妹以須，反歸以娣。"
      },
      {
        "label": "九四",
        "text": "歸妹愆期，遲歸有時。"
      },
      {
        "label": "六五",
        "text": "帝乙歸妹，其君之袂，不如其娣之袂良，月幾望，吉。"
      },
      {
        "label": "上六",
        "text": "女承筐無實，士刲羊無血，無攸利。"
      }
    ],
    "extras": []
  },
  {
    "number": 55,
    "name": "豐",
    "judgment": "亨，王假之，勿憂，宜日中。",
    "lines": [
      {
        "label": "初九",
        "text": "遇其配主，雖旬無咎，往有尚。"
      },
      {
        "label": "六二",
        "text": "豐其蔀，日中見斗，往得疑疾，有孚發若，吉。"
      },
      {
        "label": "九三",
        "text": "豐其沛，日中見沫，折其右肱，無咎。"
      },
      {
        "label": "九四",
        "text": "豐其蔀，日中見斗，遇其夷主，吉。"
      },
      {
        "label": "六五",
        "text": "來章，有慶譽，吉。"
      },
      {
        "label": "上六",
        "text": "豐其屋，蔀其家，窺其戶，闃其無人，三歲不覿，凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 56,
    "name": "旅",
    "judgment": "小亨，旅貞吉。",
    "lines": [
      {
        "label": "初六",
        "text": "旅瑣瑣，斯其所取災。"
      },
      {
        "label": "六二",
        "text": "旅即次，懷其資，得童僕貞。"
      },
      {
        "label": "九三",
        "text": "旅焚其次，喪其童僕，貞厲。"
      },
      {
        "label": "九四",
        "text": "旅于處，得其資斧，我心不快。"
      },
      {
        "label": "六五",
        "text": "射雉一矢亡，終以譽命。"
      },
      {
        "label": "上九",
        "text": "鳥焚其巢，旅人先笑後號咷。喪牛于易，凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 57,
    "name": "巽",
    "judgment": "小亨，利攸往，利見大人。",
    "lines": [
      {
        "label": "初六",
        "text": "進退，利武人之貞。"
      },
      {
        "label": "九二",
        "text": "巽在床下，用史巫紛若，吉無咎。"
      },
      {
        "label": "九三",
        "text": "頻巽，吝。"
      },
      {
        "label": "六四",
        "text": "悔亡，田獲三品。"
      },
      {
        "label": "九五",
        "text": "貞吉悔亡，無不利。無初有終，先庚三日，後庚三日，吉。"
      },
      {
        "label": "上九",
        "text": "巽在床下，喪其資斧，貞凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 58,
    "name": "兌",
    "judgment": "亨，利貞。",
    "lines": [
      {
        "label": "初九",
        "text": "和兌，吉。"
      },
      {
        "label": "九二",
        "text": "孚兌，吉，悔亡。"
      },
      {
        "label": "六三",
        "text": "來兌，凶。"
      },
      {
        "label": "九四",
        "text": "商兌，未寧，介疾有喜。"
      },
      {
        "label": "九五",
        "text": "孚于剝，有厲。"
      },
      {
        "label": "上六",
        "text": "引兌。"
      }
    ],
    "extras": []
  },
  {
    "number": 59,
    "name": "渙",
    "judgment": "亨。王假有廟，利涉大川，利貞。",
    "lines": [
      {
        "label": "初六",
        "text": "用拯馬壯，吉。"
      },
      {
        "label": "九二",
        "text": "渙奔其機，悔亡。"
      },
      {
        "label": "六三",
        "text": "渙其躬，無悔。"
      },
      {
        "label": "六四",
        "text": "渙其群，元吉。渙有丘，匪夷所思。"
      },
      {
        "label": "九五",
        "text": "渙汗其大號，渙王居，無咎。"
      },
      {
        "label": "上九",
        "text": "渙其血，去逖出，無咎。"
      }
    ],
    "extras": []
  },
  {
    "number": 60,
    "name": "節",
    "judgment": "亨。苦節不可貞。",
    "lines": [
      {
        "label": "初九",
        "text": "不出戶庭，無咎。"
      },
      {
        "label": "九二",
        "text": "不出門庭，凶。"
      },
      {
        "label": "六三",
        "text": "不節若，則嗟若，無咎。"
      },
      {
        "label": "六四",
        "text": "安節，亨。"
      },
      {
        "label": "九五",
        "text": "甘節，吉；往有尚。"
      },
      {
        "label": "上六",
        "text": "苦節，貞凶，悔亡。"
      }
    ],
    "extras": []
  },
  {
    "number": 61,
    "name": "中孚",
    "judgment": "豚魚，吉，利涉大川，利貞。",
    "lines": [
      {
        "label": "初九",
        "text": "虞吉，有他不燕。"
      },
      {
        "label": "九二",
        "text": "鳴鶴在陰，其子和之，我有好爵，吾與爾靡之。"
      },
      {
        "label": "六三",
        "text": "得敵，或鼓或罷，或泣或歌。"
      },
      {
        "label": "六四",
        "text": "月幾望，馬匹亡，無咎。"
      },
      {
        "label": "九五",
        "text": "有孚攣如，無咎。"
      },
      {
        "label": "上九",
        "text": "翰音登于天，貞凶。"
      }
    ],
    "extras": []
  },
  {
    "number": 62,
    "name": "小過",
    "judgment": "亨，利貞，可小事，不可大事。飛鳥遺之音，不宜上宜下，大吉。",
    "lines": [
      {
        "label": "初六",
        "text": "飛鳥以凶。"
      },
      {
        "label": "六二",
        "text": "過其祖，遇其妣；不及其君，遇其臣；無咎。"
      },
      {
        "label": "九三",
        "text": "弗過防之，從或戕之，凶。"
      },
      {
        "label": "九四",
        "text": "無咎，弗過遇之。往厲必戒，勿用永貞。"
      },
      {
        "label": "六五",
        "text": "密雲不雨，自我西郊，公弋取彼在穴。"
      },
      {
        "label": "上六",
        "text": "弗遇過之，飛鳥離之，凶，是謂災眚。"
      }
    ],
    "extras": []
  },
  {
    "number": 63,
    "name": "既濟",
    "judgment": "亨，小利貞，初吉終亂。",
    "lines": [
      {
        "label": "初九",
        "text": "曳其輪，濡其尾，無咎。"
      },
      {
        "label": "六二",
        "text": "婦喪其茀，勿逐，七日得。"
      },
      {
        "label": "九三",
        "text": "高宗伐鬼方，三年克之，小人勿用。"
      },
      {
        "label": "六四",
        "text": "繻有衣袽，終日戒。"
      },
      {
        "label": "九五",
        "text": "東鄰殺牛，不如西鄰之禴祭，實受其福。"
      },
      {
        "label": "上六",
        "text": "濡其首，厲。"
      }
    ],
    "extras": []
  },
  {
    "number": 64,
    "name": "未濟",
    "judgment": "亨，小狐汔濟，濡其尾，無攸利。",
    "lines": [
      {
        "label": "初六",
        "text": "濡其尾，吝。"
      },
      {
        "label": "九二",
        "text": "曳其輪，貞吉。"
      },
      {
        "label": "六三",
        "text": "未濟，征凶，利涉大川。"
      },
      {
        "label": "九四",
        "text": "貞吉，悔亡，震用伐鬼方，三年有賞于大國。"
      },
      {
        "label": "六五",
        "text": "貞吉，無悔，君子之光，有孚，吉。"
      },
      {
        "label": "上九",
        "text": "有孚于飲酒，無咎，濡其首，有孚失是。"
      }
    ],
    "extras": []
  }
];

if (typeof window !== "undefined") window.ZHOUYI_BENJING = ZHOUYI_BENJING;
if (typeof module !== "undefined") module.exports = ZHOUYI_BENJING;


path: app.js
content: const TRIGRAMS = {
  "111": { name: "乾", symbol: "☰", nature: "天", image: "健", counsel: "主动、开创、守正，不以强势替代判断。" },
  "110": { name: "兑", symbol: "☱", nature: "澤", image: "悦", counsel: "沟通、交换、悦纳，但承诺要有边界。" },
  "101": { name: "离", symbol: "☲", nature: "火", image: "丽", counsel: "看见事实，辨明依附关系，不被表象带走。" },
  "100": { name: "震", symbol: "☳", nature: "雷", image: "动", counsel: "启动、警醒，先稳住第一步。" },
  "011": { name: "巽", symbol: "☴", nature: "風", image: "入", counsel: "渐入、顺势，用连续的小动作推进。" },
  "010": { name: "坎", symbol: "☵", nature: "水", image: "险", counsel: "面对风险，先建承载与退路。" },
  "001": { name: "艮", symbol: "☶", nature: "山", image: "止", counsel: "止步、界限，在停顿中重新定位。" },
  "000": { name: "坤", symbol: "☷", nature: "地", image: "顺", counsel: "承接、养成，以耐心和秩序承载变化。" }
};

// Key is lower trigram | upper trigram, because lines are stored from bottom to top.
const HEXAGRAM_LOOKUP = {
  "乾|乾": 1, "乾|兑": 43, "乾|离": 14, "乾|震": 34, "乾|巽": 9, "乾|坎": 5, "乾|艮": 26, "乾|坤": 11,
  "兑|乾": 10, "兑|兑": 58, "兑|离": 38, "兑|震": 54, "兑|巽": 61, "兑|坎": 60, "兑|艮": 41, "兑|坤": 19,
  "离|乾": 13, "离|兑": 49, "离|离": 30, "离|震": 55, "离|巽": 37, "离|坎": 63, "离|艮": 22, "离|坤": 36,
  "震|乾": 25, "震|兑": 17, "震|离": 21, "震|震": 51, "震|巽": 42, "震|坎": 3, "震|艮": 27, "震|坤": 24,
  "巽|乾": 44, "巽|兑": 28, "巽|离": 50, "巽|震": 32, "巽|巽": 57, "巽|坎": 48, "巽|艮": 18, "巽|坤": 46,
  "坎|乾": 6, "坎|兑": 47, "坎|离": 64, "坎|震": 40, "坎|巽": 59, "坎|坎": 29, "坎|艮": 4, "坎|坤": 7,
  "艮|乾": 33, "艮|兑": 31, "艮|离": 56, "艮|震": 62, "艮|巽": 53, "艮|坎": 39, "艮|艮": 52, "艮|坤": 15,
  "坤|乾": 12, "坤|兑": 45, "坤|离": 35, "坤|震": 16, "坤|巽": 20, "坤|坎": 8, "坤|艮": 23, "坤|坤": 2
};

const LINE_POSITIONS = ["初爻", "二爻", "三爻", "四爻", "五爻", "上爻"];
const JOURNAL_KEY = "zhouyi-benjing-journal-v1";

const LINE_GUIDANCE = [
  "事在初起，宜先试探根基，不急于定局。",
  "渐入关系或结构，重在取得中位的支撑。",
  "内外交界，最容易躁进，宜复核风险。",
  "开始外显，适合调整表达、位置与策略。",
  "居于核心，重在正当性、责任和判断。",
  "一事将极，宜收束、转化，不恋旧势。"
];

const QUESTION_GUIDANCE = {
  relationship: "感情与关系之问，重点看互信、位置是否相称，以及是否有可持续的回应。",
  work: "事业与项目之问，重点看时机、角色、资源和下一步是否可验证。",
  money: "财务之问，重点先分清事实、假设与欲望；重大投入必须保留缓冲和退出条件。",
  wellbeing: "身心之问，卦象只能提示节奏和边界；涉及疾病、持续痛苦或风险时，应优先求助专业人士。",
  timing: "时机之问，重点看动爻多少、变卦方向，以及当下是否宜动、宜守或宜缓。",
  general: "一般问题，先把卦象当成镜子：找出你真正能负责的一步，再观察现实反馈。"
};

const state = {
  method: "coin",
  currentReading: null,
  catalogGrade: "all"
};

const els = {
  question: document.querySelector("#question"),
  castButton: document.querySelector("#castButton"),
  modeButtons: document.querySelectorAll(".mode-button"),
  resultLayout: document.querySelector("#resultLayout"),
  detailGrid: document.querySelector("#detailGrid"),
  primaryHexagram: document.querySelector("#primaryHexagram"),
  changedHexagram: document.querySelector("#changedHexagram"),
  primaryTitle: document.querySelector("#primaryTitle"),
  changedTitle: document.querySelector("#changedTitle"),
  primaryTrigrams: document.querySelector("#primaryTrigrams"),
  changedTrigrams: document.querySelector("#changedTrigrams"),
  changedBlock: document.querySelector("#changedBlock"),
  changeArrow: document.querySelector("#changeArrow"),
  readingText: document.querySelector("#readingText"),
  lineList: document.querySelector("#lineList"),
  symbolList: document.querySelector("#symbolList"),
  journalList: document.querySelector("#journalList"),
  copyButton: document.querySelector("#copyButton"),
  clearJournalButton: document.querySelector("#clearJournalButton"),
  catalogSearch: document.querySelector("#catalogSearch"),
  catalogFilters: document.querySelector("#catalogFilters"),
  catalogGrid: document.querySelector("#catalogGrid"),
  hexagramSearch: document.querySelector("#hexagramSearch"),
  hexagramLibrary: document.querySelector("#hexagramLibrary")
};

function tossLine(method) {
  if (method === "yarrow") {
    return createLine(weightedPick([
      { value: 6, weight: 1 },
      { value: 7, weight: 5 },
      { value: 8, weight: 7 },
      { value: 9, weight: 3 }
    ]));
  }

  const coins = Array.from({ length: 3 }, () => (Math.random() < 0.5 ? 2 : 3));
  return createLine(coins.reduce((sum, coin) => sum + coin, 0), coins);
}

function weightedPick(items) {
  const total = items.reduce((sum, item) => sum + item.weight, 0);
  let cursor = Math.random() * total;
  for (const item of items) {
    cursor -= item.weight;
    if (cursor < 0) return item.value;
  }
  return items[items.length - 1].value;
}

function createLine(value, coins = []) {
  return {
    value,
    coins,
    yang: value === 7 || value === 9,
    moving: value === 6 || value === 9,
    label: value === 6 ? "老阴" : value === 7 ? "少阳" : value === 8 ? "少阴" : "老阳"
  };
}

function castHexagram() {
  const lines = Array.from({ length: 6 }, () => tossLine(state.method));
  const changedLines = lines.map((line) => ({
    ...line,
    yang: line.moving ? !line.yang : line.yang,
    moving: false
  }));

  return enrichReading({
    id: createId(),
    createdAt: new Date().toISOString(),
    question: els.question.value.trim(),
    method: state.method,
    lines,
    changedLines
  });
}

function enrichReading(reading) {
  const primary = resolveHexagram(reading.lines);
  const changed = resolveHexagram(reading.changedLines);
  const moving = reading.lines
    .map((line, index) => ({ line, index }))
    .filter(({ line }) => line.moving);

  return {
    ...reading,
    primary,
    changed,
    moving,
    decision: decideTextSource(primary, changed, moving)
  };
}

function createId() {
  if (window.crypto?.randomUUID) return window.crypto.randomUUID();
  return `reading-${Date.now()}-${Math.random().toString(16).slice(2)}`;
}

function resolveHexagram(lines) {
  const lowerBits = lines.slice(0, 3).map((line) => (line.yang ? "1" : "0")).join("");
  const upperBits = lines.slice(3, 6).map((line) => (line.yang ? "1" : "0")).join("");
  const lower = TRIGRAMS[lowerBits];
  const upper = TRIGRAMS[upperBits];
  const number = HEXAGRAM_LOOKUP[`${lower.name}|${upper.name}`];
  const benjing = ZHOUYI_BENJING[number - 1];

  return {
    number,
    name: benjing.name,
    fullName: fullHexagramName(benjing.name, upper, lower),
    judgment: benjing.judgment,
    lines: benjing.lines,
    extras: benjing.extras,
    lower,
    upper
  };
}

function fullHexagramName(name, upper, lower) {
  if (upper.name === lower.name && sameTrigramName(name, upper.name)) return `${name}為${upper.nature}`;
  return `${upper.nature}${lower.nature}${name}`;
}

function sameTrigramName(sourceName, trigramName) {
  const aliases = { 兑: "兌", 离: "離" };
  return sourceName === trigramName || sourceName === aliases[trigramName];
}

function decideTextSource(primary, changed, moving) {
  const count = moving.length;

  if (count === 0) {
    return {
      rule: "六爻不变：以本卦卦辞为主。",
      focus: "本卦卦辞",
      entries: [{ title: `${primary.name}卦辞`, text: primary.judgment, priority: true }]
    };
  }

  if (count === 1) {
    const item = moving[0];
    return {
      rule: "一爻变：以该动爻爻辞为主。",
      focus: primary.lines[item.index].label,
      entries: [lineEntry(primary, item.index, true)]
    };
  }

  if (count === 2) {
    const indexes = moving.map(({ index }) => index).sort((a, b) => a - b);
    const upperIndex = indexes[indexes.length - 1];
    return {
      rule: "二爻变：取两条动爻爻辞，以上爻为主。",
      focus: primary.lines[upperIndex].label,
      entries: indexes.map((index) => lineEntry(primary, index, index === upperIndex))
    };
  }

  if (count === 3) {
    return {
      rule: "三爻变：以本卦卦辞与变卦卦辞合看。",
      focus: "本卦与变卦卦辞",
      entries: [
        { title: `${primary.name}卦辞`, text: primary.judgment, priority: true },
        { title: `${changed.name}卦辞`, text: changed.judgment, priority: false }
      ]
    };
  }

  if (count === 4) {
    const staticIndexes = [0, 1, 2, 3, 4, 5].filter((index) => !moving.some((item) => item.index === index));
    const lowerIndex = staticIndexes[0];
    return {
      rule: "四爻变：取两条静爻爻辞，以下爻为主。",
      focus: primary.lines[lowerIndex].label,
      entries: staticIndexes.map((index) => lineEntry(primary, index, index === lowerIndex))
    };
  }

  if (count === 5) {
    const staticIndex = [0, 1, 2, 3, 4, 5].find((index) => !moving.some((item) => item.index === index));
    return {
      rule: "五爻变：取变卦中唯一静爻所对应的爻辞。",
      focus: changed.lines[staticIndex].label,
      entries: [lineEntry(changed, staticIndex, true)]
    };
  }

  const special = primary.number === 1 ? primary.extras.find((item) => item.label === "用九")
    : primary.number === 2 ? primary.extras.find((item) => item.label === "用六")
      : null;

  if (special) {
    return {
      rule: "六爻皆变：乾用用九，坤用用六。",
      focus: special.label,
      entries: [{ title: special.label, text: special.text, priority: true }]
    };
  }

  return {
    rule: "六爻皆变：乾坤之外，以变卦卦辞为主。",
    focus: `${changed.name}卦辞`,
    entries: [{ title: `${changed.name}卦辞`, text: changed.judgment, priority: true }]
  };
}

function lineEntry(hexagram, index, priority) {
  const source = hexagram.lines[index];
  return {
    title: `${hexagram.name}${source.label}`,
    text: source.text,
    priority
  };
}

function renderReading(reading) {
  state.currentReading = reading;
  els.resultLayout.hidden = false;
  els.detailGrid.hidden = false;

  renderHexagram(els.primaryHexagram, reading.lines);
  renderHexagram(els.changedHexagram, reading.changedLines);

  const hasMoving = reading.moving.length > 0;
  els.changedBlock.style.opacity = hasMoving ? "1" : "0.45";
  els.changeArrow.textContent = hasMoving ? "→" : "•";

  els.primaryTitle.textContent = `${reading.primary.number}. ${reading.primary.fullName}`;
  els.changedTitle.textContent = hasMoving ? `${reading.changed.number}. ${reading.changed.fullName}` : "无变卦";
  els.primaryTrigrams.textContent = trigramText(reading.primary);
  els.changedTrigrams.textContent = hasMoving ? trigramText(reading.changed) : "六爻皆静，重在本卦卦辞。";

  els.readingText.innerHTML = buildReadingSections(reading);
  els.lineList.innerHTML = buildLineList(reading);
  els.symbolList.innerHTML = buildSymbolList(reading);

  saveJournal(reading);
  renderJournal();
  els.resultLayout.scrollIntoView({ behavior: "smooth", block: "start" });
}

function renderHexagram(container, lines) {
  container.innerHTML = "";
  [...lines].reverse().forEach((line) => {
    const div = document.createElement("div");
    div.className = `yao ${line.yang ? "yang" : "yin"} ${line.moving ? "moving" : ""}`;
    div.setAttribute("aria-label", `${line.label}${line.moving ? "，动爻" : ""}`);
    if (line.moving) {
      const dot = document.createElement("span");
      dot.className = "move-dot";
      div.appendChild(dot);
    }
    container.appendChild(div);
  });
}

function trigramText(hexagram) {
  return `上${hexagram.upper.name}${hexagram.upper.symbol}${hexagram.upper.nature} · 下${hexagram.lower.name}${hexagram.lower.symbol}${hexagram.lower.nature}`;
}

function buildReadingSections(reading) {
  const questionType = classifyQuestion(reading.question);
  const question = reading.question || "未写下具体问题";
  const entries = reading.decision.entries
    .map((entry) => `<blockquote class="${entry.priority ? "primary-source" : ""}"><strong>${escapeHtml(entry.title)}</strong>${escapeHtml(entry.text)}</blockquote>`)
    .join("");

  return `
    <section>
      <h3>所问</h3>
      <p>${escapeHtml(question)}</p>
    </section>
    <section>
      <h3>卦辞</h3>
      <blockquote><strong>${escapeHtml(reading.primary.name)}卦辞</strong>${escapeHtml(reading.primary.judgment)}</blockquote>
      ${reading.moving.length ? `<p>变卦为「${escapeHtml(reading.changed.fullName)}」，其卦辞为：${escapeHtml(reading.changed.judgment)}</p>` : ""}
    </section>
    <section>
      <h3>取辞</h3>
      <p><span class="rule-badge">${reading.moving.length} 动爻</span>${escapeHtml(reading.decision.rule)} 本次重点：${escapeHtml(reading.decision.focus)}。</p>
      <div class="source-stack">${entries}</div>
    </section>
    <section>
      <h3>解读</h3>
      <p>${buildInterpretation(reading, questionType)}</p>
    </section>
    <section>
      <h3>体系路由</h3>
      <p>${buildRouteNote(reading, questionType)}</p>
    </section>
    <section>
      <h3>行动</h3>
      <p>${buildActionAdvice(reading, questionType)}</p>
    </section>
    <section>
      <h3>追问</h3>
      <p>${buildReflectionQuestion(reading, questionType)}</p>
    </section>
  `;
}

function buildRouteNote(reading, questionType) {
  const enabled = DIVINATION_SYSTEMS.find((item) => item.id === "zhouyi-benjing");
  const related = recommendSystems(questionType)
    .map((id) => DIVINATION_SYSTEMS.find((item) => item.id === id))
    .filter(Boolean);
  const names = related.map((item) => `${item.name}（${item.status}，${item.grade}级）`).join("；");
  return `本次采用 ${enabled.name}（${enabled.grade}级，${enabled.status}）作为主体系，因为它能直接引用本经并按动爻取辞。可参考的旁支体系：${names || "暂无"}。旁支只作百科线索，不参与本次断语。`;
}

function recommendSystems(questionType) {
  const map = {
    relationship: ["liuyao", "meihua", "ziwei", "tarot"],
    work: ["meihua", "liuyao", "qimen", "bazi"],
    money: ["liuyao", "qimen", "bazi"],
    wellbeing: ["meihua", "fengshui", "bazi"],
    timing: ["qimen", "liuyao", "meihua"],
    general: ["meihua", "liuyao", "routing"]
  };
  return map[questionType] || map.general;
}

function buildInterpretation(reading, questionType) {
  const movement = reading.moving.length === 0
    ? "此卦无动爻，说明问题的关键不在立刻改变，而在看清本卦所呈现的结构。"
    : reading.moving.length >= 4
      ? "动爻很多，表示局面已经接近整体翻转，判断时要少抓单点，多看变卦给出的方向。"
      : "有动爻，说明现状中已经出现转折点；爻位提示变化发生的层次。";

  const lineLayer = reading.moving.length
    ? reading.moving.map(({ index }) => `${LINE_POSITIONS[index]}：${LINE_GUIDANCE[index]}`).join(" ")
    : "六爻皆静，以本卦卦辞为主，不宜把问题解释成马上会变。";

  return `${movement}${lineLayer}${QUESTION_GUIDANCE[questionType]} 本系统只以《周易》本经卦辞、爻辞为底，不把结果说成确定命令。`;
}

function buildActionAdvice(reading, questionType) {
  const count = reading.moving.length;
  const typeAdvice = {
    relationship: "先校正关系中的位置与边界，再谈推进；如果对方回应不稳定，不要用催促替代确认。",
    work: "把下一步拆成可验证的小行动，先确认角色、资源、时间表，再扩大承诺。",
    money: "不要只看收益叙事，先列出最大损失、退出条件和等待成本。",
    wellbeing: "先恢复秩序和支持系统；若涉及疾病或持续痛苦，请优先找专业帮助。",
    timing: "若动爻少，先抓关键动作；若动爻多，缩短承诺周期，等待新局面落定。",
    general: "把卦象落回现实：今天能负责的一步是什么，做完后用什么信号复盘。"
  };

  const rhythm = count === 0
    ? "宜守中观察，少做剧烈转向。"
    : count <= 2
      ? "宜抓住一个关键点，小步推进。"
      : count === 3
        ? "宜同时看现状与去向，先做过渡安排。"
        : "宜降低赌注，给变化留出缓冲。";

  return `${rhythm}${typeAdvice[questionType]}`;
}

function buildReflectionQuestion(reading, questionType) {
  const base = {
    relationship: "这段关系里，我真正能负责的是表达、边界，还是等待？",
    work: "如果只推进一步，哪一步最能验证这件事值得继续？",
    money: "我现在看到的是价值、价格，还是被波动放大的欲望与恐惧？",
    wellbeing: "我最需要先恢复的是体力、秩序、支持，还是边界？",
    timing: "我是在等合适时机，还是在用等待回避行动？",
    general: "这件事里，我真正能负责的部分是什么？"
  };
  return `${base[questionType]}以「${reading.primary.fullName}」为镜，再看「${reading.changed.fullName}」是否指出下一阶段。`;
}

function buildLineList(reading) {
  return reading.lines
    .map((line, index) => {
      const source = reading.primary.lines[index];
      const selected = reading.decision.entries.some((entry) => entry.title === `${reading.primary.name}${source.label}`);
      const coinText = line.coins.length ? `三钱：${line.coins.join(" + ")} = ${line.value}` : `蓍草概率数：${line.value}`;
      return `
        <div class="line-item ${line.moving ? "moving" : ""} ${selected ? "selected" : ""}">
          <strong>${source.label} · ${line.label}${line.moving ? " · 动" : ""}</strong>
          <p>${coinText}</p>
          <p class="source-text">${escapeHtml(source.text)}</p>
        </div>
      `;
    })
    .reverse()
    .join("");
}

function buildSymbolList(reading) {
  const items = [
    {
      title: "本经底座",
      text: "本页数据由 sources/zhouyi/zhouyi_benjing.txt 生成，仅含六十四卦卦辞、爻辞、用九、用六。"
    },
    {
      title: `上卦 ${reading.primary.upper.name}${reading.primary.upper.symbol}`,
      text: `${reading.primary.upper.nature}象为${reading.primary.upper.image}：${reading.primary.upper.counsel}`
    },
    {
      title: `下卦 ${reading.primary.lower.name}${reading.primary.lower.symbol}`,
      text: `${reading.primary.lower.nature}象为${reading.primary.lower.image}：${reading.primary.lower.counsel}`
    },
    {
      title: "取辞规则",
      text: reading.decision.rule
    }
  ];

  if (reading.moving.length) {
    items.push({
      title: `变化 ${reading.changed.fullName}`,
      text: `由 ${reading.primary.fullName} 变为 ${reading.changed.fullName}，解释时先按动爻数量取辞，再参考变卦方向。`
    });
  }

  return items
    .map(
      (item) => `
        <div class="symbol-item">
          <strong>${escapeHtml(item.title)}</strong>
          <p>${escapeHtml(item.text)}</p>
        </div>
      `
    )
    .join("");
}

function renderCatalog() {
  if (!els.catalogGrid) return;
  const query = normalize(els.catalogSearch?.value || "");
  const systems = DIVINATION_SYSTEMS.filter((item) => {
    const gradeOk = state.catalogGrade === "all" || item.grade === state.catalogGrade;
    const haystack = normalize([
      item.name,
      item.family,
      item.grade,
      item.status,
      item.basis,
      item.capability,
      item.guardrail,
      item.bestFor.join(" "),
      item.inputs.join(" ")
    ].join(" "));
    return gradeOk && (!query || haystack.includes(query));
  });

  els.catalogGrid.innerHTML = systems.map(renderSystemCard).join("") ||
    `<div class="system-card"><p>没有匹配的体系。</p></div>`;
}

function renderSystemCard(item) {
  return `
    <article class="system-card">
      <header>
        <div>
          <h3>${escapeHtml(item.name)}</h3>
          <p>${escapeHtml(item.family)} · ${escapeHtml(item.basis)}</p>
        </div>
        <span class="grade-badge grade-${item.grade.toLowerCase()}">${item.grade}</span>
      </header>
      <span class="status-badge">${escapeHtml(item.status)}</span>
      <p>${escapeHtml(item.capability)}</p>
      <div class="tag-list">${item.bestFor.slice(0, 4).map((tag) => `<span>${escapeHtml(tag)}</span>`).join("")}</div>
      <p><strong>资料：</strong>${escapeHtml(item.inputs.join("、"))}</p>
      <p><strong>边界：</strong>${escapeHtml(item.guardrail)}</p>
    </article>
  `;
}

function renderHexagramLibrary() {
  if (!els.hexagramLibrary) return;
  const query = normalize(els.hexagramSearch?.value || "");
  const items = ZHOUYI_BENJING.filter((hex) => {
    const haystack = normalize([
      hex.number,
      hex.name,
      hex.judgment,
      hex.lines.map((line) => `${line.label}${line.text}`).join(" "),
      hex.extras.map((line) => `${line.label}${line.text}`).join(" ")
    ].join(" "));
    return !query || haystack.includes(query);
  });

  els.hexagramLibrary.innerHTML = items.map(renderHexCard).join("") ||
    `<div class="hex-card"><p>没有匹配的卦。</p></div>`;
}

function renderHexCard(hex) {
  const firstMovingLine = hex.lines.find((line) => /吉|凶|悔|咎|厲|利/.test(line.text)) || hex.lines[0];
  return `
    <article class="hex-card">
      <header>
        <h3>${hex.number}. ${escapeHtml(hex.name)}</h3>
        <span class="grade-badge grade-s">本经</span>
      </header>
      <p class="source-line">${escapeHtml(hex.name)}：${escapeHtml(hex.judgment)}</p>
      <p>${escapeHtml(firstMovingLine.label)}：${escapeHtml(firstMovingLine.text)}</p>
    </article>
  `;
}

function normalize(value) {
  return String(value).toLowerCase().replace(/\s+/g, "");
}

function classifyQuestion(question) {
  const q = question.toLowerCase();
  if (/感情|关系|恋|婚|伴侣|喜欢|复合|分手/.test(q)) return "relationship";
  if (/工作|事业|合作|项目|公司|创业|offer|职位|老板|面试|跳槽/.test(q)) return "work";
  if (/钱|投资|买|卖|收入|财|价格|交易|理财|资产/.test(q)) return "money";
  if (/健康|身体|病|睡眠|焦虑|压力|治疗|医院/.test(q)) return "wellbeing";
  if (/何时|什么时候|时机|现在适合|是否适合|能不能|该不该/.test(q)) return "timing";
  return "general";
}

function methodText(method) {
  if (method === "yarrow") return "蓍草概率";
  return "三枚铜钱";
}

function saveJournal(reading) {
  const journal = getJournal().filter((item) => item.id !== reading.id);
  journal.unshift({
    id: reading.id,
    createdAt: reading.createdAt,
    question: reading.question,
    method: reading.method,
    lines: reading.lines,
    changedLines: reading.changedLines
  });
  localStorage.setItem(JOURNAL_KEY, JSON.stringify(journal.slice(0, 8)));
}

function getJournal() {
  try {
    return JSON.parse(localStorage.getItem(JOURNAL_KEY) || "[]");
  } catch {
    return [];
  }
}

function renderJournal() {
  const journal = getJournal();
  if (!journal.length) {
    els.journalList.innerHTML = `<div class="journal-item"><p>暂无记录</p></div>`;
    return;
  }

  els.journalList.innerHTML = journal
    .map((item) => {
      const reading = enrichReading(item);
      const date = new Intl.DateTimeFormat("zh-CN", {
        month: "2-digit",
        day: "2-digit",
        hour: "2-digit",
        minute: "2-digit"
      }).format(new Date(item.createdAt));
      return `
        <button class="journal-item" type="button" data-id="${item.id}">
          <strong>${reading.primary.number}. ${escapeHtml(reading.primary.fullName)}</strong>
          <p>${date} · ${methodText(item.method)} · ${escapeHtml(item.question || "未写问题")}</p>
        </button>
      `;
    })
    .join("");
}

function escapeHtml(value = "") {
  return String(value)
    .replaceAll("&", "&amp;")
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")
    .replaceAll('"', "&quot;")
    .replaceAll("'", "&#039;");
}

function plainTextReading() {
  if (!state.currentReading) return "";
  const container = document.createElement("div");
  container.innerHTML = buildReadingSections(state.currentReading);
  return container.innerText.trim();
}

function bootstrap() {
  if (!Array.isArray(window.ZHOUYI_BENJING) || window.ZHOUYI_BENJING.length !== 64) {
    els.readingText.innerHTML = `<section><h3>数据错误</h3><p>未能加载完整《周易》本经数据。</p></section>`;
    return;
  }
  if (!Array.isArray(window.DIVINATION_SYSTEMS) || window.DIVINATION_SYSTEMS.length < 8) {
    els.readingText.innerHTML = `<section><h3>数据错误</h3><p>未能加载完整术数百科数据。</p></section>`;
    return;
  }

  els.modeButtons.forEach((button) => {
    button.addEventListener("click", () => {
      state.method = button.dataset.method;
      els.modeButtons.forEach((item) => item.classList.toggle("active", item === button));
    });
  });

  els.castButton.addEventListener("click", () => {
    renderReading(castHexagram());
  });

  els.copyButton.addEventListener("click", async () => {
    const text = plainTextReading();
    if (!text) return;
    try {
      await navigator.clipboard.writeText(text);
      els.copyButton.textContent = "✓";
    } catch {
      els.copyButton.textContent = "!";
    }
    window.setTimeout(() => {
      els.copyButton.textContent = "⧉";
    }, 1200);
  });

  els.clearJournalButton.addEventListener("click", () => {
    localStorage.removeItem(JOURNAL_KEY);
    renderJournal();
  });

  els.catalogSearch?.addEventListener("input", renderCatalog);
  els.hexagramSearch?.addEventListener("input", renderHexagramLibrary);
  els.catalogFilters?.addEventListener("click", (event) => {
    const button = event.target.closest("[data-grade]");
    if (!button) return;
    state.catalogGrade = button.dataset.grade;
    els.catalogFilters.querySelectorAll(".filter-button").forEach((item) => {
      item.classList.toggle("active", item === button);
    });
    renderCatalog();
  });

  els.journalList.addEventListener("click", (event) => {
    const button = event.target.closest("[data-id]");
    if (!button) return;
    const record = getJournal().find((item) => item.id === button.dataset.id);
    if (record) renderReading(enrichReading(record));
  });

  renderJournal();
  renderCatalog();
  renderHexagramLibrary();
}

bootstrap();


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)