forge-dev-framework 1.0.1

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 (140) hide show
  1. package/.claude/rules/api-patterns.md +98 -0
  2. package/.claude/rules/security-baseline.md +204 -0
  3. package/.claude/rules/testing-standards.md +177 -0
  4. package/.claude/rules/ui-conventions.md +142 -0
  5. package/README.md +261 -0
  6. package/bin/forge.js +14 -0
  7. package/dist/bin/forge.js +14 -0
  8. package/dist/cli/index.d.ts +22 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +116 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/commands/base.d.ts +31 -0
  13. package/dist/commands/base.d.ts.map +1 -0
  14. package/dist/commands/base.js +31 -0
  15. package/dist/commands/base.js.map +1 -0
  16. package/dist/commands/config.d.ts +14 -0
  17. package/dist/commands/config.d.ts.map +1 -0
  18. package/dist/commands/config.js +175 -0
  19. package/dist/commands/config.js.map +1 -0
  20. package/dist/commands/generate.d.ts +17 -0
  21. package/dist/commands/generate.d.ts.map +1 -0
  22. package/dist/commands/generate.js +159 -0
  23. package/dist/commands/generate.js.map +1 -0
  24. package/dist/commands/help.d.ts +11 -0
  25. package/dist/commands/help.d.ts.map +1 -0
  26. package/dist/commands/help.js +65 -0
  27. package/dist/commands/help.js.map +1 -0
  28. package/dist/commands/index.d.ts +8 -0
  29. package/dist/commands/index.d.ts.map +1 -0
  30. package/dist/commands/index.js +8 -0
  31. package/dist/commands/index.js.map +1 -0
  32. package/dist/commands/init.d.ts +10 -0
  33. package/dist/commands/init.d.ts.map +1 -0
  34. package/dist/commands/init.js +22 -0
  35. package/dist/commands/init.js.map +1 -0
  36. package/dist/commands/status.d.ts +13 -0
  37. package/dist/commands/status.d.ts.map +1 -0
  38. package/dist/commands/status.js +101 -0
  39. package/dist/commands/status.js.map +1 -0
  40. package/dist/commands/stubs.d.ts +14 -0
  41. package/dist/commands/stubs.d.ts.map +1 -0
  42. package/dist/commands/stubs.js +30 -0
  43. package/dist/commands/stubs.js.map +1 -0
  44. package/dist/generators/index.d.ts +11 -0
  45. package/dist/generators/index.d.ts.map +1 -0
  46. package/dist/generators/index.js +10 -0
  47. package/dist/generators/index.js.map +1 -0
  48. package/dist/generators/required-fields.d.ts +74 -0
  49. package/dist/generators/required-fields.d.ts.map +1 -0
  50. package/dist/generators/required-fields.js +179 -0
  51. package/dist/generators/required-fields.js.map +1 -0
  52. package/dist/generators/template-engine.d.ts +65 -0
  53. package/dist/generators/template-engine.d.ts.map +1 -0
  54. package/dist/generators/template-engine.js +209 -0
  55. package/dist/generators/template-engine.js.map +1 -0
  56. package/dist/generators/token-validator.d.ts +51 -0
  57. package/dist/generators/token-validator.d.ts.map +1 -0
  58. package/dist/generators/token-validator.js +141 -0
  59. package/dist/generators/token-validator.js.map +1 -0
  60. package/dist/generators/types.d.ts +433 -0
  61. package/dist/generators/types.d.ts.map +1 -0
  62. package/dist/generators/types.js +5 -0
  63. package/dist/generators/types.js.map +1 -0
  64. package/dist/generators/xml-task-generator.d.ts +67 -0
  65. package/dist/generators/xml-task-generator.d.ts.map +1 -0
  66. package/dist/generators/xml-task-generator.js +297 -0
  67. package/dist/generators/xml-task-generator.js.map +1 -0
  68. package/dist/git/__tests__/worktree.test.d.ts +5 -0
  69. package/dist/git/__tests__/worktree.test.d.ts.map +1 -0
  70. package/dist/git/__tests__/worktree.test.js +121 -0
  71. package/dist/git/__tests__/worktree.test.js.map +1 -0
  72. package/dist/git/codeowners.d.ts +101 -0
  73. package/dist/git/codeowners.d.ts.map +1 -0
  74. package/dist/git/codeowners.js +216 -0
  75. package/dist/git/codeowners.js.map +1 -0
  76. package/dist/git/commit.d.ts +135 -0
  77. package/dist/git/commit.d.ts.map +1 -0
  78. package/dist/git/commit.js +223 -0
  79. package/dist/git/commit.js.map +1 -0
  80. package/dist/git/hooks/commit-msg.d.ts +8 -0
  81. package/dist/git/hooks/commit-msg.d.ts.map +1 -0
  82. package/dist/git/hooks/commit-msg.js +34 -0
  83. package/dist/git/hooks/commit-msg.js.map +1 -0
  84. package/dist/git/hooks/pre-commit.d.ts +8 -0
  85. package/dist/git/hooks/pre-commit.d.ts.map +1 -0
  86. package/dist/git/hooks/pre-commit.js +34 -0
  87. package/dist/git/hooks/pre-commit.js.map +1 -0
  88. package/dist/git/pre-commit-hooks.d.ts +117 -0
  89. package/dist/git/pre-commit-hooks.d.ts.map +1 -0
  90. package/dist/git/pre-commit-hooks.js +270 -0
  91. package/dist/git/pre-commit-hooks.js.map +1 -0
  92. package/dist/git/wipe-protocol.d.ts +281 -0
  93. package/dist/git/wipe-protocol.d.ts.map +1 -0
  94. package/dist/git/wipe-protocol.js +237 -0
  95. package/dist/git/wipe-protocol.js.map +1 -0
  96. package/dist/git/worktree.d.ts +69 -0
  97. package/dist/git/worktree.d.ts.map +1 -0
  98. package/dist/git/worktree.js +202 -0
  99. package/dist/git/worktree.js.map +1 -0
  100. package/dist/scripts/install.d.ts +8 -0
  101. package/dist/scripts/install.d.ts.map +1 -0
  102. package/dist/scripts/install.js +161 -0
  103. package/dist/scripts/install.js.map +1 -0
  104. package/dist/types/config.d.ts +30 -0
  105. package/dist/types/config.d.ts.map +1 -0
  106. package/dist/types/config.js +23 -0
  107. package/dist/types/config.js.map +1 -0
  108. package/dist/types/index.d.ts +6 -0
  109. package/dist/types/index.d.ts.map +1 -0
  110. package/dist/types/index.js +6 -0
  111. package/dist/types/index.js.map +1 -0
  112. package/dist/types/state.d.ts +56 -0
  113. package/dist/types/state.d.ts.map +1 -0
  114. package/dist/types/state.js +6 -0
  115. package/dist/types/state.js.map +1 -0
  116. package/dist/utils/config.d.ts +15 -0
  117. package/dist/utils/config.d.ts.map +1 -0
  118. package/dist/utils/config.js +80 -0
  119. package/dist/utils/config.js.map +1 -0
  120. package/dist/utils/errors.d.ts +25 -0
  121. package/dist/utils/errors.d.ts.map +1 -0
  122. package/dist/utils/errors.js +48 -0
  123. package/dist/utils/errors.js.map +1 -0
  124. package/dist/utils/index.d.ts +11 -0
  125. package/dist/utils/index.d.ts.map +1 -0
  126. package/dist/utils/index.js +9 -0
  127. package/dist/utils/index.js.map +1 -0
  128. package/dist/utils/logger.d.ts +34 -0
  129. package/dist/utils/logger.d.ts.map +1 -0
  130. package/dist/utils/logger.js +73 -0
  131. package/dist/utils/logger.js.map +1 -0
  132. package/dist/utils/state-api.d.ts +128 -0
  133. package/dist/utils/state-api.d.ts.map +1 -0
  134. package/dist/utils/state-api.js +170 -0
  135. package/dist/utils/state-api.js.map +1 -0
  136. package/dist/utils/template-client.d.ts +73 -0
  137. package/dist/utils/template-client.d.ts.map +1 -0
  138. package/dist/utils/template-client.js +151 -0
  139. package/dist/utils/template-client.js.map +1 -0
  140. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * FORGE Error Classes
