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.
Files changed (126) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +25 -10
  3. package/VERSION +1 -1
  4. package/dist/_raw/content/guide/branding.md +146 -0
  5. package/dist/_raw/content/guide/data-driven-content.md +204 -0
  6. package/dist/_raw/content/reference/configuration.md +145 -7
  7. package/dist/_raw/content/reference/environment-variables.md +26 -1
  8. package/dist/_raw/content/reference/glossary.md +25 -1
  9. package/dist/_raw/content/reference/key-concepts.md +30 -2
  10. package/dist/_raw/content/reference/plugins.md +14 -0
  11. package/dist/_raw/content/reference/slides-authoring-guidelines.md +129 -0
  12. package/dist/_raw/content/reference.md +1 -0
  13. package/dist/_raw/docs/decisions/ADR-0006-data-driven-content.md +350 -0
  14. package/dist/content/deployment/preflight.html +10 -6
  15. package/dist/content/deployment/recipes/aws-s3.html +10 -6
  16. package/dist/content/deployment/recipes/cloudflare-pages.html +10 -6
  17. package/dist/content/deployment/recipes/cloudflare-r2.html +10 -6
  18. package/dist/content/deployment/recipes/fly-io.html +10 -6
  19. package/dist/content/deployment/recipes/github-pages.html +10 -6
  20. package/dist/content/deployment/recipes/netlify.html +10 -6
  21. package/dist/content/deployment/recipes/vercel.html +10 -6
  22. package/dist/content/deployment/secrets-and-env-vars.html +10 -6
  23. package/dist/content/deployment.html +10 -6
  24. package/dist/content/guide/approaches.html +10 -6
  25. package/dist/content/guide/branding.html +510 -0
  26. package/dist/content/guide/data-driven-content.html +543 -0
  27. package/dist/content/guide/features.html +10 -6
  28. package/dist/content/guide/getting-started.html +10 -6
  29. package/dist/content/guide/kitfly-overview.html +10 -6
  30. package/dist/content/reference/configuration.html +135 -9
  31. package/dist/content/reference/design-catalog.html +10 -6
  32. package/dist/content/reference/environment-variables.html +50 -8
  33. package/dist/content/reference/glossary.html +24 -8
  34. package/dist/content/reference/key-concepts.html +33 -9
  35. package/dist/content/reference/plugins.html +22 -7
  36. package/dist/content/reference/slides-authoring-guidelines.html +422 -0
  37. package/dist/content/reference/structure.html +10 -6
  38. package/dist/content/reference.html +11 -6
  39. package/dist/content/templates/crucible.html +10 -6
  40. package/dist/content/templates/handbook.html +10 -6
  41. package/dist/content/templates/minimal.html +10 -6
  42. package/dist/content/templates/overview.html +10 -6
  43. package/dist/content/templates/pipeline.html +10 -6
  44. package/dist/content/templates/productbook.html +10 -6
  45. package/dist/content/templates/runbook.html +10 -6
  46. package/dist/content/templates/servicebook.html +10 -6
  47. package/dist/content-index.json +38 -2
  48. package/dist/docs/decisions/ADR-0001-minimalist-site-code.html +10 -6
  49. package/dist/docs/decisions/ADR-0002-ai-accessibility.html +10 -6
  50. package/dist/docs/decisions/ADR-0003-single-file-bundle.html +10 -6
  51. package/dist/docs/decisions/ADR-0004-bun-runtime.html +10 -6
  52. package/dist/docs/decisions/ADR-0005-plugin-contract-and-distribution.html +10 -6
  53. package/dist/docs/decisions/ADR-0006-data-driven-content.html +752 -0
  54. package/dist/docs/decisions/DDR-0001-viewport-locked-layout.html +10 -6
  55. package/dist/docs/decisions/DDR-0002-theme-system.html +10 -6
  56. package/dist/docs/decisions/DDR-0003-bounded-logo-slot.html +10 -6
  57. package/dist/docs/decisions/DDR-0004-slides-rendering-model.html +10 -6
  58. package/dist/docs/decisions/DDR-0005-deterministic-layout-boundary.html +10 -6
  59. package/dist/docs/userguide/cli/build.html +10 -6
  60. package/dist/docs/userguide/cli/bundle.html +10 -6
  61. package/dist/docs/userguide/cli/dev.html +10 -6
  62. package/dist/docs/userguide/cli/init.html +10 -6
  63. package/dist/docs/userguide/cli/servers.html +10 -6
  64. package/dist/docs/userguide/cli/stop.html +10 -6
  65. package/dist/docs/userguide/cli/update.html +10 -6
  66. package/dist/docs/userguide/cli/version.html +10 -6
  67. package/dist/docs/userguide/cli.html +10 -6
  68. package/dist/docs/userguide/sharing.html +10 -6
  69. package/dist/index.html +10 -6
  70. package/dist/llms.txt +3 -3
  71. package/dist/provenance.json +4 -4
  72. package/dist/schemas/plugin-registry.schema.html +10 -6
  73. package/dist/schemas/plugin-schemas-notes.html +10 -6
  74. package/dist/schemas/plugin.schema.html +10 -6
  75. package/dist/schemas/plugins.schema.html +10 -6
  76. package/dist/schemas/v0/common.schema.html +14 -10
  77. package/dist/schemas/v0/plugin-registry.schema.html +13 -9
  78. package/dist/schemas/v0/plugin.schema.html +13 -9
  79. package/dist/schemas/v0/plugins.schema.html +13 -9
  80. package/dist/schemas/v0/site.schema.html +67 -7
  81. package/dist/schemas/v0/theme.schema.html +21 -17
  82. package/dist/schemas.html +10 -6
  83. package/dist/styles.css +39 -4
  84. package/package.json +1 -1
  85. package/plugins-dist/latex-runtime.js +140 -0
  86. package/plugins-dist/latex.js +178 -0
  87. package/plugins-dist/slides-charts-lite-runtime.js +179 -0
  88. package/plugins-dist/slides-charts-lite.js +198 -0
  89. package/plugins-dist/slides-visuals.css +166 -0
  90. package/plugins-dist/slides-visuals.js +124 -33
  91. package/registry/plugins.yaml +30 -5
  92. package/schemas/v0/site.schema.json +56 -0
  93. package/scripts/build.ts +195 -70
  94. package/scripts/bundle.ts +122 -11
  95. package/scripts/dev.ts +345 -178
  96. package/src/__tests__/brief.test.ts +151 -0
  97. package/src/__tests__/build.test.ts +234 -4
  98. package/src/__tests__/bundle.test.ts +134 -0
  99. package/src/__tests__/dev-plugin-errors.test.ts +20 -0
  100. package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-branching-no-source.md +5 -0
  101. package/src/__tests__/fixtures/fences/slides-visuals/invalid/flow-converging-no-target.md +6 -0
  102. package/src/__tests__/fixtures/fences/slides-visuals/invalid/staircase-empty-steps.md +3 -0
  103. package/src/__tests__/fixtures/fences/slides-visuals/invalid/timeline-horizontal-no-events.md +2 -0
  104. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching-no-split.md +7 -0
  105. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-branching.md +8 -0
  106. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging-no-merge.md +7 -0
  107. package/src/__tests__/fixtures/fences/slides-visuals/valid/flow-converging.md +8 -0
  108. package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase-down.md +7 -0
  109. package/src/__tests__/fixtures/fences/slides-visuals/valid/staircase.md +8 -0
  110. package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-horizontal.md +9 -0
  111. package/src/__tests__/fixtures/fences/slides-visuals/valid/timeline-vertical.md +10 -0
  112. package/src/__tests__/init.test.ts +51 -2
  113. package/src/__tests__/latex-runtime.bun.test.ts +35 -0
  114. package/src/__tests__/shared.test.ts +621 -1
  115. package/src/__tests__/slides-charts-lite-runtime.bun.test.ts +45 -0
  116. package/src/__tests__/slides-visuals-runtime-regressions.bun.test.ts +33 -0
  117. package/src/cli.ts +11 -4
  118. package/src/commands/init.ts +1 -1
  119. package/src/shared.ts +761 -18
  120. package/src/site/styles.css +39 -4
  121. package/src/site/template.html +5 -2
  122. package/src/templates/brief.ts +486 -0
  123. package/src/templates/deck.ts +59 -0
  124. package/src/templates/driver.ts +46 -13
  125. package/src/templates/handbook.ts +32 -0
  126. package/src/templates/runbook.ts +32 -0
@@ -0,0 +1,9 @@
1
+ :::timeline-horizontal
2
+ events:
3
+ - label: "Kickoff"
4
+ date: "Jan 2026"
5
+ - label: "Alpha"
6
+ date: "Mar 2026"
7
+ - label: "GA Release"
8
+ date: "Jun 2026"
9
+ :::
@@ -0,0 +1,10 @@
1
+ :::timeline-vertical
2
+ events:
3
+ - label: "Research Phase"
4
+ date: "Q1"
5
+ - label: "Prototype"
6
+ - label: "User Testing"
7
+ date: "Q3"
8
+ - label: "Launch"
9
+ date: "Q4"
10
+ :::
@@ -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
+ });