@inharness-ai/claude4spec 1.0.3 → 1.0.5
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/CHANGELOG.md +19 -0
- package/dist/bin/c4s/commands/ask.d.ts +13 -0
- package/dist/bin/c4s/commands/ask.js +167 -0
- package/dist/bin/c4s/commands/ask.js.map +1 -0
- package/dist/bin/c4s/errors.d.ts +1 -1
- package/dist/bin/c4s/errors.js.map +1 -1
- package/dist/bin/c4s/project.d.ts +6 -0
- package/dist/bin/c4s/project.js +25 -0
- package/dist/bin/c4s/project.js.map +1 -1
- package/dist/bin/c4s.js +12 -6
- package/dist/bin/c4s.js.map +1 -1
- package/dist/client/assets/{arc-D8brDDag.js → arc-grMo2vzL.js} +1 -1
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-Bmh1uTQZ.js → architectureDiagram-3BPJPVTR-Fp_VHONq.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-55jaVWwd.js → blockDiagram-GPEHLZMM-CIwVG0sx.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-Dxm0tLsZ.js → c4Diagram-AAUBKEIU-tysuJyz0.js} +1 -1
- package/dist/client/assets/channel-B30S19wt.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-vDJ1slcJ.js → chunk-2J33WTMH-DZFNNwID.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-DP6CC-Qn.js → chunk-4BX2VUAB-CsnJG7Pv.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-SgOSJYkL.js → chunk-55IACEB6-MhREYXzo.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-BtRfbjBO.js → chunk-727SXJPM-BjvyGtK3.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-yIRaTgFg.js → chunk-AQP2D5EJ-zfcfKNbO.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-B_VD4t8N.js → chunk-FMBD7UC4-Ckx-Hc8U.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-BvJdtX82.js → chunk-ND2GUHAM-DSIVVmYM.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BLNWKymD.js → chunk-QZHKN3VN-EcIM6ZdS.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-Bm4SZLsb.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-Bm4SZLsb.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-BQyA-r-y.js → cose-bilkent-S5V4N54A-DC8DVe0z.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-CAh0mTzA.js → dagre-BM42HDAG-BQjcdXnw.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-C83TGK4o.js → diagram-2AECGRRQ-BUPeBMwt.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-2L6uowvf.js → diagram-5GNKFQAL-I_Q-Pnp6.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-Cj5n4jdq.js → diagram-KO2AKTUF-B8WbbWJu.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-Bp5SDMjg.js → diagram-LMA3HP47-CsACxgW7.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-cFsDQ8Qk.js → diagram-OG6HWLK6-lPuJxQED.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-D8G5xpg3.js → erDiagram-TEJ5UH35-cU5ZGREz.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-CuNudlCD.js → flowDiagram-I6XJVG4X-Dr-vZTBV.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-CtFlsB15.js → ganttDiagram-6RSMTGT7-CXiWZ0R8.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-h66Tso4O.js → gitGraphDiagram-PVQCEYII-PDvLBbvz.js} +1 -1
- package/dist/client/assets/{index-aPVup1Re.js → index-BQltseJ-.js} +1 -1
- package/dist/client/assets/{index-aJE-l7h7.js → index-RMlMPKY7.js} +1 -1
- package/dist/client/assets/{index-D5ljIkCJ.js → index-YFPhJxE5.js} +184 -174
- package/dist/client/assets/{index-CZOpb3O7.css → index-zpHL2aYW.css} +1 -1
- package/dist/client/assets/{infoDiagram-5YYISTIA-CO_BLfuW.js → infoDiagram-5YYISTIA-Re9fOUPS.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-D4rSRnQA.js → ishikawaDiagram-YF4QCWOH-BTazB_7p.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-GyHI6dB8.js → journeyDiagram-JHISSGLW-pGUoqxHl.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-CrH33WLe.js → kanban-definition-UN3LZRKU-C2RzCJrM.js} +1 -1
- package/dist/client/assets/{linear-Dh1OyvSm.js → linear-Be3WPYKf.js} +1 -1
- package/dist/client/assets/{mermaid.core-C45sMDhS.js → mermaid.core-GdPXct3q.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bgwb0vwA.js → mindmap-definition-RKZ34NQL-DvktVTUU.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-l9cCpVfG.js → pieDiagram-4H26LBE5-DvC_m4m5.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-BCPSUbC3.js → quadrantDiagram-W4KKPZXB-SWtidcZL.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-TEGOe-vV.js → requirementDiagram-4Y6WPE33-CQEHDx1W.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-C69pv_7D.js → sankeyDiagram-5OEKKPKP-C0PTA3gP.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-arinzeCk.js → sequenceDiagram-3UESZ5HK-D-x7SXoo.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-C2YENpmw.js → stateDiagram-AJRCARHV-BhcGVfs1.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-2vcyLY1V.js +1 -0
- package/dist/client/assets/{timeline-definition-PNZ67QCA-h5qtI99f.js → timeline-definition-PNZ67QCA-JYTlKPB-.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-CnuK75Ut.js → vennDiagram-CIIHVFJN-KjNL1Qpz.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-B4bQ0Xyy.js → wardley-L42UT6IY-DcljmmEY.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-apV8olQc.js → wardleyDiagram-YWT4CUSO-Pbq6ALgg.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-OTP6zeEy.js → xychartDiagram-2RQKCTM6-G_r_2Cvk.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/server/config.d.ts +6 -0
- package/dist/server/config.js +6 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/db/migrate.js +28 -11
- package/dist/server/db/migrate.js.map +1 -1
- package/dist/server/db/migrations/028_page_version_kind_patch.sql +43 -0
- package/dist/server/db/migrations/029_chat_thread_patch.sql +64 -0
- package/dist/server/external-skills/brief-implementer-template.d.ts +1 -1
- package/dist/server/external-skills/brief-implementer-template.js +14 -0
- package/dist/server/external-skills/brief-implementer-template.js.map +1 -1
- package/dist/server/external-skills/spec-reader-template.d.ts +1 -1
- package/dist/server/external-skills/spec-reader-template.js +12 -0
- package/dist/server/external-skills/spec-reader-template.js.map +1 -1
- package/dist/server/index.js +111 -37
- package/dist/server/index.js.map +1 -1
- package/dist/server/routes/agent-turn.d.ts +92 -0
- package/dist/server/routes/agent-turn.js +379 -0
- package/dist/server/routes/agent-turn.js.map +1 -0
- package/dist/server/routes/chat.d.ts +2 -28
- package/dist/server/routes/chat.js +33 -382
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/errors.js +4 -0
- package/dist/server/routes/errors.js.map +1 -1
- package/dist/server/routes/patches.d.ts +8 -0
- package/dist/server/routes/patches.js +106 -0
- package/dist/server/routes/patches.js.map +1 -0
- package/dist/server/routes/threads.d.ts +2 -2
- package/dist/server/routes/threads.js +51 -1
- package/dist/server/routes/threads.js.map +1 -1
- package/dist/server/services/brief.js +0 -1
- package/dist/server/services/brief.js.map +1 -1
- package/dist/server/services/chat-context.d.ts +3 -1
- package/dist/server/services/chat-context.js +32 -1
- package/dist/server/services/chat-context.js.map +1 -1
- package/dist/server/services/chat.d.ts +5 -2
- package/dist/server/services/chat.js +35 -7
- package/dist/server/services/chat.js.map +1 -1
- package/dist/server/services/page-version.d.ts +11 -4
- package/dist/server/services/page-version.js +19 -11
- package/dist/server/services/page-version.js.map +1 -1
- package/dist/server/services/pages-frontmatter-indexer.d.ts +4 -1
- package/dist/server/services/pages-frontmatter-indexer.js +19 -9
- package/dist/server/services/pages-frontmatter-indexer.js.map +1 -1
- package/dist/server/services/patch.d.ts +66 -0
- package/dist/server/services/patch.js +196 -0
- package/dist/server/services/patch.js.map +1 -0
- package/dist/shared/entities.d.ts +62 -2
- package/dist/shared/entities.js +11 -0
- package/dist/shared/entities.js.map +1 -1
- package/dist/shared/types.d.ts +5 -2
- package/package.json +1 -1
- package/dist/client/assets/channel-ArVcv4Yl.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-B3nmPR7w.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-B3nmPR7w.js +0 -1
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CS6ocDH6.js +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,23 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [1.0.5] - 2026-05-19
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- `c4s ask` — synchronous CLI Q&A against a running `npx claude4spec` server. Supports `--ct chat | brief | patch`, thread continuation via `--thread <id>`, and explicit server override via `--server <url>`. Skill templates (`c4s-spec-reader`, `c4s-brief-implementer`) document the escalation path as optional — only available when both `c4s` and the server are present.
|
|
12
|
+
- `POST /api/threads/:id/ask` — synchronous JSON sibling of `POST /api/chat` (SSE). Shares the same adapter pool, `pendingInputs` map, and tool whitelist via a new `routes/agent-turn.ts` module extracted from `chat.ts`.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- The server now binds to a single, deterministic port (the `port+1` fallback is gone). `EADDRINUSE` fails fast with a clear message so that `c4s ask` can reliably discover the server through `.claude4spec/config.json.port`.
|
|
16
|
+
|
|
17
|
+
## [1.0.4] - 2026-05-18
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- M23 Patches — patches (`.claude4spec/patches/`) become a first-class source alongside pages and briefs: versioned in `page_version` (`kind='patch'`) and chat-enabled (`chat_thread.context_type='patch'`). Adds a patches route/service, patch chat context, frontmatter indexing, and client views (`PatchDetail`, `PatchEditor`, `usePatches`, `PageViewSwitcher`).
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Dropped the `CHECK` constraints on `page_version.kind` and `chat_thread.context_type` (migrations 028/029); allowed values are now validated in the application layer, so future source and context types need no migration.
|
|
24
|
+
|
|
8
25
|
## [1.0.3] - 2026-05-16
|
|
9
26
|
|
|
10
27
|
### Changed
|
|
@@ -42,5 +59,7 @@ Initial public release.
|
|
|
42
59
|
- Acceptance Criteria entity and tooling.
|
|
43
60
|
- Briefs and patches workflow for spec-driven implementation.
|
|
44
61
|
|
|
62
|
+
[1.0.5]: https://github.com/InHarness/claude4spec/compare/v1.0.4...v1.0.5
|
|
63
|
+
[1.0.4]: https://github.com/InHarness/claude4spec/compare/v1.0.3...v1.0.4
|
|
45
64
|
[1.0.3]: https://github.com/InHarness/claude4spec/compare/v1.0.2...v1.0.3
|
|
46
65
|
[1.0.2]: https://github.com/InHarness/claude4spec/compare/v1.0.1...v1.0.2
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ParsedArgs } from '../args.js';
|
|
2
|
+
/**
|
|
3
|
+
* `c4s ask` — synchroniczny kanal Q&A z agentem specyfikacji (M11).
|
|
4
|
+
*
|
|
5
|
+
* Jedyna komenda `c4s` wymagajaca dzialajacego serwera `npx claude4spec`:
|
|
6
|
+
* nie uruchamia agenta sama, tylko deleguje ture do `POST /api/threads/:id/ask`
|
|
7
|
+
* i kolapsuje ja do `{ threadId, answer }`.
|
|
8
|
+
*
|
|
9
|
+
* c4s ask "<msg>" --ct chat
|
|
10
|
+
* c4s ask "<msg>" --ct brief --brief <path>
|
|
11
|
+
* c4s ask "<msg>" --thread <id>
|
|
12
|
+
*/
|
|
13
|
+
export declare function runAsk(args: ParsedArgs): Promise<void>;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { optionalString } from '../args.js';
|
|
4
|
+
import { CliError } from '../errors.js';
|
|
5
|
+
import { resolveProjectByConfig } from '../project.js';
|
|
6
|
+
/**
|
|
7
|
+
* `c4s ask` — synchroniczny kanal Q&A z agentem specyfikacji (M11).
|
|
8
|
+
*
|
|
9
|
+
* Jedyna komenda `c4s` wymagajaca dzialajacego serwera `npx claude4spec`:
|
|
10
|
+
* nie uruchamia agenta sama, tylko deleguje ture do `POST /api/threads/:id/ask`
|
|
11
|
+
* i kolapsuje ja do `{ threadId, answer }`.
|
|
12
|
+
*
|
|
13
|
+
* c4s ask "<msg>" --ct chat
|
|
14
|
+
* c4s ask "<msg>" --ct brief --brief <path>
|
|
15
|
+
* c4s ask "<msg>" --thread <id>
|
|
16
|
+
*/
|
|
17
|
+
export async function runAsk(args) {
|
|
18
|
+
const message = args.positional[0];
|
|
19
|
+
if (!message || !message.trim()) {
|
|
20
|
+
throw new CliError('INVALID_ARGS', 'message is required: c4s ask "<msg>" --ct chat');
|
|
21
|
+
}
|
|
22
|
+
const threadFlag = optionalString(args, 'thread');
|
|
23
|
+
const ct = optionalString(args, 'ct');
|
|
24
|
+
const briefFlag = optionalString(args, 'brief');
|
|
25
|
+
const serverOverride = optionalString(args, 'server');
|
|
26
|
+
// --- discovery: adres serwera -------------------------------------------
|
|
27
|
+
// `--server` nadpisuje resolve projektu + budowanie URL z config.json.
|
|
28
|
+
let baseUrl;
|
|
29
|
+
if (serverOverride) {
|
|
30
|
+
baseUrl = serverOverride.replace(/\/+$/, '');
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const projectDir = resolveProjectByConfig(args.project);
|
|
34
|
+
baseUrl = `http://localhost:${readConfigPort(projectDir)}`;
|
|
35
|
+
}
|
|
36
|
+
// --- health-check tozsamosci --------------------------------------------
|
|
37
|
+
await healthCheck(baseUrl);
|
|
38
|
+
// --- create-thread (context-specific) — pomijany dla --thread -----------
|
|
39
|
+
let threadId;
|
|
40
|
+
if (threadFlag) {
|
|
41
|
+
threadId = threadFlag;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
if (ct !== 'chat' && ct !== 'brief' && ct !== 'patch') {
|
|
45
|
+
throw new CliError('INVALID_ARGS', '--ct must be chat|brief|patch (or pass --thread <id> to continue a thread)');
|
|
46
|
+
}
|
|
47
|
+
if (ct === 'patch') {
|
|
48
|
+
// Watki patch nie maja CLI route create-thread — tylko kontynuacja.
|
|
49
|
+
throw new CliError('INVALID_ARGS', 'c4s ask cannot create a patch thread; pass --thread <id> to continue one');
|
|
50
|
+
}
|
|
51
|
+
if (ct === 'brief') {
|
|
52
|
+
if (!briefFlag) {
|
|
53
|
+
throw new CliError('INVALID_ARGS', '--ct brief requires --brief <path>');
|
|
54
|
+
}
|
|
55
|
+
const encoded = briefFlag.split('/').map(encodeURIComponent).join('/');
|
|
56
|
+
const created = await postJson(`${baseUrl}/api/briefs/${encoded}/threads`, {});
|
|
57
|
+
threadId = pickThreadId(created);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const created = await postJson(`${baseUrl}/api/threads`, {});
|
|
61
|
+
threadId = pickThreadId(created);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// --- run-turn (generyczny po context_type) ------------------------------
|
|
65
|
+
const result = await postJson(`${baseUrl}/api/threads/${encodeURIComponent(threadId)}/ask`, {
|
|
66
|
+
message,
|
|
67
|
+
});
|
|
68
|
+
const answer = typeof result.answer === 'string' ? result.answer : '';
|
|
69
|
+
const outThreadId = typeof result.threadId === 'string' ? result.threadId : threadId;
|
|
70
|
+
// --- output --------------------------------------------------------------
|
|
71
|
+
if (args.format === 'text') {
|
|
72
|
+
process.stdout.write(answer + '\n');
|
|
73
|
+
// threadId na stderr — hint do kontynuacji wątku.
|
|
74
|
+
process.stderr.write(`thread: ${outThreadId} (continue: c4s ask "..." --thread ${outThreadId})\n`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
process.stdout.write(JSON.stringify({ threadId: outThreadId, answer }, null, 2) + '\n');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** Czyta `.claude4spec/config.json` i zwraca `port`. */
|
|
81
|
+
function readConfigPort(projectDir) {
|
|
82
|
+
const file = path.join(projectDir, '.claude4spec', 'config.json');
|
|
83
|
+
let parsed;
|
|
84
|
+
try {
|
|
85
|
+
parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw new CliError('PROJECT_NOT_FOUND', `cannot read ${file}: ${err.message}`);
|
|
89
|
+
}
|
|
90
|
+
const port = parsed.port;
|
|
91
|
+
if (typeof port !== 'number') {
|
|
92
|
+
throw new CliError('PROJECT_NOT_FOUND', `config.json has no numeric "port" (${file})`);
|
|
93
|
+
}
|
|
94
|
+
return port;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Health-check tozsamosci: `GET /api/config` musi zwrocic kształt configu
|
|
98
|
+
* claude4spec. Trzy rozlaczne wyniki: connection refused → SERVER_NOT_RUNNING;
|
|
99
|
+
* odpowiedz spoza configu → SERVER_NOT_RECOGNIZED; poprawny config → OK.
|
|
100
|
+
*/
|
|
101
|
+
async function healthCheck(baseUrl) {
|
|
102
|
+
let res;
|
|
103
|
+
try {
|
|
104
|
+
res = await fetch(`${baseUrl}/api/config`);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
throw new CliError('SERVER_NOT_RUNNING', `no claude4spec server responding at ${baseUrl}`, 'start it with `npx claude4spec` in the project');
|
|
108
|
+
}
|
|
109
|
+
let body;
|
|
110
|
+
try {
|
|
111
|
+
body = await res.json();
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
throw new CliError('SERVER_NOT_RECOGNIZED', `process at ${baseUrl} responded but not with a claude4spec config`);
|
|
115
|
+
}
|
|
116
|
+
if (!isConfigShape(body)) {
|
|
117
|
+
throw new CliError('SERVER_NOT_RECOGNIZED', `process at ${baseUrl} is not a claude4spec server (unexpected GET /api/config shape)`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function isConfigShape(body) {
|
|
121
|
+
if (!body || typeof body !== 'object')
|
|
122
|
+
return false;
|
|
123
|
+
const c = body;
|
|
124
|
+
return (typeof c.name === 'string' &&
|
|
125
|
+
typeof c.port === 'number' &&
|
|
126
|
+
typeof c.pagesDir === 'string' &&
|
|
127
|
+
typeof c.mode === 'string' &&
|
|
128
|
+
'writingStyle' in c &&
|
|
129
|
+
!!c.onboarding &&
|
|
130
|
+
typeof c.onboarding === 'object');
|
|
131
|
+
}
|
|
132
|
+
/** POST JSON; przy nie-2xx propaguje `{ error: { code, message } }` endpointu. */
|
|
133
|
+
async function postJson(url, payload) {
|
|
134
|
+
let res;
|
|
135
|
+
try {
|
|
136
|
+
res = await fetch(url, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: { 'content-type': 'application/json' },
|
|
139
|
+
body: JSON.stringify(payload),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw new CliError('SERVER_NOT_RUNNING', `request to ${url} failed (connection refused)`);
|
|
144
|
+
}
|
|
145
|
+
let body = {};
|
|
146
|
+
try {
|
|
147
|
+
body = (await res.json());
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
/* puste/nie-JSON body — obsluzone nizej przez !res.ok */
|
|
151
|
+
}
|
|
152
|
+
if (!res.ok) {
|
|
153
|
+
const err = (body.error ?? {});
|
|
154
|
+
throw new CliError(err.code ?? 'AGENT_ERROR', err.message ?? `request to ${url} failed with HTTP ${res.status}`);
|
|
155
|
+
}
|
|
156
|
+
// create-thread zwraca `{ data: {...} }`; run-turn zwraca obiekt wprost.
|
|
157
|
+
return body.data ?? body;
|
|
158
|
+
}
|
|
159
|
+
function pickThreadId(created) {
|
|
160
|
+
// `POST /api/threads` → `{ id }`; `POST /api/briefs/.../threads` → `{ threadId }`.
|
|
161
|
+
const id = created.threadId ?? created.id;
|
|
162
|
+
if (typeof id !== 'string' || !id) {
|
|
163
|
+
throw new CliError('AGENT_ERROR', 'create-thread response had no thread id');
|
|
164
|
+
}
|
|
165
|
+
return id;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../../../src/bin/c4s/commands/ask.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/c4s/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type CliErrorCode = 'PROJECT_NOT_FOUND' | 'ENTITY_NOT_FOUND' | 'SECTION_NOT_FOUND' | 'INVALID_TYPE' | 'INVALID_ARGS' | 'AMBIGUOUS_SLUGS' | 'SCHEMA_OUT_OF_DATE' | 'FILE_NOT_FOUND' | 'UNKNOWN_COMMAND';
|
|
1
|
+
export type CliErrorCode = 'PROJECT_NOT_FOUND' | 'ENTITY_NOT_FOUND' | 'SECTION_NOT_FOUND' | 'INVALID_TYPE' | 'INVALID_ARGS' | 'AMBIGUOUS_SLUGS' | 'SCHEMA_OUT_OF_DATE' | 'FILE_NOT_FOUND' | 'UNKNOWN_COMMAND' | 'SERVER_NOT_RUNNING' | 'SERVER_NOT_RECOGNIZED' | 'NOT_FOUND' | 'STREAM_IN_PROGRESS' | 'AGENT_UNAVAILABLE' | 'AGENT_ERROR' | 'TIMEOUT' | 'ABORTED';
|
|
2
2
|
export declare class CliError extends Error {
|
|
3
3
|
code: CliErrorCode;
|
|
4
4
|
hint?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/bin/c4s/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/bin/c4s/errors.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACd;IAA4C;IAA/D,YAAmB,IAAkB,EAAE,OAAe,EAAS,IAAa;QAC1E,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,SAAI,GAAJ,IAAI,CAAc;QAA0B,SAAI,GAAJ,IAAI,CAAS;QAE1E,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF"}
|
|
@@ -1 +1,7 @@
|
|
|
1
1
|
export declare function resolveProject(override?: string): string;
|
|
2
|
+
/**
|
|
3
|
+
* Wariant `resolveProject` dla `c4s ask` — markerem waznosci projektu jest
|
|
4
|
+
* `.claude4spec/config.json` (nie `db.sqlite`). `ask` nie czyta encji, tylko
|
|
5
|
+
* potrzebuje `config.json.port` do discovery serwera.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveProjectByConfig(override?: string): string;
|
package/dist/bin/c4s/project.js
CHANGED
|
@@ -20,4 +20,29 @@ export function resolveProject(override) {
|
|
|
20
20
|
dir = parent;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Wariant `resolveProject` dla `c4s ask` — markerem waznosci projektu jest
|
|
25
|
+
* `.claude4spec/config.json` (nie `db.sqlite`). `ask` nie czyta encji, tylko
|
|
26
|
+
* potrzebuje `config.json.port` do discovery serwera.
|
|
27
|
+
*/
|
|
28
|
+
export function resolveProjectByConfig(override) {
|
|
29
|
+
const hasConfig = (dir) => fs.existsSync(path.join(dir, '.claude4spec', 'config.json'));
|
|
30
|
+
if (override) {
|
|
31
|
+
const abs = path.resolve(process.cwd(), override);
|
|
32
|
+
if (!hasConfig(abs)) {
|
|
33
|
+
throw new CliError('PROJECT_NOT_FOUND', `no claude4spec project at ${abs}`, 'check the path or run `npx claude4spec` there first');
|
|
34
|
+
}
|
|
35
|
+
return abs;
|
|
36
|
+
}
|
|
37
|
+
let dir = process.cwd();
|
|
38
|
+
while (true) {
|
|
39
|
+
if (hasConfig(dir))
|
|
40
|
+
return dir;
|
|
41
|
+
const parent = path.dirname(dir);
|
|
42
|
+
if (parent === dir) {
|
|
43
|
+
throw new CliError('PROJECT_NOT_FOUND', 'no claude4spec project found in current directory or any parent', 'run `npx claude4spec` first or pass `--project <path>`');
|
|
44
|
+
}
|
|
45
|
+
dir = parent;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
23
48
|
//# sourceMappingURL=project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/bin/c4s/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,QAAQ,CAChB,mBAAmB,EACnB,6BAA6B,GAAG,EAAE,EAClC,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,EACnB,iEAAiE,EACjE,wDAAwD,CACzD,CAAC;QACJ,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/bin/c4s/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC9C,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;YAChE,MAAM,IAAI,QAAQ,CAChB,mBAAmB,EACnB,6BAA6B,GAAG,EAAE,EAClC,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,EACnB,iEAAiE,EACjE,wDAAwD,CACzD,CAAC;QACJ,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAiB;IACtD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAChC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/D,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,EACnB,6BAA6B,GAAG,EAAE,EAClC,qDAAqD,CACtD,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IACxB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,SAAS,CAAC,GAAG,CAAC;YAAE,OAAO,GAAG,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,QAAQ,CAChB,mBAAmB,EACnB,iEAAiE,EACjE,wDAAwD,CACzD,CAAC;QACJ,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC"}
|
package/dist/bin/c4s.js
CHANGED
|
@@ -15,6 +15,7 @@ import { runCatalog } from './c4s/commands/catalog.js';
|
|
|
15
15
|
import { runListTags } from './c4s/commands/list-tags.js';
|
|
16
16
|
import { runListSlugs } from './c4s/commands/list-slugs.js';
|
|
17
17
|
import { runResolve } from './c4s/commands/resolve.js';
|
|
18
|
+
import { runAsk } from './c4s/commands/ask.js';
|
|
18
19
|
const HELP = `Usage: c4s <command> [options]
|
|
19
20
|
|
|
20
21
|
Tag commands (1:1 with XML tag names):
|
|
@@ -30,6 +31,12 @@ Detail view (no XML counterpart):
|
|
|
30
31
|
Utility:
|
|
31
32
|
resolve <file.md> [--format inline|json]
|
|
32
33
|
|
|
34
|
+
Agent Q&A (requires a running \`npx claude4spec\` server):
|
|
35
|
+
ask "<msg>" --ct chat
|
|
36
|
+
ask "<msg>" --ct brief --brief <path>
|
|
37
|
+
ask "<msg>" --thread <id>
|
|
38
|
+
--server <url> override server discovery (remote / one-off --port)
|
|
39
|
+
|
|
33
40
|
Discovery:
|
|
34
41
|
catalog
|
|
35
42
|
list-tags
|
|
@@ -43,7 +50,7 @@ Global flags:
|
|
|
43
50
|
--version print c4s version
|
|
44
51
|
--help show this help
|
|
45
52
|
`;
|
|
46
|
-
function main() {
|
|
53
|
+
async function main() {
|
|
47
54
|
const argv = process.argv.slice(2);
|
|
48
55
|
if (argv.length === 0 || argv[0] === '--help' || argv[0] === '-h') {
|
|
49
56
|
process.stdout.write(HELP);
|
|
@@ -78,6 +85,8 @@ function main() {
|
|
|
78
85
|
return runListTags(args);
|
|
79
86
|
case 'list-slugs':
|
|
80
87
|
return runListSlugs(args);
|
|
88
|
+
case 'ask':
|
|
89
|
+
return runAsk(args);
|
|
81
90
|
default:
|
|
82
91
|
throw new CliError('UNKNOWN_COMMAND', `unknown command '${args.command}'`, 'run `c4s --help`');
|
|
83
92
|
}
|
|
@@ -102,10 +111,7 @@ function readPackageVersion() {
|
|
|
102
111
|
}
|
|
103
112
|
return 'unknown';
|
|
104
113
|
}
|
|
105
|
-
|
|
106
|
-
main();
|
|
107
|
-
}
|
|
108
|
-
catch (err) {
|
|
114
|
+
main().catch((err) => {
|
|
109
115
|
if (err instanceof CliError) {
|
|
110
116
|
writeError(err);
|
|
111
117
|
process.exit(codeToExit(err.code));
|
|
@@ -113,7 +119,7 @@ catch (err) {
|
|
|
113
119
|
const message = err instanceof Error ? err.message : String(err);
|
|
114
120
|
writeError(new CliError('UNKNOWN_COMMAND', message));
|
|
115
121
|
process.exit(1);
|
|
116
|
-
}
|
|
122
|
+
});
|
|
117
123
|
function codeToExit(code) {
|
|
118
124
|
switch (code) {
|
|
119
125
|
case 'PROJECT_NOT_FOUND':
|
package/dist/bin/c4s.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c4s.js","sourceRoot":"","sources":["../../src/bin/c4s.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"c4s.js","sourceRoot":"","sources":["../../src/bin/c4s.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a0 as ln,a1 as an,a2 as H,a3 as q,a4 as B,a5 as un,a6 as y,a7 as tn,a8 as L,a9 as _,aa as rn,ab as o,ac as on,ad as sn,ae as fn}from"./mermaid.core-
|
|
1
|
+
import{a0 as ln,a1 as an,a2 as H,a3 as q,a4 as B,a5 as un,a6 as y,a7 as tn,a8 as L,a9 as _,aa as rn,ab as o,ac as on,ad as sn,ae as fn}from"./mermaid.core-GdPXct3q.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,F=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*L(on(0,T*T*R-P*P)),j=(P*g-m*S)/R,z=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=j-F,e=z-t,r=w-F,G=p-t;return x*x+e*e>r*r+G*G&&(j=w,z=p),{cx:j,cy:z,x01:-n,y01:-d,x11:j*(v/T-1),y11:z*(v/T-1)}}function hn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=dn,C=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-un,c=A.apply(this,arguments)-un,F=rn(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(F>tn-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*H(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(u*u+s*s)),w=_(rn(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(z>y){var G=sn(z/u*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=t?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=t?1:-1,m+=M,g-=M):(S=0,m=g=(f+c)/2)}var J=s*H(m),K=s*q(m),N=u*H(T),Q=u*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=u*H(R),Y=u*q(R),E;if(F<an)if(E=pn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(fn((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,t),r=W(U,V,N,Q,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(J,K),a.arc(0,0,s,m,g,!t)):a.moveTo(J,K),!(u>y)||!(P>y)?a.lineTo(N,Q):p>y?(e=W(N,Q,U,V,u,-p,t),r=W(J,K,X,Y,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-an/2;return[H(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|