3
+ */
4
+ export declare class ForgeError extends Error {
5
+ readonly code: string;
6
+ constructor(message: string, code: string);
7
+ }
8
+ export declare class ConfigError extends ForgeError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class StateError extends ForgeError {
12
+ constructor(message: string);
13
+ }
14
+ export declare class ValidationError extends ForgeError {
15
+ readonly validationErrors: string[];
16
+ constructor(message: string, validationErrors: string[]);
17
+ }
18
+ export declare class ProjectNotFoundError extends ForgeError {
19
+ constructor(projectRoot: string);
20
+ }
21
+ /**
22
+ * Format error for user-friendly display
23
+ */
24
+ export declare function formatError(error: Error): string;
25
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,UAAW,SAAQ,KAAK;aACU,IAAI,EAAE,MAAM;gBAA7C,OAAO,EAAE,MAAM,EAAkB,IAAI,EAAE,MAAM;CAK1D;AAED,qBAAa,WAAY,SAAQ,UAAU;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,UAAW,SAAQ,UAAU;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,UAAU;aACA,gBAAgB,EAAE,MAAM,EAAE;gBAA3D,OAAO,EAAE,MAAM,EAAkB,gBAAgB,EAAE,MAAM,EAAE;CAIxE;AAED,qBAAa,oBAAqB,SAAQ,UAAU;gBACtC,WAAW,EAAE,MAAM;CAIhC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAKhD"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * FORGE Error Classes
3
+ */
4
+ export class ForgeError extends Error {
5
+ code;
6
+ constructor(message, code) {
7
+ super(message);
8
+ this.code = code;
9
+ this.name = 'ForgeError';
10
+ Error.captureStackTrace(this, this.constructor);
11
+ }
12
+ }
13
+ export class ConfigError extends ForgeError {
14
+ constructor(message) {
15
+ super(message, 'CONFIG_ERROR');
16
+ this.name = 'ConfigError';
17
+ }
18
+ }
19
+ export class StateError extends ForgeError {
20
+ constructor(message) {
21
+ super(message, 'STATE_ERROR');
22
+ this.name = 'StateError';
23
+ }
24
+ }
25
+ export class ValidationError extends ForgeError {
26
+ validationErrors;
27
+ constructor(message, validationErrors) {
28
+ super(message, 'VALIDATION_ERROR');
29
+ this.validationErrors = validationErrors;
30
+ this.name = 'ValidationError';
31
+ }
32
+ }
33
+ export class ProjectNotFoundError extends ForgeError {
34
+ constructor(projectRoot) {
35
+ super(`No FORGE project found at ${projectRoot}`, 'PROJECT_NOT_FOUND');
36
+ this.name = 'ProjectNotFoundError';
37
+ }
38
+ }
39
+ /**
40
+ * Format error for user-friendly display
41
+ */
42
+ export function formatError(error) {
43
+ if (error instanceof ForgeError) {
44
+ return `${error.name}: ${error.message}`;
45
+ }
46
+ return `Error: ${error.message}`;
47
+ }
48
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACU;IAA7C,YAAY,OAAe,EAAkB,IAAY;QACvD,KAAK,CAAC,OAAO,CAAC,CAAC;QAD4B,SAAI,GAAJ,IAAI,CAAQ;QAEvD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,UAAU;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IACA;IAA7C,YAAY,OAAe,EAAkB,gBAA0B;QACrE,KAAK,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;QADQ,qBAAgB,GAAhB,gBAAgB,CAAU;QAErE,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,UAAU;IAClD,YAAY,WAAmB;QAC7B,KAAK,CAAC,6BAA6B,WAAW,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IACD,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * FORGE Utility Exports
3
+ */
4
+ export * from './config';
5
+ export * from './errors';
6
+ export * from './logger';
7
+ export * from './state-api';
8
+ export * from './template-client';
9
+ export type { ForgeConfig, ForgeMode, ForgeDepth, GitStrategy, AgentProfile } from '../types/config.js';
10
+ export type { ForgeState, Task, TaskStatus, Contract, EventPayload, EventType } from '../types/state.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAGlC,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACxG,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * FORGE Utility Exports
3
+ */
4
+ export * from './config';
5
+ export * from './errors';
6
+ export * from './logger';
7
+ export * from './state-api';
8
+ export * from './template-client';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * FORGE Logger - User-friendly output formatting
3
+ */
4
+ export declare class Logger {
5
+ private quiet;
6
+ constructor(quiet?: boolean);
7
+ info(message: string): void;
8
+ success(message: string): void;
9
+ warning(message: string): void;
10
+ error(message: string): void;
11
+ debug(message: string): void;
12
+ /**
13
+ * Display a section header
14
+ */
15
+ header(title: string): void;
16
+ /**
17
+ * Display a bullet point
18
+ */
19
+ bullet(message: string, indent?: number): void;
20
+ /**
21
+ * Display a list item with number
22
+ */
23
+ numbered(message: string, index: number): void;
24
+ /**
25
+ * Display a code block or path
26
+ */
27
+ code(text: string): void;
28
+ /**
29
+ * Empty line for spacing
30
+ */
31
+ newline(): void;
32
+ }
33
+ export declare const logger: Logger;
34
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA;;GAEG;AAEH,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAU;gBAEX,KAAK,GAAE,OAAe;IAIlC,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM5B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO3B;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAOjD;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM9C;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB;AAED,eAAO,MAAM,MAAM,QAAe,CAAC"}
@@ -0,0 +1,73 @@
1
+ import chalk from 'chalk';
2
+ /**
3
+ * FORGE Logger - User-friendly output formatting
4
+ */
5
+ export class Logger {
6
+ quiet;
7
+ constructor(quiet = false) {
8
+ this.quiet = quiet;
9
+ }
10
+ info(message) {
11
+ if (!this.quiet)
12
+ console.log(chalk.blue('ℹ'), message);
13
+ }
14
+ success(message) {
15
+ if (!this.quiet)
16
+ console.log(chalk.green('✓'), message);
17
+ }
18
+ warning(message) {
19
+ if (!this.quiet)
20
+ console.log(chalk.yellow('⚠'), message);
21
+ }
22
+ error(message) {
23
+ console.error(chalk.red('✗'), message);
24
+ }
25
+ debug(message) {
26
+ if (process.env.DEBUG && !this.quiet) {
27
+ console.log(chalk.gray('[debug]'), message);
28
+ }
29
+ }
30
+ /**
31
+ * Display a section header
32
+ */
33
+ header(title) {
34
+ if (!this.quiet) {
35
+ console.log('\n' + chalk.bold.cyan(title));
36
+ console.log(chalk.cyan('─'.repeat(title.length)));
37
+ }
38
+ }
39
+ /**
40
+ * Display a bullet point
41
+ */
42
+ bullet(message, indent = 0) {
43
+ if (!this.quiet) {
44
+ const prefix = ' '.repeat(indent);
45
+ console.log(prefix + chalk.gray('•'), message);
46
+ }
47
+ }
48
+ /**
49
+ * Display a list item with number
50
+ */
51
+ numbered(message, index) {
52
+ if (!this.quiet) {
53
+ console.log(chalk.gray(`${index}.`), message);
54
+ }
55
+ }
56
+ /**
57
+ * Display a code block or path
58
+ */
59
+ code(text) {
60
+ if (!this.quiet) {
61
+ console.log(chalk.gray(text));
62
+ }
63
+ }
64
+ /**
65
+ * Empty line for spacing
66
+ */
67
+ newline() {
68
+ if (!this.quiet)
69
+ console.log();
70
+ }
71
+ }
72
+ export const logger = new Logger();
73
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AAEH,MAAM,OAAO,MAAM;IACT,KAAK,CAAU;IAEvB,YAAY,QAAiB,KAAK;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,OAAe;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAa;QAClB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,OAAe,EAAE,SAAiB,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,OAAe,EAAE,KAAa;QACrC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,IAAY;QACf,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * FORGE State Access API
3
+ * Interface between CLI-ENGINE and STATE-ENGINE
4
+ *
5
+ * This provides the API contract specified in state/STATE_API_SPEC.md
6
+ */
7
+ export interface Task {
8
+ id: string;
9
+ title: string;
10
+ ownerRole: string;
11
+ status: string;
12
+ deps: string[];
13
+ allowedPaths: string[];
14
+ acceptance: string[];
15
+ verify: string[];
16
+ commit: string | null;
17
+ requests: string[];
18
+ priority: number;
19
+ blockedBy: string[];
20
+ blocks: string[];
21
+ assignedTo: string | null;
22
+ createdAt?: string;
23
+ startedAt?: string | null;
24
+ completedAt?: string | null;
25
+ }
26
+ export interface Contract {
27
+ id: string;
28
+ path: string;
29
+ version: string;
30
+ publishedBy: string;
31
+ consumers: string[];
32
+ publishedAt?: string;
33
+ status: 'draft' | 'published' | 'deprecated';
34
+ }
35
+ export interface ProjectMetadata {
36
+ name: string;
37
+ status: string;
38
+ currentMilestone: string;
39
+ currentPhase: number;
40
+ createdAt?: string;
41
+ updatedAt?: string;
42
+ }
43
+ export interface StateMetadata {
44
+ schemaVersion: string;
45
+ lastEventId: string;
46
+ eventCount: number;
47
+ }
48
+ export interface State {
49
+ project: ProjectMetadata;
50
+ tasks: Task[];
51
+ contracts: Contract[];
52
+ eventsPointer: string;
53
+ metadata?: StateMetadata;
54
+ }
55
+ export interface EventPayload {
56
+ commitHash?: string;
57
+ filesChanged?: string[];
58
+ testsRun?: number;
59
+ testsPassed?: number;
60
+ blockingTasks?: string[];
61
+ reason?: string;
62
+ contractId?: string;
63
+ contractPath?: string;
64
+ requestedBy?: string;
65
+ requestedFor?: string;
66
+ version?: string;
67
+ severity?: 'P0' | 'P1' | 'P2';
68
+ finding?: string;
69
+ requirementRef?: string;
70
+ resolvedBy?: string;
71
+ resolution?: string;
72
+ publishedBy?: string;
73
+ consumers?: string[];
74
+ [key: string]: unknown;
75
+ }
76
+ export type EventType = 'TASK_STARTED' | 'TASK_COMPLETED' | 'TASK_BLOCKED' | 'TASK_FAILED' | 'TASK_CANCELLED' | 'REQUEST_CONTRACT' | 'CONTRACT_PUBLISHED' | 'REVIEW_FINDING' | 'REVIEW_RESOLVED';
77
+ export interface Event {
78
+ eventId: string;
79
+ timestamp: string;
80
+ taskId: string | null;
81
+ actor: string;
82
+ type: EventType;
83
+ payload: EventPayload;
84
+ }
85
+ export interface MergeResult {
86
+ eventCount: number;
87
+ errors: string[];
88
+ }
89
+ /**
90
+ * Load canonical STATE.json
91
+ */
92
+ export declare function getState(projectRoot?: string): State | null;
93
+ /**
94
+ * Get a specific task by ID
95
+ */
96
+ export declare function getTask(taskId: string, projectRoot?: string): Task | undefined;
97
+ /**
98
+ * Get all tasks owned by a specific role
99
+ */
100
+ export declare function getTasksByOwner(ownerRole: string, projectRoot?: string): Task[];
101
+ /**
102
+ * Get all contracts, optionally filtered by consumer
103
+ */
104
+ export declare function getContracts(consumerRole?: string | undefined, projectRoot?: string): Contract[];
105
+ /**
106
+ * Generate a unique event ID
107
+ * Format: evt-{ISO8601_timestamp}-{agent_name}-{sequence_number}
108
+ */
109
+ export declare function generateEventId(actor: string): string;
110
+ /**
111
+ * Submit an event to the event log
112
+ * This is append-only and concurrency-safe
113
+ */
114
+ export declare function submitEvent(event: Event, projectRoot?: string): Promise<void>;
115
+ /**
116
+ * Trigger State Steward to merge events into STATE.json
117
+ * This runs state/merge.ts
118
+ */
119
+ export declare function mergeState(projectRoot?: string): Promise<MergeResult>;
120
+ /**
121
+ * Check if we're in a FORGE project
122
+ */
123
+ export declare function isForgeProject(projectRoot?: string): boolean;
124
+ /**
125
+ * Initialize a new FORGE project state
126
+ */
127
+ export declare function initializeState(projectName: string, projectRoot?: string): State;
128
+ //# sourceMappingURL=state-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-api.d.ts","sourceRoot":"","sources":["../../src/utils/state-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * FORGE State Access API
3
+ * Interface between CLI-ENGINE and STATE-ENGINE
4
+ *
5
+ * This provides the API contract specified in state/STATE_API_SPEC.md
6
+ */
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { execSync } from 'child_process';
10
+ const STATE_PATH = 'state/STATE.json';
11
+ const EVENTS_DIR = 'state/events';
12
+ const MERGE_SCRIPT = 'state/merge.ts';
13
+ /**
14
+ * Load canonical STATE.json
15
+ */
16
+ export function getState(projectRoot = process.cwd()) {
17
+ const statePath = path.join(projectRoot, STATE_PATH);
18
+ if (!fs.existsSync(statePath)) {
19
+ return null;
20
+ }
21
+ try {
22
+ const content = fs.readFileSync(statePath, 'utf-8');
23
+ return JSON.parse(content);
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Failed to load state from ${statePath}: ${error}`);
27
+ }
28
+ }
29
+ /**
30
+ * Get a specific task by ID
31
+ */
32
+ export function getTask(taskId, projectRoot = process.cwd()) {
33
+ const state = getState(projectRoot);
34
+ if (!state) {
35
+ return undefined;
36
+ }
37
+ return state.tasks.find((t) => t.id === taskId);
38
+ }
39
+ /**
40
+ * Get all tasks owned by a specific role
41
+ */
42
+ export function getTasksByOwner(ownerRole, projectRoot = process.cwd()) {
43
+ const state = getState(projectRoot);
44
+ if (!state) {
45
+ return [];
46
+ }
47
+ return state.tasks.filter((t) => t.ownerRole === ownerRole);
48
+ }
49
+ /**
50
+ * Get all contracts, optionally filtered by consumer
51
+ */
52
+ export function getContracts(consumerRole = undefined, projectRoot = process.cwd()) {
53
+ const state = getState(projectRoot);
54
+ if (!state) {
55
+ return [];
56
+ }
57
+ if (!consumerRole) {
58
+ return state.contracts;
59
+ }
60
+ return state.contracts.filter((c) => c.consumers.includes(consumerRole));
61
+ }
62
+ /**
63
+ * Generate a unique event ID
64
+ * Format: evt-{ISO8601_timestamp}-{agent_name}-{sequence_number}
65
+ */
66
+ export function generateEventId(actor) {
67
+ const timestamp = new Date().toISOString();
68
+ const sequence = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
69
+ return `evt-${timestamp}-${actor}-${sequence}`;
70
+ }
71
+ /**
72
+ * Submit an event to the event log
73
+ * This is append-only and concurrency-safe
74
+ */
75
+ export async function submitEvent(event, projectRoot = process.cwd()) {
76
+ const eventsDir = path.join(projectRoot, EVENTS_DIR);
77
+ // Ensure events directory exists
78
+ if (!fs.existsSync(eventsDir)) {
79
+ fs.mkdirSync(eventsDir, { recursive: true });
80
+ }
81
+ // Validate event structure
82
+ if (!event.eventId || !event.timestamp || !event.actor || !event.type) {
83
+ throw new Error('Invalid event: missing required fields');
84
+ }
85
+ // Write event file
86
+ const filename = `${event.eventId}.json`;
87
+ const eventPath = path.join(eventsDir, filename);
88
+ try {
89
+ fs.writeFileSync(eventPath, JSON.stringify(event, null, 2), 'utf-8');
90
+ }
91
+ catch (error) {
92
+ throw new Error(`Failed to write event to ${eventPath}: ${error}`);
93
+ }
94
+ }
95
+ /**
96
+ * Trigger State Steward to merge events into STATE.json
97
+ * This runs state/merge.ts
98
+ */
99
+ export async function mergeState(projectRoot = process.cwd()) {
100
+ const mergeScriptPath = path.join(projectRoot, MERGE_SCRIPT);
101
+ if (!fs.existsSync(mergeScriptPath)) {
102
+ throw new Error(`Merge script not found at ${mergeScriptPath}`);
103
+ }
104
+ try {
105
+ // Run merge script using bun (as specified in state/README.md)
106
+ const output = execSync(`bun run ${mergeScriptPath}`, {
107
+ cwd: projectRoot,
108
+ encoding: 'utf-8',
109
+ });
110
+ // Parse output to extract event count and errors
111
+ // The merge script should output JSON or structured text
112
+ return {
113
+ eventCount: 0,
114
+ errors: [],
115
+ };
116
+ }
117
+ catch (error) {
118
+ // If merge fails, return errors
119
+ return {
120
+ eventCount: 0,
121
+ errors: [String(error)],
122
+ };
123
+ }
124
+ }
125
+ /**
126
+ * Check if we're in a FORGE project
127
+ */
128
+ export function isForgeProject(projectRoot = process.cwd()) {
129
+ const statePath = path.join(projectRoot, STATE_PATH);
130
+ return fs.existsSync(statePath);
131
+ }
132
+ /**
133
+ * Initialize a new FORGE project state
134
+ */
135
+ export function initializeState(projectName, projectRoot = process.cwd()) {
136
+ const now = new Date().toISOString();
137
+ const state = {
138
+ project: {
139
+ name: projectName,
140
+ status: 'initialized',
141
+ currentMilestone: 'v1.0',
142
+ currentPhase: 0,
143
+ createdAt: now,
144
+ updatedAt: now,
145
+ },
146
+ tasks: [],
147
+ contracts: [],
148
+ eventsPointer: 'state/events/',
149
+ metadata: {
150
+ schemaVersion: '1.0.0',
151
+ lastEventId: '',
152
+ eventCount: 0,
153
+ },
154
+ };
155
+ // Ensure state directory exists
156
+ const stateDir = path.join(projectRoot, 'state');
157
+ if (!fs.existsSync(stateDir)) {
158
+ fs.mkdirSync(stateDir, { recursive: true });
159
+ }
160
+ // Write STATE.json
161
+ const statePath = path.join(projectRoot, STATE_PATH);
162
+ fs.writeFileSync(statePath, JSON.stringify(state, null, 2), 'utf-8');
163
+ // Ensure events directory exists
164
+ const eventsDir = path.join(projectRoot, EVENTS_DIR);
165
+ if (!fs.existsSync(eventsDir)) {
166
+ fs.mkdirSync(eventsDir, { recursive: true });
167
+ }
168
+ return state;
169
+ }
170
+ //# sourceMappingURL=state-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-api.js","sourceRoot":"","sources":["../../src/utils/state-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * FORGE Template Client
3
+ * Wrapper for TEMPLATES integration with CLI-ENGINE
4
+ */
5
+ import { type TemplateContext, type RenderResult, type XmlTaskSpec } from '../generators/index.js';
6
+ import { type RequiredFieldSet } from '../generators/index.js';
7
+ /**
8
+ * Template Client Configuration
9
+ */
10
+ export interface TemplateClientConfig {
11
+ projectRoot: string;
12
+ templatesDir?: string;
13
+ outputDir?: string;
14
+ interactive?: boolean;
15
+ }
16
+ /**
17
+ * Template Client for FORGE CLI
18
+ */
19
+ export declare class TemplateClient {
20
+ private engine;
21
+ private projectRoot;
22
+ private interactive;
23
+ private outputDir;
24
+ constructor(config: TemplateClientConfig);
25
+ /**
26
+ * Validate that context has all required fields for a template
27
+ */
28
+ validateContext(context: Partial<TemplateContext>, fieldSet: RequiredFieldSet): {
29
+ valid: boolean;
30
+ missing: string[];
31
+ };
32
+ /**
33
+ * Get required fields for a specific template
34
+ */
35
+ getRequiredFields(fieldSet: RequiredFieldSet): string[];
36
+ /**
37
+ * Render a template with the given context
38
+ */
39
+ renderTemplate(templateName: string, context: Partial<TemplateContext>): Promise<RenderResult>;
40
+ /**
41
+ * Render and write a template to disk
42
+ */
43
+ generateArtifact(templateName: string, context: Partial<TemplateContext>, outputFilename: string): Promise<void>;
44
+ /**
45
+ * Generate XML task specs
46
+ */
47
+ generateXmlTasks(tasks: XmlTaskSpec[]): string;
48
+ /**
49
+ * Handle token limit warnings
50
+ */
51
+ private handleTokenLimitWarning;
52
+ /**
53
+ * Get token limit for a template
54
+ */
55
+ private getTemplateLimit;
56
+ /**
57
+ * Check if file exists
58
+ */
59
+ private fileExists;
60
+ /**
61
+ * Backup existing file
62
+ */
63
+ private backupFile;
64
+ /**
65
+ * Prompt user to proceed despite warnings
66
+ */
67
+ private shouldProceed;
68
+ }
69
+ /**
70
+ * Create a template client instance
71
+ */
72
+ export declare function createTemplateClient(config: TemplateClientConfig): TemplateClient;
73
+ //# sourceMappingURL=template-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-client.d.ts","sourceRoot":"","sources":["../../src/utils/template-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAA6C,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE9I,OAAO,EAA2C,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAGxG;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,oBAAoB;IAkBxC;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,gBAAgB,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE;IAIrH;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,EAAE;IAIvD;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAiBpG;;OAEG;IACG,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBtH;;OAEG;IACH,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM;IAM9C;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAY/B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,UAAU;IASxB;;OAEG;YACW,UAAU;IAMxB;;OAEG;YACW,aAAa;CAS5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAEjF"}