@enterprise-skills/orchestrator 3.2.0 → 3.3.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 (48) hide show
  1. package/compliance/fedramp.yaml +30 -0
  2. package/compliance/gdpr.yaml +33 -0
  3. package/compliance/hipaa.yaml +29 -0
  4. package/compliance/iso27001.yaml +29 -0
  5. package/compliance/pcidss.yaml +24 -0
  6. package/compliance/soc2.yaml +33 -0
  7. package/dist/__tests__/compliance.test.d.ts +2 -0
  8. package/dist/__tests__/compliance.test.d.ts.map +1 -0
  9. package/dist/__tests__/compliance.test.js +148 -0
  10. package/dist/__tests__/compliance.test.js.map +1 -0
  11. package/dist/__tests__/preflight-resolver.test.d.ts +2 -0
  12. package/dist/__tests__/preflight-resolver.test.d.ts.map +1 -0
  13. package/dist/__tests__/preflight-resolver.test.js +182 -0
  14. package/dist/__tests__/preflight-resolver.test.js.map +1 -0
  15. package/dist/__tests__/workflow-library.test.d.ts +2 -0
  16. package/dist/__tests__/workflow-library.test.d.ts.map +1 -0
  17. package/dist/__tests__/workflow-library.test.js +185 -0
  18. package/dist/__tests__/workflow-library.test.js.map +1 -0
  19. package/dist/compliance.d.ts +51 -0
  20. package/dist/compliance.d.ts.map +1 -0
  21. package/dist/compliance.js +160 -0
  22. package/dist/compliance.js.map +1 -0
  23. package/dist/index.d.ts +62 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +152 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/preflight-resolver.d.ts +58 -0
  28. package/dist/preflight-resolver.d.ts.map +1 -0
  29. package/dist/preflight-resolver.js +345 -0
  30. package/dist/preflight-resolver.js.map +1 -0
  31. package/dist/types.d.ts +1 -1
  32. package/dist/types.d.ts.map +1 -1
  33. package/dist/workflow-library.d.ts +14 -0
  34. package/dist/workflow-library.d.ts.map +1 -0
  35. package/dist/workflow-library.js +94 -0
  36. package/dist/workflow-library.js.map +1 -0
  37. package/package.json +4 -2
  38. package/workflows/beginner-launchpad.yaml +33 -0
  39. package/workflows/enterprise-control-plane.yaml +38 -0
  40. package/workflows/growth-engine.yaml +33 -0
  41. package/workflows/health-check.yaml +28 -0
  42. package/workflows/incident-triage.yaml +34 -0
  43. package/workflows/post-refactor.yaml +27 -0
  44. package/workflows/product-launch.yaml +54 -0
  45. package/workflows/release-readiness.yaml +62 -0
  46. package/workflows/security-assessment.yaml +60 -0
  47. package/workflows/sprint-close.yaml +30 -0
  48. package/workflows/ux-quality-review.yaml +33 -0
package/dist/index.js CHANGED
@@ -36,7 +36,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
36
36
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.BUILTIN_TRIGGERS = exports.runHardeningSensors = exports.OrchestrationAdvisor = exports.AuditLogger = exports.PolicyEnforcer = exports.SignalRouter = exports.DagResolver = exports.StateMachine = exports.Orchestrator = void 0;
39
+ exports.BUILTIN_TRIGGERS = exports.runHardeningSensors = exports.PreflightResolver = exports.buildComplianceReport = exports.evaluateFramework = exports.listFrameworks = exports.detectControls = exports.WorkflowLibrary = exports.OrchestrationAdvisor = exports.AuditLogger = exports.PolicyEnforcer = exports.SignalRouter = exports.DagResolver = exports.StateMachine = exports.Orchestrator = void 0;
40
40
  const path = __importStar(require("path"));
41
41
  const fs = __importStar(require("fs"));
42
42
  const state_machine_1 = require("./state-machine");
@@ -45,6 +45,8 @@ const signal_router_1 = require("./signal-router");
45
45
  const policy_enforcer_1 = require("./policy-enforcer");
46
46
  const audit_logger_1 = require("./audit-logger");
47
47
  const advisor_1 = require("./advisor");
