nimai-cli 0.1.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.
- package/dist/adapters/anthropic.d.ts +9 -0
- package/dist/adapters/anthropic.d.ts.map +1 -0
- package/dist/adapters/anthropic.js +43 -0
- package/dist/adapters/anthropic.js.map +1 -0
- package/dist/adapters/errors.d.ts +5 -0
- package/dist/adapters/errors.d.ts.map +1 -0
- package/dist/adapters/errors.js +13 -0
- package/dist/adapters/errors.js.map +1 -0
- package/dist/adapters/ollama.d.ts +8 -0
- package/dist/adapters/ollama.d.ts.map +1 -0
- package/dist/adapters/ollama.js +34 -0
- package/dist/adapters/ollama.js.map +1 -0
- package/dist/adapters/openai.d.ts +9 -0
- package/dist/adapters/openai.d.ts.map +1 -0
- package/dist/adapters/openai.js +46 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/adapters/types.d.ts +9 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +3 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/commands/new.d.ts +5 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +55 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/review.d.ts +5 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +63 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/spec.d.ts +14 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +163 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/validate.d.ts +5 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +50 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/config.d.ts +34 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +90 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ModelAdapter } from './types';
|
|
2
|
+
export declare const DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
3
|
+
export declare class AnthropicAdapter implements ModelAdapter {
|
|
4
|
+
private client;
|
|
5
|
+
private model;
|
|
6
|
+
constructor(apiKey: string, model?: string);
|
|
7
|
+
generate(prompt: string): Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,eAAO,MAAM,aAAa,sBAAsB,CAAC;AAEjD,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAsB;IAKnD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA2BhD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.AnthropicAdapter = exports.DEFAULT_MODEL = void 0;
|
|
7
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
8
|
+
const errors_1 = require("./errors");
|
|
9
|
+
exports.DEFAULT_MODEL = 'claude-sonnet-4-6';
|
|
10
|
+
class AnthropicAdapter {
|
|
11
|
+
client;
|
|
12
|
+
model;
|
|
13
|
+
constructor(apiKey, model = exports.DEFAULT_MODEL) {
|
|
14
|
+
this.client = new sdk_1.default({ apiKey });
|
|
15
|
+
this.model = model;
|
|
16
|
+
}
|
|
17
|
+
async generate(prompt) {
|
|
18
|
+
try {
|
|
19
|
+
const message = await this.client.messages.create({
|
|
20
|
+
model: this.model,
|
|
21
|
+
max_tokens: 4096,
|
|
22
|
+
messages: [{ role: 'user', content: prompt }],
|
|
23
|
+
});
|
|
24
|
+
const block = message.content[0];
|
|
25
|
+
if (block.type !== 'text') {
|
|
26
|
+
throw new errors_1.AdapterError('Unexpected response type from Anthropic API');
|
|
27
|
+
}
|
|
28
|
+
return block.text;
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
if (err instanceof errors_1.AdapterError)
|
|
32
|
+
throw err;
|
|
33
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
34
|
+
// Surface auth errors clearly
|
|
35
|
+
if (message.includes('401') || message.includes('authentication')) {
|
|
36
|
+
throw new errors_1.AdapterError('Anthropic API authentication failed. Check your ANTHROPIC_API_KEY.', err);
|
|
37
|
+
}
|
|
38
|
+
throw new errors_1.AdapterError(`Anthropic API error: ${message}`, err);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.AnthropicAdapter = AnthropicAdapter;
|
|
43
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/adapters/anthropic.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA0C;AAE1C,qCAAwC;AAE3B,QAAA,aAAa,GAAG,mBAAmB,CAAC;AAEjD,MAAa,gBAAgB;IACnB,MAAM,CAAY;IAClB,KAAK,CAAS;IAEtB,YAAY,MAAc,EAAE,QAAgB,qBAAa;QACvD,IAAI,CAAC,MAAM,GAAG,IAAI,aAAS,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAChD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAC9C,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC1B,MAAM,IAAI,qBAAY,CAAC,6CAA6C,CAAC,CAAC;YACxE,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,qBAAY;gBAAE,MAAM,GAAG,CAAC;YAE3C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,8BAA8B;YAC9B,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,qBAAY,CACpB,oEAAoE,EACpE,GAAG,CACJ,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,qBAAY,CAAC,wBAAwB,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF;AApCD,4CAoCC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/adapters/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAa,SAAQ,KAAK;aAGnB,KAAK,CAAC,EAAE,OAAO;gBAD/B,OAAO,EAAE,MAAM,EACC,KAAK,CAAC,EAAE,OAAO,YAAA;CAKlC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdapterError = void 0;
|
|
4
|
+
class AdapterError extends Error {
|
|
5
|
+
cause;
|
|
6
|
+
constructor(message, cause) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.cause = cause;
|
|
9
|
+
this.name = 'AdapterError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.AdapterError = AdapterError;
|
|
13
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/adapters/errors.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAa,SAAQ,KAAK;IAGnB;IAFlB,YACE,OAAe,EACC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAU;QAG/B,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AARD,oCAQC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ModelAdapter } from './types';
|
|
2
|
+
export declare class OllamaAdapter implements ModelAdapter {
|
|
3
|
+
private baseUrl;
|
|
4
|
+
private model;
|
|
5
|
+
constructor(baseUrl?: string, model?: string);
|
|
6
|
+
generate(prompt: string): Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,qBAAa,aAAc,YAAW,YAAY;IAE9C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;gBADL,OAAO,GAAE,MAAiC,EAC1C,KAAK,GAAE,MAAiB;IAG5B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAwBhD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OllamaAdapter = void 0;
|
|
4
|
+
const errors_1 = require("./errors");
|
|
5
|
+
class OllamaAdapter {
|
|
6
|
+
baseUrl;
|
|
7
|
+
model;
|
|
8
|
+
constructor(baseUrl = 'http://localhost:11434', model = 'llama3') {
|
|
9
|
+
this.baseUrl = baseUrl;
|
|
10
|
+
this.model = model;
|
|
11
|
+
}
|
|
12
|
+
async generate(prompt) {
|
|
13
|
+
let res;
|
|
14
|
+
try {
|
|
15
|
+
res = await fetch(`${this.baseUrl}/api/generate`, {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: { 'Content-Type': 'application/json' },
|
|
18
|
+
body: JSON.stringify({ model: this.model, prompt, stream: false }),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
throw new errors_1.AdapterError(`Ollama connection failed at ${this.baseUrl}. Is Ollama running? (${err.message})`, err);
|
|
23
|
+
}
|
|
24
|
+
if (!res.ok) {
|
|
25
|
+
throw new errors_1.AdapterError(`Ollama API error: ${res.status} ${res.statusText}`);
|
|
26
|
+
}
|
|
27
|
+
const data = await res.json();
|
|
28
|
+
if (!data?.response)
|
|
29
|
+
throw new errors_1.AdapterError('Unexpected response shape from Ollama API');
|
|
30
|
+
return data.response;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.OllamaAdapter = OllamaAdapter;
|
|
34
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/adapters/ollama.ts"],"names":[],"mappings":";;;AACA,qCAAwC;AAExC,MAAa,aAAa;IAEd;IACA;IAFV,YACU,UAAkB,wBAAwB,EAC1C,QAAgB,QAAQ;QADxB,YAAO,GAAP,OAAO,CAAmC;QAC1C,UAAK,GAAL,KAAK,CAAmB;IAC/B,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,eAAe,EAAE;gBAChD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;aACnE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,qBAAY,CACpB,+BAA+B,IAAI,CAAC,OAAO,yBAA0B,GAAa,CAAC,OAAO,GAAG,EAC7F,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,qBAAY,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9E,CAAC;QAGD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAoB,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,QAAQ;YAAE,MAAM,IAAI,qBAAY,CAAC,2CAA2C,CAAC,CAAC;QACzF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;CACF;AA9BD,sCA8BC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ModelAdapter } from './types';
|
|
2
|
+
export declare class OpenAIAdapter implements ModelAdapter {
|
|
3
|
+
private apiKey;
|
|
4
|
+
private model;
|
|
5
|
+
private baseUrl;
|
|
6
|
+
constructor(apiKey: string, model?: string, baseUrl?: string);
|
|
7
|
+
generate(prompt: string): Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,qBAAa,aAAc,YAAW,YAAY;IAE9C,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;gBAFP,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAiB,EACxB,OAAO,GAAE,MAAoC;IAGjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA+BhD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OpenAIAdapter = void 0;
|
|
4
|
+
const errors_1 = require("./errors");
|
|
5
|
+
class OpenAIAdapter {
|
|
6
|
+
apiKey;
|
|
7
|
+
model;
|
|
8
|
+
baseUrl;
|
|
9
|
+
constructor(apiKey, model = 'gpt-4o', baseUrl = 'https://api.openai.com/v1') {
|
|
10
|
+
this.apiKey = apiKey;
|
|
11
|
+
this.model = model;
|
|
12
|
+
this.baseUrl = baseUrl;
|
|
13
|
+
}
|
|
14
|
+
async generate(prompt) {
|
|
15
|
+
let res;
|
|
16
|
+
try {
|
|
17
|
+
res = await fetch(`${this.baseUrl}/chat/completions`, {
|
|
18
|
+
method: 'POST',
|
|
19
|
+
headers: {
|
|
20
|
+
'Content-Type': 'application/json',
|
|
21
|
+
Authorization: `Bearer ${this.apiKey}`,
|
|
22
|
+
},
|
|
23
|
+
body: JSON.stringify({
|
|
24
|
+
model: this.model,
|
|
25
|
+
messages: [{ role: 'user', content: prompt }],
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
throw new errors_1.AdapterError(`OpenAI API network error: ${err.message}`, err);
|
|
31
|
+
}
|
|
32
|
+
if (!res.ok) {
|
|
33
|
+
if (res.status === 401) {
|
|
34
|
+
throw new errors_1.AdapterError('OpenAI API authentication failed. Check your OPENAI_API_KEY.');
|
|
35
|
+
}
|
|
36
|
+
throw new errors_1.AdapterError(`OpenAI API error: ${res.status} ${res.statusText}`);
|
|
37
|
+
}
|
|
38
|
+
const data = await res.json();
|
|
39
|
+
const content = data?.choices?.[0]?.message?.content;
|
|
40
|
+
if (!content)
|
|
41
|
+
throw new errors_1.AdapterError('Unexpected response shape from OpenAI API');
|
|
42
|
+
return content;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.OpenAIAdapter = OpenAIAdapter;
|
|
46
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/adapters/openai.ts"],"names":[],"mappings":";;;AACA,qCAAwC;AAExC,MAAa,aAAa;IAEd;IACA;IACA;IAHV,YACU,MAAc,EACd,QAAgB,QAAQ,EACxB,UAAkB,2BAA2B;QAF7C,WAAM,GAAN,MAAM,CAAQ;QACd,UAAK,GAAL,KAAK,CAAmB;QACxB,YAAO,GAAP,OAAO,CAAsC;IACpD,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,MAAc;QAC3B,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,mBAAmB,EAAE;gBACpD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;iBACvC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;iBAC9C,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,qBAAY,CAAC,6BAA8B,GAAa,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvB,MAAM,IAAI,qBAAY,CAAC,8DAA8D,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,IAAI,qBAAY,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC9E,CAAC;QAGD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAoB,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,qBAAY,CAAC,2CAA2C,CAAC,CAAC;QAClF,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AAtCD,sCAsCC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelAdapter interface — Milestone 2 stub.
|
|
3
|
+
* Implement this to add --standalone mode with a specific LLM provider.
|
|
4
|
+
*/
|
|
5
|
+
export interface ModelAdapter {
|
|
6
|
+
/** Send a prompt and return the model's text response */
|
|
7
|
+
generate(prompt: string): Promise<string>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,CAkBpE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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.runNew = runNew;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const nimai_core_1 = require("nimai-core");
|
|
40
|
+
const nimai_mcp_1 = require("nimai-mcp");
|
|
41
|
+
function runNew(outputPath, options) {
|
|
42
|
+
const resolved = path.resolve(outputPath);
|
|
43
|
+
if (fs.existsSync(resolved) && !options.force) {
|
|
44
|
+
console.error(`Error: "${resolved}" already exists. Use --force to overwrite.`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
const templatePath = path.join(nimai_mcp_1.FORGE_ROOT, 'FORGE-spec-template.md');
|
|
48
|
+
const template = (0, nimai_core_1.loadTemplate)(templatePath);
|
|
49
|
+
const dir = path.dirname(resolved);
|
|
50
|
+
if (!fs.existsSync(dir))
|
|
51
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
52
|
+
fs.writeFileSync(resolved, template.raw, 'utf-8');
|
|
53
|
+
console.log(`Spec scaffolded at ${resolved}`);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,wBAkBC;AA3BD,uCAAyB;AACzB,2CAA6B;AAC7B,2CAA0C;AAC1C,yCAAuC;AAMvC,SAAgB,MAAM,CAAC,UAAkB,EAAE,OAAmB;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAE1C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC9C,OAAO,CAAC,KAAK,CACX,WAAW,QAAQ,6CAA6C,CACjE,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAU,EAAE,wBAAwB,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAA,yBAAY,EAAC,YAAY,CAAC,CAAC;IAE5C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,EAAE,CAAC,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAsBxE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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.runReview = runReview;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const nimai_core_1 = require("nimai-core");
|
|
40
|
+
function runReview(specPath, options) {
|
|
41
|
+
const resolved = path.resolve(specPath);
|
|
42
|
+
let specContent;
|
|
43
|
+
try {
|
|
44
|
+
specContent = fs.readFileSync(resolved, 'utf-8');
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
console.error(`Error: Cannot read spec at "${resolved}"`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
const reviewerPrompt = (0, nimai_core_1.buildPrompt2)(specContent);
|
|
51
|
+
if (options.out) {
|
|
52
|
+
const outPath = path.resolve(options.out);
|
|
53
|
+
const dir = path.dirname(outPath);
|
|
54
|
+
if (!fs.existsSync(dir))
|
|
55
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
56
|
+
fs.writeFileSync(outPath, reviewerPrompt, 'utf-8');
|
|
57
|
+
console.log(`Reviewer prompt written to ${outPath}`);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
console.log(reviewerPrompt);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,8BAsBC;AA9BD,uCAAyB;AACzB,2CAA6B;AAC7B,2CAA0C;AAM1C,SAAgB,SAAS,CAAC,QAAgB,EAAE,OAAsB;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,+BAA+B,QAAQ,GAAG,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,cAAc,GAAG,IAAA,yBAAY,EAAC,WAAW,CAAC,CAAC;IAEjD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ModelAdapter } from '../adapters/types';
|
|
2
|
+
export interface SpecOptions {
|
|
3
|
+
hosted: boolean;
|
|
4
|
+
standalone: boolean;
|
|
5
|
+
repoPath: string;
|
|
6
|
+
out?: string;
|
|
7
|
+
validate: boolean;
|
|
8
|
+
allowInvalid: boolean;
|
|
9
|
+
model?: string;
|
|
10
|
+
/** Optional adapter for testing — if provided, skips adapter construction */
|
|
11
|
+
adapter?: ModelAdapter;
|
|
12
|
+
}
|
|
13
|
+
export declare function runSpec(request: string, options: SpecOptions): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2FlF"}
|
|
@@ -0,0 +1,163 @@
|
|
|
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.runSpec = runSpec;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const nimai_core_1 = require("nimai-core");
|
|
40
|
+
const anthropic_1 = require("../adapters/anthropic");
|
|
41
|
+
const errors_1 = require("../adapters/errors");
|
|
42
|
+
const config_1 = require("../config");
|
|
43
|
+
async function runSpec(request, options) {
|
|
44
|
+
// ── Flag validation ──────────────────────────────────────────────────────────
|
|
45
|
+
if (!options.hosted && !options.standalone) {
|
|
46
|
+
console.error('Error: specify --hosted or --standalone');
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
if (options.hosted && options.validate) {
|
|
50
|
+
console.error('Error: --validate is only supported with --standalone.\n' +
|
|
51
|
+
'Use --standalone (and optionally --out) or run: nimai validate <file>');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
if (options.allowInvalid && !options.validate) {
|
|
55
|
+
console.error('Error: --allow-invalid requires --validate.\n' +
|
|
56
|
+
'Add --validate to enable validation, then --allow-invalid to override exit behavior.');
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
// ── Context + prompt building ─────────────────────────────────────────────────
|
|
60
|
+
const repoPath = path.resolve(options.repoPath);
|
|
61
|
+
const context = (0, nimai_core_1.extractContext)(repoPath, request);
|
|
62
|
+
const contextSummary = context
|
|
63
|
+
.map(item => `[${item.file}]\n${item.snippet}`)
|
|
64
|
+
.join('\n\n---\n\n');
|
|
65
|
+
const prompt = (0, nimai_core_1.buildPrompt1)(request, contextSummary);
|
|
66
|
+
// ── --hosted: return deterministic bundle, no API call ───────────────────────
|
|
67
|
+
if (options.hosted) {
|
|
68
|
+
printBundle(prompt, context);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// ── --standalone: resolve config then build adapter ──────────────────────────
|
|
72
|
+
let adapter;
|
|
73
|
+
if (options.adapter) {
|
|
74
|
+
adapter = options.adapter;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const fileConfig = (0, config_1.loadConfig)(process.cwd());
|
|
78
|
+
const config = (0, config_1.resolveConfig)(fileConfig, { model: options.model });
|
|
79
|
+
adapter = buildAdapter(config.adapter, config.model, config);
|
|
80
|
+
if (!adapter)
|
|
81
|
+
process.exit(1); // buildAdapter prints error and returns null on failure
|
|
82
|
+
}
|
|
83
|
+
let specContent;
|
|
84
|
+
try {
|
|
85
|
+
specContent = await adapter.generate(prompt);
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
console.error(`Error: ${err instanceof errors_1.AdapterError ? err.message : err.message}`);
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
// ── Output ────────────────────────────────────────────────────────────────────
|
|
92
|
+
if (options.out) {
|
|
93
|
+
const outPath = path.resolve(options.out);
|
|
94
|
+
const dir = path.dirname(outPath);
|
|
95
|
+
if (!fs.existsSync(dir))
|
|
96
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
97
|
+
fs.writeFileSync(outPath, specContent, 'utf-8');
|
|
98
|
+
console.log(`Spec written to ${outPath}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.log(specContent);
|
|
102
|
+
}
|
|
103
|
+
// ── --validate ────────────────────────────────────────────────────────────────
|
|
104
|
+
if (options.validate) {
|
|
105
|
+
const issues = (0, nimai_core_1.lintContent)(specContent);
|
|
106
|
+
const hard = issues.filter(i => !i.advisory);
|
|
107
|
+
const advisory = issues.filter(i => i.advisory);
|
|
108
|
+
if (hard.length === 0 && advisory.length === 0) {
|
|
109
|
+
console.error('✓ Validation passed — no issues found.');
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
if (hard.length > 0) {
|
|
113
|
+
console.error(`\nValidation: ${hard.length} issue(s) found`);
|
|
114
|
+
hard.forEach(i => console.error(` ${i.type === 'missing_section' ? '' : `Line ${i.line}: `}${i.message}`));
|
|
115
|
+
}
|
|
116
|
+
if (advisory.length > 0) {
|
|
117
|
+
console.error(`\nAdvisory warnings: ${advisory.length}`);
|
|
118
|
+
advisory.forEach(i => console.error(` warn: ${i.message}`));
|
|
119
|
+
}
|
|
120
|
+
if (hard.length > 0 && !options.allowInvalid) {
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function buildAdapter(adapterName, model, config) {
|
|
127
|
+
if (adapterName === 'anthropic') {
|
|
128
|
+
const apiKey = process.env['ANTHROPIC_API_KEY'];
|
|
129
|
+
if (!apiKey) {
|
|
130
|
+
console.error('Error: ANTHROPIC_API_KEY environment variable is not set.\n' +
|
|
131
|
+
'Set it and retry, or use --hosted to generate a prompt bundle without an API key.');
|
|
132
|
+
process.exit(1);
|
|
133
|
+
}
|
|
134
|
+
return new anthropic_1.AnthropicAdapter(apiKey, model);
|
|
135
|
+
}
|
|
136
|
+
if (adapterName === 'openai') {
|
|
137
|
+
const { OpenAIAdapter } = require('../adapters/openai');
|
|
138
|
+
const apiKey = process.env['OPENAI_API_KEY'];
|
|
139
|
+
if (!apiKey) {
|
|
140
|
+
console.error('Error: OPENAI_API_KEY environment variable is not set.');
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
return new OpenAIAdapter(apiKey, model, config.openaiBaseUrl);
|
|
144
|
+
}
|
|
145
|
+
if (adapterName === 'ollama') {
|
|
146
|
+
const { OllamaAdapter } = require('../adapters/ollama');
|
|
147
|
+
return new OllamaAdapter(config.ollamaUrl, model);
|
|
148
|
+
}
|
|
149
|
+
console.error(`Error: Unknown adapter "${adapterName}". Valid values: anthropic, openai, ollama`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
function printBundle(prompt, context) {
|
|
153
|
+
console.log('=== NIMAI SPEC BUNDLE ===');
|
|
154
|
+
console.log('');
|
|
155
|
+
console.log('--- PROMPT (paste into your AI agent) ---');
|
|
156
|
+
console.log(prompt);
|
|
157
|
+
if (context.length > 0) {
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log(`--- CONTEXT FILES INCLUDED (${context.length}) ---`);
|
|
160
|
+
context.forEach(item => console.log(` • ${item.file} (relevance: ${item.relevance})`));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,IAAI,CAoDjF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runValidate = runValidate;
|
|
4
|
+
const nimai_core_1 = require("nimai-core");
|
|
5
|
+
function runValidate(specPath, options = {}) {
|
|
6
|
+
let issues;
|
|
7
|
+
try {
|
|
8
|
+
issues = (0, nimai_core_1.lintSpec)(specPath);
|
|
9
|
+
}
|
|
10
|
+
catch (err) {
|
|
11
|
+
console.error(`Error: ${err.message}`);
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
const hard = issues.filter(i => !i.advisory);
|
|
15
|
+
const advisory = issues.filter(i => i.advisory);
|
|
16
|
+
if (hard.length === 0 && advisory.length === 0) {
|
|
17
|
+
console.log('✓ Spec passed — no issues found.');
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const blanks = hard.filter(i => i.type === 'blank_field');
|
|
21
|
+
const nhfi = hard.filter(i => i.type === 'needs_human_input');
|
|
22
|
+
const missing = hard.filter(i => i.type === 'missing_section');
|
|
23
|
+
if (hard.length > 0) {
|
|
24
|
+
console.log(`nimai validate: ${hard.length} issue(s) found\n`);
|
|
25
|
+
if (blanks.length > 0) {
|
|
26
|
+
console.log(`Blank fields (${blanks.length}):`);
|
|
27
|
+
blanks.forEach(i => console.log(` Line ${i.line}: ${i.message}`));
|
|
28
|
+
console.log('');
|
|
29
|
+
}
|
|
30
|
+
if (nhfi.length > 0) {
|
|
31
|
+
console.log(`[NEEDS HUMAN INPUT] flags (${nhfi.length}):`);
|
|
32
|
+
nhfi.forEach(i => console.log(` Line ${i.line}: ${i.message}`));
|
|
33
|
+
console.log('');
|
|
34
|
+
}
|
|
35
|
+
if (missing.length > 0) {
|
|
36
|
+
console.log(`Missing required sections (${missing.length}):`);
|
|
37
|
+
missing.forEach(i => console.log(` ${i.message}`));
|
|
38
|
+
console.log('');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (advisory.length > 0) {
|
|
42
|
+
console.log(`Advisory warnings (${advisory.length})${options.strictArchitecture ? ' [--strict-architecture: treated as errors]' : ''}:`);
|
|
43
|
+
advisory.forEach(i => console.log(` warn: ${i.message}`));
|
|
44
|
+
console.log('');
|
|
45
|
+
}
|
|
46
|
+
if (hard.length > 0 || options.strictArchitecture) {
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";;AAMA,kCAoDC;AA1DD,2CAAiD;AAMjD,SAAgB,WAAW,CAAC,QAAgB,EAAE,UAA2B,EAAE;IACzE,IAAI,MAAmB,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,IAAA,qBAAQ,EAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAEhD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC;IAE/D,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAE/D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YAC3D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;YAC9D,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,sBAAsB,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const ForgeConfigSchema: z.ZodObject<{
|
|
3
|
+
adapter: z.ZodOptional<z.ZodEnum<["anthropic", "openai", "ollama"]>>;
|
|
4
|
+
model: z.ZodOptional<z.ZodString>;
|
|
5
|
+
ollamaUrl: z.ZodOptional<z.ZodString>;
|
|
6
|
+
openaiBaseUrl: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
adapter?: "anthropic" | "openai" | "ollama" | undefined;
|
|
9
|
+
model?: string | undefined;
|
|
10
|
+
ollamaUrl?: string | undefined;
|
|
11
|
+
openaiBaseUrl?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
adapter?: "anthropic" | "openai" | "ollama" | undefined;
|
|
14
|
+
model?: string | undefined;
|
|
15
|
+
ollamaUrl?: string | undefined;
|
|
16
|
+
openaiBaseUrl?: string | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export type ForgeConfig = z.infer<typeof ForgeConfigSchema>;
|
|
19
|
+
export interface ResolvedConfig {
|
|
20
|
+
adapter: 'anthropic' | 'openai' | 'ollama';
|
|
21
|
+
model: string;
|
|
22
|
+
ollamaUrl: string;
|
|
23
|
+
openaiBaseUrl: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function loadConfig(cwd: string): ForgeConfig;
|
|
26
|
+
export interface ConfigOverrides {
|
|
27
|
+
adapter?: string;
|
|
28
|
+
model?: string;
|
|
29
|
+
ollamaUrl?: string;
|
|
30
|
+
openaiBaseUrl?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function resolveConfig(fileConfig: ForgeConfig, overrides?: ConfigOverrides): ResolvedConfig;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;EAKrB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAWD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAmBnD;AAID,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,WAAW,EACvB,SAAS,GAAE,eAAoB,GAC9B,cAAc,CAehB"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
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.loadConfig = loadConfig;
|
|
37
|
+
exports.resolveConfig = resolveConfig;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const yaml = __importStar(require("js-yaml"));
|
|
41
|
+
const zod_1 = require("zod");
|
|
42
|
+
// ─── Schema ───────────────────────────────────────────────────────────────────
|
|
43
|
+
const ForgeConfigSchema = zod_1.z.object({
|
|
44
|
+
adapter: zod_1.z.enum(['anthropic', 'openai', 'ollama']).optional(),
|
|
45
|
+
model: zod_1.z.string().optional(),
|
|
46
|
+
ollamaUrl: zod_1.z.string().url().optional(),
|
|
47
|
+
openaiBaseUrl: zod_1.z.string().url().optional(),
|
|
48
|
+
});
|
|
49
|
+
const DEFAULTS = {
|
|
50
|
+
adapter: 'anthropic',
|
|
51
|
+
model: 'claude-sonnet-4-6',
|
|
52
|
+
ollamaUrl: 'http://localhost:11434',
|
|
53
|
+
openaiBaseUrl: 'https://api.openai.com/v1',
|
|
54
|
+
};
|
|
55
|
+
// ─── Loader ───────────────────────────────────────────────────────────────────
|
|
56
|
+
function loadConfig(cwd) {
|
|
57
|
+
const configPath = path.join(cwd, '.nimai', 'config.yaml');
|
|
58
|
+
if (!fs.existsSync(configPath))
|
|
59
|
+
return {};
|
|
60
|
+
let raw;
|
|
61
|
+
try {
|
|
62
|
+
raw = yaml.load(fs.readFileSync(configPath, 'utf-8'));
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
throw new Error(`Failed to parse .nimai/config.yaml: ${err.message}`);
|
|
66
|
+
}
|
|
67
|
+
const result = ForgeConfigSchema.safeParse(raw ?? {});
|
|
68
|
+
if (!result.success) {
|
|
69
|
+
const issues = result.error.issues.map((i) => ` ${i.path.join('.')}: ${i.message}`).join('\n');
|
|
70
|
+
throw new Error(`Invalid .nimai/config.yaml:\n${issues}`);
|
|
71
|
+
}
|
|
72
|
+
return result.data;
|
|
73
|
+
}
|
|
74
|
+
function resolveConfig(fileConfig, overrides = {}) {
|
|
75
|
+
return {
|
|
76
|
+
adapter: overrides.adapter ??
|
|
77
|
+
fileConfig.adapter ??
|
|
78
|
+
DEFAULTS.adapter,
|
|
79
|
+
model: overrides.model ??
|
|
80
|
+
fileConfig.model ??
|
|
81
|
+
DEFAULTS.model,
|
|
82
|
+
ollamaUrl: overrides.ollamaUrl ??
|
|
83
|
+
fileConfig.ollamaUrl ??
|
|
84
|
+
DEFAULTS.ollamaUrl,
|
|
85
|
+
openaiBaseUrl: overrides.openaiBaseUrl ??
|
|
86
|
+
fileConfig.openaiBaseUrl ??
|
|
87
|
+
DEFAULTS.openaiBaseUrl,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,gCAmBC;AAWD,sCAkBC;AAhFD,uCAAyB;AACzB,2CAA6B;AAC7B,8CAAgC;AAChC,6BAAwB;AAExB,iFAAiF;AAEjF,MAAM,iBAAiB,GAAG,OAAC,CAAC,MAAM,CAAC;IACjC,OAAO,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC7D,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtC,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAWH,MAAM,QAAQ,GAAmB;IAC/B,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,mBAAmB;IAC1B,SAAS,EAAE,wBAAwB;IACnC,aAAa,EAAE,2BAA2B;CAC3C,CAAC;AAEF,iFAAiF;AAEjF,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IAE1C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,uCAAwC,GAAa,CAAC,OAAO,EAAE,CAChE,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5G,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAWD,SAAgB,aAAa,CAC3B,UAAuB,EACvB,YAA6B,EAAE;IAE/B,OAAO;QACL,OAAO,EAAG,SAAS,CAAC,OAAqC;YAChD,UAAU,CAAC,OAAO;YAClB,QAAQ,CAAC,OAAO;QACzB,KAAK,EAAI,SAAS,CAAC,KAAK;YACf,UAAU,CAAC,KAAK;YAChB,QAAQ,CAAC,KAAK;QACvB,SAAS,EAAE,SAAS,CAAC,SAAS;YACnB,UAAU,CAAC,SAAS;YACpB,QAAQ,CAAC,SAAS;QAC7B,aAAa,EAAE,SAAS,CAAC,aAAa;YACvB,UAAU,CAAC,aAAa;YACxB,QAAQ,CAAC,aAAa;KACtC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const commander_1 = require("commander");
|
|
5
|
+
const spec_1 = require("./commands/spec");
|
|
6
|
+
const validate_1 = require("./commands/validate");
|
|
7
|
+
const review_1 = require("./commands/review");
|
|
8
|
+
const new_1 = require("./commands/new");
|
|
9
|
+
const program = new commander_1.Command();
|
|
10
|
+
program
|
|
11
|
+
.name('nimai')
|
|
12
|
+
.description('Nimai — spec ops CLI for AI work\n\nCommands: spec, validate, review, new\nPlanned (M3b): nimai run — execute a spec end-to-end (deferred pending usage data)')
|
|
13
|
+
.version('0.1.0');
|
|
14
|
+
program
|
|
15
|
+
.command('spec <request>')
|
|
16
|
+
.description('Generate a FORGE spec from a loose request')
|
|
17
|
+
.option('--hosted', 'Output a deterministic prompt+context bundle (no API key needed)')
|
|
18
|
+
.option('--standalone', 'Call the model directly to generate the draft spec')
|
|
19
|
+
.option('--repo <path>', 'Path to the repository root for context extraction', process.cwd())
|
|
20
|
+
.option('--out <file>', 'Write output to file instead of stdout')
|
|
21
|
+
.option('--validate', 'Run lint on the generated spec after --standalone generation (not valid with --hosted)')
|
|
22
|
+
.option('--allow-invalid', 'Exit 0 even when --validate finds issues (requires --validate)')
|
|
23
|
+
.option('--model <id>', 'Model ID for --standalone mode (overrides .nimai/config.yaml)')
|
|
24
|
+
.action((request, options) => {
|
|
25
|
+
(0, spec_1.runSpec)(request, {
|
|
26
|
+
hosted: !!options.hosted,
|
|
27
|
+
standalone: !!options.standalone,
|
|
28
|
+
repoPath: options.repo,
|
|
29
|
+
out: options.out,
|
|
30
|
+
validate: !!options.validate,
|
|
31
|
+
allowInvalid: !!options.allowInvalid,
|
|
32
|
+
model: options.model,
|
|
33
|
+
}).catch(err => {
|
|
34
|
+
console.error('Error:', err.message);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
program
|
|
39
|
+
.command('validate <specPath>')
|
|
40
|
+
.description('Lint a spec file for unresolved fields, NHFI flags, and missing sections')
|
|
41
|
+
.option('--strict-architecture', 'Treat advisory architecture warnings as errors (exits 1)')
|
|
42
|
+
.action((specPath, options) => {
|
|
43
|
+
(0, validate_1.runValidate)(specPath, { strictArchitecture: !!options.strictArchitecture });
|
|
44
|
+
});
|
|
45
|
+
program
|
|
46
|
+
.command('review <specPath>')
|
|
47
|
+
.description('Generate a FORGE reviewer/validator prompt from an approved spec')
|
|
48
|
+
.option('--out <file>', 'Write reviewer prompt to file instead of stdout')
|
|
49
|
+
.action((specPath, options) => {
|
|
50
|
+
(0, review_1.runReview)(specPath, { out: options.out });
|
|
51
|
+
});
|
|
52
|
+
program
|
|
53
|
+
.command('new <outputPath>')
|
|
54
|
+
.description('Scaffold a new FORGE spec file from the canonical template')
|
|
55
|
+
.option('--force', 'Overwrite if file already exists')
|
|
56
|
+
.action((outputPath, options) => {
|
|
57
|
+
(0, new_1.runNew)(outputPath, { force: !!options.force });
|
|
58
|
+
});
|
|
59
|
+
program.parse(process.argv);
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,0CAA0C;AAC1C,kDAAkD;AAClD,8CAA8C;AAC9C,wCAAwC;AAExC,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,+JAA+J,CAAC;KAC5K,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,UAAU,EAAE,kEAAkE,CAAC;KACtF,MAAM,CAAC,cAAc,EAAE,oDAAoD,CAAC;KAC5E,MAAM,CAAC,eAAe,EAAE,oDAAoD,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC5F,MAAM,CAAC,cAAc,EAAE,wCAAwC,CAAC;KAChE,MAAM,CAAC,YAAY,EAAE,wFAAwF,CAAC;KAC9G,MAAM,CAAC,iBAAiB,EAAE,gEAAgE,CAAC;KAC3F,MAAM,CAAC,cAAc,EAAE,+DAA+D,CAAC;KACvF,MAAM,CAAC,CAAC,OAAe,EAAE,OAQzB,EAAE,EAAE;IACH,IAAA,cAAO,EAAC,OAAO,EAAE;QACf,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM;QACxB,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU;QAChC,QAAQ,EAAE,OAAO,CAAC,IAAI;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ;QAC5B,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,qBAAqB,CAAC;KAC9B,WAAW,CAAC,0EAA0E,CAAC;KACvF,MAAM,CAAC,uBAAuB,EAAE,0DAA0D,CAAC;KAC3F,MAAM,CAAC,CAAC,QAAgB,EAAE,OAAyC,EAAE,EAAE;IACtE,IAAA,sBAAW,EAAC,QAAQ,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;AAC9E,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,cAAc,EAAE,iDAAiD,CAAC;KACzE,MAAM,CAAC,CAAC,QAAgB,EAAE,OAAyB,EAAE,EAAE;IACtD,IAAA,kBAAS,EAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,4DAA4D,CAAC;KACzE,MAAM,CAAC,SAAS,EAAE,kCAAkC,CAAC;KACrD,MAAM,CAAC,CAAC,UAAkB,EAAE,OAA4B,EAAE,EAAE;IAC3D,IAAA,YAAM,EAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nimai-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Nimai CLI — spec ops for AI work. nimai spec, review, validate, and new.",
|
|
5
|
+
"keywords": ["nimai", "forge", "cli", "spec", "ai", "llm", "specification", "mcp", "anthropic", "openai", "ollama"],
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/Balagopalaji/nimai.git",
|
|
10
|
+
"directory": "packages/cli"
|
|
11
|
+
},
|
|
12
|
+
"files": ["dist/"],
|
|
13
|
+
"main": "dist/index.js",
|
|
14
|
+
"types": "dist/index.d.ts",
|
|
15
|
+
"bin": {
|
|
16
|
+
"nimai": "dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"dev": "tsc --watch",
|
|
22
|
+
"clean": "rm -rf dist"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/js-yaml": "^4.0.9",
|
|
26
|
+
"@types/node": "^22.0.0",
|
|
27
|
+
"typescript": "^5.4.5",
|
|
28
|
+
"vitest": "^1.6.0"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@anthropic-ai/sdk": "^0.78.0",
|
|
32
|
+
"nimai-core": "workspace:*",
|
|
33
|
+
"nimai-mcp": "workspace:*",
|
|
34
|
+
"commander": "^12.1.0",
|
|
35
|
+
"js-yaml": "^4.1.1",
|
|
36
|
+
"zod": "^3.25.76"
|
|
37
|
+
}
|
|
38
|
+
}
|