perttool 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/CHANGELOG.md +66 -33
  2. package/README.md +172 -110
  3. package/dist/application/analyze.js +5 -5
  4. package/dist/application/analyze.js.map +1 -1
  5. package/dist/application/init.d.ts +42 -0
  6. package/dist/application/init.d.ts.map +1 -0
  7. package/dist/application/init.js +217 -0
  8. package/dist/application/init.js.map +1 -0
  9. package/dist/application/mutate.d.ts.map +1 -1
  10. package/dist/application/mutate.js +13 -9
  11. package/dist/application/mutate.js.map +1 -1
  12. package/dist/cli.js +245 -372
  13. package/dist/cli.js.map +1 -1
  14. package/dist/command/discovery.d.ts +30 -0
  15. package/dist/command/discovery.d.ts.map +1 -0
  16. package/dist/command/discovery.js +625 -0
  17. package/dist/command/discovery.js.map +1 -0
  18. package/dist/command/registry.d.ts +84 -0
  19. package/dist/command/registry.d.ts.map +1 -0
  20. package/dist/command/registry.js +951 -0
  21. package/dist/command/registry.js.map +1 -0
  22. package/dist/command/usage.d.ts +42 -0
  23. package/dist/command/usage.d.ts.map +1 -0
  24. package/dist/command/usage.js +337 -0
  25. package/dist/command/usage.js.map +1 -0
  26. package/dist/conversion/mermaid-import.js +56 -56
  27. package/dist/conversion/mermaid-import.js.map +1 -1
  28. package/dist/conversion/mermaid.js +1 -1
  29. package/dist/conversion/mermaid.js.map +1 -1
  30. package/dist/help/guide.d.ts +12 -0
  31. package/dist/help/guide.d.ts.map +1 -0
  32. package/dist/help/guide.js +103 -0
  33. package/dist/help/guide.js.map +1 -0
  34. package/dist/help/registry.d.ts +0 -6
  35. package/dist/help/registry.d.ts.map +1 -1
  36. package/dist/help/registry.js +69 -80
  37. package/dist/help/registry.js.map +1 -1
  38. package/dist/index.d.ts +12 -2
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +6 -1
  41. package/dist/index.js.map +1 -1
  42. package/dist/io/safe-write.js +17 -17
  43. package/dist/io/safe-write.js.map +1 -1
  44. package/dist/mutation/gate.d.ts +5 -0
  45. package/dist/mutation/gate.d.ts.map +1 -0
  46. package/dist/mutation/gate.js +156 -0
  47. package/dist/mutation/gate.js.map +1 -0
  48. package/dist/mutation/milestone.js +26 -26
  49. package/dist/mutation/milestone.js.map +1 -1
  50. package/dist/mutation/project.js +14 -14
  51. package/dist/mutation/project.js.map +1 -1
  52. package/dist/mutation/resource.js +22 -22
  53. package/dist/mutation/resource.js.map +1 -1
  54. package/dist/mutation/task.js +40 -40
  55. package/dist/mutation/task.js.map +1 -1
  56. package/dist/mutation/types.d.ts +26 -1
  57. package/dist/mutation/types.d.ts.map +1 -1
  58. package/dist/parser/document-parser.js +17 -17
  59. package/dist/parser/document-parser.js.map +1 -1
  60. package/dist/semantic/validator.js +41 -41
  61. package/dist/semantic/validator.js.map +1 -1
  62. package/dist/version.d.ts +1 -1
  63. package/dist/version.js +1 -1
  64. package/package.json +3 -3
