@rasensio/aidlc-content 1.29.2 → 1.30.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/capabilities/claude-code.yaml +14 -0
- package/capabilities/codex.yaml +10 -0
- package/capabilities/copilot.yaml +10 -0
- package/capabilities/cursor.yaml +10 -0
- package/capabilities/kiro.yaml +10 -0
- package/capabilities/windsurf.yaml +11 -0
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +6 -0
- package/dist/capabilities.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/types.d.ts +20 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/skills/00-overview.md +34 -6
- package/skills/03-entry-point.md +4 -1
- package/skills/05-constitution.md +23 -17
- package/skills/20-requirements.md +1 -1
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
platform: claude-code
|
|
2
|
+
questions:
|
|
3
|
+
mechanism: AskUserQuestion
|
|
4
|
+
directive: >-
|
|
5
|
+
Render each question spec as one question in an AskUserQuestion call. The
|
|
6
|
+
interrogative sentence is the question; each option's label is its choice and
|
|
7
|
+
its consequence is the description; mark the recommendation by putting it
|
|
8
|
+
first and appending "(Recommended)" to its label. At most four options per
|
|
9
|
+
question and at least two — a spec with more must be split or narrowed. Never
|
|
10
|
+
add an explicit "Other" option: the tool supplies one, and a second is a dead
|
|
11
|
+
choice the user has to rule out. The header is a chip of at most 12
|
|
12
|
+
characters, so it names the decision, not the question. Put "Why it matters",
|
|
13
|
+
the citations and "If you say nothing" in the question file and name its path
|
|
14
|
+
in one line of the message that carries the call — they do not fit an option
|
|
15
|
+
description, and truncating them is what made questions unanswerable.
|
|
2
16
|
capabilities:
|
|
3
17
|
plan-mode:
|
|
4
18
|
phases: [ideation, requirements, design]
|
package/capabilities/codex.yaml
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
platform: codex
|
|
2
|
+
questions:
|
|
3
|
+
mechanism: request_user_input
|
|
4
|
+
directive: >-
|
|
5
|
+
Render each question spec through the structured user-input request when the
|
|
6
|
+
running Codex build exposes one — the interrogative as the prompt, one entry
|
|
7
|
+
per option carrying its consequence, the recommendation named as such. When it
|
|
8
|
+
is not available, fall back to numbered prose in the message and do not
|
|
9
|
+
pretend a picker exists. Either way the question file is written first and its
|
|
10
|
+
path named in one line, because a sandboxed turn can end before an answer
|
|
11
|
+
arrives and the file is what survives it.
|
|
2
12
|
capabilities:
|
|
3
13
|
code-generation:
|
|
4
14
|
phases: [implementation, testing]
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
platform: copilot
|
|
2
|
+
questions:
|
|
3
|
+
mechanism: null
|
|
4
|
+
directive: >-
|
|
5
|
+
Copilot Chat has no structured question prompt, so render each spec as
|
|
6
|
+
numbered prose in the message: the interrogative as a bold line, then the
|
|
7
|
+
options as a numbered list with the consequence on each, then the
|
|
8
|
+
recommendation and the no-answer outcome. Restart option numbering at 1 for
|
|
9
|
+
every question, whatever was numbered earlier in the message — a user
|
|
10
|
+
answering "3" must be answering the third option of that question. Ask the
|
|
11
|
+
user to reply with the option number or its label.
|
|
2
12
|
capabilities:
|
|
3
13
|
plan-mode:
|
|
4
14
|
phases: [ideation, requirements, design]
|
package/capabilities/cursor.yaml
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
platform: cursor
|
|
2
|
+
questions:
|
|
3
|
+
mechanism: null
|
|
4
|
+
directive: >-
|
|
5
|
+
Cursor has no structured question prompt, so render each spec as numbered
|
|
6
|
+
prose in the chat: the interrogative as a bold line, then the options as a
|
|
7
|
+
numbered list with the consequence on each, then the recommendation and the
|
|
8
|
+
no-answer outcome. Restart option numbering at 1 for every question, whatever
|
|
9
|
+
was numbered earlier in the message. Name the question file by path so the
|
|
10
|
+
user can open it in the editor — Cursor puts the file a click away, which is
|
|
11
|
+
what makes the longer questions cheap to route there.
|
|
2
12
|
capabilities:
|
|
3
13
|
composer:
|
|
4
14
|
phases: [design, implementation]
|
package/capabilities/kiro.yaml
CHANGED
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
platform: kiro
|
|
2
|
+
questions:
|
|
3
|
+
mechanism: null
|
|
4
|
+
directive: >-
|
|
5
|
+
Kiro has no structured question prompt, so render each spec as numbered prose
|
|
6
|
+
in the chat: the interrogative as a bold line, then the options as a numbered
|
|
7
|
+
list with the consequence on each, then the recommendation and the no-answer
|
|
8
|
+
outcome. Restart option numbering at 1 for every question, whatever was
|
|
9
|
+
numbered earlier in the message. The question file stays under `.aidlc/`, not
|
|
10
|
+
`.kiro/specs/` — a spec session is where the answer lands, not where the
|
|
11
|
+
question is recorded.
|
|
2
12
|
capabilities:
|
|
3
13
|
spec-driven-development:
|
|
4
14
|
phases: [requirements, design, implementation]
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
platform: windsurf
|
|
2
|
+
questions:
|
|
3
|
+
mechanism: null
|
|
4
|
+
directive: >-
|
|
5
|
+
Windsurf has no structured question prompt, so render each spec as numbered
|
|
6
|
+
prose in Cascade: the interrogative as a bold line, then the options as a
|
|
7
|
+
numbered list with the consequence on each, then the recommendation and the
|
|
8
|
+
no-answer outcome. Restart option numbering at 1 for every question, whatever
|
|
9
|
+
was numbered earlier in the message. Windsurf's context window is the tightest
|
|
10
|
+
of the supported platforms, so route to the question file sooner here — keep
|
|
11
|
+
the rendered prompt to the interrogative, the option labels and the file path,
|
|
12
|
+
and leave the citations in the file.
|
|
2
13
|
capabilities:
|
|
3
14
|
cascade:
|
|
4
15
|
phases: [implementation]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,YAAY,CAAC;AAKnE,wBAAgB,gBAAgB,IAAI,aAAa,EAAE,CAqBlD;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE5E"}
|
package/dist/capabilities.js
CHANGED
|
@@ -11,9 +11,15 @@ export function loadCapabilities() {
|
|
|
11
11
|
return files.map(filename => {
|
|
12
12
|
const raw = readFileSync(resolve(CAPABILITIES_DIR, filename), 'utf8');
|
|
13
13
|
const parsed = parseYaml(raw);
|
|
14
|
+
// `questions` is carried through rather than folded into `capabilities`, so
|
|
15
|
+
// that a null `mechanism` stays distinguishable from a missing block: the
|
|
16
|
+
// first selects the numbered-prose fallback, the second is a capability file
|
|
17
|
+
// that forgot AC-7 and must fail the adapter tripwire.
|
|
18
|
+
const questions = parsed['questions'];
|
|
14
19
|
return {
|
|
15
20
|
platform: parsed['platform'] ?? '',
|
|
16
21
|
capabilities: parsed['capabilities'] ?? {},
|
|
22
|
+
...(questions ? { questions } : {}),
|
|
17
23
|
};
|
|
18
24
|
});
|
|
19
25
|
}
|
package/dist/capabilities.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5E,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AAE/D,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACtD,IAAI,EAAE,CAAC;IAEV,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAA4B,CAAC;QAEzD,OAAO;YACL,QAAQ,EAAG,MAAM,CAAC,UAAU,CAAY,IAAI,EAAE;YAC9C,YAAY,EAAG,MAAM,CAAC,cAAc,CAA6B,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAG1C,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC5E,MAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;AAE/D,MAAM,UAAU,gBAAgB;IAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC;SACxC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SACtD,IAAI,EAAE,CAAC;IAEV,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QAC1B,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAA4B,CAAC;QAEzD,4EAA4E;QAC5E,0EAA0E;QAC1E,6EAA6E;QAC7E,uDAAuD;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAkC,CAAC;QAEvE,OAAO;YACL,QAAQ,EAAG,MAAM,CAAC,UAAU,CAAY,IAAI,EAAE;YAC9C,YAAY,EAAG,MAAM,CAAC,cAAc,CAA6B,IAAI,EAAE;YACvE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,gBAAgB,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC/D,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export { loadGlossary, getGlossaryTerm } from './glossary.js';
|
|
|
5
5
|
export { loadCapabilities, getCapabilityMap } from './capabilities.js';
|
|
6
6
|
export { loadPhases, getPhase } from './phases.js';
|
|
7
7
|
export { loadTutorials, getTutorial, getSeries, parseTutorialSource } from './tutorials.js';
|
|
8
|
-
export type { Skill, WorkflowTemplate, GuidanceLayer, GlossaryTerm, CapabilityMap, PhaseDefinition, CodeSample, ContentReference, TutorialStep, Tutorial, WidgetKind, WidgetReference } from './types.js';
|
|
8
|
+
export type { Skill, WorkflowTemplate, GuidanceLayer, GlossaryTerm, CapabilityMap, QuestionRendering, PhaseDefinition, CodeSample, ContentReference, TutorialStep, Tutorial, WidgetKind, WidgetReference } from './types.js';
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,YAAY,EAAE,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -45,9 +45,29 @@ export interface GlossaryTerm {
|
|
|
45
45
|
*/
|
|
46
46
|
not?: string;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* How one platform renders a question spec (explanatory-questions/AC-7).
|
|
50
|
+
*
|
|
51
|
+
* Deliberately a top-level sibling of `capabilities`, not an entry inside it:
|
|
52
|
+
* `resolveActivation` returns exactly one activation string per phase, and
|
|
53
|
+
* `claude-code`, `copilot` and `kiro` already occupy `requirements` and `design`
|
|
54
|
+
* — the phases questions get asked in. A second entry for the same phase would
|
|
55
|
+
* silently lose to the first.
|
|
56
|
+
*/
|
|
57
|
+
export interface QuestionRendering {
|
|
58
|
+
/**
|
|
59
|
+
* The platform's native question mechanism, or `null` when it has none.
|
|
60
|
+
* Null selects the numbered-prose fallback (explanatory-questions/AC-10).
|
|
61
|
+
*/
|
|
62
|
+
mechanism: string | null;
|
|
63
|
+
/** What the agent must do to render a spec on this platform. */
|
|
64
|
+
directive: string;
|
|
65
|
+
}
|
|
48
66
|
export interface CapabilityMap {
|
|
49
67
|
platform: string;
|
|
50
68
|
capabilities: Record<string, unknown>;
|
|
69
|
+
/** Absent only for a platform whose capability file predates AC-7. */
|
|
70
|
+
questions?: QuestionRendering;
|
|
51
71
|
}
|
|
52
72
|
export interface PhaseDefinition {
|
|
53
73
|
name: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,KAAK;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,sEAAsE;IACtE,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAEpE;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;IACtC,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
package/package.json
CHANGED
package/skills/00-overview.md
CHANGED
|
@@ -156,14 +156,42 @@ On each lifecycle event — `on-instance-start`, `on-phase-enter`, `on-phase-exi
|
|
|
156
156
|
5. If an action fails and it is `blocking: true`, stop and report the failure to the user before continuing the lifecycle. If `blocking: false`, report and continue.
|
|
157
157
|
6. Report every action you ran and its outcome — never run configured automation silently.
|
|
158
158
|
|
|
159
|
-
##
|
|
159
|
+
## Question Protocol
|
|
160
160
|
|
|
161
|
-
|
|
161
|
+
Ask the user something when **different answers would change an artifact, a design decision, or scope** — the trigger is consequence, not volume. A question whose answers change nothing is not asked. A question that an answer already given in this instance resolves is not re-asked: name that answer and ask the narrow follow-up instead.
|
|
162
162
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
163
|
+
### The spec
|
|
164
|
+
|
|
165
|
+
Every question is written first as a **spec** — platform-neutral, and never printed into the conversation. It carries, at minimum:
|
|
166
|
+
|
|
167
|
+
- **The decision**, as one interrogative sentence.
|
|
168
|
+
- **Why it matters** — what it blocks, and what goes wrong if it is guessed.
|
|
169
|
+
- **What the repo already says** — cited as `path:line`, or `path` when the whole file is the point. "Nothing found" is a valid citation; saying nothing is not.
|
|
170
|
+
- **Two to four options**, each with its consequence spelled out.
|
|
171
|
+
- **A recommendation**, marked as such — exactly one, with the reason it wins.
|
|
172
|
+
- **If you say nothing** — the outcome of no answer, so that not answering is a choice rather than a stall.
|
|
173
|
+
|
|
174
|
+
Expand every identifier on first use, writing the thing out with the tag in parentheses — "the citation rule (AC-1)", not a bare `AC-1`, `FR3` or `unit-4`. A bare tag assumes the reader carries a mapping they do not have.
|
|
175
|
+
|
|
176
|
+
### Rendering the spec
|
|
177
|
+
|
|
178
|
+
The spec is input to a rendering, never output. How to render it on this platform is in `.aidlc/resources/questions/rendering.md` — read that before asking. Routing is decided by the question, never by asking the user which mode they want:
|
|
179
|
+
|
|
180
|
+
- Options self-explanatory and the stake fits one line → render it directly and let the user answer in place.
|
|
181
|
+
- Needs citations, trade-offs, or more than three lines of context → write the question file first, then render a prompt naming its path in one line.
|
|
182
|
+
|
|
183
|
+
### The question file
|
|
184
|
+
|
|
185
|
+
Written in **every** branch, including when the user answers in place — it is the record of what was asked and decided, not a fallback. Two locations, and no others are valid:
|
|
186
|
+
|
|
187
|
+
- Inside an instance: `.aidlc/state/<instance>/<phase>-questions.md`.
|
|
188
|
+
- No instance (constitution update, first activation): `.aidlc/questions/<topic>.md`.
|
|
189
|
+
|
|
190
|
+
Each question in the file ends with an `[Answer]:` tag — blank while open, carrying the chosen option label verbatim once answered. Fold answers into the phase artifact they were gathered for and leave the file in place as the record.
|
|
191
|
+
|
|
192
|
+
With no interactive terminal, write the file, say where it is, and end the turn. Never assume an answer.
|
|
193
|
+
|
|
194
|
+
**At most five questions stand open at once.** At the limit, answering — or accepting the stated defaults — comes before asking another. The cap counts open questions, not questions asked: a long negotiation is fine, an accumulating pile is not.
|
|
167
195
|
|
|
168
196
|
## Roadmap Capture
|
|
169
197
|
|
package/skills/03-entry-point.md
CHANGED
|
@@ -32,7 +32,8 @@ If `.aidlc/context/` does not exist or contains no `.md` files, defer to the **a
|
|
|
32
32
|
2. For each instance, read `instance.yaml` (current phase, template, scope, claim) and the `phase-<name>.yaml` files to compute completion (complete artifacts ÷ total required artifacts).
|
|
33
33
|
3. Read `.aidlc/config.yaml` for project defaults (scope, template) if present.
|
|
34
34
|
4. Count roadmap items per status directory under `.aidlc/roadmap/` (`inbox`, `backlog`, `in-progress`, `done`, `hold`) — count files, and read frontmatter only if a title is needed. Never read item bodies. Status is the directory; there is no status field to read.
|
|
35
|
-
5.
|
|
35
|
+
5. Count pending questions — the question files matching `.aidlc/state/*/*-questions.md` and `.aidlc/questions/*.md` that contain at least one blank `[Answer]:` tag. Grep for the tag; do not read the question bodies. This is the only read that opens a question file at menu time.
|
|
36
|
+
6. Check `<git-common-dir>/aidlc/retro-pending/` (resolve via `git rev-parse --git-common-dir`) for pending-retrospective markers. Each marker adds a menu entry: **Run retrospective for `<instance>`** (routes to the **aidlc-retrospective** skill). A marker whose instance has no state dir and no registry entry is stale — remove it and note the cleanup in one line.
|
|
36
37
|
|
|
37
38
|
Do not read artifact bodies or transition history to build the menu — the compact state files are enough.
|
|
38
39
|
|
|
@@ -43,6 +44,7 @@ Compose a short menu from the state. Include only the options that make sense:
|
|
|
43
44
|
- **Continue `<instance>`** — one entry per incomplete instance, showing current phase and completion percentage. Most recently updated first.
|
|
44
45
|
- **Start something new** — always.
|
|
45
46
|
- **Capture a roadmap item** — always.
|
|
47
|
+
- **Answer pending questions** — when the pending-question count is above zero; show it and where they are (e.g. "2 questions waiting — `my-feature`, constitution update"). List this first among the roadmap and question entries: an unanswered question is work already blocked.
|
|
46
48
|
- **Triage the inbox** — when `inbox/` is non-empty; show the count (e.g. "3 items awaiting triage"). List this above **Browse** — an untriaged submission is somebody waiting on a decision.
|
|
47
49
|
- **Browse / promote the roadmap** — when any status directory outside `hold/` is non-empty; show counts per status (e.g. "3 inbox, 5 backlog, 1 in progress, 12 done").
|
|
48
50
|
- **Show status** — when at least one instance exists.
|
|
@@ -60,6 +62,7 @@ If `.aidlc/state/` is empty or missing, offer just three options: start somethin
|
|
|
60
62
|
| Continue an instance | Follow the **aidlc-continue** skill |
|
|
61
63
|
| Start something new | Run the **concurrency gate** (below), then ask what they are building, pick a template (see **aidlc-getting-started**), and create the instance per "Creating an Instance" in **aidlc-overview** |
|
|
62
64
|
| Capture a roadmap item | Follow the **aidlc-roadmap** skill (capture flow) |
|
|
65
|
+
| Answer pending questions | Open the question file, re-render its open questions per the **Question Protocol** in **aidlc-overview**, record each answer in the file, then fold them into the artifact they were gathered for |
|
|
63
66
|
| Triage the inbox | Follow the **aidlc-roadmap** skill (triage flow) |
|
|
64
67
|
| Browse / promote the roadmap | Follow the **aidlc-roadmap** skill (browse/promote flow) |
|
|
65
68
|
| Show status | Summarize each instance from its state files — name, template, current phase, completion %, and whether it looks stalled. When the roadmap is non-empty, append the per-status counts (e.g. "roadmap: 3 inbox, 5 backlog, 12 done") |
|
|
@@ -8,12 +8,12 @@ native_mode_hint:
|
|
|
8
8
|
claude-code: >-
|
|
9
9
|
This skill imports a document and drafts prose for the user to correct. Do
|
|
10
10
|
not enter plan mode. Never rewrite an existing constitution from the vision
|
|
11
|
-
in one step — propose changes
|
|
11
|
+
in one step — propose changes as a question file and apply only what the user
|
|
12
12
|
accepts.
|
|
13
13
|
copilot: >-
|
|
14
14
|
This skill imports a document and drafts prose for the user to correct. Stay
|
|
15
15
|
in the default agent — do not switch to plan mode. Never rewrite an existing
|
|
16
|
-
constitution from the vision in one step — propose changes
|
|
16
|
+
constitution from the vision in one step — propose changes as a question file and
|
|
17
17
|
apply only what the user accepts.
|
|
18
18
|
---
|
|
19
19
|
# Constitution
|
|
@@ -134,35 +134,40 @@ risk, and it exits 0 either way. This is advisory. It never fails a phase.
|
|
|
134
134
|
|
|
135
135
|
### Step 2 — Propose, do not apply
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
A constitution update has no instance, so its questions go to
|
|
138
|
+
`.aidlc/questions/constitution-update-<YYYY-MM-DD>.md` — one question per change,
|
|
139
|
+
following the **Question Protocol** in the overview skill:
|
|
139
140
|
|
|
140
141
|
```markdown
|
|
141
142
|
# Constitution update — <date>
|
|
142
143
|
|
|
143
144
|
Vision source: <path> (<n> statements added, <m> removed)
|
|
144
145
|
|
|
145
|
-
## NOT-2
|
|
146
|
+
## Should NOT-2 still stand, now that the statement it cites is gone?
|
|
146
147
|
|
|
148
|
+
**Why it matters:** NOT-2 is a boundary this repo is held to. Left citing a
|
|
149
|
+
statement the vision no longer carries, it is enforced without a source.
|
|
150
|
+
|
|
151
|
+
**What the repo already says:** `.aidlc/constitution.md` NOT-2 cites V-99887766.
|
|
147
152
|
The vision no longer says: "<old statement text>"
|
|
148
153
|
It now says: "<new statement text, if there is a successor>"
|
|
149
154
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
155
|
+
1. Re-cite NOT-2 against V-<new id>, wording unchanged — the boundary survives, only its source moves.
|
|
156
|
+
2. Reword NOT-2: <proposed wording> — the boundary narrows to what the vision now supports.
|
|
157
|
+
3. Retire NOT-2 — the repo may do this again, with nothing recording that it once must not.
|
|
158
|
+
4. Leave NOT-2 as it is — it becomes a deliberate local rule the vision never carried.
|
|
154
159
|
|
|
155
|
-
|
|
160
|
+
**Recommended:** 1, when a successor statement exists — the boundary was agreed
|
|
161
|
+
on its own merits and a re-citation is the smallest change that keeps it sourced.
|
|
156
162
|
|
|
157
|
-
|
|
163
|
+
**If you say nothing:** NOT-2 is left as it is and the drift is recorded in
|
|
164
|
+
Amendments, so the next reader sees an unsourced rule rather than a silent one.
|
|
158
165
|
|
|
159
|
-
|
|
160
|
-
- [ ] Add NOT-<next>: <proposed wording>
|
|
161
|
-
- [ ] Nothing — this statement is about a different repo
|
|
166
|
+
[Answer]:
|
|
162
167
|
```
|
|
163
168
|
|
|
164
|
-
|
|
165
|
-
did not" is a common and correct answer.
|
|
169
|
+
Offer the leave-as-it-is option every time. "The vision changed and this repo's
|
|
170
|
+
boundary did not" is a common and correct answer.
|
|
166
171
|
|
|
167
172
|
### Step 3 — Apply only what is checked
|
|
168
173
|
|
|
@@ -174,7 +179,8 @@ aidlc constitution import <path>
|
|
|
174
179
|
|
|
175
180
|
Append one line to Amendments for every applied change — date, entry id, what
|
|
176
181
|
changed, why. Amendments are how the next reader tells a deliberate local rule from
|
|
177
|
-
a stale derivation.
|
|
182
|
+
a stale derivation. Record each answer in the question file and leave it in place —
|
|
183
|
+
it is the record of what was asked and decided.
|
|
178
184
|
|
|
179
185
|
## Consulting the constitution
|
|
180
186
|
|
|
@@ -48,7 +48,7 @@ See **The context rule** in **aidlc-overview**.
|
|
|
48
48
|
- **Identified**: write every criterion as a list item `- AC-<n>: <text>` (bold variants `- **AC-<n>**: ...` and `- **AC-<n>:** ...` are also valid). Assign `AC-1`, `AC-2`, ... sequentially. IDs are never renumbered or reused — an amended criterion keeps its meaning or is retired: mark it `- AC-<n> (retired YYYY-MM-DD, superseded by AC-<m>): <text>` and issue a new ID. The testing-phase gate parses these IDs and fails on any active criterion without a referencing test.
|
|
49
49
|
4. **Set scope boundaries.** Explicitly state what is NOT included.
|
|
50
50
|
5. **Non-functional requirements.** Address performance, security, accessibility, and compatibility where relevant.
|
|
51
|
-
6. **For
|
|
51
|
+
6. **For open decisions**: When a decision would change what `requirements.md` says, ask it through the **Question Protocol** in **aidlc-overview** — questions for this phase go to `.aidlc/state/<instance>/requirements-questions.md`. Prefer drafting `requirements.md` early with the unresolved points marked as explicit decision blocks: users decide better reacting to a concrete draft than answering abstract questions. Fold each answer into the draft and leave the question file as the record of what was decided and why.
|
|
52
52
|
|
|
53
53
|
## Bugfix Reproduction (bugfix template)
|
|
54
54
|
|