kitfly 0.2.0 → 0.2.3
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.
- package/CHANGELOG.md +68 -0
- package/README.md +25 -10
- package/VERSION +1 -1
- package/dist/_raw/content/guide/branding.md +146 -0
- package/dist/_raw/content/guide/data-driven-content.md +204 -0
- package/dist/_raw/content/reference/configuration.md +145 -7
- package/dist/_raw/content/reference/environment-variables.md +26 -1
- package/dist/_raw/content/reference/glossary.md +25 -1
- package/dist/_raw/content/reference/key-concepts.md +30 -2
- package/dist/_raw/content/reference/plugins.md +14 -0
- package/dist/_raw/content/reference/slides-authoring-guidelines.md +129 -0
- package/dist/_raw/content/reference.md +1 -0
- package/dist/_raw/docs/decisions/ADR-0006-data-driven-content.md +350 -0
- package/dist/content/deployment/preflight.html +10 -6
- package/dist/content/deployment/recipes/aws-s3.html +10 -6
- package/dist/content/deployment/recipes/cloudflare-pages.html +10 -6
- package/dist/content/deployment/recipes/cloudflare-r2.html +10 -6
- package/dist/content/deployment/recipes/fly-io.html +10 -6
- package/dist/content/deployment/recipes/github-pages.html +10 -6
- package/dist/content/deployment/recipes/netlify.html +10 -6
- package/dist/content/deployment/recipes/vercel.html +10 -6
- package/dist/content/deployment/secrets-and-env-vars.html +10 -6
- package/dist/content/deployment.html +10 -6
- package/dist/content/guide/approaches.html +10 -6
- package/dist/content/guide/branding.html +510 -0
- package/dist/content/guide/data-driven-content.html +543 -0
- package/dist/content/guide/features.html +10 -6
- package/dist/content/guide/getting-started.html +10 -6
- package/dist/content/guide/kitfly-overview.html +10 -6
- package/dist/content/reference/configuration.html +135 -9
- package/dist/content/reference/design-catalog.html +10 -6
- package/dist/content/reference/environment-variables.html +50 -8
- package/dist/content/reference/glossary.html +24 -8
- package/dist/content/reference/key-concepts.html +33 -9
- package/dist/content/reference/plugins.html +22 -7
- package/dist/content/reference/slides-authoring-guidelines.html +422 -0
- package/dist/content/reference/structure.html +10 -6
- package/dist/content/reference.html +11 -6
- package/dist/content/templates/crucible.html +10 -6
- package/dist/content/templates/handbook.html +10 -6
- package/dist/content/templates/minimal.html +10 -6
- package/dist/content/templates/overview.html +10 -6
- package/dist/content/templates/pipeline.html +10 -6
- package/dist/content/templates/productbook.html +10 -6
- package/dist/content/templates/runbook.html +10 -6
- package/dist/content/templates/servicebook.html +10 -6
- package/dist/content-index.json +38 -2
- package/dist/docs/decisions/ADR-0001-minimalist-site-code.html +10 -6
- package/dist/docs/decisions/ADR-0002-ai-accessibility.html +10 -6
- package/dist/docs/decisions/ADR-0003-single-file-bundle.html +10 -6
- package/dist/docs/decisions/ADR-0004-bun-runtime.html +10 -6
- package/dist/docs/decisions/ADR-0005-plugin-contract-and-distribution.html +10 -6
- package/dist/docs/decisions/ADR-0006-data-driven-content.html +752 -0
- package/dist/docs/decisions/DDR-0001-viewport-locked-layout.html +10 -6
- package/dist/docs/decisions/DDR-0002-theme-system.html +10 -6
- package/dist/docs/decisions/DDR-0003-bounded-logo-slot.html +10 -6
- package/dist/docs/decisions/DDR-0004-slides-rendering-model.html +10 -6
- package/dist/docs/decisions/DDR-0005-deterministic-layout-boundary.html +10 -6
- package/dist/docs/userguide/cli/build.html +10 -6
- package/dist/docs/userguide/cli/bundle.html +10 -6
- package/dist/docs/userguide/cli/dev.html +10 -6
- package/dist/docs/userguide/cli/init.html +10 -6
- package/dist/docs/userguide/cli/servers.html +10 -6
- package/dist/docs/userguide/cli/stop.html +10 -6
- package/dist/docs/userguide/cli/update.html +10 -6
- package/dist/docs/userguide/cli/version.html +10 -6
- package/dist/docs/userguide/cli.html +10 -6
- package/dist/docs/userguide/sharing.html +10 -6
- package/dist/index.html +10 -6
- package/dist/llms.txt +3 -3
- package/dist/provenance.json +4 -4
- package/dist/schemas/plugin-registry.schema.html +10 -6
- package/dist/schemas/plugin-schemas-notes.html +10 -6
- package/dist/schemas/plugin.schema.html +10 -6
- package/dist/schemas/plugins.schema.html +10 -6
- package/dist/schemas/v0/common.schema.html +14 -10
- package/dist/schemas/v0/plugin-registry.schema.html +13 -9
- package/dist/schemas/v0/plugin.schema.html +13 -9
- package/dist/schemas/v0/plugins.schema.html +13 -9
- package/dist/schemas/v0/site.schema.html +67 -7
- package/dist/schemas/v0/theme.schema.html +21 -17
- package/dist/schemas.html +10 -6
- package/dist/styles.css +39 -4
- package/package.json +1 -1
- package/plugins-dist/latex-runtime.js +140 -0
- package/plugins-dist/latex.js +178 -0
- package/plugins-dist/slides-charts-lite-runtime.js +179 -0
- package/plugins-dist/slides-charts-lite.js +198 -0
- package/plugins-dist/slides-visuals.css +166 -0
- package/plugins-dist/slides-visuals.js +124 -33
- package/registry/plugins.yaml +30 -5
- package/schemas/v0/site.schema.json +56 -0
- package/scripts/build.ts +195 -70
- package/scripts/bundle.ts +122 -11
- package/scripts/dev.ts +345 -178
- package/src/__tests__/brief.test.ts +151 -0
- package/src/__tests__/build.test.ts +234 -4
- package/src/__tests__/bundle.test.ts +134 -0
- package/src/__tests__/dev-plugin-errors.test.ts +20 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-branching-no-source.md +5 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-converging-no-target.md +6 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/staircase-empty-steps.md +3 -0
- package/src/__tests__/fixtures/fences/slides-visuals/invalid/timeline-horizontal-no-events.md +2 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching-no-split.md +7 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging-no-merge.md +7 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase-down.md +7 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase.md +8 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-horizontal.md +9 -0
- package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-vertical.md +10 -0
- package/src/__tests__/init.test.ts +51 -2
- package/src/__tests__/latex-runtime.bun.test.ts +35 -0
- package/src/__tests__/shared.test.ts +621 -1
- package/src/__tests__/slides-charts-lite-runtime.bun.test.ts +45 -0
- package/src/__tests__/slides-visuals-runtime-regressions.bun.test.ts +33 -0
- package/src/cli.ts +11 -4
- package/src/commands/init.ts +1 -1
- package/src/shared.ts +761 -18
- package/src/site/styles.css +39 -4
- package/src/site/template.html +5 -2
- package/src/templates/brief.ts +486 -0
- package/src/templates/deck.ts +59 -0
- package/src/templates/driver.ts +46 -13
- package/src/templates/handbook.ts +32 -0
- package/src/templates/runbook.ts +32 -0
|
@@ -9,8 +9,8 @@ import { existsSync } from "node:fs";
|
|
|
9
9
|
import { mkdtemp, readFile, rm } from "node:fs/promises";
|
|
10
10
|
import { tmpdir } from "node:os";
|
|
11
11
|
import { join } from "node:path";
|
|
12
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
13
|
-
import { init } from "../commands/init.ts";
|
|
12
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
13
|
+
import { init, listAvailableTemplates } from "../commands/init.ts";
|
|
14
14
|
import { defaultBranding, getTemplate, listTemplates, runTemplate } from "../templates/driver.ts";
|
|
15
15
|
|
|
16
16
|
// ---------------------------------------------------------------------------
|
|
@@ -53,6 +53,7 @@ describe("template registry", () => {
|
|
|
53
53
|
expect(ids).toContain("minimal");
|
|
54
54
|
expect(ids).toContain("deck");
|
|
55
55
|
expect(ids).toContain("handbook");
|
|
56
|
+
expect(ids).toContain("brief");
|
|
56
57
|
expect(templates.length).toBeGreaterThanOrEqual(2);
|
|
57
58
|
});
|
|
58
59
|
|
|
@@ -66,6 +67,17 @@ describe("template registry", () => {
|
|
|
66
67
|
it("returns undefined for unknown template", () => {
|
|
67
68
|
expect(getTemplate("nonexistent")).toBeUndefined();
|
|
68
69
|
});
|
|
70
|
+
|
|
71
|
+
it("listAvailableTemplates output includes brief", () => {
|
|
72
|
+
const spy = vi.spyOn(console, "log").mockImplementation(() => {});
|
|
73
|
+
try {
|
|
74
|
+
listAvailableTemplates();
|
|
75
|
+
const output = spy.mock.calls.map((call) => String(call[0] ?? "")).join("\n");
|
|
76
|
+
expect(output).toContain("brief");
|
|
77
|
+
} finally {
|
|
78
|
+
spy.mockRestore();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
69
81
|
});
|
|
70
82
|
|
|
71
83
|
// ---------------------------------------------------------------------------
|
|
@@ -358,6 +370,16 @@ describe("init() entry point", () => {
|
|
|
358
370
|
expect(generatedExists(projectName, "CUSTOMIZING.md")).toBe(true);
|
|
359
371
|
});
|
|
360
372
|
|
|
373
|
+
it("creates a brief site when template flag is set", async () => {
|
|
374
|
+
await init(projectName, { template: "brief", git: false });
|
|
375
|
+
|
|
376
|
+
expect(generatedExists(projectName, "content/product/overview.md")).toBe(true);
|
|
377
|
+
expect(generatedExists(projectName, "content/use-cases/example-use-case.md")).toBe(true);
|
|
378
|
+
expect(generatedExists(projectName, "content/getting-started/requirements.md")).toBe(true);
|
|
379
|
+
expect(generatedExists(projectName, "content/reference/contacts.md")).toBe(true);
|
|
380
|
+
expect(generatedExists(projectName, "CUSTOMIZING.md")).toBe(true);
|
|
381
|
+
});
|
|
382
|
+
|
|
361
383
|
it("passes brand overrides through to template context", async () => {
|
|
362
384
|
await init(projectName, {
|
|
363
385
|
git: false,
|
|
@@ -439,6 +461,33 @@ describe("standalone mode", () => {
|
|
|
439
461
|
});
|
|
440
462
|
});
|
|
441
463
|
|
|
464
|
+
describe("ai-assist mode", () => {
|
|
465
|
+
const projectName = "test-brief-ai";
|
|
466
|
+
|
|
467
|
+
it("brief template writes AGENTS.md and brief-specific role files", async () => {
|
|
468
|
+
await runTemplate({
|
|
469
|
+
name: projectName,
|
|
470
|
+
template: "brief",
|
|
471
|
+
git: false,
|
|
472
|
+
aiAssist: true,
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
expect(generatedExists(projectName, "AGENTS.md")).toBe(true);
|
|
476
|
+
expect(generatedExists(projectName, "config/agentic/roles/devlead.yaml")).toBe(true);
|
|
477
|
+
expect(generatedExists(projectName, "config/agentic/roles/infoarch.yaml")).toBe(true);
|
|
478
|
+
expect(generatedExists(projectName, "config/agentic/roles/qa.yaml")).toBe(true);
|
|
479
|
+
expect(generatedExists(projectName, "config/agentic/roles/prodstrat.yaml")).toBe(true);
|
|
480
|
+
expect(generatedExists(projectName, "config/agentic/roles/advisor.yaml")).toBe(true);
|
|
481
|
+
expect(generatedExists(projectName, "config/agentic/roles/analyst.yaml")).toBe(false);
|
|
482
|
+
expect(generatedExists(projectName, "config/agentic/roles/prodmktg.yaml")).toBe(false);
|
|
483
|
+
|
|
484
|
+
const agents = await readGenerated(projectName, "AGENTS.md");
|
|
485
|
+
expect(agents).toContain("external audience brief");
|
|
486
|
+
expect(agents).toContain("informational and professional");
|
|
487
|
+
expect(agents).toContain("problem -> solution -> outcome");
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
|
|
442
491
|
// ---------------------------------------------------------------------------
|
|
443
492
|
// Default Branding Derivation
|
|
444
493
|
// ---------------------------------------------------------------------------
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { expect, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
type LatexHooks = {
|
|
4
|
+
splitMath: (text: string) => Array<{ text?: string; math?: string; display?: boolean }>;
|
|
5
|
+
isCurrency: (expr: string) => boolean;
|
|
6
|
+
shouldTreatAsLiteralInline: (expr: string, text: string, closingIndex: number) => boolean;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
async function loadHooks(): Promise<LatexHooks> {
|
|
10
|
+
// @ts-expect-error JS plugin helper file
|
|
11
|
+
await import("../../plugins-dist/latex-runtime.js");
|
|
12
|
+
const hooks = (globalThis as any).__kitflyLatexTest as LatexHooks | undefined;
|
|
13
|
+
if (!hooks) throw new Error("latex test hooks not found on globalThis");
|
|
14
|
+
return hooks;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
test("latex: parses inline math", async () => {
|
|
18
|
+
const hooks = await loadHooks();
|
|
19
|
+
expect(hooks.splitMath("A $x^2$ value")).toEqual([
|
|
20
|
+
{ text: "A " },
|
|
21
|
+
{ math: "x^2", display: false },
|
|
22
|
+
{ text: " value" },
|
|
23
|
+
]);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("latex: treats $5-$10 as literal currency range", async () => {
|
|
27
|
+
const hooks = await loadHooks();
|
|
28
|
+
expect(hooks.splitMath("$5-$10")).toEqual([{ text: "$5-$10" }]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test("latex: currency helper matches dashed ranges", async () => {
|
|
32
|
+
const hooks = await loadHooks();
|
|
33
|
+
expect(hooks.isCurrency("5-10")).toBe(true);
|
|
34
|
+
expect(hooks.isCurrency("5 to 10")).toBe(true);
|
|
35
|
+
});
|