@momentiq/dark-factory-cli 1.1.0 → 2.0.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 (104) hide show
  1. package/README.md +86 -2
  2. package/dist/adapters/critic-result-schema.d.ts +14 -14
  3. package/dist/adapters/index.d.ts +1 -0
  4. package/dist/adapters/index.d.ts.map +1 -1
  5. package/dist/adapters/index.js +7 -0
  6. package/dist/adapters/index.js.map +1 -1
  7. package/dist/adapters/static-schema-lint.d.ts +68 -0
  8. package/dist/adapters/static-schema-lint.d.ts.map +1 -0
  9. package/dist/adapters/static-schema-lint.js +813 -0
  10. package/dist/adapters/static-schema-lint.js.map +1 -0
  11. package/dist/cli.d.ts +17 -1
  12. package/dist/cli.d.ts.map +1 -1
  13. package/dist/cli.js +296 -41
  14. package/dist/cli.js.map +1 -1
  15. package/dist/commands/findings.d.ts +6 -0
  16. package/dist/commands/findings.d.ts.map +1 -0
  17. package/dist/commands/findings.js +196 -0
  18. package/dist/commands/findings.js.map +1 -0
  19. package/dist/commands/skills.d.ts +6 -0
  20. package/dist/commands/skills.d.ts.map +1 -0
  21. package/dist/commands/skills.js +248 -0
  22. package/dist/commands/skills.js.map +1 -0
  23. package/dist/doctor.d.ts +17 -0
  24. package/dist/doctor.d.ts.map +1 -1
  25. package/dist/doctor.js +107 -0
  26. package/dist/doctor.js.map +1 -1
  27. package/dist/evidence/docker-build.d.ts +6 -0
  28. package/dist/evidence/docker-build.d.ts.map +1 -0
  29. package/dist/evidence/docker-build.js +199 -0
  30. package/dist/evidence/docker-build.js.map +1 -0
  31. package/dist/evidence/index.d.ts +1 -0
  32. package/dist/evidence/index.d.ts.map +1 -1
  33. package/dist/evidence/index.js +6 -0
  34. package/dist/evidence/index.js.map +1 -1
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +4 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/mcp/server.d.ts.map +1 -1
  40. package/dist/mcp/server.js +2 -0
  41. package/dist/mcp/server.js.map +1 -1
  42. package/dist/mcp/tools/doctor.d.ts.map +1 -1
  43. package/dist/mcp/tools/doctor.js +5 -0
  44. package/dist/mcp/tools/doctor.js.map +1 -1
  45. package/dist/mcp/tools/review-bypass.d.ts.map +1 -1
  46. package/dist/mcp/tools/review-bypass.js +21 -0
  47. package/dist/mcp/tools/review-bypass.js.map +1 -1
  48. package/dist/mcp/tools/skills-install.d.ts +6 -0
  49. package/dist/mcp/tools/skills-install.d.ts.map +1 -0
  50. package/dist/mcp/tools/skills-install.js +260 -0
  51. package/dist/mcp/tools/skills-install.js.map +1 -0
  52. package/dist/mcp/tools/stats-gate.d.ts.map +1 -1
  53. package/dist/mcp/tools/stats-gate.js +63 -15
  54. package/dist/mcp/tools/stats-gate.js.map +1 -1
  55. package/dist/policy/gate.d.ts +1 -1
  56. package/dist/policy/gate.d.ts.map +1 -1
  57. package/dist/policy/gate.js +96 -12
  58. package/dist/policy/gate.js.map +1 -1
  59. package/dist/prompt.d.ts +1 -0
  60. package/dist/prompt.d.ts.map +1 -1
  61. package/dist/prompt.js +105 -1
  62. package/dist/prompt.js.map +1 -1
  63. package/dist/report.d.ts +106 -3
  64. package/dist/report.d.ts.map +1 -1
  65. package/dist/report.js +282 -10
  66. package/dist/report.js.map +1 -1
  67. package/dist/runner.d.ts +2 -0
  68. package/dist/runner.d.ts.map +1 -1
  69. package/dist/runner.js +86 -2
  70. package/dist/runner.js.map +1 -1
  71. package/dist/self-consistency.d.ts +144 -0
  72. package/dist/self-consistency.d.ts.map +1 -0
  73. package/dist/self-consistency.js +368 -0
  74. package/dist/self-consistency.js.map +1 -0
  75. package/dist/skills/config.d.ts +176 -0
  76. package/dist/skills/config.d.ts.map +1 -0
  77. package/dist/skills/config.js +251 -0
  78. package/dist/skills/config.js.map +1 -0
  79. package/dist/skills/index.d.ts +4 -0
  80. package/dist/skills/index.d.ts.map +1 -0
  81. package/dist/skills/index.js +8 -0
  82. package/dist/skills/index.js.map +1 -0
  83. package/dist/skills/install.d.ts +62 -0
  84. package/dist/skills/install.d.ts.map +1 -0
  85. package/dist/skills/install.js +315 -0
  86. package/dist/skills/install.js.map +1 -0
  87. package/dist/skills/template.d.ts +42 -0
  88. package/dist/skills/template.d.ts.map +1 -0
  89. package/dist/skills/template.js +95 -0
  90. package/dist/skills/template.js.map +1 -0
  91. package/dist/trusted-surface/rebind.d.ts.map +1 -1
  92. package/dist/trusted-surface/rebind.js +14 -1
  93. package/dist/trusted-surface/rebind.js.map +1 -1
  94. package/package.json +32 -2
  95. package/skills/README.md +89 -0
  96. package/skills/chief-engineer-blitz/SKILL.md.tmpl +443 -0
  97. package/skills/chief-engineer-blitz/skill.json +53 -0
  98. package/skills/chief-engineer-review/SKILL.md.tmpl +184 -0
  99. package/skills/chief-engineer-review/references/review-examples.md.tmpl +130 -0
  100. package/skills/chief-engineer-review/skill.json +67 -0
  101. package/skills/chief-engineer-review/templates/code-review-prompt.md.tmpl +111 -0
  102. package/skills/chief-engineer-review/templates/escalation-prompt.md.tmpl +56 -0
  103. package/skills/chief-engineer-review/templates/plan-review-prompt.md.tmpl +74 -0
  104. package/skills/skill-schema.json +73 -0
