PlanPlan Activity
note

This rune is part of @refrakt-md/plan. Install with npm install @refrakt-md/plan and add "@refrakt-md/plan" to the plugins array in your refrakt.config.json.

Plan Activity

Renders a recent activity feed showing the most recently modified plan entities. Each entry displays the modification date, entity type, ID, status, and title. Status badges are color-coded using the plan status palette.

This is a self-closing aggregation rune — it produces a sentinel that the pipeline resolves with live entity data, sorted by file modification time.

Default (last 10 items)

{% plan-activity /%}
<section data-rune="collection">
  <meta data-field="collection-type" content="work,bug,spec,decision,milestone">
  <meta data-field="collection-filter" content="">
  <meta data-field="collection-sort" content="-modified">
  <meta data-field="collection-group" content="">
  <meta data-field="collection-limit" content="10">
  <meta data-field="collection-fields" content="">
  <meta data-field="collection-layout" content="table">
  <meta data-field="collection-group-display" content="headings">
  <meta data-field="collection-empty" content="">
  <meta data-field="__collection-sentinel" content="true">
  <meta data-field="collection-body" content="# Item
{% link href=$item.url %}**{% $item.id %}** — {% $item.data.title %}{% /link %}
# Type
{% humanize($item.type) %}
# Status
{% humanize($item.data.status) %}
# Modified
{% date($item.data.modified) %}
">
  <div data-name="items"></div>
</section>
<section class="rf-collection" data-type="work,bug,spec,decision,milestone" data-layout="table" data-rune="collection" data-density="full">
  <div data-name="items" class="rf-collection__items rf-collection__items">
    <table class="rf-collection__table">
      <thead>
        <tr>
          <th>Item</th>
          <th>Type</th>
          <th>Status</th>
          <th>Modified</th>
        </tr>
      </thead>
      <tbody>
        <tr data-entity-id="WORK-101">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-101</strong>

                Content model validation errors
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Ready</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-102">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-102</strong>

                Token fallback chain for nested tints
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Ready</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-103">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-103</strong>

                Interactive rune playground
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Ready</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-104">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-104</strong>

                Heading level auto-detection for nested runes
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>In Progress</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-105">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-105</strong>

                Snapshot tests for identity transform output
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>In Progress</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-106">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-106</strong>

                Add copy button to code fences
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Done</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-107">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-107</strong>

                Theme marketplace architecture
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Draft</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-108">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-108</strong>

                Responsive modifier system
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Review</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="RF-142">
          <td>
            <p>
              <a href="/runes/plan/work">
                <strong marker="**">RF-142</strong>

                Implement tint rune dark mode support
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Ready</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="RF-215">
          <td>
            <p>
              <a href="/runes/plan/work">
                <strong marker="**">RF-215</strong>

                Alignment system migration
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Blocked</td>
          <td>Jun 14, 2026</td>
        </tr>
      </tbody>
    </table>
  </div>
</section>

Custom limit

Show fewer or more recent items.

{% plan-activity limit="5" /%}
<section data-rune="collection">
  <meta data-field="collection-type" content="work,bug,spec,decision,milestone">
  <meta data-field="collection-filter" content="">
  <meta data-field="collection-sort" content="-modified">
  <meta data-field="collection-group" content="">
  <meta data-field="collection-limit" content="5">
  <meta data-field="collection-fields" content="">
  <meta data-field="collection-layout" content="table">
  <meta data-field="collection-group-display" content="headings">
  <meta data-field="collection-empty" content="">
  <meta data-field="__collection-sentinel" content="true">
  <meta data-field="collection-body" content="# Item
{% link href=$item.url %}**{% $item.id %}** — {% $item.data.title %}{% /link %}
# Type
{% humanize($item.type) %}
# Status
{% humanize($item.data.status) %}
# Modified
{% date($item.data.modified) %}
">
  <div data-name="items"></div>
</section>
<section class="rf-collection" data-type="work,bug,spec,decision,milestone" data-layout="table" data-rune="collection" data-density="full">
  <div data-name="items" class="rf-collection__items rf-collection__items">
    <table class="rf-collection__table">
      <thead>
        <tr>
          <th>Item</th>
          <th>Type</th>
          <th>Status</th>
          <th>Modified</th>
        </tr>
      </thead>
      <tbody>
        <tr data-entity-id="WORK-101">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-101</strong>

                Content model validation errors
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Ready</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-102">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-102</strong>

                Token fallback chain for nested tints
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Ready</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-103">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-103</strong>

                Interactive rune playground
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>Ready</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-104">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-104</strong>

                Heading level auto-detection for nested runes
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>In Progress</td>
          <td>Jun 14, 2026</td>
        </tr>
        <tr data-entity-id="WORK-105">
          <td>
            <p>
              <a href="/runes/plan/examples">
                <strong marker="**">WORK-105</strong>

                Snapshot tests for identity transform output
              </a>
            </p>
          </td>
          <td>Work</td>
          <td>In Progress</td>
          <td>Jun 14, 2026</td>
        </tr>
      </tbody>
    </table>
  </div>
</section>

Attributes

AttributeTypeDefaultDescription
limitnumber10Maximum number of recent items to show

Output structure

The rune resolves to an ordered list of entries, each containing:

  • Modification date (<time> element, ISO date format)
  • Entity type label (work, bug, spec, decision)
  • Entity ID
  • Status badge with [data-status] color-coding
  • Entity title

Items are sorted by file modification time, most recent first. Only entities with available modification data are included. Modification dates are sourced from the shared content pipeline's $file.modified variable, which uses git commit timestamps with a filesystem stat fallback.