@ignite-agent/agent 0.1.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/AI.txt +7 -0
  2. package/LICENSE +57 -4
  3. package/README.md +194 -12
  4. package/dist/cli/index.js +105 -21
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli/project.d.ts +39 -0
  7. package/dist/cli/project.js +276 -0
  8. package/dist/cli/project.js.map +1 -0
  9. package/dist/client-public.d.ts +2 -0
  10. package/dist/client-public.js +3 -0
  11. package/dist/client-public.js.map +1 -0
  12. package/dist/client.d.ts +3 -1
  13. package/dist/client.js +7 -0
  14. package/dist/client.js.map +1 -1
  15. package/dist/env.js +1 -2
  16. package/dist/env.js.map +1 -1
  17. package/dist/ignite.css +228 -0
  18. package/dist/index.d.ts +9 -3
  19. package/dist/index.js +8 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/mcp.d.ts +22 -0
  22. package/dist/mcp.js +88 -0
  23. package/dist/mcp.js.map +1 -0
  24. package/dist/operator/blog.d.ts +21 -0
  25. package/dist/operator/blog.js +32 -0
  26. package/dist/operator/blog.js.map +1 -0
  27. package/dist/operator/card.d.ts +5 -0
  28. package/dist/operator/card.js +11 -0
  29. package/dist/operator/card.js.map +1 -0
  30. package/dist/operator/jsonld.d.ts +6 -0
  31. package/dist/operator/jsonld.js +6 -3
  32. package/dist/operator/jsonld.js.map +1 -1
  33. package/dist/operator/metadata.d.ts +1 -0
  34. package/dist/operator/metadata.js +1 -0
  35. package/dist/operator/metadata.js.map +1 -1
  36. package/dist/operator/page.d.ts +17 -0
  37. package/dist/operator/page.js +51 -0
  38. package/dist/operator/page.js.map +1 -0
  39. package/dist/operator/prose.d.ts +19 -0
  40. package/dist/operator/prose.js +26 -0
  41. package/dist/operator/prose.js.map +1 -0
  42. package/dist/operator/proxy.d.ts +2 -0
  43. package/dist/operator/proxy.js +43 -22
  44. package/dist/operator/proxy.js.map +1 -1
  45. package/dist/operator/robots.d.ts +1 -0
  46. package/dist/operator/robots.js +1 -0
  47. package/dist/operator/robots.js.map +1 -1
  48. package/dist/operator/sitemap-merge.d.ts +10 -0
  49. package/dist/operator/sitemap-merge.js +56 -0
  50. package/dist/operator/sitemap-merge.js.map +1 -0
  51. package/dist/operator/sitemap.d.ts +5 -1
  52. package/dist/operator/sitemap.js +28 -17
  53. package/dist/operator/sitemap.js.map +1 -1
  54. package/dist/operator/ui.d.ts +44 -0
  55. package/dist/operator/ui.js +477 -0
  56. package/dist/operator/ui.js.map +1 -0
  57. package/dist/operator/wiki.d.ts +21 -0
  58. package/dist/operator/wiki.js +41 -0
  59. package/dist/operator/wiki.js.map +1 -0
  60. package/dist/types.d.ts +39 -0
  61. package/onboarding/CLAUDE-CODE-SETUP.md +52 -18
  62. package/onboarding/CURSOR-SETUP.md +73 -0
  63. package/onboarding/LOVABLE-SETUP.md +76 -0
  64. package/onboarding/MIGRATE-EXISTING.md +94 -0
  65. package/onboarding/REPLIT-SETUP.md +76 -0
  66. package/package.json +32 -9
