faceted-prompting 0.0.0 → 0.2.0

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 (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -2
  3. package/bin/facet +2 -0
  4. package/dist/cli/compose-context.d.ts +8 -0
  5. package/dist/cli/compose-context.d.ts.map +1 -0
  6. package/dist/cli/compose-context.js +194 -0
  7. package/dist/cli/compose-context.js.map +1 -0
  8. package/dist/cli/index.d.ts +3 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +144 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/install-skill/facets.d.ts +28 -0
  13. package/dist/cli/install-skill/facets.d.ts.map +1 -0
  14. package/dist/cli/install-skill/facets.js +160 -0
  15. package/dist/cli/install-skill/facets.js.map +1 -0
  16. package/dist/cli/install-skill/flow.d.ts +13 -0
  17. package/dist/cli/install-skill/flow.d.ts.map +1 -0
  18. package/dist/cli/install-skill/flow.js +63 -0
  19. package/dist/cli/install-skill/flow.js.map +1 -0
  20. package/dist/cli/install-skill/modes.d.ts +27 -0
  21. package/dist/cli/install-skill/modes.d.ts.map +1 -0
  22. package/dist/cli/install-skill/modes.js +130 -0
  23. package/dist/cli/install-skill/modes.js.map +1 -0
  24. package/dist/cli/install-skill/targets.d.ts +10 -0
  25. package/dist/cli/install-skill/targets.d.ts.map +1 -0
  26. package/dist/cli/install-skill/targets.js +27 -0
  27. package/dist/cli/install-skill/targets.js.map +1 -0
  28. package/dist/cli/path-guard.d.ts +12 -0
  29. package/dist/cli/path-guard.d.ts.map +1 -0
  30. package/dist/cli/path-guard.js +81 -0
  31. package/dist/cli/path-guard.js.map +1 -0
  32. package/dist/cli/runner.d.ts +10 -0
  33. package/dist/cli/runner.d.ts.map +1 -0
  34. package/dist/cli/runner.js +66 -0
  35. package/dist/cli/runner.js.map +1 -0
  36. package/dist/cli/select.d.ts +7 -0
  37. package/dist/cli/select.d.ts.map +1 -0
  38. package/dist/cli/select.js +70 -0
  39. package/dist/cli/select.js.map +1 -0
  40. package/dist/cli/skill-commands.d.ts +8 -0
  41. package/dist/cli/skill-commands.d.ts.map +1 -0
  42. package/dist/cli/skill-commands.js +44 -0
  43. package/dist/cli/skill-commands.js.map +1 -0
  44. package/dist/cli/skill-file-ops.d.ts +3 -0
  45. package/dist/cli/skill-file-ops.d.ts.map +1 -0
  46. package/dist/cli/skill-file-ops.js +89 -0
  47. package/dist/cli/skill-file-ops.js.map +1 -0
  48. package/dist/cli/skill-renderer.d.ts +24 -0
  49. package/dist/cli/skill-renderer.d.ts.map +1 -0
  50. package/dist/cli/skill-renderer.js +194 -0
  51. package/dist/cli/skill-renderer.js.map +1 -0
  52. package/dist/cli/skill-types.d.ts +31 -0
  53. package/dist/cli/skill-types.d.ts.map +1 -0
  54. package/dist/cli/skill-types.js +2 -0
  55. package/dist/cli/skill-types.js.map +1 -0
  56. package/dist/cli/types.d.ts +17 -0
  57. package/dist/cli/types.d.ts.map +1 -0
  58. package/dist/cli/types.js +2 -0
  59. package/dist/cli/types.js.map +1 -0
  60. package/dist/compose-definition.d.ts +3 -0
  61. package/dist/compose-definition.d.ts.map +1 -0
  62. package/dist/compose-definition.js +99 -0
  63. package/dist/compose-definition.js.map +1 -0
  64. package/dist/compose.d.ts +18 -0
  65. package/dist/compose.d.ts.map +1 -0
  66. package/dist/compose.js +51 -0
  67. package/dist/compose.js.map +1 -0
  68. package/dist/config/index.d.ts +9 -0
  69. package/dist/config/index.d.ts.map +1 -0
  70. package/dist/config/index.js +82 -0
  71. package/dist/config/index.js.map +1 -0
  72. package/dist/data-engine.d.ts +49 -0
  73. package/dist/data-engine.d.ts.map +1 -0
  74. package/dist/data-engine.js +85 -0
  75. package/dist/data-engine.js.map +1 -0
  76. package/dist/escape.d.ts +14 -0
  77. package/dist/escape.d.ts.map +1 -0
  78. package/dist/escape.js +16 -0
  79. package/dist/escape.js.map +1 -0
  80. package/dist/index.d.ts +19 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +19 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/init/index.d.ts +17 -0
  85. package/dist/init/index.d.ts.map +1 -0
  86. package/dist/init/index.js +197 -0
  87. package/dist/init/index.js.map +1 -0
  88. package/dist/output/index.d.ts +10 -0
  89. package/dist/output/index.d.ts.map +1 -0
  90. package/dist/output/index.js +67 -0
  91. package/dist/output/index.js.map +1 -0
  92. package/dist/prompt-payload.d.ts +8 -0
  93. package/dist/prompt-payload.d.ts.map +1 -0
  94. package/dist/prompt-payload.js +24 -0
  95. package/dist/prompt-payload.js.map +1 -0
  96. package/dist/resolve.d.ts +73 -0
  97. package/dist/resolve.d.ts.map +1 -0
  98. package/dist/resolve.js +160 -0
  99. package/dist/resolve.js.map +1 -0
  100. package/dist/scope.d.ts +47 -0
  101. package/dist/scope.d.ts.map +1 -0
  102. package/dist/scope.js +69 -0
  103. package/dist/scope.js.map +1 -0
  104. package/dist/template.d.ts +27 -0
  105. package/dist/template.d.ts.map +1 -0
  106. package/dist/template.js +49 -0
  107. package/dist/template.js.map +1 -0
  108. package/dist/truncation.d.ts +36 -0
  109. package/dist/truncation.d.ts.map +1 -0
  110. package/dist/truncation.js +63 -0
  111. package/dist/truncation.js.map +1 -0
  112. package/dist/types.d.ts +70 -0
  113. package/dist/types.d.ts.map +1 -0
  114. package/dist/types.js +10 -0
  115. package/dist/types.js.map +1 -0
  116. package/package.json +49 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { ComposeDefinition } from './types.js';
2
+ export declare function loadComposeDefinition(definitionPath: string): Promise<ComposeDefinition>;
3
+ //# sourceMappingURL=compose-definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-definition.d.ts","sourceRoot":"","sources":["../src/compose-definition.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAqB,MAAM,YAAY,CAAC;AA+EvE,wBAAsB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyB9F"}
@@ -0,0 +1,99 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { parse } from 'yaml';
3
+ const ALLOWED_COMPOSE_KEYS = new Set([
4
+ 'name',
5
+ 'description',
6
+ 'persona',
7
+ 'template',
8
+ 'knowledge',
9
+ 'policies',
10
+ 'instruction',
11
+ 'order',
12
+ ]);
13
+ const ORDER_VALUES = new Set(['persona', 'knowledge', 'policies', 'instruction']);
14
+ function normalizeOrder(rawOrder) {
15
+ if (!rawOrder)
16
+ return undefined;
17
+ const normalized = [];
18
+ const seen = new Set();
19
+ for (const entry of rawOrder) {
20
+ if (!ORDER_VALUES.has(entry)) {
21
+ throw new Error(`Invalid compose order entry: ${entry}`);
22
+ }
23
+ if (entry === 'persona')
24
+ continue;
25
+ const typedEntry = entry;
26
+ if (seen.has(typedEntry))
27
+ continue;
28
+ seen.add(typedEntry);
29
+ normalized.push(typedEntry);
30
+ }
31
+ return normalized.length > 0 ? normalized : undefined;
32
+ }
33
+ function ensureStringList(value, field) {
34
+ if (value === undefined)
35
+ return undefined;
36
+ if (!Array.isArray(value)) {
37
+ throw new Error(`${field} must be a YAML list`);
38
+ }
39
+ if (!value.every(entry => typeof entry === 'string')) {
40
+ throw new Error(`${field} must contain only strings`);
41
+ }
42
+ return value;
43
+ }
44
+ function ensureOptionalString(value, field) {
45
+ if (value === undefined)
46
+ return undefined;
47
+ if (typeof value !== 'string') {
48
+ throw new Error(`${field} must be a scalar string`);
49
+ }
50
+ return value;
51
+ }
52
+ function ensureRequiredString(value, field) {
53
+ if (typeof value !== 'string' || value.trim().length === 0) {
54
+ throw new Error(`Compose definition must include required field: ${field}`);
55
+ }
56
+ return value.trim();
57
+ }
58
+ function parseComposeDefinitionYaml(rawYaml) {
59
+ const parsed = parse(rawYaml);
60
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
61
+ throw new Error('Compose definition must be a YAML object');
62
+ }
63
+ for (const key of Object.keys(parsed)) {
64
+ if (!ALLOWED_COMPOSE_KEYS.has(key)) {
65
+ throw new Error(`Unknown compose definition key: ${key}`);
66
+ }
67
+ }
68
+ return parsed;
69
+ }
70
+ function toOptionalNonEmpty(value) {
71
+ if (!value)
72
+ return undefined;
73
+ const trimmed = value.trim();
74
+ return trimmed.length > 0 ? trimmed : undefined;
75
+ }
76
+ export async function loadComposeDefinition(definitionPath) {
77
+ const rawYaml = readFileSync(definitionPath, 'utf-8');
78
+ const parsed = parseComposeDefinitionYaml(rawYaml);
79
+ const name = ensureRequiredString(parsed.name, 'name');
80
+ const persona = ensureRequiredString(parsed.persona, 'persona');
81
+ const description = ensureOptionalString(parsed.description, 'description');
82
+ const template = ensureOptionalString(parsed.template, 'template');
83
+ const instruction = ensureOptionalString(parsed.instruction, 'instruction');
84
+ const knowledge = ensureStringList(parsed.knowledge, 'knowledge');
85
+ const policies = ensureStringList(parsed.policies, 'policies');
86
+ const rawOrder = ensureStringList(parsed.order, 'order');
87
+ const order = normalizeOrder(rawOrder);
88
+ return {
89
+ name,
90
+ description: toOptionalNonEmpty(description),
91
+ persona,
92
+ template: toOptionalNonEmpty(template),
93
+ knowledge: knowledge && knowledge.length > 0 ? knowledge : undefined,
94
+ policies: policies && policies.length > 0 ? policies : undefined,
95
+ instruction: toOptionalNonEmpty(instruction),
96
+ order,
97
+ };
98
+ }
99
+ //# sourceMappingURL=compose-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-definition.js","sourceRoot":"","sources":["../src/compose-definition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Facet composition — the core placement rule.
3
+ *
4
+ * system prompt: persona only (WHO)
5
+ * user message: policy + knowledge + instruction (HOW / WHAT TO KNOW / WHAT TO DO)
6
+ *
7
+ * This module has ZERO dependencies on TAKT internals.
8
+ */
9
+ import type { FacetSet, ComposedPrompt, ComposeOptions } from './types.js';
10
+ /**
11
+ * Compose facets into an LLM-ready prompt according to Faceted Prompting
12
+ * placement rules.
13
+ *
14
+ * - persona → systemPrompt
15
+ * - policy / knowledge / instruction → userMessage (in that order)
16
+ */
17
+ export declare function compose(facets: FacetSet, options: ComposeOptions): ComposedPrompt;
18
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG3E;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,GAAG,cAAc,CAwCjF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Facet composition — the core placement rule.
3
+ *
4
+ * system prompt: persona only (WHO)
5
+ * user message: policy + knowledge + instruction (HOW / WHAT TO KNOW / WHAT TO DO)
6
+ *
7
+ * This module has ZERO dependencies on TAKT internals.
8
+ */
9
+ import { prepareKnowledgeContent, preparePolicyContent } from './truncation.js';
10
+ /**
11
+ * Compose facets into an LLM-ready prompt according to Faceted Prompting
12
+ * placement rules.
13
+ *
14
+ * - persona → systemPrompt
15
+ * - policy / knowledge / instruction → userMessage (in that order)
16
+ */
17
+ export function compose(facets, options) {
18
+ const systemPrompt = facets.persona?.body ?? '';
19
+ const userParts = [];
20
+ const order = options.userMessageOrder ?? ['policies', 'knowledge', 'instruction'];
21
+ for (const entry of order) {
22
+ if (entry === 'policies') {
23
+ if (!facets.policies || facets.policies.length === 0)
24
+ continue;
25
+ const joined = facets.policies.map(p => p.body).join('\n\n---\n\n');
26
+ const sourcePath = facets.policies.length === 1
27
+ ? facets.policies[0].sourcePath
28
+ : undefined;
29
+ userParts.push(preparePolicyContent(joined, options.contextMaxChars, sourcePath));
30
+ continue;
31
+ }
32
+ if (entry === 'knowledge') {
33
+ if (!facets.knowledge || facets.knowledge.length === 0)
34
+ continue;
35
+ const joined = facets.knowledge.map(k => k.body).join('\n\n---\n\n');
36
+ const sourcePath = facets.knowledge.length === 1
37
+ ? facets.knowledge[0].sourcePath
38
+ : undefined;
39
+ userParts.push(prepareKnowledgeContent(joined, options.contextMaxChars, sourcePath));
40
+ continue;
41
+ }
42
+ if (entry === 'instruction' && facets.instruction) {
43
+ userParts.push(facets.instruction.body);
44
+ }
45
+ }
46
+ return {
47
+ systemPrompt,
48
+ userMessage: userParts.join('\n\n'),
49
+ };
50
+ }
51
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../src/compose.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,MAAgB,EAAE,OAAuB;IAC/D,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC;IAEhD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,gBAAgB,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAEnF,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC/D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAC7C,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,UAAU;gBAChC,CAAC,CAAC,SAAS,CAAC;YACd,SAAS,CAAC,IAAI,CACZ,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CAClE,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACjE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrE,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;gBAC9C,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,UAAU;gBACjC,CAAC,CAAC,SAAS,CAAC;YACd,SAAS,CAAC,IAAI,CACZ,uBAAuB,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,EAAE,UAAU,CAAC,CACrE,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,aAAa,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO;QACL,YAAY;QACZ,WAAW,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface FacetedConfig {
2
+ readonly version: number;
3
+ readonly skillPaths?: readonly string[];
4
+ }
5
+ export declare function getFacetedRoot(homeDir: string): string;
6
+ export declare function getConfigPath(homeDir: string): string;
7
+ export declare function ensureConfigFile(homeDir: string): void;
8
+ export declare function readFacetedConfig(homeDir: string): Promise<FacetedConfig>;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAQtD;AAkBD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAmD/E"}
@@ -0,0 +1,82 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { tracedConfig } from 'traced-config';
4
+ import { parse } from 'yaml';
5
+ const DEFAULT_CONFIG = ['version: 1', 'skillPaths: []'].join('\n');
6
+ export function getFacetedRoot(homeDir) {
7
+ return join(homeDir, '.faceted');
8
+ }
9
+ export function getConfigPath(homeDir) {
10
+ return join(getFacetedRoot(homeDir), 'config.yaml');
11
+ }
12
+ export function ensureConfigFile(homeDir) {
13
+ const root = getFacetedRoot(homeDir);
14
+ mkdirSync(root, { recursive: true });
15
+ const configPath = getConfigPath(homeDir);
16
+ if (!existsSync(configPath)) {
17
+ writeFileSync(configPath, `${DEFAULT_CONFIG}\n`, 'utf-8');
18
+ }
19
+ }
20
+ function parseConfigRootAsObject(content) {
21
+ const parsed = parse(content);
22
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
23
+ throw new Error('Config root must be an object');
24
+ }
25
+ return parsed;
26
+ }
27
+ function hasErrorCode(error) {
28
+ if (typeof error !== 'object' || error === null) {
29
+ return false;
30
+ }
31
+ const withCode = error;
32
+ return typeof withCode.code === 'string';
33
+ }
34
+ export async function readFacetedConfig(homeDir) {
35
+ const configPath = getConfigPath(homeDir);
36
+ if (!existsSync(configPath)) {
37
+ throw new Error(`Missing faceted config: ${configPath}`);
38
+ }
39
+ const resolver = tracedConfig({
40
+ schema: {
41
+ version: {
42
+ default: 1,
43
+ doc: 'config schema version',
44
+ format: Number,
45
+ sources: { global: false, local: true, env: false, cli: false },
46
+ },
47
+ skillPaths: {
48
+ default: [],
49
+ doc: 'skill path list',
50
+ format: 'string-list',
51
+ sources: { global: false, local: true, env: false, cli: false },
52
+ },
53
+ },
54
+ });
55
+ resolver.addFormat('string-list', value => {
56
+ return Array.isArray(value) && value.every(item => typeof item === 'string');
57
+ });
58
+ resolver.addParser('yaml', parseConfigRootAsObject);
59
+ resolver.addParser('yml', parseConfigRootAsObject);
60
+ try {
61
+ await resolver.loadFile([{ path: configPath, label: 'local' }]);
62
+ }
63
+ catch (error) {
64
+ if (hasErrorCode(error)) {
65
+ throw error;
66
+ }
67
+ throw new Error(`Invalid faceted config file: ${configPath}`);
68
+ }
69
+ const validationIssues = resolver.validate();
70
+ if (validationIssues.length > 0) {
71
+ const invalidField = validationIssues[0]?.key;
72
+ if (invalidField) {
73
+ throw new Error(`Invalid faceted config field: ${invalidField}`);
74
+ }
75
+ throw new Error('Invalid faceted config field');
76
+ }
77
+ return {
78
+ version: resolver.get('version'),
79
+ skillPaths: resolver.get('skillPaths'),
80
+ };
81
+ }
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * DataEngine — abstract interface for facet data retrieval.
3
+ *
4
+ * Compose logic depends only on this interface; callers wire
5
+ * concrete implementations (FileDataEngine, SqliteDataEngine, etc.).
6
+ *
7
+ * This module depends only on node:fs, node:path.
8
+ */
9
+ import type { FacetKind, FacetContent } from './types.js';
10
+ /**
11
+ * Abstract interface for facet data retrieval.
12
+ *
13
+ * Methods return Promises so that implementations backed by
14
+ * async I/O (database, network) can be used without changes.
15
+ */
16
+ export interface DataEngine {
17
+ /**
18
+ * Resolve a single facet by kind and key (name without extension).
19
+ * Returns undefined if the facet does not exist.
20
+ */
21
+ resolve(kind: FacetKind, key: string): Promise<FacetContent | undefined>;
22
+ /** List available facet keys for a given kind. */
23
+ list(kind: FacetKind): Promise<string[]>;
24
+ }
25
+ /**
26
+ * File-system backed DataEngine.
27
+ *
28
+ * Resolves facets from a single root directory using the convention:
29
+ * {root}/{kind}/{key}.md
30
+ */
31
+ export declare class FileDataEngine implements DataEngine {
32
+ private readonly root;
33
+ constructor(root: string);
34
+ resolve(kind: FacetKind, key: string): Promise<FacetContent | undefined>;
35
+ list(kind: FacetKind): Promise<string[]>;
36
+ }
37
+ /**
38
+ * Chains multiple DataEngines with first-match-wins resolution.
39
+ *
40
+ * resolve() returns the first non-undefined result.
41
+ * list() returns deduplicated keys from all engines.
42
+ */
43
+ export declare class CompositeDataEngine implements DataEngine {
44
+ private readonly engines;
45
+ constructor(engines: readonly DataEngine[]);
46
+ resolve(kind: FacetKind, key: string): Promise<FacetContent | undefined>;
47
+ list(kind: FacetKind): Promise<string[]>;
48
+ }
49
+ //# sourceMappingURL=data-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-engine.d.ts","sourceRoot":"","sources":["../src/data-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAW1D;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC,CAAC;IAEzE,kDAAkD;IAClD,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC1C;AAED;;;;;GAKG;AACH,qBAAa,cAAe,YAAW,UAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,MAAM;IAEnC,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAQxE,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAQ/C;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,UAAU;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,SAAS,UAAU,EAAE;IAMrD,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAQxE,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAc/C"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * DataEngine — abstract interface for facet data retrieval.
3
+ *
4
+ * Compose logic depends only on this interface; callers wire
5
+ * concrete implementations (FileDataEngine, SqliteDataEngine, etc.).
6
+ *
7
+ * This module depends only on node:fs, node:path.
8
+ */
9
+ import { existsSync, readFileSync, readdirSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ /** Plural-kind to directory name mapping (identity for all current kinds). */
12
+ const KIND_DIR = {
13
+ personas: 'personas',
14
+ policies: 'policies',
15
+ knowledge: 'knowledge',
16
+ instructions: 'instructions',
17
+ 'output-contracts': 'output-contracts',
18
+ };
19
+ /**
20
+ * File-system backed DataEngine.
21
+ *
22
+ * Resolves facets from a single root directory using the convention:
23
+ * {root}/{kind}/{key}.md
24
+ */
25
+ export class FileDataEngine {
26
+ root;
27
+ constructor(root) {
28
+ this.root = root;
29
+ }
30
+ async resolve(kind, key) {
31
+ const dir = KIND_DIR[kind];
32
+ const filePath = join(this.root, dir, `${key}.md`);
33
+ if (!existsSync(filePath))
34
+ return undefined;
35
+ const body = readFileSync(filePath, 'utf-8');
36
+ return { body, sourcePath: filePath };
37
+ }
38
+ async list(kind) {
39
+ const dir = KIND_DIR[kind];
40
+ const dirPath = join(this.root, dir);
41
+ if (!existsSync(dirPath))
42
+ return [];
43
+ return readdirSync(dirPath)
44
+ .filter(f => f.endsWith('.md'))
45
+ .map(f => f.slice(0, -3));
46
+ }
47
+ }
48
+ /**
49
+ * Chains multiple DataEngines with first-match-wins resolution.
50
+ *
51
+ * resolve() returns the first non-undefined result.
52
+ * list() returns deduplicated keys from all engines.
53
+ */
54
+ export class CompositeDataEngine {
55
+ engines;
56
+ constructor(engines) {
57
+ this.engines = engines;
58
+ if (engines.length === 0) {
59
+ throw new Error('CompositeDataEngine requires at least one engine');
60
+ }
61
+ }
62
+ async resolve(kind, key) {
63
+ for (const engine of this.engines) {
64
+ const result = await engine.resolve(kind, key);
65
+ if (result !== undefined)
66
+ return result;
67
+ }
68
+ return undefined;
69
+ }
70
+ async list(kind) {
71
+ const seen = new Set();
72
+ const result = [];
73
+ for (const engine of this.engines) {
74
+ const keys = await engine.list(kind);
75
+ for (const key of keys) {
76
+ if (!seen.has(key)) {
77
+ seen.add(key);
78
+ result.push(key);
79
+ }
80
+ }
81
+ }
82
+ return result;
83
+ }
84
+ }
85
+ //# sourceMappingURL=data-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-engine.js","sourceRoot":"","sources":["../src/data-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Template injection prevention.
3
+ *
4
+ * Escapes curly braces in dynamic content so they are not
5
+ * interpreted as template variables by the template engine.
6
+ *
7
+ * This module has ZERO dependencies on TAKT internals.
8
+ */
9
+ /**
10
+ * Replace ASCII curly braces with full-width equivalents
11
+ * to prevent template variable injection in user-supplied content.
12
+ */
13
+ export declare function escapeTemplateChars(str: string): string;
14
+ //# sourceMappingURL=escape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../src/escape.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD"}
package/dist/escape.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Template injection prevention.
3
+ *
4
+ * Escapes curly braces in dynamic content so they are not
5
+ * interpreted as template variables by the template engine.
6
+ *
7
+ * This module has ZERO dependencies on TAKT internals.
8
+ */
9
+ /**
10
+ * Replace ASCII curly braces with full-width equivalents
11
+ * to prevent template variable injection in user-supplied content.
12
+ */
13
+ export function escapeTemplateChars(str) {
14
+ return str.replace(/\{/g, '\uff5b').replace(/\}/g, '\uff5d');
15
+ }
16
+ //# sourceMappingURL=escape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escape.js","sourceRoot":"","sources":["../src/escape.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC/D,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * faceted-prompting — Public API
3
+ *
4
+ * Re-exports all public types, interfaces, and functions.
5
+ * Consumers should import from this module only.
6
+ */
7
+ export type { FacetKind, FacetContent, FacetSet, ComposedPrompt, ComposedPromptPayload, ComposeOptions, CopyFiles, } from './types.js';
8
+ export { compose } from './compose.js';
9
+ export { composePromptPayload } from './prompt-payload.js';
10
+ export type { DataEngine } from './data-engine.js';
11
+ export { FileDataEngine, CompositeDataEngine } from './data-engine.js';
12
+ export { trimContextContent, renderConflictNotice, prepareKnowledgeContent, preparePolicyContent, } from './truncation.js';
13
+ export { renderTemplate } from './template.js';
14
+ export { escapeTemplateChars } from './escape.js';
15
+ export type { PieceSections } from './resolve.js';
16
+ export { isResourcePath, resolveFacetPath, resolveFacetByName, resolveResourcePath, resolveResourceContent, resolveRefToContent, resolveRefList, resolveSectionMap, extractPersonaDisplayName, resolvePersona, } from './resolve.js';
17
+ export type { ScopeRef } from './scope.js';
18
+ export { isScopeRef, parseScopeRef, resolveScopeRef, validateScopeOwner, validateScopeRepo, validateScopeFacetName, } from './scope.js';
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAG3D,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGvE,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGlD,YAAY,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * faceted-prompting — Public API
3
+ *
4
+ * Re-exports all public types, interfaces, and functions.
5
+ * Consumers should import from this module only.
6
+ */
7
+ // Compose
8
+ export { compose } from './compose.js';
9
+ export { composePromptPayload } from './prompt-payload.js';
10
+ export { FileDataEngine, CompositeDataEngine } from './data-engine.js';
11
+ // Truncation
12
+ export { trimContextContent, renderConflictNotice, prepareKnowledgeContent, preparePolicyContent, } from './truncation.js';
13
+ // Template engine
14
+ export { renderTemplate } from './template.js';
15
+ // Escape
16
+ export { escapeTemplateChars } from './escape.js';
17
+ export { isResourcePath, resolveFacetPath, resolveFacetByName, resolveResourcePath, resolveResourceContent, resolveRefToContent, resolveRefList, resolveSectionMap, extractPersonaDisplayName, resolvePersona, } from './resolve.js';
18
+ export { isScopeRef, parseScopeRef, resolveScopeRef, validateScopeOwner, validateScopeRepo, validateScopeFacetName, } from './scope.js';
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAI3D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,aAAa;AACb,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AAEzB,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,SAAS;AACT,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIlD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,GACf,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,UAAU,EACV,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,17 @@
1
+ type FetchResponseLike = {
2
+ ok: boolean;
3
+ status: number;
4
+ text(): Promise<string>;
5
+ };
6
+ type FetchLike = (input: string) => Promise<FetchResponseLike>;
7
+ export declare function listPullSampleTargetPaths(homeDir: string): string[];
8
+ export declare function initializeFacetedHome(options: {
9
+ homeDir: string;
10
+ }): Promise<void>;
11
+ export declare function pullSampleFacets(options: {
12
+ homeDir: string;
13
+ fetchImpl?: FetchLike;
14
+ overwrite?: boolean;
15
+ }): Promise<void>;
16
+ export {};
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/init/index.ts"],"names":[],"mappings":"AAqJA,KAAK,iBAAiB,GAAG;IACvB,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB,CAAC;AAEF,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAuB/D,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGnE;AAcD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBvF;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9H"}