@@ -0,0 +1,103 @@
1
+ import { TOOL_VERSION } from "../version.js";
2
+ import { getHelp, } from "./registry.js";
3
+ function jsonPosition(position) {
4
+ return {
5
+ offset: position.offset,
6
+ line: position.line + 1,
7
+ column: position.column + 1,
8
+ };
9
+ }
10
+ function jsonSpan(span) {
11
+ return {
12
+ start: jsonPosition(span.start),
13
+ end: jsonPosition(span.end),
14
+ };
15
+ }
16
+ function guideDiagnosticToJson(diagnostic) {
17
+ return {
18
+ code: diagnostic.code,
19
+ severity: diagnostic.severity,
20
+ message: diagnostic.message,
21
+ entity_id: diagnostic.entityId ?? null,
22
+ span: diagnostic.span === undefined ? null : jsonSpan(diagnostic.span),
23
+ related: (diagnostic.related ?? []).map((related) => ({
24
+ message: related.message,
25
+ span: jsonSpan(related.span),
26
+ })),
27
+ help_topic: null,
28
+ guide_topic: diagnostic.helpTopic ?? null,
29
+ expected_syntax: diagnostic.expectedSyntax ?? null,
30
+ fixes: [],
31
+ data: diagnostic.data ?? {},
32
+ };
33
+ }
34
+ function guideInvocation(topicId) {
35
+ return ["perttool", "guide", ...topicId.split("."), "--level", "quick"]
36
+ .join(" ");
37
+ }
38
+ function renderGuideDiagnostic(diagnostic) {
39
+ return [
40
+ `${diagnostic.code} ${diagnostic.severity}: ${diagnostic.message}`,
41
+ ...(diagnostic.helpTopic === undefined
42
+ ? []
43
+ : [` guide: ${guideInvocation(diagnostic.helpTopic)}`]),
44
+ ].join("\n");
45
+ }
46
+ export function getGuide(topicId, level) {
47
+ const help = getHelp(topicId, level);
48
+ return Object.freeze({
49
+ schemaVersion: "Perttool.GuideResult.v1",
50
+ cliContractVersion: 3,
51
+ toolVersion: TOOL_VERSION,
52
+ operation: "guide",
53
+ ...help,
54
+ });
55
+ }
56
+ export function guideResultToJson(result) {
57
+ return {
58
+ schema_version: result.schemaVersion,
59
+ cli_contract_version: result.cliContractVersion,
60
+ tool_version: result.toolVersion,
61
+ operation: result.operation,
62
+ ok: result.ok,
63
+ diagnostics: result.diagnostics.map(guideDiagnosticToJson),
64
+ topic_id: result.topicId,
65
+ level: result.level,
66
+ title: result.title,
67
+ summary: result.summary,
68
+ sections: result.sections,
69
+ syntax: result.syntax,
70
+ examples: result.examples,
71
+ related: result.related,
72
+ topics: result.topics,
73
+ };
74
+ }
75
+ export function serializeGuideResult(result) {
76
+ return `${JSON.stringify(guideResultToJson(result))}\n`;
77
+ }
78
+ export function renderGuideResult(result) {
79
+ if (!result.ok) {
80
+ return `${result.diagnostics.map(renderGuideDiagnostic).join("\n")}\n`;
81
+ }
82
+ const lines = [result.title, "", result.summary];
83
+ if (result.topics.length > 0) {
84
+ lines.push("", "Topics:");
85
+ for (const topic of result.topics) {
86
+ lines.push(` ${topic.id.padEnd(12)} ${topic.summary}`);
87
+ }
88
+ }
89
+ for (const section of result.sections) {
90
+ lines.push("", section.title, section.body);
91
+ }
92
+ if (result.syntax.length > 0) {
93
+ lines.push("", "Syntax:", ...result.syntax.map((line) => ` ${line}`));
94
+ }
95
+ if (result.examples.length > 0) {
96
+ lines.push("", "Examples:", ...result.examples.map((example) => ` ${example.id}: ${example.text}`));
97
+ }
98
+ if (result.related.length > 0) {
99
+ lines.push("", `Related: ${result.related.join(", ")}`);
100
+ }
101
+ return `${lines.join("\n")}\n`;
102
+ }
103
+ //# sourceMappingURL=guide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/help/guide.ts"],"names":[],"mappings":"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"}
@@ -33,11 +33,5 @@ export interface HelpResult {
33
33
  readonly topics: readonly Pick<HelpNode, "id" | "title" | "summary">[];
34
34
  readonly diagnostics: readonly Diagnostic[];
35
35
  }
36
- export interface CommandHelpDefinition {
37
- readonly operation: string;
38
- readonly summary: string;
39
- readonly syntax: readonly string[];
40
- }
41
- export declare function getAgentHelpCommandHelp(): CommandHelpDefinition;
42
36
  export declare function getHelp(topicId: string | null, level: HelpLevel): HelpResult;
43
37
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/help/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC;IACvE,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAcD,wBAAgB,uBAAuB,IAAI,qBAAqB,CAE/D;AAomBD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,CAsD5E"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/help/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC;IACvE,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAsmBD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,SAAS,GAAG,UAAU,CAsD5E"}