48
+ const workflow_library_1 = require("./workflow-library");
49
+ const preflight_resolver_1 = require("./preflight-resolver");
48
50
  class Orchestrator {
49
51
  state;
50
52
  dag;
@@ -52,6 +54,7 @@ class Orchestrator {
52
54
  policy;
53
55
  audit;
54
56
  advisor;
57
+ workflows;
55
58
  config;
56
59
  constructor(options) {
57
60
  const stateDir = path.join(options.projectRoot, '.project-ai');
@@ -69,6 +72,7 @@ class Orchestrator {
69
72
  this.policy = new policy_enforcer_1.PolicyEnforcer(options.policyPath);
70
73
  this.audit = new audit_logger_1.AuditLogger(auditLogPath);
71
74
  this.advisor = advisor_1.OrchestrationAdvisor.fromRegistry(path.join(options.projectRoot, 'registry', 'canonical-skills.yaml'));
75
+ this.workflows = new workflow_library_1.WorkflowLibrary(options.projectRoot);
72
76
  }
73
77
  startSession(project, branch) {
74
78
  const ctx = this.state.initSession(project, branch);
@@ -182,6 +186,144 @@ class Orchestrator {
182
186
  }
183
187
  return updated;
184
188
  }
189
+ /**
190
+ * pipeline/PREFLIGHT_RESOLVER_SPEC.md Steps 1-7: deterministic, file-backed
191
+ * resolution of task type, model routing, skill availability, doc load
192
+ * order, and the new-skill gate. Audited as a policy check.
193
+ */
194
+ preflight(request, options = {}) {
195
+ const resolution = new preflight_resolver_1.PreflightResolver(this.config.project_root).resolve(request, options);
196
+ this.audit.log(this.config.session_id, 'policy_check', {
197
+ action: 'preflight_resolved',
198
+ request,
199
+ task_type: resolution.task_type,
200
+ match_phase: resolution.match_phase,
201
+ matches: resolution.matches.map(m => m.skill_id),
202
+ model: resolution.model,
203
+ authority_pack: resolution.authority_pack,
204
+ warnings: resolution.warnings,
205
+ });
206
+ return resolution;
207
+ }
208
+ /**
209
+ * Agent brief: the advisor/gate state an IDE agent should consume at turn
210
+ * start — last task contract, pending signals, and the active workflow's
211
+ * ready steps (gates auto-resolved first). Written to
212
+ * .project-ai/skill-outputs/_agent-brief.md by the CLI so hooks can inject
213
+ * it and agents can read it deterministically.
214
+ */
215
+ composeBrief() {
216
+ const contract = this.state.readTaskContract();
217
+ const signals = this.state.getPendingSignals();
218
+ let workflow = null;
219
+ const wfState = this.state.getWorkflowState();
220
+ if (wfState) {
221
+ let ready = [];
222
+ if (wfState.status === 'running') {
223
+ try {
224
+ const def = this.workflows.load(wfState.workflow);
225
+ ready = this.advanceWorkflow(def).actionable;
226
+ }
227
+ catch {
228
+ // Definition not resolvable (e.g. one-off --file workflow): report
229
+ // state without ready-step resolution rather than failing the brief.
230
+ }
231
+ }
232
+ const latest = this.state.getWorkflowState();
233
+ workflow = { name: wfState.workflow, status: latest?.status ?? wfState.status, ready };
234
+ }
235
+ return { contract, signals, workflow };
236
+ }
237
+ listWorkflows() {
238
+ return this.workflows.list();
239
+ }
240
+ loadWorkflow(nameOrFile) {
241
+ return this.workflows.load(nameOrFile);
242
+ }
243
+ /**
244
+ * Advance the active workflow: auto-resolve every ready gate and conditional
245
+ * step (recording decisions + audit events), then return the actionable
246
+ * sequential/parallel steps whose dependencies are satisfied. Gate failures
247
+ * with fail_action STOP halt the workflow (`stopped_at_gate`) — the
248
+ * governance stop-condition, never bypassed. A failed gate with a non-STOP
249
+ * fail_action records the decision and marks the gate `skipped` so the DAG
250
+ * can continue; the branch target is advisory for the executing agent.
251
+ */
252
+ advanceWorkflow(workflow) {
253
+ const resolved = [];
254
+ // Loop: resolving a gate can unblock further gates/conditionals.
255
+ for (;;) {
256
+ const state = this.state.getWorkflowState();
257
+ if (!state || state.status !== 'running') {
258
+ return { state, actionable: [], resolved };
259
+ }
260
+ const ready = this.dag.getReadySteps(workflow, state);
261
+ const auto = ready.find(s => s.type === 'gate' || s.type === 'conditional');
262
+ if (!auto) {
263
+ return {
264
+ state,
265
+ actionable: ready.map(s => ({ id: s.id, type: s.type, skill: s.skill, skills: s.skills })),
266
+ resolved,
267
+ };
268
+ }
269
+ const getOutput = (skillId) => this.state.readSkillOutput(skillId);
270
+ if (auto.type === 'gate') {
271
+ const decision = this.dag.evaluateGate(auto, getOutput);
272
+ state.gate_decisions.push(decision);
273
+ this.audit.log(this.config.session_id, 'gate_result', {
274
+ workflow: state.workflow,
275
+ gate: auto.id,
276
+ result: decision.result,
277
+ reason: decision.reason,
278
+ }, undefined, state.workflow);
279
+ resolved.push({ id: auto.id, type: 'gate', outcome: `${decision.result}: ${decision.reason}` });
280
+ if (decision.result === 'pass') {
281
+ this.state.writeWorkflowState(this.dag.completeStep(state, auto.id, 'completed', 0, []));
282
+ }
283
+ else if (auto.fail_action === 'STOP' || !auto.fail_action) {
284
+ state.status = 'stopped_at_gate';
285
+ state.last_updated = new Date().toISOString();
286
+ this.state.writeWorkflowState(state);
287
+ this.audit.log(this.config.session_id, 'workflow_complete', {
288
+ workflow: state.workflow,
289
+ status: 'stopped_at_gate',
290
+ gate: auto.id,
291
+ reason: decision.reason,
292
+ }, undefined, state.workflow);
293
+ }
294
+ else {
295
+ this.state.writeWorkflowState(this.dag.completeStep(state, auto.id, 'skipped', 0, []));
296
+ }
297
+ }
298
+ else {
299
+ const target = this.dag.evaluateConditional(auto, getOutput);
300
+ this.audit.log(this.config.session_id, 'gate_result', {
301
+ workflow: state.workflow,
302
+ conditional: auto.id,
303
+ branch: target ?? 'SKIP',
304
+ }, undefined, state.workflow);
305
+ resolved.push({ id: auto.id, type: 'conditional', outcome: target ?? 'SKIP' });
306
+ this.state.writeWorkflowState(this.dag.completeStep(state, auto.id, target ? 'completed' : 'skipped', 0, []));
307
+ }
308
+ }
309
+ }
310
+ abortWorkflow(reason) {
311
+ const state = this.state.getWorkflowState();
312
+ if (!state)
313
+ throw new Error('No active workflow');
314
+ if (state.status === 'running') {
315
+ state.status = 'aborted';
316
+ state.last_updated = new Date().toISOString();
317
+ this.state.writeWorkflowState(state);
318
+ }
319
+ this.audit.log(this.config.session_id, 'workflow_complete', {
320
+ workflow: state.workflow,
321
+ status: state.status,
322
+ action: 'abort',
323
+ reason,
324
+ }, undefined, state.workflow);
325
+ return state;
326
+ }
185
327
  adviseUserInput(request, options = {}) {
186
328
  const session = this.state.getSessionContext();
187
329
  const decision = this.advisor.advise({
@@ -257,6 +399,15 @@ var audit_logger_2 = require("./audit-logger");
257
399
  Object.defineProperty(exports, "AuditLogger", { enumerable: true, get: function () { return audit_logger_2.AuditLogger; } });
258
400
  var advisor_2 = require("./advisor");
259
401
  Object.defineProperty(exports, "OrchestrationAdvisor", { enumerable: true, get: function () { return advisor_2.OrchestrationAdvisor; } });
402
+ var workflow_library_2 = require("./workflow-library");
403
+ Object.defineProperty(exports, "WorkflowLibrary", { enumerable: true, get: function () { return workflow_library_2.WorkflowLibrary; } });
404
+ var compliance_1 = require("./compliance");
405
+ Object.defineProperty(exports, "detectControls", { enumerable: true, get: function () { return compliance_1.detectControls; } });
406
+ Object.defineProperty(exports, "listFrameworks", { enumerable: true, get: function () { return compliance_1.listFrameworks; } });
407
+ Object.defineProperty(exports, "evaluateFramework", { enumerable: true, get: function () { return compliance_1.evaluateFramework; } });
408
+ Object.defineProperty(exports, "buildComplianceReport", { enumerable: true, get: function () { return compliance_1.buildComplianceReport; } });
409
+ var preflight_resolver_2 = require("./preflight-resolver");
410
+ Object.defineProperty(exports, "PreflightResolver", { enumerable: true, get: function () { return preflight_resolver_2.PreflightResolver; } });
260
411
  var hardening_sensors_1 = require("./hardening-sensors");
261
412
  Object.defineProperty(exports, "runHardeningSensors", { enumerable: true, get: function () { return hardening_sensors_1.runHardeningSensors; } });
262
413
  var builtin_triggers_1 = require("./builtin-triggers");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ export type TaskType = 'strategy' | 'architecture' | 'implementation' | 'skill_creation';
2
+ export type DocPhase = 'session_start' | 'before_code_changes' | 'before_schema_changes' | 'before_rag_changes' | 'before_agent_changes' | 'before_alignment_changes' | 'before_skill_refinement' | 'before_promotion';
3
+ export interface SkillMatch {
4
+ skill_id: string;
5
+ score: number;
6
+ matched_via: string[];
7
+ active: boolean;
8
+ }
9
+ export interface DocToLoad {
10
+ path: string;
11
+ required: boolean;
12
+ exists: boolean;
13
+ }
14
+ export interface NewSkillGate {
15
+ requested: boolean;
16
+ allowed: boolean;
17
+ overlaps: string[];
18
+ enforcement: string;
19
+ note: string;
20
+ }
21
+ export interface PreflightResolution {
22
+ request: string;
23
+ task_type: TaskType;
24
+ authority_pack: 'loaded' | 'missing';
25
+ model_family: 'strategy' | 'architecture' | 'implementation';
26
+ model: string | null;
27
+ match_phase: 'exact' | 'keyword' | 'category' | 'none';
28
+ matches: SkillMatch[];
29
+ category: string | null;
30
+ docs: DocToLoad[];
31
+ new_skill: NewSkillGate | null;
32
+ warnings: string[];
33
+ }
34
+ export interface PreflightOptions {
35
+ phase?: DocPhase;
36
+ registryPath?: string;
37
+ }
38
+ export declare class PreflightResolver {
39
+ private projectRoot;
40
+ constructor(projectRoot: string);
41
+ private stateDir;
42
+ private loadRegistry;
43
+ private loadAliasMap;
44
+ private loadActiveSkillIds;
45
+ classify(request: string): TaskType;
46
+ private scoreEntry;
47
+ /**
48
+ * Spec Step 4 duplicate search: skill_id / alias / trigger overlap against
49
+ * the subject of the creation request (the creation phrasing itself is
50
+ * stripped so "new"/"skill" don't produce noise). Deliberately separate
51
+ * from the phased matching above — the Phase-3 category fallback is a
52
+ * suggestion mechanism and must not veto creation, while a sub-threshold
53
+ * keyword score must not green-light a duplicate.
54
+ */
55
+ private findCreationOverlaps;
56
+ resolve(request: string, options?: PreflightOptions): PreflightResolution;
57
+ }
58
+ //# sourceMappingURL=preflight-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight-resolver.d.ts","sourceRoot":"","sources":["../src/preflight-resolver.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AACzF,MAAM,MAAM,QAAQ,GAChB,eAAe,GACf,qBAAqB,GACrB,uBAAuB,GACvB,oBAAoB,GACpB,sBAAsB,GACtB,0BAA0B,GAC1B,yBAAyB,GACzB,kBAAkB,CAAC;AAEvB,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,QAAQ,CAAC;IACpB,cAAc,EAAE,QAAQ,GAAG,SAAS,CAAC;IACrC,YAAY,EAAE,UAAU,GAAG,cAAc,GAAG,gBAAgB,CAAC;IAC7D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;IACvD,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,SAAS,EAAE,YAAY,GAAG,IAAI,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAkED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM;IAEvC,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,kBAAkB;IAY1B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ;IAqBnC,OAAO,CAAC,UAAU;IAqClB;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,mBAAmB;CAmJ9E"}
@@ -0,0 +1,345 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PreflightResolver = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const yaml = __importStar(require("js-yaml"));
40
+ // Spec Step 3 Phase 2 weights.
41
+ const SCORE_TRIGGER = 10;
42
+ const SCORE_ALIAS = 8;
43
+ const SCORE_DESCRIPTION_KEYWORD = 3;
44
+ const SCORE_CATEGORY = 2;
45
+ const SCORE_ACTIVATION_TAG = 5;
46
+ const KEYWORD_THRESHOLD = 15;
47
+ const TOP_MATCHES = 3;
48
+ // Spec Step 3 Phase 3 keyword-to-category table.
49
+ const CATEGORY_TABLE = [
50
+ { keywords: ['security', 'auth', 'secrets', 'vulnerability'], category: 'security', candidates: ['security-audit', 'rag-audit'] },
51
+ { keywords: ['test', 'coverage', 'suite', 'spec'], category: 'testing', candidates: ['test-orchestrator', 'bootstrap-testing'] },
52
+ { keywords: ['deploy', 'release', 'ship', 'production'], category: 'deployment', candidates: ['pre-deploy-check', 'changelog-generator'] },
53
+ { keywords: ['performance', 'slow', 'speed', 'optimize'], category: 'performance', candidates: ['performance-audit'] },
54
+ { keywords: ['database', 'schema', 'migration', 'table'], category: 'database', candidates: ['db-migration-agent', 'db-explorer'] },
55
+ { keywords: ['review', 'quality', 'standards', 'lint'], category: 'quality', candidates: ['code-review', 'full-stack-audit'] },
56
+ { keywords: ['bug', 'error', 'broken', 'fix', 'debug'], category: 'debugging', candidates: ['bug-hunter', 'incident-response'] },
57
+ { keywords: ['feature', 'build', 'implement', 'add'], category: 'building', candidates: ['feature-builder'] },
58
+ { keywords: ['docs', 'document', 'api spec', 'swagger'], category: 'documentation', candidates: ['api-docs-generator', 'adr-manager', 'onboarding-guide'] },
59
+ { keywords: ['compliance', 'soc', 'hipaa', 'gdpr', 'audit'], category: 'compliance', candidates: ['compliance-mapper', 'security-audit'] },
60
+ { keywords: ['incident', 'outage', 'down', 'emergency'], category: 'incident', candidates: ['incident-response'] },
61
+ { keywords: ['architecture', 'adr', 'decision', 'design'], category: 'architecture', candidates: ['adr-manager'] },
62
+ { keywords: ['onboard', 'getting started', 'new', 'explain'], category: 'onboarding', candidates: ['onboarding-guide'] },
63
+ { keywords: ['refactor', 'clean', 'reorganize', 'simplify'], category: 'refactoring', candidates: ['refactor-agent'] },
64
+ { keywords: ['project', 'status', 'health', 'dashboard'], category: 'management', candidates: ['project-manager'] },
65
+ { keywords: ['feedback', 'improve', 'learn', 'refinement'], category: 'learning', candidates: ['skill-learner'] },
66
+ { keywords: ['ai', 'agent', 'rag', 'alignment', 'model'], category: 'ai-governance', candidates: ['rag-audit', 'agentic-audit', 'alignment-audit'] },
67
+ ];
68
+ function loadYamlFile(filePath) {
69
+ try {
70
+ if (!fs.existsSync(filePath))
71
+ return null;
72
+ return yaml.load(fs.readFileSync(filePath, 'utf-8'));
73
+ }
74
+ catch {
75
+ return null;
76
+ }
77
+ }
78
+ function tokenize(request) {
79
+ return request.toLowerCase().split(/[^a-z0-9-]+/).filter(t => t.length > 3);
80
+ }
81
+ // Word-boundary containment without dynamic RegExp construction (registry
82
+ // values are semi-trusted, but security/detect-unsafe-regex is right that
83
+ // building patterns from data is the wrong tool here).
84
+ function containsWord(text, word) {
85
+ const needle = word.toLowerCase();
86
+ if (needle.length === 0)
87
+ return false;
88
+ const isWordChar = (c) => c !== undefined && /[a-z0-9-]/.test(c);
89
+ let from = 0;
90
+ for (;;) {
91
+ const idx = text.indexOf(needle, from);
92
+ if (idx === -1)
93
+ return false;
94
+ if (!isWordChar(text[idx - 1]) && !isWordChar(text[idx + needle.length]))
95
+ return true;
96
+ from = idx + 1;
97
+ }
98
+ }
99
+ class PreflightResolver {
100
+ projectRoot;
101
+ constructor(projectRoot) {
102
+ this.projectRoot = projectRoot;
103
+ }
104
+ stateDir() {
105
+ return path.join(this.projectRoot, '.project-ai');
106
+ }
107
+ loadRegistry(explicit) {
108
+ const candidates = [
109
+ explicit,
110
+ path.join(this.projectRoot, 'registry', 'canonical-skills.yaml'),
111
+ path.join(this.stateDir(), 'SKILL_REGISTRY_SNAPSHOT.yaml'),
112
+ ].filter((p) => Boolean(p));
113
+ for (const candidate of candidates) {
114
+ const parsed = loadYamlFile(candidate);
115
+ if (parsed?.skills && Array.isArray(parsed.skills)) {
116
+ return { entries: parsed.skills, found: true };
117
+ }
118
+ }
119
+ return { entries: [], found: false };
120
+ }
121
+ loadAliasMap() {
122
+ const parsed = loadYamlFile(path.join(this.projectRoot, 'registry', 'skill-aliases.yaml'));
123
+ return parsed?.aliases ?? {};
124
+ }
125
+ loadActiveSkillIds() {
126
+ const parsed = loadYamlFile(path.join(this.stateDir(), 'ACTIVE_SKILLS.yaml'));
127
+ if (!parsed?.active)
128
+ return null;
129
+ return new Set(parsed.active
130
+ .filter(item => item.reason !== 'not_applicable')
131
+ .map(item => item.skill_id));
132
+ }
133
+ classify(request) {
134
+ const text = request.toLowerCase().replace(/\s+/g, ' ');
135
+ // "create/add/... [a] [new] skill" — token scan keeps
136
+ // security/detect-unsafe-regex quiet (no optional-group regex).
137
+ const tokens = text.split(' ');
138
+ const verbs = ['create', 'add', 'build', 'write', 'make'];
139
+ const skillIdx = tokens.findIndex(t => t === 'skill' || t === 'skills');
140
+ const verbBeforeSkill = skillIdx > 0 &&
141
+ tokens.slice(Math.max(0, skillIdx - 3), skillIdx).some(t => verbs.includes(t));
142
+ if (verbBeforeSkill || text.includes('skill for ')) {
143
+ return 'skill_creation';
144
+ }
145
+ if (/^should\s|\bshould we\b|\bstrategy\b|\broadmap\b|\bwhat .* next\b|\bhow should .* evolve\b/.test(text)) {
146
+ return 'strategy';
147
+ }
148
+ if (/\bdesign\b|\bschema\b|\badr\b|\barchitecture\b|\brestructure\b|\bplan the\b/.test(text)) {
149
+ return 'architecture';
150
+ }
151
+ return 'implementation';
152
+ }
153
+ scoreEntry(entry, request, tokens) {
154
+ const text = request.toLowerCase();
155
+ let score = 0;
156
+ const via = [];
157
+ for (const trigger of entry.trigger_phrases ?? []) {
158
+ if (text.includes(trigger.toLowerCase())) {
159
+ score += SCORE_TRIGGER;
160
+ via.push(`trigger:"${trigger}"`);
161
+ }
162
+ }
163
+ for (const alias of entry.aliases ?? []) {
164
+ if (containsWord(text, alias)) {
165
+ score += SCORE_ALIAS;
166
+ via.push(`alias:${alias}`);
167
+ }
168
+ }
169
+ const description = (entry.description ?? '').toLowerCase();
170
+ for (const token of tokens) {
171
+ if (description.includes(token)) {
172
+ score += SCORE_DESCRIPTION_KEYWORD;
173
+ via.push(`desc:${token}`);
174
+ }
175
+ }
176
+ if (entry.category && tokens.includes(entry.category.toLowerCase())) {
177
+ score += SCORE_CATEGORY;
178
+ via.push(`category:${entry.category}`);
179
+ }
180
+ for (const tag of entry.activation_tags ?? []) {
181
+ if (tokens.includes(tag.toLowerCase())) {
182
+ score += SCORE_ACTIVATION_TAG;
183
+ via.push(`tag:${tag}`);
184
+ }
185
+ }
186
+ return { score, via };
187
+ }
188
+ /**
189
+ * Spec Step 4 duplicate search: skill_id / alias / trigger overlap against
190
+ * the subject of the creation request (the creation phrasing itself is
191
+ * stripped so "new"/"skill" don't produce noise). Deliberately separate
192
+ * from the phased matching above — the Phase-3 category fallback is a
193
+ * suggestion mechanism and must not veto creation, while a sub-threshold
194
+ * keyword score must not green-light a duplicate.
195
+ */
196
+ findCreationOverlaps(request, entries) {
197
+ const subject = request
198
+ .toLowerCase()
199
+ .replace(/\b(create|add|build|write|make|a|an|new|skill|skills|for|that|which|to)\b/g, ' ');
200
+ const subjectTokens = tokenize(subject);
201
+ if (subjectTokens.length === 0)
202
+ return [];
203
+ const overlaps = [];
204
+ for (const entry of entries) {
205
+ const idTokens = entry.skill_id.toLowerCase().split('-');
206
+ const aliasTokens = (entry.aliases ?? []).flatMap(a => a.toLowerCase().split(/[\s-]+/));
207
+ const idHit = subjectTokens.some(t => idTokens.some(idTok => idTok.length > 3 && (t.startsWith(idTok) || idTok.startsWith(t))));
208
+ const aliasHit = subjectTokens.some(t => aliasTokens.includes(t));
209
+ const triggerHit = (entry.trigger_phrases ?? []).some(p => subject.includes(p.toLowerCase()));
210
+ if (idHit || aliasHit || triggerHit)
211
+ overlaps.push(entry.skill_id);
212
+ }
213
+ return overlaps;
214
+ }
215
+ resolve(request, options = {}) {
216
+ const warnings = [];
217
+ const tokens = tokenize(request);
218
+ const text = request.toLowerCase();
219
+ // Step 1 — authority pack (fall back to full activation when missing).
220
+ const activeIds = this.loadActiveSkillIds();
221
+ const authorityPack = activeIds ? 'loaded' : 'missing';
222
+ if (!activeIds) {
223
+ warnings.push('Authority pack missing - falling back to full activation (all skills considered active).');
224
+ }
225
+ // Step 2 — task classification.
226
+ const taskType = this.classify(request);
227
+ // Step 3 — skill availability.
228
+ const { entries, found: registryFound } = this.loadRegistry(options.registryPath);
229
+ if (!registryFound) {
230
+ warnings.push('Registry snapshot missing - cannot score skills; duplicate risk unchecked.');
231
+ }
232
+ const aliasMap = this.loadAliasMap();
233
+ const isActive = (id) => (activeIds ? activeIds.has(id) : true);
234
+ let matchPhase = 'none';
235
+ let matches = [];
236
+ let category = null;
237
+ // Phase 1: exact skill_id or alias-map hit.
238
+ const exact = entries.filter(e => containsWord(text, e.skill_id));
239
+ const aliasHits = Object.entries(aliasMap)
240
+ .filter(([alias]) => containsWord(text, alias))
241
+ .map(([alias, id]) => ({ alias, id }));
242
+ if (exact.length > 0 || aliasHits.length > 0) {
243
+ matchPhase = 'exact';
244
+ const seen = new Set();
245
+ for (const e of exact) {
246
+ seen.add(e.skill_id);
247
+ matches.push({ skill_id: e.skill_id, score: 100, matched_via: ['exact:skill_id'], active: isActive(e.skill_id) });
248
+ }
249
+ for (const hit of aliasHits) {
250
+ if (seen.has(hit.id))
251
+ continue;
252
+ seen.add(hit.id);
253
+ matches.push({ skill_id: hit.id, score: 100, matched_via: [`exact:alias:${hit.alias}`], active: isActive(hit.id) });
254
+ }
255
+ }
256
+ // Phase 2: weighted keyword scoring.
257
+ if (matches.length === 0 && entries.length > 0) {
258
+ const scored = entries
259
+ .map(entry => ({ entry, ...this.scoreEntry(entry, request, tokens) }))
260
+ .filter(item => item.score > KEYWORD_THRESHOLD)
261
+ .sort((a, b) => b.score - a.score)
262
+ .slice(0, TOP_MATCHES);
263
+ if (scored.length > 0) {
264
+ matchPhase = 'keyword';
265
+ matches = scored.map(item => ({
266
+ skill_id: item.entry.skill_id,
267
+ score: item.score,
268
+ matched_via: item.via,
269
+ active: isActive(item.entry.skill_id),
270
+ }));
271
+ }
272
+ }
273
+ // Phase 3: semantic category fallback.
274
+ if (matches.length === 0) {
275
+ const row = CATEGORY_TABLE.find(r => r.keywords.some(k => (k.includes(' ') ? text.includes(k) : tokens.includes(k) || text.split(/[^a-z0-9]+/).includes(k))));
276
+ if (row) {
277
+ matchPhase = 'category';
278
+ category = row.category;
279
+ matches = row.candidates.map(id => ({
280
+ skill_id: id,
281
+ score: 0,
282
+ matched_via: [`category:${row.category}`],
283
+ active: isActive(id),
284
+ }));
285
+ }
286
+ }
287
+ for (const match of matches.filter(m => !m.active)) {
288
+ warnings.push(`Skill "${match.skill_id}" matches but is not active in ACTIVE_SKILLS.yaml - offer to activate.`);
289
+ }
290
+ // Step 4 — new-skill gate.
291
+ let newSkill = null;
292
+ if (taskType === 'skill_creation') {
293
+ const policy = loadYamlFile(path.join(this.stateDir(), 'NEW_SKILL_POLICY.yaml'));
294
+ const overlaps = this.findCreationOverlaps(request, entries);
295
+ const enforcement = String(policy?.enforcement ?? 'unknown');
296
+ const creationAllowed = policy ? policy.allow_canonical_creation === true || policy.allow_project_local === true : false;
297
+ const allowed = creationAllowed && overlaps.length === 0;
298
+ newSkill = {
299
+ requested: true,
300
+ allowed,
301
+ overlaps,
302
+ enforcement,
303
+ note: overlaps.length > 0
304
+ ? `Overlapping skill(s) exist: ${overlaps.join(', ')} - do not create a duplicate.`
305
+ : creationAllowed
306
+ ? 'No overlap found - creation allowed; rationale + decision-log entry required.'
307
+ : 'Creation not allowed by policy - canonical creation requires hub approval.',
308
+ };
309
+ }
310
+ // Step 5 — doc load order for the phase.
311
+ const phase = options.phase ?? (taskType === 'architecture' ? 'before_schema_changes'
312
+ : taskType === 'strategy' ? 'session_start'
313
+ : 'before_code_changes');
314
+ const docsFile = loadYamlFile(path.join(this.stateDir(), 'AUTHORITATIVE_DOCS.yaml'));
315
+ const docs = (docsFile?.[phase] ?? []).map(doc => ({
316
+ path: doc.path,
317
+ required: doc.required === true,
318
+ exists: fs.existsSync(path.join(this.projectRoot, doc.path)),
319
+ }));
320
+ for (const doc of docs.filter(d => d.required && !d.exists)) {
321
+ warnings.push(`Required doc unreadable: ${doc.path} - do not proceed until resolved.`);
322
+ }
323
+ // Step 6 — model routing.
324
+ const modelFamily = taskType === 'architecture' ? 'architecture'
325
+ : taskType === 'implementation' ? 'implementation'
326
+ : 'strategy'; // strategy + skill_creation route to strategy; ambiguity defaults to strategy per MODEL_ROUTING
327
+ const routing = loadYamlFile(path.join(this.stateDir(), 'MODEL_ROUTING.yaml'));
328
+ const model = routing?.mappings?.[modelFamily] ?? null;
329
+ return {
330
+ request,
331
+ task_type: taskType,
332
+ authority_pack: authorityPack,
333
+ model_family: modelFamily,
334
+ model,
335
+ match_phase: matchPhase,
336
+ matches,
337
+ category,
338
+ docs,
339
+ new_skill: newSkill,
340
+ warnings,
341
+ };
342
+ }
343
+ }
344
+ exports.PreflightResolver = PreflightResolver;
345
+ //# sourceMappingURL=preflight-resolver.js.map