Skip to content

Commit 5b42802

Browse files
committed
downstream best practices
lessons learned from implementing publedge
1 parent 29fdf7e commit 5b42802

39 files changed

Lines changed: 3917 additions & 0 deletions

File tree

docs/.nojekyll

Whitespace-only changes.

docs/404.html

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Page Not Found - Example Knowledge Base</title>
7+
<meta name="robots" content="noindex">
8+
<link rel="stylesheet" href="/assets/styles.css">
9+
<style>/* Generated from project.yml — do not edit manually */
10+
.group-badge.governance { background: #7c4dff; }
11+
:is(html, body).light-mode .group-badge.governance { background: #4527a0; }
12+
.matrix-table .matrix-row-header.group-governance { border-left-color: #7c4dff; }
13+
:is(html, body).light-mode .matrix-table .matrix-row-header.group-governance { border-left-color: #4527a0; }
14+
.group-badge.technical { background: #4fc3f7; }
15+
:is(html, body).light-mode .group-badge.technical { background: #0277bd; }
16+
.matrix-table .matrix-row-header.group-technical { border-left-color: #4fc3f7; }
17+
:is(html, body).light-mode .matrix-table .matrix-row-header.group-technical { border-left-color: #0277bd; }
18+
.group-badge.operational { background: #ff6e40; }
19+
:is(html, body).light-mode .group-badge.operational { background: #bf360c; }
20+
.matrix-table .matrix-row-header.group-operational { border-left-color: #ff6e40; }
21+
:is(html, body).light-mode .matrix-table .matrix-row-header.group-operational { border-left-color: #bf360c; }
22+
.status-badge.active { background: #4caf50; color: #000; }
23+
:is(html, body).light-mode .status-badge.active { background: #1b7d1b; color: #fff; }
24+
.status-badge.draft { background: #ff9800; color: #000; }
25+
:is(html, body).light-mode .status-badge.draft { background: #e65100; color: #fff; }
26+
.status-badge.deprecated { background: #607d8b; color: #000; }
27+
:is(html, body).light-mode .status-badge.deprecated { background: #455a64; color: #fff; }
28+
:root { --accent: #4fc3f7; }
29+
:is(html, body).light-mode { --accent: #0055aa; }
30+
</style>
31+
<script>
32+
(function() {
33+
var params = new URLSearchParams(window.location.search);
34+
if (params.get('theme') === 'light' || localStorage.getItem('theme') === 'light') {
35+
document.documentElement.classList.add('light-mode');
36+
localStorage.setItem('theme', 'light');
37+
}
38+
})();
39+
</script>
40+
</head>
41+
<body>
42+
<a class="skip-link" href="#main-content">Skip to content</a>
43+
<header class="site-header">
44+
<h1><a href="/index.html" onclick="passTheme(this)">Example Knowledge Base</a></h1>
45+
<button class="hamburger-btn" onclick="toggleMobileMenu()" aria-label="Toggle menu" aria-expanded="false" aria-controls="siteNav">
46+
<span class="hamburger-icon"></span>
47+
</button>
48+
<nav class="site-nav" id="siteNav" aria-label="Main navigation">
49+
<a href="/index.html" class="site-nav-link" onclick="passTheme(this)">Home</a>
50+
<a href="/containers.html" class="site-nav-link" onclick="passTheme(this)">Frameworks</a>
51+
<a href="/primaries.html" class="site-nav-link" onclick="passTheme(this)">Requirements</a>
52+
<a href="/matrix.html" class="site-nav-link" onclick="passTheme(this)">Matrix</a>
53+
<a href="/timeline.html" class="site-nav-link" onclick="passTheme(this)">Timeline</a>
54+
<a href="/compare.html" class="site-nav-link" onclick="passTheme(this)">Compare</a>
55+
<a href="/about.html" class="site-nav-link" onclick="passTheme(this)">About</a>
56+
<a href="/pattern.html" class="site-nav-link" onclick="passTheme(this)">Pattern</a>
57+
</nav>
58+
<div class="header-actions">
59+
<div class="site-search" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-owns="searchResults">
60+
<input type="search" id="siteSearchInput" class="search-input" placeholder="Search..." aria-label="Search" aria-autocomplete="list" aria-controls="searchResults" autocomplete="off">
61+
<ul id="searchResults" class="search-results" role="listbox" hidden></ul>
62+
</div>
63+
<button class="theme-toggle" onclick="toggleTheme()" title="Toggle light/dark mode" aria-label="Toggle light/dark mode">&#x1F313;</button>
64+
</div>
65+
</header>
66+
<div class="container" id="main-content" style="text-align:center;">
67+
<h1 style="margin-top:2rem;">404 — Page Not Found</h1>
68+
<p style="color:var(--text-secondary); margin: 1rem 0 2rem;">The page you're looking for doesn't exist or has moved.</p>
69+
<div style="display:flex; gap:1rem; justify-content:center; flex-wrap:wrap;">
70+
<a href="/" class="bridge-cta">Home</a>
71+
<a href="/containers.html" class="bridge-cta">All frameworks</a>
72+
<a href="/primaries.html" class="bridge-cta">All requirements</a>
73+
</div>
74+
</div>
75+
<footer>
76+
<p>Maintained with <a href="https://github.com/your-org/your-repo">version control</a>. This is a reference tool, not professional advice.</p>
77+
<p>&copy; 2026 | Built with <a href="https://knowledge-as-code.com">Knowledge-as-Code</a>, a pattern by <a href="https://paice.work">PAICE.work</a></p>
78+
</footer>
79+
<script>
80+
function toggleTheme() {
81+
document.documentElement.classList.toggle('light-mode');
82+
localStorage.setItem('theme', document.documentElement.classList.contains('light-mode') ? 'light' : 'dark');
83+
}
84+
function toggleMobileMenu() {
85+
var btn = document.querySelector('.hamburger-btn');
86+
var menu = document.getElementById('siteNav');
87+
var isOpen = menu.classList.toggle('open');
88+
btn.classList.toggle('active', isOpen);
89+
btn.setAttribute('aria-expanded', isOpen);
90+
}
91+
document.addEventListener('click', function(e) {
92+
var menu = document.getElementById('siteNav');
93+
var btn = document.querySelector('.hamburger-btn');
94+
if (menu && btn && menu.classList.contains('open') && !menu.contains(e.target) && !btn.contains(e.target)) {
95+
menu.classList.remove('open');
96+
btn.classList.remove('active');
97+
btn.setAttribute('aria-expanded', 'false');
98+
}
99+
});
100+
function passTheme(link) {
101+
if (document.documentElement.classList.contains('light-mode')) {
102+
var url = new URL(link.href, window.location.href);
103+
url.searchParams.set('theme', 'light');
104+
link.href = url.pathname + url.search + url.hash;
105+
}
106+
}
107+
(function() {
108+
var btn = document.createElement('button');
109+
btn.className = 'back-to-top';
110+
btn.setAttribute('aria-label', 'Back to top');
111+
btn.textContent = '\u2191';
112+
document.body.appendChild(btn);
113+
window.addEventListener('scroll', function() { btn.classList.toggle('visible', window.scrollY > 400); });
114+
btn.addEventListener('click', function() { window.scrollTo({ top: 0, behavior: 'smooth' }); });
115+
})();
116+
</script>
117+
</body>
118+
</html>

docs/CNAME

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
example.com

docs/about.html

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>About - Example Knowledge Base</title>
7+
<meta name="theme-color" content="#1a1a2e">
8+
<link rel="canonical" href="https://example.com/about.html">
9+
<link rel="stylesheet" href="assets/styles.css">
10+
<style>/* Generated from project.yml — do not edit manually */
11+
.group-badge.governance { background: #7c4dff; }
12+
:is(html, body).light-mode .group-badge.governance { background: #4527a0; }
13+
.matrix-table .matrix-row-header.group-governance { border-left-color: #7c4dff; }
14+
:is(html, body).light-mode .matrix-table .matrix-row-header.group-governance { border-left-color: #4527a0; }
15+
.group-badge.technical { background: #4fc3f7; }
16+
:is(html, body).light-mode .group-badge.technical { background: #0277bd; }
17+
.matrix-table .matrix-row-header.group-technical { border-left-color: #4fc3f7; }
18+
:is(html, body).light-mode .matrix-table .matrix-row-header.group-technical { border-left-color: #0277bd; }
19+
.group-badge.operational { background: #ff6e40; }
20+
:is(html, body).light-mode .group-badge.operational { background: #bf360c; }
21+
.matrix-table .matrix-row-header.group-operational { border-left-color: #ff6e40; }
22+
:is(html, body).light-mode .matrix-table .matrix-row-header.group-operational { border-left-color: #bf360c; }
23+
.status-badge.active { background: #4caf50; color: #000; }
24+
:is(html, body).light-mode .status-badge.active { background: #1b7d1b; color: #fff; }
25+
.status-badge.draft { background: #ff9800; color: #000; }
26+
:is(html, body).light-mode .status-badge.draft { background: #e65100; color: #fff; }
27+
.status-badge.deprecated { background: #607d8b; color: #000; }
28+
:is(html, body).light-mode .status-badge.deprecated { background: #455a64; color: #fff; }
29+
:root { --accent: #4fc3f7; }
30+
:is(html, body).light-mode { --accent: #0055aa; }
31+
</style>
32+
<meta name="description" content="A structured reference tracking example entities across categories.">
33+
<meta property="og:title" content="About">
34+
<meta property="og:description" content="A structured reference tracking example entities across categories.">
35+
<meta property="og:type" content="website">
36+
<meta property="og:image" content="https://example.com/[object Object]">
37+
<meta property="og:url" content="https://example.com/about.html">
38+
<meta name="twitter:card" content="summary_large_image">
39+
<meta name="twitter:site" content="[object Object]">
40+
<script>
41+
(function() {
42+
var params = new URLSearchParams(window.location.search);
43+
if (params.get('theme') === 'light' || localStorage.getItem('theme') === 'light') {
44+
document.documentElement.classList.add('light-mode');
45+
localStorage.setItem('theme', 'light');
46+
}
47+
})();
48+
</script>
49+
</head>
50+
<body>
51+
<a class="skip-link" href="#main-content">Skip to content</a>
52+
<header class="site-header">
53+
<h1><a href="index.html" onclick="passTheme(this)">Example Knowledge Base</a></h1>
54+
<button class="hamburger-btn" onclick="toggleMobileMenu()" aria-label="Toggle menu" aria-expanded="false" aria-controls="siteNav">
55+
<span class="hamburger-icon"></span>
56+
</button>
57+
<nav class="site-nav" id="siteNav" aria-label="Main navigation">
58+
<a href="index.html" class="site-nav-link" onclick="passTheme(this)">Home</a>
59+
<a href="containers.html" class="site-nav-link" onclick="passTheme(this)">Frameworks</a>
60+
<a href="primaries.html" class="site-nav-link" onclick="passTheme(this)">Requirements</a>
61+
<a href="matrix.html" class="site-nav-link" onclick="passTheme(this)">Matrix</a>
62+
<a href="timeline.html" class="site-nav-link" onclick="passTheme(this)">Timeline</a>
63+
<a href="compare.html" class="site-nav-link" onclick="passTheme(this)">Compare</a>
64+
<a href="about.html" class="site-nav-link active" onclick="passTheme(this)">About</a>
65+
<a href="pattern.html" class="site-nav-link" onclick="passTheme(this)">Pattern</a>
66+
</nav>
67+
<div class="header-actions">
68+
<div class="site-search" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-owns="searchResults">
69+
<input type="search" id="siteSearchInput" class="search-input" placeholder="Search..." aria-label="Search" aria-autocomplete="list" aria-controls="searchResults" autocomplete="off">
70+
<ul id="searchResults" class="search-results" role="listbox" hidden></ul>
71+
</div>
72+
<button class="theme-toggle" onclick="toggleTheme()" title="Toggle light/dark mode" aria-label="Toggle light/dark mode">&#x1F313;</button>
73+
</div>
74+
</header>
75+
<div class="container" id="main-content">
76+
<div class="about-content">
77+
<h2 style="margin-top: 0.5rem;">About</h2>
78+
<p>A structured reference tracking example entities across categories. Tracks <strong>2 frameworks</strong>, <strong>3 requirements</strong>, <strong>4 provisions</strong>, and <strong>2 organizations</strong>.</p>
79+
<h3>Data Model</h3>
80+
<p><strong>Organization</strong> &rarr; <strong>Framework</strong> &rarr; <strong>Provision</strong> &rarr; <strong>Requirement</strong></p>
81+
<p>Requirements are the stable anchors. Provisions are the implementations — different frameworks implements the same requirements differently.</p>
82+
<h3>JSON API</h3>
83+
<ul>
84+
<li><span class="api-endpoint"><a href="api/v1/index.json">api/v1/index.json</a></span> — API manifest</li>
85+
<li><span class="api-endpoint"><a href="api/v1/primaries.json">api/v1/primaries.json</a></span> — All requirements</li>
86+
<li><span class="api-endpoint"><a href="api/v1/containers.json">api/v1/containers.json</a></span> — All frameworks</li>
87+
</ul>
88+
<h3>Contributing</h3>
89+
<p>See the <a href="https://github.com/your-org/your-repo">repository</a> for contribution guidelines.</p>
90+
</div>
91+
</div>
92+
<footer>
93+
<p>Maintained with <a href="https://github.com/your-org/your-repo">version control</a>. This is a reference tool, not professional advice.</p>
94+
<p>&copy; 2026 | Built with <a href="https://knowledge-as-code.com">Knowledge-as-Code</a>, a pattern by <a href="https://paice.work">PAICE.work</a></p>
95+
</footer>
96+
<script src="assets/search.js"></script>
97+
<script src="assets/tables.js"></script>
98+
<script>
99+
function toggleTheme() {
100+
document.documentElement.classList.toggle('light-mode');
101+
localStorage.setItem('theme', document.documentElement.classList.contains('light-mode') ? 'light' : 'dark');
102+
}
103+
function toggleMobileMenu() {
104+
var btn = document.querySelector('.hamburger-btn');
105+
var menu = document.getElementById('siteNav');
106+
var isOpen = menu.classList.toggle('open');
107+
btn.classList.toggle('active', isOpen);
108+
btn.setAttribute('aria-expanded', isOpen);
109+
}
110+
document.addEventListener('click', function(e) {
111+
var menu = document.getElementById('siteNav');
112+
var btn = document.querySelector('.hamburger-btn');
113+
if (menu && btn && menu.classList.contains('open') && !menu.contains(e.target) && !btn.contains(e.target)) {
114+
menu.classList.remove('open');
115+
btn.classList.remove('active');
116+
btn.setAttribute('aria-expanded', 'false');
117+
}
118+
});
119+
function passTheme(link) {
120+
if (document.documentElement.classList.contains('light-mode')) {
121+
var url = new URL(link.href, window.location.href);
122+
url.searchParams.set('theme', 'light');
123+
link.href = url.pathname + url.search + url.hash;
124+
}
125+
}
126+
(function() {
127+
var btn = document.createElement('button');
128+
btn.className = 'back-to-top';
129+
btn.setAttribute('aria-label', 'Back to top');
130+
btn.textContent = '\u2191';
131+
document.body.appendChild(btn);
132+
window.addEventListener('scroll', function() { btn.classList.toggle('visible', window.scrollY > 400); });
133+
btn.addEventListener('click', function() { window.scrollTo({ top: 0, behavior: 'smooth' }); });
134+
})();
135+
</script>
136+
</body>
137+
</html>

docs/agents.json

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
{
2+
"schema_version": "1.0",
3+
"site": {
4+
"name": "Example Knowledge Base",
5+
"url": "https://example.com/",
6+
"description": "A structured reference tracking example entities across categories.",
7+
"repo": "https://github.com/your-org/your-repo"
8+
},
9+
"capabilities": [
10+
{
11+
"id": "container-comparison",
12+
"name": "Framework Comparison",
13+
"description": "Compare 2 frameworks across 3 requirements",
14+
"url": "https://example.com/compare.html"
15+
},
16+
{
17+
"id": "coverage-matrix",
18+
"name": "Coverage Matrix",
19+
"description": "See which requirements each framework supports",
20+
"url": "https://example.com/matrix.html"
21+
},
22+
{
23+
"id": "json-api",
24+
"name": "JSON API",
25+
"description": "Programmatic access to all data",
26+
"url": "https://example.com/api/v1/index.json",
27+
"endpoints": [
28+
{
29+
"path": "api/v1/containers.json",
30+
"description": "All frameworks"
31+
},
32+
{
33+
"path": "api/v1/primaries.json",
34+
"description": "All requirements"
35+
},
36+
{
37+
"path": "api/v1/authorities.json",
38+
"description": "All organizations"
39+
},
40+
{
41+
"path": "api/v1/mappings.json",
42+
"description": "All mappings"
43+
},
44+
{
45+
"path": "api/v1/matrix.json",
46+
"description": "Coverage matrix"
47+
},
48+
{
49+
"path": "api/v1/comparisons.json",
50+
"description": "Pre-computed comparisons"
51+
}
52+
]
53+
}
54+
],
55+
"content": {
56+
"containers": [
57+
{
58+
"id": "iso-27001",
59+
"name": "ISO 27001",
60+
"status": "active",
61+
"url": "https://example.com/container/iso-27001/"
62+
},
63+
{
64+
"id": "nist-csf",
65+
"name": "NIST Cybersecurity Framework",
66+
"status": "active",
67+
"url": "https://example.com/container/nist-csf/"
68+
}
69+
],
70+
"primaries": [
71+
{
72+
"id": "access-control",
73+
"name": "Access Control",
74+
"group": "governance",
75+
"url": "https://example.com/primary/access-control/"
76+
},
77+
{
78+
"id": "data-quality",
79+
"name": "Data Quality",
80+
"group": "technical",
81+
"url": "https://example.com/primary/data-quality/"
82+
},
83+
{
84+
"id": "incident-response",
85+
"name": "Incident Response",
86+
"group": "operational",
87+
"url": "https://example.com/primary/incident-response/"
88+
}
89+
],
90+
"authorities": [
91+
{
92+
"id": "iso",
93+
"name": "International Organization for Standardization",
94+
"url": "https://example.com/authority/iso/"
95+
},
96+
{
97+
"id": "nist",
98+
"name": "National Institute of Standards and Technology",
99+
"url": "https://example.com/authority/nist/"
100+
}
101+
]
102+
},
103+
"discovery": {
104+
"llms_txt": "https://example.com/llms.txt",
105+
"sitemap": "https://example.com/sitemap.xml",
106+
"rss": "https://example.com/index.xml",
107+
"robots": "https://example.com/robots.txt"
108+
},
109+
"meta": {
110+
"last_updated": "2026-04-19",
111+
"built_with": "Knowledge as Code",
112+
"pattern_url": "https://knowledge-as-code.com",
113+
"template_url": "https://github.com/snapsynapse/knowledge-as-code-template"
114+
},
115+
"related_sites": [
116+
{
117+
"name": "Knowledge as Code",
118+
"url": "https://knowledge-as-code.com",
119+
"description": "The pattern definition and community hub"
120+
},
121+
{
122+
"name": "Graceful Boundaries",
123+
"url": "https://github.com/snapsynapse/graceful-boundaries",
124+
"description": "How services communicate operational limits to humans and agents"
125+
},
126+
{
127+
"name": "Siteline",
128+
"url": "https://siteline.to",
129+
"description": "AI agent readiness scanner for websites"
130+
}
131+
]
132+
}

0 commit comments

Comments
 (0)