Loading...
Loading...
This skill should be used when the user asks to "add entity", "create custom entity", "new entity type", "define entity", or mentions wanting to add a new trackable data type to their secondbrain project beyond the predefined ADR, Note, Task, and Discussion types.
npx skill4agent add sergio-bershadsky/ai secondbrain-entity.claude/data/config.yamlsecondbrain-initPREFIX-XXXXYYYY-MM-DD-slug.claude/data/<entity>/schema.yamltype: object
required: [records]
properties:
last_number:
type: integer
description: Last assigned sequential number
records:
type: array
items:
type: object
required: [id, title, created, file]
properties:
id:
type: string
description: Unique identifier
title:
type: string
description: Display title
created:
type: string
format: date
file:
type: string
description: Path to markdown file
status:
type: string
enum: [active, archived]
# ... custom fields.claude/data/<entity>/records.yamllast_number: 0
records: []templates/entities/<entity>/TEMPLATE.md---
id: {{id}}
title: {{title}}
created: {{date}}
status: active
# ... custom fields
---
# {{title}}
## Overview
[Description]
## Details
[Content]docs/.vitepress/data/<entity>.data.tsimport { defineLoader } from 'vitepress'
import fs from 'fs'
import yaml from 'js-yaml'
interface Record {
id: string
title: string
created: string
file: string
status: string
// ... custom fields
}
export interface Data {
records: Record[]
lastNumber: number
}
declare const data: Data
export { data }
export default defineLoader({
watch: ['.claude/data/<entity>/*.yaml'],
async load(): Promise<Data> {
const recordsPath = '.claude/data/<entity>/records.yaml'
if (!fs.existsSync(recordsPath)) {
return { records: [], lastNumber: 0 }
}
const content = fs.readFileSync(recordsPath, 'utf-8')
const parsed = yaml.load(content) as any
return {
records: parsed.records || [],
lastNumber: parsed.last_number || 0
}
}
})docs/<entity>/index.md---
title: <Entity> Index
---
# <Entity>
<script setup>
import { data } from '../.vitepress/data/<entity>.data'
import EntityTable from '../.vitepress/theme/components/EntityTable.vue'
const columns = [
{ key: 'id', label: 'ID', sortable: true },
{ key: 'title', label: 'Title', sortable: true },
{ key: 'created', label: 'Created', sortable: true },
{ key: 'status', label: 'Status', sortable: true }
]
</script>
<EntityTable :data="data.records" :columns="columns" />.claude/data/config.yamlentities:
<entity>:
enabled: true
singular: <singular>
id_format: sequential # or date-based, uuid
prefix: PREFIX # for sequential IDs
freshness:
stale_after_days: 30
fields:
- name: field_name
type: string
required: truedocs/.vitepress/config.ts{
text: '<Entity>',
collapsed: true,
items: [
{ text: 'Overview', link: '/<entity>/' }
]
}## Entity Created
**Name:** <entity>
**Singular:** <singular>
**ID Format:** sequential (PREFIX-XXXX)
**Status Tracking:** Yes
### Fields
| Field | Type | Required |
|-------|------|----------|
| title | string | Yes |
| description | string | No |
| priority | enum (low, medium, high) | No |
### Files Created
- `.claude/data/<entity>/schema.yaml`
- `.claude/data/<entity>/records.yaml`
- `docs/.vitepress/data/<entity>.data.ts`
- `docs/<entity>/index.md`
### Next Steps
1. Create records using the new entity type
2. Add entity-specific skills if needed
3. Customize the index page layout| Type | YAML Schema | Example |
|---|---|---|
| string | | "Hello world" |
| integer | | 42 |
| number | | 3.14 |
| boolean | | true/false |
| date | | 2026-01-15 |
| datetime | | 2026-01-15T10:30:00Z |
| array | | [tag1, tag2] |
| enum | | "active" |
PREFIX-0001, PREFIX-0002, PREFIX-00032026-01-15-meeting-notes
2026-01-15-architecture-review550e8400-e29b-41d4-a716-446655440000