@@ -0,0 +1,176 @@
1
+ import { z } from "zod";
2
+ export declare const CONFIG_FILENAME = "darkfactory.yaml";
3
+ export declare const DarkFactoryConfigSchema: z.ZodObject<{
4
+ repo: z.ZodOptional<z.ZodObject<{
5
+ displayName: z.ZodOptional<z.ZodOptional<z.ZodString>>;
6
+ slug: z.ZodOptional<z.ZodOptional<z.ZodString>>;
7
+ ownerRepo: z.ZodOptional<z.ZodOptional<z.ZodString>>;
8
+ }, "strip", z.ZodTypeAny, {
9
+ ownerRepo?: string | undefined;
10
+ displayName?: string | undefined;
11
+ slug?: string | undefined;
12
+ }, {
13
+ ownerRepo?: string | undefined;
14
+ displayName?: string | undefined;
15
+ slug?: string | undefined;
16
+ }>>;
17
+ docs: z.ZodOptional<z.ZodObject<{
18
+ manifesto: z.ZodOptional<z.ZodOptional<z.ZodString>>;
19
+ adrDir: z.ZodOptional<z.ZodOptional<z.ZodString>>;
20
+ cycleDocsDir: z.ZodOptional<z.ZodOptional<z.ZodString>>;
21
+ rfcDir: z.ZodOptional<z.ZodOptional<z.ZodString>>;
22
+ prdDir: z.ZodOptional<z.ZodOptional<z.ZodString>>;
23
+ }, "strip", z.ZodTypeAny, {
24
+ manifesto?: string | undefined;
25
+ adrDir?: string | undefined;
26
+ cycleDocsDir?: string | undefined;
27
+ rfcDir?: string | undefined;
28
+ prdDir?: string | undefined;
29
+ }, {
30
+ manifesto?: string | undefined;
31
+ adrDir?: string | undefined;
32
+ cycleDocsDir?: string | undefined;
33
+ rfcDir?: string | undefined;
34
+ prdDir?: string | undefined;
35
+ }>>;
36
+ agents: z.ZodOptional<z.ZodObject<{
37
+ chiefEngineer: z.ZodOptional<z.ZodOptional<z.ZodString>>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ chiefEngineer?: string | undefined;
40
+ }, {
41
+ chiefEngineer?: string | undefined;
42
+ }>>;
43
+ qualityGates: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
44
+ qualityGatesExtras: z.ZodOptional<z.ZodObject<{
45
+ apiTypes: z.ZodOptional<z.ZodOptional<z.ZodString>>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ apiTypes?: string | undefined;
48
+ }, {
49
+ apiTypes?: string | undefined;
50
+ }>>;
51
+ worktreeRoot: z.ZodOptional<z.ZodString>;
52
+ agentCommitterOrg: z.ZodOptional<z.ZodString>;
53
+ skills: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
54
+ enabled: z.ZodOptional<z.ZodOptional<z.ZodBoolean>>;
55
+ }, "strip", z.ZodTypeAny, {
56
+ enabled?: boolean | undefined;
57
+ }, {
58
+ enabled?: boolean | undefined;
59
+ }>>>;
60
+ }, "strict", z.ZodTypeAny, {
61
+ docs?: {
62
+ manifesto?: string | undefined;
63
+ adrDir?: string | undefined;
64
+ cycleDocsDir?: string | undefined;
65
+ rfcDir?: string | undefined;
66
+ prdDir?: string | undefined;
67
+ } | undefined;
68
+ repo?: {
69
+ ownerRepo?: string | undefined;
70
+ displayName?: string | undefined;
71
+ slug?: string | undefined;
72
+ } | undefined;
73
+ agents?: {
74
+ chiefEngineer?: string | undefined;
75
+ } | undefined;
76
+ qualityGates?: string[] | undefined;
77
+ qualityGatesExtras?: {
78
+ apiTypes?: string | undefined;
79
+ } | undefined;
80
+ worktreeRoot?: string | undefined;
81
+ agentCommitterOrg?: string | undefined;
82
+ skills?: Record<string, {
83
+ enabled?: boolean | undefined;
84
+ }> | undefined;
85
+ }, {
86
+ docs?: {
87
+ manifesto?: string | undefined;
88
+ adrDir?: string | undefined;
89
+ cycleDocsDir?: string | undefined;
90
+ rfcDir?: string | undefined;
91
+ prdDir?: string | undefined;
92
+ } | undefined;
93
+ repo?: {
94
+ ownerRepo?: string | undefined;
95
+ displayName?: string | undefined;
96
+ slug?: string | undefined;
97
+ } | undefined;
98
+ agents?: {
99
+ chiefEngineer?: string | undefined;
100
+ } | undefined;
101
+ qualityGates?: string[] | undefined;
102
+ qualityGatesExtras?: {
103
+ apiTypes?: string | undefined;
104
+ } | undefined;
105
+ worktreeRoot?: string | undefined;
106
+ agentCommitterOrg?: string | undefined;
107
+ skills?: Record<string, {
108
+ enabled?: boolean | undefined;
109
+ }> | undefined;
110
+ }>;
111
+ export type DarkFactoryConfig = z.infer<typeof DarkFactoryConfigSchema>;
112
+ export interface LoadedDarkFactoryConfig {
113
+ readonly config: DarkFactoryConfig;
114
+ readonly configPath: string;
115
+ /**
116
+ * True when the consumer has no `darkfactory.yaml` at the repo root and
117
+ * the renderer falls back to manifest defaults entirely. Callers may
118
+ * surface a hint to create one.
119
+ */
120
+ readonly isDefault: boolean;
121
+ }
122
+ /**
123
+ * Locate + parse `darkfactory.yaml` at `repoRoot`. Returns a defaulted
124
+ * empty config when the file does not exist (so callers can render skills
125
+ * against pure manifest defaults without special-casing the missing file).
126
+ * Throws on parse / schema errors — those are explicit consumer mistakes
127
+ * the install should fail closed on.
128
+ */
129
+ export declare function loadDarkFactoryConfig(repoRoot: string): LoadedDarkFactoryConfig;
130
+ /**
131
+ * Parse a git remote URL into `<owner>/<repo>`. Handles both the SSH
132
+ * shorthand (`git@github.com:owner/repo[.git]`) and the HTTPS form
133
+ * (`https://github.com/owner/repo[.git]`). Returns null when neither
134
+ * shape matches — we don't want to populate `OWNER_REPO` from a URL we
135
+ * couldn't confidently parse.
136
+ */
137
+ export declare function parseGitRemoteOwnerRepo(remoteUrl: string): string | null;
138
+ /**
139
+ * Best-effort inference of `<owner>/<repo>` from the consumer's
140
+ * `origin` git remote. Returns null when the repo is not a git checkout,
141
+ * has no origin, or origin has an unparseable URL. Never throws — the
142
+ * caller treats null as "no inference available, fall back to manifest
143
+ * default".
144
+ */
145
+ export declare function inferGitOriginOwnerRepo(repoRoot: string): string | null;
146
+ export interface ResolveSkillOverridesOptions {
147
+ readonly config: DarkFactoryConfig;
148
+ /**
149
+ * Consumer repo root. When provided, `OWNER_REPO` / `REPO_SLUG` fall back
150
+ * to git-remote inference when the yaml does not provide them. Omit in
151
+ * unit tests that want pure-config behavior.
152
+ */
153
+ readonly repoRoot?: string;
154
+ }
155
+ /**
156
+ * Resolve the install-time variable overrides for one skill, given the
157
+ * loaded consumer config. The output is the `overrides` arg to
158
+ * `renderTemplateBody` — a map from variable name to value (scalar string)
159
+ * or values (string[] for kind:"list").
160
+ *
161
+ * Precedence for `OWNER_REPO` / `REPO_SLUG`:
162
+ * 1. yaml `repo.ownerRepo` / `repo.slug` (explicit; wins)
163
+ * 2. git remote inference from `repoRoot` (when supplied)
164
+ * 3. manifest default (renderer falls back when this map omits the key)
165
+ *
166
+ * Variable→config-key mapping is hard-coded here because there is exactly
167
+ * one consumer-config schema. A generic mapping system is not worth the
168
+ * indirection at this size.
169
+ */
170
+ export declare function resolveSkillOverrides(options: ResolveSkillOverridesOptions): Record<string, string | string[]>;
171
+ /**
172
+ * Returns the list of skills the consumer has marked `enabled: true` in
173
+ * `darkfactory.yaml#skills`. Used by `df skills install --all`.
174
+ */
175
+ export declare function enabledSkillNames(config: DarkFactoryConfig): string[];
176
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/skills/config.ts"],"names":[],"mappings":"AA2CA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe,qBAAqB,CAAC;AAmClD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBzB,CAAC;AAEZ,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,GACf,uBAAuB,CA+BzB;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWxE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAavE;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CA0DnC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAKrE"}
@@ -0,0 +1,251 @@
1
+ // `darkfactory.yaml` — unified consumer config loader.
2
+ //
3
+ // The single config surface for all `df`-installed assets (skills today;
4
+ // future hooks/agents tomorrow). Lives at the consumer repo root as a
5
+ // plain YAML file. Avoids fragmenting per-asset config across multiple
6
+ // files (e.g. `.dark-factory/skills.json`, `.agent-review/extras.json`).
7
+ //
8
+ // Shape (all keys optional — every consumer of the config supplies
9
+ // defaults):
10
+ //
11
+ // repo:
12
+ // displayName: "Dark Factory Platform"
13
+ // slug: "dark-factory-platform"
14
+ // ownerRepo: "momentiq-ai/dark-factory-platform"
15
+ // docs:
16
+ // manifesto: "docs/PRINCIPLES.md"
17
+ // adrDir: "docs/ADR"
18
+ // cycleDocsDir: "docs/roadmap/cycles"
19
+ // rfcDir: "docs/rfcs"
20
+ // prdDir: "docs/prds"
21
+ // agents:
22
+ // chiefEngineer: ".claude/agents/chief-engineer.md"
23
+ // qualityGates:
24
+ // - "make quality-gates"
25
+ // qualityGatesExtras:
26
+ // apiTypes: "make generate-api-types"
27
+ // worktreeRoot: ".claude/worktrees"
28
+ // agentCommitterOrg: "momentiq"
29
+ // skills:
30
+ // chief-engineer-review:
31
+ // enabled: true
32
+ // chief-engineer-blitz:
33
+ // enabled: true
34
+ //
35
+ // Backed by the existing `yaml` workspace dep (already required by other
36
+ // CLI surfaces); zod validates the shape so a malformed config fails closed
37
+ // at load time with a useful error.
38
+ import { execFileSync } from "node:child_process";
39
+ import { existsSync, readFileSync } from "node:fs";
40
+ import { resolve } from "node:path";
41
+ import { parse as parseYaml } from "yaml";
42
+ import { z } from "zod";
43
+ export const CONFIG_FILENAME = "darkfactory.yaml";
44
+ const repoSchema = z
45
+ .object({
46
+ displayName: z.string().optional(),
47
+ slug: z.string().optional(),
48
+ ownerRepo: z.string().optional(),
49
+ })
50
+ .partial()
51
+ .optional();
52
+ const docsSchema = z
53
+ .object({
54
+ manifesto: z.string().optional(),
55
+ adrDir: z.string().optional(),
56
+ cycleDocsDir: z.string().optional(),
57
+ rfcDir: z.string().optional(),
58
+ prdDir: z.string().optional(),
59
+ })
60
+ .partial()
61
+ .optional();
62
+ const agentsSchema = z
63
+ .object({
64
+ chiefEngineer: z.string().optional(),
65
+ })
66
+ .partial()
67
+ .optional();
68
+ const skillEntrySchema = z
69
+ .object({
70
+ enabled: z.boolean().optional(),
71
+ })
72
+ .partial();
73
+ export const DarkFactoryConfigSchema = z
74
+ .object({
75
+ repo: repoSchema,
76
+ docs: docsSchema,
77
+ agents: agentsSchema,
78
+ qualityGates: z.array(z.string()).optional(),
79
+ qualityGatesExtras: z
80
+ .object({
81
+ apiTypes: z.string().optional(),
82
+ })
83
+ .partial()
84
+ .optional(),
85
+ worktreeRoot: z.string().optional(),
86
+ agentCommitterOrg: z.string().optional(),
87
+ skills: z.record(skillEntrySchema).optional(),
88
+ })
89
+ .strict();
90
+ /**
91
+ * Locate + parse `darkfactory.yaml` at `repoRoot`. Returns a defaulted
92
+ * empty config when the file does not exist (so callers can render skills
93
+ * against pure manifest defaults without special-casing the missing file).
94
+ * Throws on parse / schema errors — those are explicit consumer mistakes
95
+ * the install should fail closed on.
96
+ */
97
+ export function loadDarkFactoryConfig(repoRoot) {
98
+ const configPath = resolve(repoRoot, CONFIG_FILENAME);
99
+ if (!existsSync(configPath)) {
100
+ return {
101
+ config: DarkFactoryConfigSchema.parse({}),
102
+ configPath,
103
+ isDefault: true,
104
+ };
105
+ }
106
+ const raw = readFileSync(configPath, "utf8");
107
+ let parsed;
108
+ try {
109
+ parsed = parseYaml(raw);
110
+ }
111
+ catch (err) {
112
+ throw new Error(`${CONFIG_FILENAME}: YAML parse error — ${err.message}`);
113
+ }
114
+ // Empty file → empty object (yaml parser returns null for a file
115
+ // containing only comments / whitespace; treat that as the empty config).
116
+ const candidate = parsed === null || parsed === undefined ? {} : parsed;
117
+ const result = DarkFactoryConfigSchema.safeParse(candidate);
118
+ if (!result.success) {
119
+ const issues = result.error.issues
120
+ .map((i) => ` - ${i.path.join(".") || "(root)"}: ${i.message}`)
121
+ .join("\n");
122
+ throw new Error(`${CONFIG_FILENAME}: schema validation failed:\n${issues}`);
123
+ }
124
+ return { config: result.data, configPath, isDefault: false };
125
+ }
126
+ /**
127
+ * Parse a git remote URL into `<owner>/<repo>`. Handles both the SSH
128
+ * shorthand (`git@github.com:owner/repo[.git]`) and the HTTPS form
129
+ * (`https://github.com/owner/repo[.git]`). Returns null when neither
130
+ * shape matches — we don't want to populate `OWNER_REPO` from a URL we
131
+ * couldn't confidently parse.
132
+ */
133
+ export function parseGitRemoteOwnerRepo(remoteUrl) {
134
+ const trimmed = remoteUrl.trim();
135
+ // SSH: git@host:owner/repo[.git]
136
+ const ssh = trimmed.match(/^[^@]+@[^:]+:([^/]+)\/([^/]+?)(?:\.git)?$/);
137
+ if (ssh)
138
+ return `${ssh[1]}/${ssh[2]}`;
139
+ // HTTPS/HTTP: https://host[:port]/owner/repo[.git]
140
+ const https = trimmed.match(/^https?:\/\/[^/]+\/([^/]+)\/([^/]+?)(?:\.git)?\/?$/);
141
+ if (https)
142
+ return `${https[1]}/${https[2]}`;
143
+ return null;
144
+ }
145
+ /**
146
+ * Best-effort inference of `<owner>/<repo>` from the consumer's
147
+ * `origin` git remote. Returns null when the repo is not a git checkout,
148
+ * has no origin, or origin has an unparseable URL. Never throws — the
149
+ * caller treats null as "no inference available, fall back to manifest
150
+ * default".
151
+ */
152
+ export function inferGitOriginOwnerRepo(repoRoot) {
153
+ let url;
154
+ try {
155
+ url = execFileSync("git", ["config", "--get", "remote.origin.url"], {
156
+ cwd: repoRoot,
157
+ encoding: "utf8",
158
+ stdio: ["ignore", "pipe", "ignore"],
159
+ }).trim();
160
+ }
161
+ catch {
162
+ return null;
163
+ }
164
+ if (url.length === 0)
165
+ return null;
166
+ return parseGitRemoteOwnerRepo(url);
167
+ }
168
+ /**
169
+ * Resolve the install-time variable overrides for one skill, given the
170
+ * loaded consumer config. The output is the `overrides` arg to
171
+ * `renderTemplateBody` — a map from variable name to value (scalar string)
172
+ * or values (string[] for kind:"list").
173
+ *
174
+ * Precedence for `OWNER_REPO` / `REPO_SLUG`:
175
+ * 1. yaml `repo.ownerRepo` / `repo.slug` (explicit; wins)
176
+ * 2. git remote inference from `repoRoot` (when supplied)
177
+ * 3. manifest default (renderer falls back when this map omits the key)
178
+ *
179
+ * Variable→config-key mapping is hard-coded here because there is exactly
180
+ * one consumer-config schema. A generic mapping system is not worth the
181
+ * indirection at this size.
182
+ */
183
+ export function resolveSkillOverrides(options) {
184
+ const { config, repoRoot } = options;
185
+ const overrides = {};
186
+ if (config.repo?.displayName !== undefined) {
187
+ overrides.REPO_NAME = config.repo.displayName;
188
+ }
189
+ if (config.repo?.slug !== undefined) {
190
+ overrides.REPO_SLUG = config.repo.slug;
191
+ }
192
+ if (config.repo?.ownerRepo !== undefined) {
193
+ overrides.OWNER_REPO = config.repo.ownerRepo;
194
+ }
195
+ if ((overrides.OWNER_REPO === undefined || overrides.REPO_SLUG === undefined) &&
196
+ repoRoot !== undefined) {
197
+ const inferred = inferGitOriginOwnerRepo(repoRoot);
198
+ if (inferred !== null) {
199
+ const slashIndex = inferred.indexOf("/");
200
+ if (overrides.OWNER_REPO === undefined) {
201
+ overrides.OWNER_REPO = inferred;
202
+ }
203
+ if (overrides.REPO_SLUG === undefined && slashIndex > 0) {
204
+ overrides.REPO_SLUG = inferred.slice(slashIndex + 1);
205
+ }
206
+ }
207
+ }
208
+ if (config.docs?.manifesto !== undefined) {
209
+ overrides.MANIFESTO_PATH = config.docs.manifesto;
210
+ }
211
+ if (config.docs?.adrDir !== undefined) {
212
+ overrides.ADR_DIR = config.docs.adrDir;
213
+ }
214
+ if (config.docs?.cycleDocsDir !== undefined) {
215
+ overrides.CYCLE_DOCS_DIR = config.docs.cycleDocsDir;
216
+ }
217
+ if (config.docs?.rfcDir !== undefined) {
218
+ overrides.RFC_DIR = config.docs.rfcDir;
219
+ }
220
+ if (config.docs?.prdDir !== undefined) {
221
+ overrides.PRD_DIR = config.docs.prdDir;
222
+ }
223
+ if (config.agents?.chiefEngineer !== undefined) {
224
+ overrides.CE_AGENT_PATH = config.agents.chiefEngineer;
225
+ }
226
+ if (config.qualityGates !== undefined && config.qualityGates.length > 0) {
227
+ overrides.QUALITY_GATE_TARGETS = config.qualityGates;
228
+ }
229
+ if (config.qualityGatesExtras?.apiTypes !== undefined) {
230
+ overrides.API_TYPES_TARGET = config.qualityGatesExtras.apiTypes;
231
+ }
232
+ if (config.worktreeRoot !== undefined) {
233
+ overrides.WORKTREE_ROOT = config.worktreeRoot;
234
+ }
235
+ if (config.agentCommitterOrg !== undefined) {
236
+ overrides.AGENT_COMMITTER_ORG = config.agentCommitterOrg;
237
+ }
238
+ return overrides;
239
+ }
240
+ /**
241
+ * Returns the list of skills the consumer has marked `enabled: true` in
242
+ * `darkfactory.yaml#skills`. Used by `df skills install --all`.
243
+ */
244
+ export function enabledSkillNames(config) {
245
+ if (!config.skills)
246
+ return [];
247
+ return Object.entries(config.skills)
248
+ .filter(([, entry]) => entry.enabled === true)
249
+ .map(([name]) => name);
250
+ }
251
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/skills/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { installSkill, listBundledSkills, resolveSkillsRoot, KNOWN_SKILLS, type InstallOptions, type InstallResult, type InstalledFile, type ListedSkill, } from "./install.js";
2
+ export { loadDarkFactoryConfig, resolveSkillOverrides, enabledSkillNames, inferGitOriginOwnerRepo, parseGitRemoteOwnerRepo, DarkFactoryConfigSchema, CONFIG_FILENAME, type DarkFactoryConfig, type LoadedDarkFactoryConfig, type ResolveSkillOverridesOptions, } from "./config.js";
3
+ export { renderTemplateBody, extractReferencedVariables, type SkillManifest, type SkillVariableDef, type RenderResult, type RenderTemplateOptions, type VariableOverride, } from "./template.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,GACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,EACf,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,GAClC,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ // Public exports for the `skills` module — consumed by:
2
+ // - `src/cli.ts` (the `df skills install/list` CLI surface)
3
+ // - `src/mcp/tools/skills-install.ts` (the parallel MCP tool surface)
4
+ // - `src/index.ts` (the library export for downstream consumers)
5
+ export { installSkill, listBundledSkills, resolveSkillsRoot, KNOWN_SKILLS, } from "./install.js";
6
+ export { loadDarkFactoryConfig, resolveSkillOverrides, enabledSkillNames, inferGitOriginOwnerRepo, parseGitRemoteOwnerRepo, DarkFactoryConfigSchema, CONFIG_FILENAME, } from "./config.js";
7
+ export { renderTemplateBody, extractReferencedVariables, } from "./template.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,8DAA8D;AAC9D,wEAAwE;AACxE,mEAAmE;AAEnE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,GAKb,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,uBAAuB,EACvB,uBAAuB,EACvB,eAAe,GAIhB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAM3B,MAAM,eAAe,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Names of the skills bundled with this CLI. Adding a new skill = (1) drop
3
+ * the source-of-truth dir under `skills/`, (2) append the name here.
4
+ */
5
+ export declare const KNOWN_SKILLS: ReadonlyArray<string>;
6
+ export interface InstallOptions {
7
+ /** Consumer repo root. `darkfactory.yaml` is loaded from here. */
8
+ readonly cwd: string;
9
+ /** Skill name (must be in KNOWN_SKILLS). */
10
+ readonly skillName: string;
11
+ /**
12
+ * Override location of the target install dir. Defaults to
13
+ * `<cwd>/.claude/skills/<skillName>/`. Tests override to a temp dir.
14
+ */
15
+ readonly targetDir?: string;
16
+ /** Force-overwrite hand-edited rendered files. */
17
+ readonly force?: boolean;
18
+ /** Override the bundled-skills source dir (tests). */
19
+ readonly _sourceRoot?: string;
20
+ }
21
+ export interface InstalledFile {
22
+ readonly relTarget: string;
23
+ readonly absoluteTarget: string;
24
+ readonly action: "created" | "updated" | "unchanged" | "skipped";
25
+ /** Present when action = "skipped" — explains why. */
26
+ readonly reason?: string;
27
+ }
28
+ export interface InstallResult {
29
+ readonly skillName: string;
30
+ readonly manifestVersion: string;
31
+ readonly configPath: string;
32
+ readonly configIsDefault: boolean;
33
+ readonly resolvedVariables: ReadonlyArray<{
34
+ readonly name: string;
35
+ readonly value: string;
36
+ }>;
37
+ readonly files: ReadonlyArray<InstalledFile>;
38
+ }
39
+ export interface ListedSkill {
40
+ readonly name: string;
41
+ readonly version: string;
42
+ readonly summary: string;
43
+ readonly originatingRepo?: string;
44
+ }
45
+ /**
46
+ * Resolve the absolute path of the bundled-skills source-of-truth root.
47
+ * In dev (running from src/), the path is `<package>/skills/`. In a
48
+ * published install (running from dist/), the path is the same — the
49
+ * `files` array in package.json carries the `skills/` dir verbatim and
50
+ * `dist/skills/index.js`'s ../../skills resolution lands on it.
51
+ */
52
+ export declare function resolveSkillsRoot(): string;
53
+ /**
54
+ * List every bundled skill (one-entry per dir under the source root that
55
+ * has a valid skill.json). Used by `df skills list` + `df_skills_list`.
56
+ */
57
+ export declare function listBundledSkills(sourceRoot?: string): ListedSkill[];
58
+ /**
59
+ * Install one skill into the consumer's `.claude/skills/<name>/`.
60
+ */
61
+ export declare function installSkill(options: InstallOptions): InstallResult;
62
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/skills/install.ts"],"names":[],"mappings":"AA8CA;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,MAAM,CAG9C,CAAC;AAUF,MAAM,WAAW,cAAc;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;IACjE,sDAAsD;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7F,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAK1C;AA8CD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CA2BpE;AA6FD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,CA0HnE"}