@@ -0,0 +1,276 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ export const ROUTE_SOURCES = {
4
+ robots: `export { default } from '@ignite-agent/agent/robots'\n`,
5
+ sitemap: `export { default } from '@ignite-agent/agent/sitemap'\n`,
6
+ wikiPage: `export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/wiki'\n`,
7
+ wikiIndex: `export { WikiIndex as default, revalidate } from '@ignite-agent/agent/wiki'\n`,
8
+ blogPage: `export { default, generateStaticParams, generateMetadata, revalidate } from '@ignite-agent/agent/blog'\n`,
9
+ blogIndex: `export { BlogIndex as default, revalidate } from '@ignite-agent/agent/blog'\n`,
10
+ middleware: `export { middleware, config } from '@ignite-agent/agent/proxy'\n`,
11
+ proxy: `export { proxy, config } from '@ignite-agent/agent/proxy'\n`,
12
+ };
13
+ export function resolveAppDir(cwd) {
14
+ if (existsSync(join(cwd, 'app')))
15
+ return join(cwd, 'app');
16
+ if (existsSync(join(cwd, 'src/app')))
17
+ return join(cwd, 'src/app');
18
+ return null;
19
+ }
20
+ export function detectDesignSystem(cwd) {
21
+ if (existsSync(join(cwd, 'components.json')))
22
+ return 'shadcn';
23
+ const tailwind = ['tailwind.config.ts', 'tailwind.config.js', 'tailwind.config.mjs', 'tailwind.config.cjs'];
24
+ if (tailwind.some((name) => existsSync(join(cwd, name))))
25
+ return 'tailwind';
26
+ return 'unknown';
27
+ }
28
+ export function findGlobalsCss(cwd, appDir) {
29
+ const candidates = [
30
+ join(appDir, 'globals.css'),
31
+ join(appDir, 'global.css'),
32
+ join(cwd, 'app/globals.css'),
33
+ join(cwd, 'src/app/globals.css'),
34
+ join(cwd, 'src/globals.css'),
35
+ ];
36
+ return candidates.find((path) => existsSync(path)) ?? null;
37
+ }
38
+ export function loadEnvFile(path, env) {
39
+ if (!existsSync(path))
40
+ return;
41
+ const contents = readFileSync(path, 'utf8');
42
+ for (const raw of contents.split(/\r?\n/)) {
43
+ const line = raw.trim();
44
+ if (!line || line.startsWith('#'))
45
+ continue;
46
+ const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);
47
+ if (!match)
48
+ continue;
49
+ const key = match[1];
50
+ if (!key || env[key] !== undefined)
51
+ continue;
52
+ let value = match[2] ?? '';
53
+ if ((value.startsWith('"') && value.endsWith('"')) ||
54
+ (value.startsWith("'") && value.endsWith("'"))) {
55
+ value = value.slice(1, -1);
56
+ }
57
+ env[key] = value;
58
+ }
59
+ }
60
+ export function brandCssSnippet(globalsCss, design) {
61
+ const map = colorMapping(globalsCss, design);
62
+ return `/* Ignite pages inherit host brand via CSS variables. Safe to edit. */
63
+ :root {
64
+ --ignite-color-text: ${map.text};
65
+ --ignite-color-muted: ${map.muted};
66
+ --ignite-color-primary: ${map.primary};
67
+ --ignite-color-border: ${map.border};
68
+ --ignite-font-sans: ${map.fontSans};
69
+ --ignite-font-heading: ${map.fontHeading};
70
+ --ignite-radius: ${map.radius};
71
+ --ignite-prose-width: 65ch;
72
+ }
73
+
74
+ /* Optional: load Ignite prose CSS from your bundle instead of the runtime <style> tag.
75
+ @import '@ignite-agent/agent/styles.css';
76
+ Then pass injectCss={false} to IgniteFrame / IgniteProse.
77
+ */
78
+ `;
79
+ }
80
+ export function inspectRouteFile(path) {
81
+ if (!existsSync(path))
82
+ return 'missing';
83
+ const contents = readFileSync(path, 'utf8');
84
+ if (contents.includes('@ignite-agent/agent/'))
85
+ return 'ignite';
86
+ return 'host';
87
+ }
88
+ export function migrateSitemapSnippet() {
89
+ return `import igniteSitemap, { mergeSitemap } from '@ignite-agent/agent/sitemap'
90
+
91
+ export default async function sitemap() {
92
+ const local = await localSitemap() // existing absolute URLs; do not drop these
93
+ return mergeSitemap(local, await igniteSitemap())
94
+ }
95
+ `;
96
+ }
97
+ export function hostOwnedContentRoutes(appDir) {
98
+ const checks = [
99
+ ['blog/[slug]/page.tsx', 'blog'],
100
+ ['blog/page.tsx', 'blog-index'],
101
+ ['w/[slug]/page.tsx', 'wiki'],
102
+ ['w/page.tsx', 'wiki-index'],
103
+ ];
104
+ const found = [];
105
+ for (const [rel, kind] of checks) {
106
+ if (inspectRouteFile(join(appDir, rel)) === 'host')
107
+ found.push({ rel, kind });
108
+ }
109
+ return found;
110
+ }
111
+ export function migrateExistingSnippet(kind) {
112
+ const pkg = kind === 'blog' ? '@ignite-agent/agent/blog' : '@ignite-agent/agent/wiki';
113
+ const loadKind = kind === 'blog' ? 'article' : 'wiki';
114
+ return `import { notFound } from 'next/navigation'
115
+ import {
116
+ FeedArticle,
117
+ feedPageMetadata,
118
+ generateStaticParams as igniteParams,
119
+ revalidate,
120
+ tryLoadFeedPage,
121
+ mergeSlugs,
122
+ } from '${pkg}'
123
+
124
+ export { revalidate }
125
+
126
+ export async function generateStaticParams() {
127
+ const local = await localSlugs() // existing host posts; do not drop these
128
+ return mergeSlugs(local, await igniteParams())
129
+ }
130
+
131
+ export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }) {
132
+ const { slug } = await params
133
+ const local = await loadLocal(slug)
134
+ if (local) return localMetadata(local)
135
+ const page = await tryLoadFeedPage('${loadKind}', slug)
136
+ return page ? feedPageMetadata(page) : {}
137
+ }
138
+
139
+ export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
140
+ const { slug } = await params
141
+ const local = await loadLocal(slug)
142
+ if (local) return <ExistingPost post={local} />
143
+ const page = await tryLoadFeedPage('${loadKind}', slug)
144
+ if (!page) notFound()
145
+ return <FeedArticle page={page} />
146
+ }
147
+ `;
148
+ }
149
+ export function injectBrandCss(cssPath, snippet) {
150
+ const existing = readFileSync(cssPath, 'utf8');
151
+ if (existing.includes('--ignite-color-text'))
152
+ return 'skipped';
153
+ const prefix = existing.endsWith('\n') || existing === '' ? '' : '\n';
154
+ writeFileSync(cssPath, `${existing}${prefix}\n${snippet}`);
155
+ return 'wrote';
156
+ }
157
+ export function diagnoseProject(cwd, env) {
158
+ const findings = [];
159
+ const appDir = resolveAppDir(cwd);
160
+ const envLocal = join(cwd, '.env.local');
161
+ const merged = { ...env };
162
+ loadEnvFile(envLocal, merged);
163
+ if (merged.NEXT_PUBLIC_IGNITE_SITE_TOKEN || envHasKey(envLocal, 'NEXT_PUBLIC_IGNITE_SITE_TOKEN')) {
164
+ findings.push({
165
+ level: 'fail',
166
+ message: 'NEXT_PUBLIC_IGNITE_SITE_TOKEN is set. That ships the token to the browser. Remove it and use IGNITE_SITE_TOKEN only.',
167
+ });
168
+ }
169
+ if (!merged.IGNITE_SITE_ID?.trim() || !merged.IGNITE_SITE_TOKEN?.trim()) {
170
+ findings.push({
171
+ level: 'fail',
172
+ message: 'Missing IGNITE_SITE_ID or IGNITE_SITE_TOKEN. Run `ignite connect` or set them in .env.local.',
173
+ });
174
+ }
175
+ else {
176
+ findings.push({ level: 'ok', message: 'IGNITE_SITE_ID and IGNITE_SITE_TOKEN are set (server-side).' });
177
+ }
178
+ if (!appDir) {
179
+ findings.push({
180
+ level: 'fail',
181
+ message: 'No app/ or src/app/ directory. This package targets the Next.js App Router.',
182
+ });
183
+ return findings;
184
+ }
185
+ const robotsPath = join(appDir, 'robots.ts');
186
+ findings.push(existsSync(robotsPath)
187
+ ? { level: 'ok', message: 'found robots route (robots.ts)' }
188
+ : { level: 'warn', message: 'missing robots route (robots.ts). Run `npx ignite init`.' });
189
+ const sitemapOwner = inspectRouteFile(join(appDir, 'sitemap.ts'));
190
+ if (sitemapOwner === 'ignite') {
191
+ findings.push({ level: 'ok', message: 'found Ignite sitemap route (sitemap.ts)' });
192
+ }
193
+ else if (sitemapOwner === 'host') {
194
+ findings.push({
195
+ level: 'warn',
196
+ message: 'existing sitemap.ts is host-owned. Do not replace it. Merge with igniteSitemap() + mergeSitemap so wiki/blog URLs are included. See onboarding/MIGRATE-EXISTING.md.',
197
+ });
198
+ }
199
+ else {
200
+ findings.push({ level: 'warn', message: 'missing sitemap route (sitemap.ts). Run `npx ignite init`.' });
201
+ }
202
+ if (!merged.IGNITE_SITE_URL?.trim() && !merged.NEXT_PUBLIC_SITE_URL?.trim()) {
203
+ findings.push({
204
+ level: 'warn',
205
+ message: 'No IGNITE_SITE_URL (or NEXT_PUBLIC_SITE_URL). Wiki/blog sitemap locs and canonical tags stay relative until you set a public origin.',
206
+ });
207
+ }
208
+ const content = [
209
+ ['w/[slug]/page.tsx', 'wiki page route'],
210
+ ['blog/[slug]/page.tsx', 'blog page route'],
211
+ ];
212
+ for (const [rel, label] of content) {
213
+ const owner = inspectRouteFile(join(appDir, rel));
214
+ if (owner === 'ignite') {
215
+ findings.push({ level: 'ok', message: `found Ignite ${label} (${rel})` });
216
+ }
217
+ else if (owner === 'host') {
218
+ findings.push({
219
+ level: 'warn',
220
+ message: `existing ${label} (${rel}) is host-owned. Do not replace it. Wrap with tryLoadFeedPage + mergeSlugs so local slugs keep winning. See onboarding/MIGRATE-EXISTING.md.`,
221
+ });
222
+ }
223
+ else {
224
+ findings.push({ level: 'warn', message: `missing ${label} (${rel}). Run \`npx ignite init\`.` });
225
+ }
226
+ }
227
+ const cssPath = findGlobalsCss(cwd, appDir);
228
+ if (cssPath && !readFileSync(cssPath, 'utf8').includes('--ignite-color-text')) {
229
+ findings.push({
230
+ level: 'warn',
231
+ message: `No --ignite-* variables in ${cssPath}. Pages still render with fallbacks; map host tokens for brand match.`,
232
+ });
233
+ }
234
+ return findings;
235
+ }
236
+ export function colorMapping(globalsCss, design) {
237
+ const fullColor = globalsCss !== null && /--foreground:\s*(oklch|oklab|#|rgb|hsl\(|var\()/i.test(globalsCss);
238
+ const useHslChannels = !fullColor && (design === 'shadcn' || Boolean(globalsCss?.includes('--foreground')));
239
+ if (fullColor) {
240
+ return {
241
+ text: 'var(--foreground, #111)',
242
+ muted: 'var(--muted-foreground, #666)',
243
+ primary: 'var(--primary, #2563eb)',
244
+ border: 'var(--border, #e5e5e5)',
245
+ fontSans: 'var(--font-body, var(--font-sans, system-ui, sans-serif))',
246
+ fontHeading: 'var(--font-heading, var(--ignite-font-sans))',
247
+ radius: 'var(--radius, 0.5rem)',
248
+ };
249
+ }
250
+ if (useHslChannels) {
251
+ return {
252
+ text: 'hsl(var(--foreground))',
253
+ muted: 'hsl(var(--muted-foreground))',
254
+ primary: 'hsl(var(--primary))',
255
+ border: 'hsl(var(--border))',
256
+ fontSans: 'var(--font-sans, system-ui, sans-serif)',
257
+ fontHeading: 'var(--font-heading, var(--ignite-font-sans))',
258
+ radius: 'var(--radius, 0.5rem)',
259
+ };
260
+ }
261
+ return {
262
+ text: 'currentColor',
263
+ muted: '#666',
264
+ primary: '#2563eb',
265
+ border: '#e5e5e5',
266
+ fontSans: 'system-ui, sans-serif',
267
+ fontHeading: 'var(--ignite-font-sans)',
268
+ radius: '0.5rem',
269
+ };
270
+ }
271
+ function envHasKey(path, key) {
272
+ if (!existsSync(path))
273
+ return false;
274
+ return new RegExp(`^${key}=`, 'm').test(readFileSync(path, 'utf8'));
275
+ }
276
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/cli/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import 'server-only';
2
+ export { IgniteClient, IgniteApiError, type ClientOptions, type CrawlEvent, } from './client.js';
@@ -0,0 +1,3 @@
1
+ import 'server-only';
2
+ export { IgniteClient, IgniteApiError, } from './client.js';
3
+ //# sourceMappingURL=client-public.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-public.js","sourceRoot":"","sources":["../src/client-public.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,EACZ,cAAc,GAGf,MAAM,aAAa,CAAC"}
package/dist/client.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type IgniteConfig } from './env.js';
2
- import type { AgentDirectives } from './types.js';
2
+ import type { AgentDirectives, FeedIndex, FeedPage } from './types.js';
3
3
  export declare class IgniteApiError extends Error {
4
4
  readonly status: number;
5
5
  readonly path: string;
@@ -15,6 +15,8 @@ export declare class IgniteClient {
15
15
  static fromEnv(options?: ClientOptions): IgniteClient;
16
16
  static fromEnvOrNull(options?: ClientOptions): IgniteClient | null;
17
17
  directives(): Promise<AgentDirectives>;
18
+ pages(): Promise<FeedIndex>;
19
+ page(slug: string): Promise<FeedPage>;
18
20
  recordCrawlEvents(events: CrawlEvent[]): Promise<void>;
19
21
  private site;
20
22
  private get;
package/dist/client.js CHANGED
@@ -27,6 +27,13 @@ export class IgniteClient {
27
27
  async directives() {
28
28
  return this.get('/agent-directives');
29
29
  }
30
+ async pages() {
31
+ return this.get('/pages');
32
+ }
33
+ async page(slug) {
34
+ const body = await this.get(`/pages/${encodeURIComponent(slug)}`);
35
+ return body.page;
36
+ }
30
37
  async recordCrawlEvents(events) {
31
38
  if (events.length === 0)
32
39
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/env.js CHANGED
@@ -5,8 +5,7 @@ export class IgniteConfigError extends Error {
5
5
  this.name = 'IgniteConfigError';
6
6
  }
7
7
  }
8
- // The token can mutate the site, so it must stay server-side. Reading process.env here means a `'use client'`
9
- // module that imports it fails to build, which is intended.
8
+ // The token is a Hub credential. `server-only` fails the build if a client component imports this file.
10
9
  export function readConfig() {
11
10
  const token = process.env.IGNITE_SITE_TOKEN?.trim();
12
11
  const siteId = process.env.IGNITE_SITE_ID?.trim();
package/dist/env.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAMA,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,8GAA8G;AAC9G,4DAA4D;AAC5D,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO;QACL,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACnF,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAiB,CACzB,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAMA,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAErD,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,wGAAwG;AACxG,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAClD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO;QACL,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,eAAe,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACnF,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,iBAAiB,CACzB,gGAAgG,CACjG,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,228 @@
1
+ .ignite {
2
+ color-scheme: inherit;
3
+ --ignite-space: calc(1rem * var(--ignite-space-scale, 1));
4
+ color: var(--ignite-color-text, currentColor);
5
+ font-family: var(--ignite-font-sans, system-ui, -apple-system, sans-serif);
6
+ line-height: 1.7;
7
+ max-width: var(--ignite-prose-width, 65ch);
8
+ margin-inline: auto;
9
+ padding-inline: var(--ignite-space);
10
+ padding-block: calc(1.5 * var(--ignite-space));
11
+ box-sizing: border-box;
12
+ }
13
+ .ignite *, .ignite *::before, .ignite *::after { box-sizing: border-box; }
14
+ .ignite a {
15
+ color: var(--ignite-color-primary, #2563eb);
16
+ text-decoration-thickness: 1px;
17
+ text-underline-offset: 0.18em;
18
+ }
19
+ .ignite a:hover { text-decoration: underline; }
20
+ .ignite-kicker {
21
+ display: flex;
22
+ flex-wrap: wrap;
23
+ gap: 0.35em 0.7em;
24
+ font-size: 0.875rem;
25
+ margin: 0 0 calc(0.75 * var(--ignite-space));
26
+ color: var(--ignite-color-muted, #666);
27
+ }
28
+ .ignite-kicker a { color: inherit; }
29
+ .ignite-kicker a:hover { color: var(--ignite-color-primary, #2563eb); }
30
+ .ignite-hero {
31
+ margin: 0 0 calc(1.1 * var(--ignite-space));
32
+ }
33
+ .ignite-hero img {
34
+ width: 100%;
35
+ height: auto;
36
+ border-radius: var(--ignite-radius, 0.5rem);
37
+ display: block;
38
+ }
39
+ .ignite-hero figcaption {
40
+ margin-top: 0.4em;
41
+ font-size: 0.9em;
42
+ color: var(--ignite-color-muted, #666);
43
+ }
44
+ .ignite-avatar {
45
+ width: 1.35em;
46
+ height: 1.35em;
47
+ border-radius: 999px;
48
+ object-fit: cover;
49
+ vertical-align: -0.25em;
50
+ margin-right: 0.35em;
51
+ }
52
+ .ignite-title {
53
+ font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
54
+ font-size: clamp(1.75rem, 1.2rem + 1.6vw, 2.5rem);
55
+ font-weight: 700;
56
+ line-height: 1.2;
57
+ text-wrap: balance;
58
+ margin: 0 0 calc(0.45 * var(--ignite-space));
59
+ color: var(--ignite-color-text, currentColor);
60
+ }
61
+ .ignite-meta {
62
+ margin: 0 0 calc(1.1 * var(--ignite-space));
63
+ color: var(--ignite-color-muted, #666);
64
+ font-size: 0.9375rem;
65
+ }
66
+ .ignite-prose {
67
+ font-size: 1.0625rem;
68
+ line-height: 1.7;
69
+ overflow-wrap: anywhere;
70
+ }
71
+ .ignite-prose > :first-child { margin-top: 0; }
72
+ .ignite-prose > :last-child { margin-bottom: 0; }
73
+ .ignite-prose :where(p, ul, ol, blockquote, pre, table, figure) { margin-block: 0.95em; }
74
+ .ignite-prose :where(h1, h2, h3, h4) {
75
+ font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
76
+ line-height: 1.25;
77
+ text-wrap: balance;
78
+ margin-block: 1.45em 0.5em;
79
+ color: var(--ignite-color-text, currentColor);
80
+ }
81
+ .ignite-prose :where(h1) { font-size: 1.65em; }
82
+ .ignite-prose :where(h2) { font-size: 1.35em; }
83
+ .ignite-prose :where(h3) { font-size: 1.15em; }
84
+ .ignite-prose :where(h4) { font-size: 1em; }
85
+ .ignite-prose :where(ul, ol) { padding-inline-start: 1.35em; }
86
+ .ignite-prose :where(li + li) { margin-top: 0.35em; }
87
+ .ignite-prose :where(li > ul, li > ol) { margin-top: 0.35em; margin-bottom: 0; }
88
+ .ignite-prose :where(blockquote) {
89
+ margin-inline: 0;
90
+ padding: 0.15em 0 0.15em 1em;
91
+ border-inline-start: 3px solid var(--ignite-color-primary, #2563eb);
92
+ color: var(--ignite-color-muted, #666);
93
+ }
94
+ .ignite-prose :where(code, kbd) {
95
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
96
+ font-size: 0.9em;
97
+ background: color-mix(in srgb, currentColor 8%, transparent);
98
+ border-radius: calc(var(--ignite-radius, 0.5rem) * 0.45);
99
+ padding: 0.12em 0.35em;
100
+ }
101
+ .ignite-prose :where(pre) {
102
+ overflow-x: auto;
103
+ padding: 1em 1.1em;
104
+ line-height: 1.55;
105
+ background: color-mix(in srgb, currentColor 6%, transparent);
106
+ border: 1px solid var(--ignite-color-border, #e5e5e5);
107
+ border-radius: var(--ignite-radius, 0.5rem);
108
+ }
109
+ .ignite-prose :where(pre code) { background: none; padding: 0; font-size: 0.875em; }
110
+ .ignite-prose :where(table) { width: 100%; border-collapse: collapse; font-size: 0.95em; }
111
+ .ignite-prose :where(th, td) {
112
+ border: 1px solid var(--ignite-color-border, #e5e5e5);
113
+ padding: 0.5em 0.7em;
114
+ text-align: start;
115
+ vertical-align: top;
116
+ }
117
+ .ignite-prose :where(th) { font-weight: 600; }
118
+ .ignite-prose :where(img, video) {
119
+ max-width: 100%;
120
+ height: auto;
121
+ border-radius: var(--ignite-radius, 0.5rem);
122
+ }
123
+ .ignite-prose :where(hr) {
124
+ border: 0;
125
+ border-top: 1px solid var(--ignite-color-border, #e5e5e5);
126
+ margin-block: 1.8em;
127
+ }
128
+ .ignite-prose :where(figure) { margin-inline: 0; }
129
+ .ignite-prose :where(figcaption) {
130
+ margin-top: 0.4em;
131
+ font-size: 0.9em;
132
+ color: var(--ignite-color-muted, #666);
133
+ }
134
+ .ignite-index-title {
135
+ font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
136
+ font-size: clamp(1.6rem, 1.1rem + 1.4vw, 2.1rem);
137
+ font-weight: 700;
138
+ line-height: 1.2;
139
+ margin: 0 0 calc(1.1 * var(--ignite-space));
140
+ }
141
+ .ignite-cards { display: grid; gap: calc(0.9 * var(--ignite-space)); }
142
+ .ignite-card {
143
+ display: block;
144
+ padding: calc(0.95 * var(--ignite-space)) calc(1.05 * var(--ignite-space));
145
+ border: 1px solid var(--ignite-color-border, #e5e5e5);
146
+ border-radius: var(--ignite-radius, 0.5rem);
147
+ text-decoration: none;
148
+ color: inherit;
149
+ }
150
+ .ignite-card:hover { border-color: var(--ignite-color-primary, #2563eb); }
151
+ .ignite-card-image {
152
+ width: 100%;
153
+ height: auto;
154
+ border-radius: calc(var(--ignite-radius, 0.5rem) * 0.6);
155
+ margin: 0 0 0.7em;
156
+ display: block;
157
+ }
158
+ .ignite-card-title {
159
+ font-family: var(--ignite-font-heading, var(--ignite-font-sans, system-ui, sans-serif));
160
+ font-size: 1.15rem;
161
+ font-weight: 650;
162
+ line-height: 1.3;
163
+ margin: 0 0 0.3em;
164
+ color: var(--ignite-color-text, currentColor);
165
+ }
166
+ .ignite-card-meta {
167
+ margin: 0 0 0.45em;
168
+ font-size: 0.875rem;
169
+ color: var(--ignite-color-muted, #666);
170
+ }
171
+ .ignite-card-excerpt {
172
+ margin: 0;
173
+ color: var(--ignite-color-muted, #666);
174
+ font-size: 0.98rem;
175
+ line-height: 1.55;
176
+ }
177
+ .ignite-tree { list-style: none; padding: 0; margin: 0; }
178
+ .ignite-tree .ignite-tree {
179
+ padding-inline-start: 1.15em;
180
+ margin-top: 0.4em;
181
+ border-inline-start: 1px solid var(--ignite-color-border, #e5e5e5);
182
+ }
183
+ .ignite-tree > li { margin: 0 0 0.55em; }
184
+ .ignite-tree a { color: inherit; text-decoration: none; }
185
+ .ignite-tree a:hover {
186
+ color: var(--ignite-color-primary, #2563eb);
187
+ text-decoration: underline;
188
+ }
189
+ .ignite-wiki-entry { margin-bottom: 0.35em; }
190
+ .ignite-wiki-link {
191
+ display: inline-flex;
192
+ align-items: center;
193
+ gap: 0.55em;
194
+ color: inherit;
195
+ text-decoration: none;
196
+ }
197
+ .ignite-wiki-link:hover {
198
+ color: var(--ignite-color-primary, #2563eb);
199
+ text-decoration: underline;
200
+ }
201
+ .ignite-wiki-thumb {
202
+ width: 1.6rem;
203
+ height: 1.6rem;
204
+ object-fit: cover;
205
+ border-radius: calc(var(--ignite-radius, 0.5rem) * 0.5);
206
+ flex-shrink: 0;
207
+ }
208
+ .ignite-wiki-title { font-weight: 550; }
209
+ .ignite-wiki-meta {
210
+ margin: 0.15em 0 0 2.15em;
211
+ font-size: 0.82rem;
212
+ color: var(--ignite-color-muted, #666);
213
+ }
214
+ .ignite-tree .ignite-tree .ignite-wiki-thumb {
215
+ width: 1.15rem;
216
+ height: 1.15rem;
217
+ }
218
+ .ignite-tree .ignite-tree .ignite-wiki-title { font-weight: 500; }
219
+ .ignite-tree .ignite-tree .ignite-wiki-meta {
220
+ margin-left: 1.7em;
221
+ font-size: 0.75rem;
222
+ }
223
+ @media (prefers-color-scheme: dark) {
224
+ .ignite {
225
+ --ignite-fallback-muted: #aaa;
226
+ --ignite-fallback-border: #333;
227
+ }
228
+ }
package/dist/index.d.ts CHANGED
@@ -1,7 +1,13 @@
1
+ import 'server-only';
1
2
  export { IgniteClient, IgniteApiError, type ClientOptions, type CrawlEvent } from './client.js';
2
3
  export { readConfig, requireConfig, IgniteConfigError, type IgniteConfig } from './env.js';
3
- export type { AgentDirectives, RobotsDirective, SitemapEntry, MetadataDirective, Measured, RateCI, } from './types.js';
4
+ export type { AgentDirectives, RobotsDirective, SitemapEntry, MetadataDirective, FeedPage, FeedIndex, Measured, RateCI, } from './types.js';
4
5
  export { default as robots } from './operator/robots.js';
5
- export { default as sitemap } from './operator/sitemap.js';
6
- export { IgniteJsonLd } from './operator/jsonld.js';
6
+ export { default as sitemap, igniteSitemap, mergeSitemap, feedPagesToSitemap } from './operator/sitemap.js';
7
+ export { IgniteJsonLd, FeedJsonLd } from './operator/jsonld.js';
7
8
  export { igniteMetadata } from './operator/metadata.js';
9
+ export { FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind } from './operator/page.js';
10
+ export { BlogIndex } from './operator/blog.js';
11
+ export { WikiIndex } from './operator/wiki.js';
12
+ export { IgniteProse, IgniteTokensProvider, type IgniteTokens } from './operator/prose.js';
13
+ export { pageJsonLd, feedMetadata, mergeSlugs } from './operator/ui.js';
package/dist/index.js CHANGED
@@ -1,7 +1,13 @@
1
+ import 'server-only';
1
2
  export { IgniteClient, IgniteApiError } from './client.js';
2
3
  export { readConfig, requireConfig, IgniteConfigError } from './env.js';
3
4
  export { default as robots } from './operator/robots.js';
4
- export { default as sitemap } from './operator/sitemap.js';
5
- export { IgniteJsonLd } from './operator/jsonld.js';
5
+ export { default as sitemap, igniteSitemap, mergeSitemap, feedPagesToSitemap } from './operator/sitemap.js';
6
+ export { IgniteJsonLd, FeedJsonLd } from './operator/jsonld.js';
6
7
  export { igniteMetadata } from './operator/metadata.js';
8
+ export { FeedArticle, feedPageMetadata, tryLoadFeedPage, feedPagesOfKind } from './operator/page.js';
9
+ export { BlogIndex } from './operator/blog.js';
10
+ export { WikiIndex } from './operator/wiki.js';
11
+ export { IgniteProse, IgniteTokensProvider } from './operator/prose.js';
12
+ export { pageJsonLd, feedMetadata, mergeSlugs } from './operator/ui.js';
7
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAuC,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,UAAU,CAAC;AAU3F,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAuC,MAAM,aAAa,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAqB,MAAM,UAAU,CAAC;AAY3F,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAqB,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/mcp.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { IgniteClient } from './client.js';
2
+ type JsonRpc = {
3
+ jsonrpc: '2.0';
4
+ id?: string | number | null;
5
+ method?: string;
6
+ params?: {
7
+ name?: string;
8
+ arguments?: Record<string, unknown>;
9
+ };
10
+ };
11
+ type JsonRpcResponse = {
12
+ jsonrpc: '2.0';
13
+ id: string | number | null;
14
+ result?: unknown;
15
+ error?: {
16
+ code: number;
17
+ message: string;
18
+ };
19
+ };
20
+ export declare function handleMcp(msg: JsonRpc, client: IgniteClient): Promise<JsonRpcResponse | null>;
21
+ export declare function runMcpStdio(): Promise<void>;
22
+ export {};