@intoinside/praxis 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.
- package/CODE_OF_CONDUCT.md +99 -0
- package/CONTRIBUTING.md +108 -0
- package/LICENSE +21 -0
- package/MAINTAINERS.md +9 -0
- package/README.md +319 -0
- package/intoinside-praxis-1.0.0.tgz +0 -0
- package/last_error.txt +42 -0
- package/package.json +40 -0
- package/src/commands/init.d.ts +1 -0
- package/src/commands/init.js +42 -0
- package/src/commands/init.ts +47 -0
- package/src/commands/integration/generate.d.ts +4 -0
- package/src/commands/integration/generate.js +69 -0
- package/src/commands/integration/generate.ts +85 -0
- package/src/commands/intent/create.d.ts +4 -0
- package/src/commands/intent/create.js +55 -0
- package/src/commands/intent/create.ts +61 -0
- package/src/commands/intent/list.d.ts +4 -0
- package/src/commands/intent/list.js +52 -0
- package/src/commands/intent/list.ts +63 -0
- package/src/commands/spec/apply.d.ts +4 -0
- package/src/commands/spec/apply.js +99 -0
- package/src/commands/spec/apply.ts +109 -0
- package/src/commands/spec/archive.d.ts +4 -0
- package/src/commands/spec/archive.js +114 -0
- package/src/commands/spec/archive.ts +121 -0
- package/src/commands/spec/delete.d.ts +4 -0
- package/src/commands/spec/delete.js +70 -0
- package/src/commands/spec/delete.ts +75 -0
- package/src/commands/spec/derive.d.ts +6 -0
- package/src/commands/spec/derive.js +107 -0
- package/src/commands/spec/derive.ts +117 -0
- package/src/core/command-generation/adapters/antigravity.d.ts +12 -0
- package/src/core/command-generation/adapters/antigravity.js +25 -0
- package/src/core/command-generation/adapters/antigravity.ts +30 -0
- package/src/core/command-generation/adapters/index.d.ts +6 -0
- package/src/core/command-generation/adapters/index.js +26 -0
- package/src/core/command-generation/adapters/index.ts +27 -0
- package/src/core/command-generation/generator.d.ts +20 -0
- package/src/core/command-generation/generator.js +26 -0
- package/src/core/command-generation/generator.ts +36 -0
- package/src/core/command-generation/index.d.ts +20 -0
- package/src/core/command-generation/index.js +23 -0
- package/src/core/command-generation/index.ts +33 -0
- package/src/core/command-generation/registry.d.ts +35 -0
- package/src/core/command-generation/registry.js +87 -0
- package/src/core/command-generation/registry.ts +95 -0
- package/src/core/command-generation/types.d.ts +54 -0
- package/src/core/command-generation/types.js +7 -0
- package/src/core/command-generation/types.ts +57 -0
- package/src/index.d.ts +2 -0
- package/src/index.js +95 -0
- package/src/index.ts +97 -0
- package/src/manifest.d.ts +21 -0
- package/src/manifest.js +170 -0
- package/src/manifest.ts +188 -0
- package/templates/checklist-template.md +42 -0
- package/templates/intent-template.md +290 -0
- package/templates/spec-template.md +114 -0
- package/test_output.txt +0 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our Pledge
|
|
4
|
+
|
|
5
|
+
We as members, contributors, and leaders pledge to make participation in our
|
|
6
|
+
community a harassment-free experience for everyone, regardless of age, body
|
|
7
|
+
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
8
|
+
identity and expression, level of experience, education, socio-economic
|
|
9
|
+
status, nationality, personal appearance, race, religion, or sexual identity
|
|
10
|
+
and orientation.
|
|
11
|
+
|
|
12
|
+
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
|
13
|
+
|
|
14
|
+
## Our Standards
|
|
15
|
+
|
|
16
|
+
Examples of behavior that contributes to a positive environment for our community include:
|
|
17
|
+
|
|
18
|
+
- Demonstrating empathy and kindness toward other people
|
|
19
|
+
- Being respectful of differing opinions, viewpoints, and experiences
|
|
20
|
+
- Giving and gracefully accepting constructive feedback
|
|
21
|
+
- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
|
22
|
+
- Focusing on what is best not just for us as individuals, but for the overall community
|
|
23
|
+
|
|
24
|
+
Examples of unacceptable behavior include:
|
|
25
|
+
|
|
26
|
+
- The use of sexualized language or imagery, and sexual attention of any kind
|
|
27
|
+
- Trolling, insulting or derogatory comments, and personal or political attacks
|
|
28
|
+
- Public or private harassment
|
|
29
|
+
- Publishing others' private information, such as a physical or email address,
|
|
30
|
+
without their explicit permission
|
|
31
|
+
- Other conduct which could reasonably be considered inappropriate in a professional setting
|
|
32
|
+
|
|
33
|
+
## Enforcement Responsibilities
|
|
34
|
+
|
|
35
|
+
Community leaders are responsible for clarifying and enforcing our standards
|
|
36
|
+
of acceptable behavior and will take appropriate and fair corrective action in
|
|
37
|
+
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
38
|
+
or harmful.
|
|
39
|
+
|
|
40
|
+
Community leaders have the right and responsibility to remove, edit, or reject
|
|
41
|
+
comments, commits, code, wiki edits, issues, and other contributions that are
|
|
42
|
+
not aligned to this Code of Conduct, and will communicate reasons for
|
|
43
|
+
moderation decisions when appropriate.
|
|
44
|
+
|
|
45
|
+
## Scope
|
|
46
|
+
|
|
47
|
+
This Code of Conduct applies within all community spaces, and also applies when
|
|
48
|
+
an individual is officially representing the community in public spaces. Examples
|
|
49
|
+
of representing our community include using an official e-mail address, posting
|
|
50
|
+
via an official social media account, or acting as an appointed representative
|
|
51
|
+
at an online or offline event.
|
|
52
|
+
|
|
53
|
+
## Enforcement Guidelines
|
|
54
|
+
|
|
55
|
+
Community leaders will follow these Community Impact Guidelines in determining
|
|
56
|
+
the consequences for any action they deem in violation of this Code of Conduct:
|
|
57
|
+
|
|
58
|
+
### 1. Correction
|
|
59
|
+
|
|
60
|
+
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
|
|
61
|
+
|
|
62
|
+
**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation
|
|
63
|
+
and an explanation of why the behavior was inappropriate. A public apology may be requested.
|
|
64
|
+
|
|
65
|
+
### 2. Warning
|
|
66
|
+
|
|
67
|
+
**Community Impact**: A violation through a single incident or series of actions.
|
|
68
|
+
|
|
69
|
+
**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including
|
|
70
|
+
unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding
|
|
71
|
+
interactions in community spaces as well as external channels like social media. Violating these terms may lead to a
|
|
72
|
+
temporary or permanent ban.
|
|
73
|
+
|
|
74
|
+
### 3. Temporary Ban
|
|
75
|
+
|
|
76
|
+
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
|
|
77
|
+
|
|
78
|
+
**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified
|
|
79
|
+
period of time. No public or private interaction with the people involved, including unsolicited interaction with those
|
|
80
|
+
enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
|
|
81
|
+
|
|
82
|
+
### 4. Permanent Ban
|
|
83
|
+
|
|
84
|
+
**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate
|
|
85
|
+
behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
|
|
86
|
+
|
|
87
|
+
**Consequence**: A permanent ban from any sort of public interaction within the community.
|
|
88
|
+
|
|
89
|
+
## Attribution
|
|
90
|
+
|
|
91
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
|
92
|
+
|
|
93
|
+
For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq]
|
|
94
|
+
[FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations].
|
|
95
|
+
|
|
96
|
+
[homepage]: https://www.contributor-covenant.org
|
|
97
|
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
|
98
|
+
[FAQ]: https://www.contributor-covenant.org/faq
|
|
99
|
+
[translations]: https://www.contributor-covenant.org/translations
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Contributing to Praxis
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing to Praxis! We welcome
|
|
4
|
+
contributions from the community to help improve the intent/spec-driven
|
|
5
|
+
development experience.
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- [Getting Started](#getting-started)
|
|
10
|
+
- [Development Setup](#development-setup)
|
|
11
|
+
- [Contributing Guidelines](#contributing-guidelines)
|
|
12
|
+
- [Adding New Agent Support](#adding-new-agent-support)
|
|
13
|
+
- [Testing](#testing-requirements)
|
|
14
|
+
- [Documentation](#documentation)
|
|
15
|
+
- [Release Process](#release-process)
|
|
16
|
+
- [Community](#community)
|
|
17
|
+
|
|
18
|
+
## Getting Started
|
|
19
|
+
|
|
20
|
+
1. **Fork the repository** on GitHub
|
|
21
|
+
2. **Clone your fork** locally:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
git clone https://github.com/your-username/praxis.git
|
|
25
|
+
cd praxis
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
3. **Set up the development environment** (see [Development Setup](#development-setup))
|
|
29
|
+
4. **Create a feature branch**:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
git checkout -b feature/your-feature-name
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
5. **Make your changes** and ensure tests pass
|
|
36
|
+
6. **Submit a pull request** with a clear description of your changes
|
|
37
|
+
|
|
38
|
+
## Development Setup
|
|
39
|
+
|
|
40
|
+
### Prerequisites
|
|
41
|
+
|
|
42
|
+
- **Git**
|
|
43
|
+
- **Supported AI agent** (for testing)
|
|
44
|
+
|
|
45
|
+
## Contributing Guidelines
|
|
46
|
+
|
|
47
|
+
### Code Standards
|
|
48
|
+
|
|
49
|
+
- **Follow PEP 8** for Python code style
|
|
50
|
+
- **Use type hints** for all function signatures
|
|
51
|
+
- **Write docstrings** for all public functions and classes
|
|
52
|
+
- **Keep functions small** and focused on single responsibilities
|
|
53
|
+
- **Use meaningful variable names** and avoid abbreviations
|
|
54
|
+
|
|
55
|
+
### Commit Guidelines
|
|
56
|
+
|
|
57
|
+
- **Use conventional commits**: `feat:`, `fix:`, `docs:`, `style:`, `refactor:`, `test:`, `chore:`
|
|
58
|
+
- **Write clear commit messages** explaining what and why
|
|
59
|
+
- **Reference issues** when applicable: `Fixes #123`, `Closes #456`
|
|
60
|
+
- **Keep commits atomic** - one logical change per commit
|
|
61
|
+
|
|
62
|
+
### Pull Request Process
|
|
63
|
+
|
|
64
|
+
1. **Update documentation** if you're changing functionality
|
|
65
|
+
2. **Add tests** for new features or bug fixes
|
|
66
|
+
3. **Submit your PR** with a clear description
|
|
67
|
+
|
|
68
|
+
### Testing Requirements
|
|
69
|
+
|
|
70
|
+
- **Unit tests** for all new functionality
|
|
71
|
+
- **Integration tests** for CLI commands and agent interactions
|
|
72
|
+
- **Cross-platform tests** (Windows, macOS, Linux)
|
|
73
|
+
- **Agent compatibility tests** for all supported AI agents
|
|
74
|
+
|
|
75
|
+
## Documentation
|
|
76
|
+
|
|
77
|
+
### Documentation Structure
|
|
78
|
+
|
|
79
|
+
- **`README.md`**: Main project overview and getting started guide
|
|
80
|
+
- **Inline documentation**: Code comments and docstrings
|
|
81
|
+
|
|
82
|
+
### Writing Documentation
|
|
83
|
+
|
|
84
|
+
- **Use clear, concise language** appropriate for the audience
|
|
85
|
+
- **Include examples** for complex features
|
|
86
|
+
- **Keep documentation in sync** with code changes
|
|
87
|
+
- **Use relative links** for internal references
|
|
88
|
+
- **Test code examples** to ensure they work
|
|
89
|
+
|
|
90
|
+
## Community
|
|
91
|
+
|
|
92
|
+
### Getting Help
|
|
93
|
+
|
|
94
|
+
- **GitHub Issues**: For bug reports and feature requests
|
|
95
|
+
- **GitHub Discussions**: For questions and discussions
|
|
96
|
+
- **Documentation**: Check the docs first for common questions
|
|
97
|
+
|
|
98
|
+
### Code of Conduct
|
|
99
|
+
|
|
100
|
+
Please read and follow our [Code of Conduct](./CODE_OF_CONDUCT.md) when participating in the Praxis community.
|
|
101
|
+
|
|
102
|
+
### Recognition
|
|
103
|
+
|
|
104
|
+
Contributors who make significant improvements to Praxis may be recognized in the project documentation or release notes.
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
Thank you for contributing! Your help makes Praxis better for everyone.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Raffaele Intorcia
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/MAINTAINERS.md
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
# Praxis
|
|
2
|
+
|
|
3
|
+
```
|
|
4
|
+
███████████ ███
|
|
5
|
+
░░███░░░░░███ ░░░
|
|
6
|
+
░███ ░███ ████████ ██████ █████ █████ ████ █████
|
|
7
|
+
░██████████ ░░███░░███ ░░░░░███ ░░███ ░░███ ░░███ ███░░
|
|
8
|
+
░███░░░░░░ ░███ ░░░ ███████ ░░░█████░ ░███ ░░█████
|
|
9
|
+
░███ ░███ ███░░███ ███░░░███ ░███ ░░░░███
|
|
10
|
+
█████ █████ ░░████████ █████ █████ █████ ██████
|
|
11
|
+
░░░░░ ░░░░░ ░░░░░░░░ ░░░░░ ░░░░░ ░░░░░ ░░░░░░
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Praxis** is a development framework that bridges **Intent‑Driven Development (IDD)** and **Spec‑Driven Development (SDD)** into a single, coherent workflow.
|
|
15
|
+
|
|
16
|
+
It relays on [Intended](https://github.com/Nom-nom-hub/Intended) and [OpenSpec](https://github.com/Fission-AI/OpenSpec).
|
|
17
|
+
|
|
18
|
+
Praxis helps teams start from *why* they are building something, derive *what* must be built in the form of explicit specifications, and continuously verify that the *how* (the code) never diverges from the original intent.
|
|
19
|
+
|
|
20
|
+
It is designed to be:
|
|
21
|
+
|
|
22
|
+
* **AI‑native** (usable from AI chats inside modern IDEs)
|
|
23
|
+
* **CLI‑first** (works without any IDE or AI integration)
|
|
24
|
+
* **Intent‑centric** (intent is the primary source of truth)
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Core Concepts
|
|
29
|
+
|
|
30
|
+
### Intent
|
|
31
|
+
|
|
32
|
+
An **Intent** describes the purpose, value, and constraints of a feature or system.
|
|
33
|
+
It answers the question:
|
|
34
|
+
|
|
35
|
+
> *Why are we building this?*
|
|
36
|
+
|
|
37
|
+
Intents are technology‑agnostic and do not describe APIs, UI, or implementation details.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
### Specification (Spec)
|
|
42
|
+
|
|
43
|
+
A **Specification** is a formal, verifiable description derived from an Intent.
|
|
44
|
+
It answers the question:
|
|
45
|
+
|
|
46
|
+
> *What must the system do to satisfy the intent?*
|
|
47
|
+
|
|
48
|
+
Specs act as contracts and can be translated into:
|
|
49
|
+
|
|
50
|
+
* behavioral rules
|
|
51
|
+
* acceptance criteria
|
|
52
|
+
* API contracts
|
|
53
|
+
* test cases
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Drift Detection
|
|
58
|
+
|
|
59
|
+
Praxis continuously checks for **semantic drift**:
|
|
60
|
+
|
|
61
|
+
* specs that no longer satisfy the intent
|
|
62
|
+
* code that implements features not justified by any intent
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## What Praxis Provides
|
|
67
|
+
|
|
68
|
+
### 1. Intent Management
|
|
69
|
+
|
|
70
|
+
* Create, update, and validate intents
|
|
71
|
+
* Enforce intent structure and clarity
|
|
72
|
+
* Track intent evolution over time
|
|
73
|
+
|
|
74
|
+
### 2. Intent Modeling
|
|
75
|
+
|
|
76
|
+
* Extract capabilities, events, and states from intents
|
|
77
|
+
* Provide a bridge between intent and specification
|
|
78
|
+
|
|
79
|
+
### 3. Spec Derivation
|
|
80
|
+
|
|
81
|
+
* Generate initial specifications from intents
|
|
82
|
+
* Maintain traceability between intents and specs
|
|
83
|
+
* Support manual refinement without losing intent linkage
|
|
84
|
+
|
|
85
|
+
### 4. Spec Validation
|
|
86
|
+
|
|
87
|
+
* Lock specs as formal contracts
|
|
88
|
+
* Validate implementations against specs
|
|
89
|
+
* Detect missing or incomplete implementations
|
|
90
|
+
|
|
91
|
+
### 5. Drift Analysis
|
|
92
|
+
|
|
93
|
+
* Detect features not backed by intent
|
|
94
|
+
* Detect intents no longer satisfied by current specs
|
|
95
|
+
|
|
96
|
+
### 6. AI & IDE Integration
|
|
97
|
+
|
|
98
|
+
* Slash‑command friendly design
|
|
99
|
+
* CLI commands that can be mapped to IDE AI chats
|
|
100
|
+
* Optional exposure as a local command server (e.g. MCP‑style)
|
|
101
|
+
|
|
102
|
+
## Folder structure
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
.praxis/
|
|
106
|
+
├── intents/
|
|
107
|
+
│ ├── wip/ # Work-in-progress intents
|
|
108
|
+
│ └── archive/ # Archived intents
|
|
109
|
+
├── specs/ # Specifications (OpenSpec)
|
|
110
|
+
│ ├── wip/ # Work-in-progress specs
|
|
111
|
+
│ └── archive/ # Archived specs
|
|
112
|
+
└── templates/ # Templates for intents and specs
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Intent Commands
|
|
116
|
+
|
|
117
|
+
|Command|Description|Status/Version|
|
|
118
|
+
|-|-|-|
|
|
119
|
+
|`praxis init`|Initialize a new project to be used with Praxis. Templates are provided in the `templates` directory.|✅|
|
|
120
|
+
|`praxis intent create <intent-description>`|Create a new intent.|✅|
|
|
121
|
+
|`praxis intent update <intent-id>`|Update an existing intent.|❔|
|
|
122
|
+
|`praxis intent validate`|Validate all intents for completeness and consistency.|❌|
|
|
123
|
+
|`praxis intent list`|List all defined intents.|✅|
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### Intent Modeling Commands
|
|
128
|
+
|
|
129
|
+
|Command|Description|Status/Version|
|
|
130
|
+
|-|-|-|
|
|
131
|
+
|`praxis intent model <intent-id>`|Generate or update the intent model (capabilities, events, states).|❔|
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
### Specification Commands
|
|
136
|
+
|
|
137
|
+
|Command|Description|Status/Version|
|
|
138
|
+
|-|-|-|
|
|
139
|
+
|`praxis spec derive --from-intent <intent-id>`|Generate initial specifications from an intent.|✅|
|
|
140
|
+
|`praxis spec refine <spec-id>`|Manually refine a specification while preserving intent traceability.|❔|
|
|
141
|
+
|`praxis spec validate <spec-id>`|Validate specs for internal consistency and completeness.|❌|
|
|
142
|
+
|`praxis spec apply <spec-id>`|Implement a specification in code.|❌|
|
|
143
|
+
|`praxis spec archive <spec-id>`|Archive a specification implemented.|❌|
|
|
144
|
+
|`praxis spec delete <spec-id>`|Delete a specific spec.|✅|
|
|
145
|
+
|`praxis spec delete --from-intent <intent-id>`|Delete all specs generated from an intent.|❌|
|
|
146
|
+
|`praxis spec lock <spec-id>`|Lock a specification as a formal contract.|❔|
|
|
147
|
+
|`praxis spec list --from-intent <intent-id>`|List all specifications and their associated intents.|❌|
|
|
148
|
+
|`praxis spec check`|Verify implementation compliance against locked specs.|❔|
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
### Analysis Commands
|
|
153
|
+
|
|
154
|
+
|Command|Description|Status/Version|
|
|
155
|
+
|-|-|-|
|
|
156
|
+
|`praxis analyze impact --from-intent <intent-id>`|Analyze the impact of changes to an intent on specs and code.|❔|
|
|
157
|
+
|`praxis analyze drift`|Detect intent/spec/code drift.|❔|
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### Integration & Runtime Commands
|
|
162
|
+
|
|
163
|
+
|Command|Description|Status/Version|
|
|
164
|
+
|-|-|-|
|
|
165
|
+
|`praxis serve`|Expose Praxis commands through a local service for IDE or AI integration.|❔|
|
|
166
|
+
|`praxis commands`|List all available commands in machine‑readable form.|❔|
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Slash Command Usage (IDE / AI Chat)
|
|
171
|
+
|
|
172
|
+
When integrated into an IDE or AI‑enabled editor, Praxis commands can be invoked as slash commands:
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
/praxis-intent-create
|
|
176
|
+
/praxis-spec-derive
|
|
177
|
+
/praxis-intent-check
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
The underlying behavior is identical to the CLI.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Development Flow Overview
|
|
185
|
+
|
|
186
|
+
The following diagram illustrates how **Intents** and **Specifications** integrate into a standard development lifecycle.
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
┌────────────┐
|
|
190
|
+
│ Intent │
|
|
191
|
+
│ (WHAT) │
|
|
192
|
+
│ (WHY) │
|
|
193
|
+
└─────┬──────┘
|
|
194
|
+
│
|
|
195
|
+
▼
|
|
196
|
+
┌──────────────────┐
|
|
197
|
+
│ Intent Modeling │
|
|
198
|
+
│ (Capabilities, │
|
|
199
|
+
│ Events, States) │
|
|
200
|
+
└────────┬─────────┘
|
|
201
|
+
│
|
|
202
|
+
▼
|
|
203
|
+
┌────────────┐
|
|
204
|
+
│ Specs │
|
|
205
|
+
│ (WHAT) │
|
|
206
|
+
└─────┬──────┘
|
|
207
|
+
│
|
|
208
|
+
┌──────────┼──────────┐
|
|
209
|
+
│ │ │
|
|
210
|
+
▼ ▼ ▼
|
|
211
|
+
Tests Contracts Scenarios
|
|
212
|
+
|
|
213
|
+
│
|
|
214
|
+
▼
|
|
215
|
+
┌────────────┐
|
|
216
|
+
│ Code │
|
|
217
|
+
│ (HOW) │
|
|
218
|
+
└─────┬──────┘
|
|
219
|
+
│
|
|
220
|
+
▼
|
|
221
|
+
┌─────────────────┐
|
|
222
|
+
│ Validation & │
|
|
223
|
+
│ Drift Detection │
|
|
224
|
+
└─────┬───────────┘
|
|
225
|
+
│
|
|
226
|
+
└───────────────┐
|
|
227
|
+
▼
|
|
228
|
+
Intent Check
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### How Praxis Fits into Daily Development
|
|
232
|
+
|
|
233
|
+
* **Before coding**: intents and specs are defined and validated
|
|
234
|
+
* **During coding**: specs act as executable and contractual guidance
|
|
235
|
+
* **After changes**: drift detection ensures alignment with original intent
|
|
236
|
+
|
|
237
|
+
This allows Praxis to integrate seamlessly with existing workflows such as:
|
|
238
|
+
|
|
239
|
+
* Agile / Scrum
|
|
240
|
+
* TDD / BDD
|
|
241
|
+
* CI/CD pipelines
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
|
|
245
|
+
## Design Philosophy
|
|
246
|
+
|
|
247
|
+
* **Intent is sacred**: everything must trace back to a reason.
|
|
248
|
+
* **Specs are contracts**: informal requirements are not enough.
|
|
249
|
+
* **Code must justify itself**: no feature without intent.
|
|
250
|
+
* **AI is an assistant, not the authority**: Praxis remains deterministic and auditable.
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## Installation
|
|
255
|
+
|
|
256
|
+
Praxis is written in **TypeScript** and distributed as a **Node.js CLI**.
|
|
257
|
+
|
|
258
|
+
### Prerequisites
|
|
259
|
+
|
|
260
|
+
* Node.js **>= 18**
|
|
261
|
+
* npm (or compatible package manager)
|
|
262
|
+
|
|
263
|
+
You can verify your environment with:
|
|
264
|
+
|
|
265
|
+
```
|
|
266
|
+
node --version
|
|
267
|
+
npm --version
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
### Install (Global)
|
|
273
|
+
|
|
274
|
+
To install Praxis globally and make the `praxis` command available system-wide:
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
npm install -g praxis
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
After installation, verify it works:
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
praxis --help
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
### Install (Project-local)
|
|
289
|
+
|
|
290
|
+
You can also install Praxis as a development dependency inside a project:
|
|
291
|
+
|
|
292
|
+
```
|
|
293
|
+
npm install --save-dev praxis
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
Then run it via:
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
npx praxis --help
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
---
|
|
303
|
+
|
|
304
|
+
### Using with IDEs and AI Chats
|
|
305
|
+
|
|
306
|
+
When installed locally or globally, Praxis commands can be mapped to:
|
|
307
|
+
|
|
308
|
+
* IDE extensions (e.g. VS Code)
|
|
309
|
+
* AI chat slash commands
|
|
310
|
+
* local tool servers (e.g. via `praxis serve`)
|
|
311
|
+
|
|
312
|
+
The installation method does not change Praxis behavior; it only affects how commands are invoked.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## Status
|
|
317
|
+
|
|
318
|
+
Praxis is under active development.
|
|
319
|
+
APIs, command names, and file formats may evolve.
|
|
Binary file
|
package/last_error.txt
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
node : (node:14940) ExperimentalWarning:
|
|
2
|
+
`--experimental-loader` may be removed
|
|
3
|
+
in the future; instead use `register()`:
|
|
4
|
+
In riga:1 car:1
|
|
5
|
+
+ node --loader ts-node/esm src/index.ts
|
|
6
|
+
--help 2>&1 | Out-File -FilePa ...
|
|
7
|
+
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
8
|
+
~~~~~~~~~~~
|
|
9
|
+
+ CategoryInfo : NotSpecifi
|
|
10
|
+
ed: ((node:14940) Ex...e `register()
|
|
11
|
+
`::String) [], RemoteException
|
|
12
|
+
+ FullyQualifiedErrorId : NativeComm
|
|
13
|
+
andError
|
|
14
|
+
|
|
15
|
+
--import 'data:text/javascript,import {
|
|
16
|
+
register } from "node:module"; import {
|
|
17
|
+
pathToFileURL } from "node:url";
|
|
18
|
+
register("ts-node/esm",
|
|
19
|
+
pathToFileURL("./"));'
|
|
20
|
+
(Use `node --trace-warnings ...` to show
|
|
21
|
+
where the warning was created)
|
|
22
|
+
(node:14940) [DEP0180]
|
|
23
|
+
DeprecationWarning: fs.Stats constructor
|
|
24
|
+
is deprecated.
|
|
25
|
+
(Use `node --trace-deprecation ...` to
|
|
26
|
+
show where the warning was created)
|
|
27
|
+
Usage: praxis [options] [command]
|
|
28
|
+
|
|
29
|
+
Praxis: Intent-First Development Framework
|
|
30
|
+
|
|
31
|
+
Options:
|
|
32
|
+
-V, --version output the version number
|
|
33
|
+
-h, --help display help for command
|
|
34
|
+
|
|
35
|
+
Commands:
|
|
36
|
+
init Initialize a new project to be used with Praxis
|
|
37
|
+
intent Manage intents (the WHY)
|
|
38
|
+
model [options] Generate or update the intent model
|
|
39
|
+
spec Manage specifications (the WHAT)
|
|
40
|
+
analyze Analyze impact and drift
|
|
41
|
+
integration IDE and AI integration
|
|
42
|
+
help [command] display help for command
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@intoinside/praxis",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"description": "**Praxis** is an intent-first development framework that bridges **Intent‑Driven Development (IDD)** and **Spec‑Driven Development (SDD)** into a single, coherent workflow.",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"types": "src/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"praxis": "src/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"prepublishOnly": "npm run build",
|
|
13
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/intoinside/Praxis.git"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"idd",
|
|
21
|
+
"sdd",
|
|
22
|
+
"intent",
|
|
23
|
+
"spec",
|
|
24
|
+
"intent-driven",
|
|
25
|
+
"spec-driven"
|
|
26
|
+
],
|
|
27
|
+
"author": "Raffaele Intorcia",
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"type": "module",
|
|
30
|
+
"bugs": {
|
|
31
|
+
"url": "https://github.com/intoinside/Praxis/issues"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/intoinside/Praxis#readme",
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@types/node": "^25.0.10",
|
|
36
|
+
"commander": "^14.0.2",
|
|
37
|
+
"ts-node": "^10.9.2",
|
|
38
|
+
"typescript": "^5.9.3"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function initCommand(): Promise<void>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
export async function initCommand() {
|
|
4
|
+
const rootDir = process.cwd();
|
|
5
|
+
const praxisDir = path.join(rootDir, '.praxis');
|
|
6
|
+
const templatesDir = path.join(praxisDir, 'templates');
|
|
7
|
+
const intentsDir = path.join(praxisDir, 'intents');
|
|
8
|
+
const intentsWipDir = path.join(praxisDir, 'intents', 'wip');
|
|
9
|
+
const intentsArchiveDir = path.join(praxisDir, 'intents', 'archive');
|
|
10
|
+
const specsDir = path.join(praxisDir, 'specs');
|
|
11
|
+
const dirs = [praxisDir, templatesDir, intentsDir, intentsWipDir, intentsArchiveDir, specsDir];
|
|
12
|
+
for (const dir of dirs) {
|
|
13
|
+
if (!fs.existsSync(dir)) {
|
|
14
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
15
|
+
console.log(`Created directory: ${path.relative(rootDir, dir)}`);
|
|
16
|
+
// Create a .gitkeep file to ensure the directory is tracked by git
|
|
17
|
+
fs.writeFileSync(path.join(dir, '.gitkeep'), '');
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
console.log(`Directory already exists: ${path.relative(rootDir, dir)}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Copy templates from root templates/ to .praxis/templates/
|
|
24
|
+
const sourceTemplatesDir = path.join(rootDir, 'templates');
|
|
25
|
+
if (fs.existsSync(sourceTemplatesDir)) {
|
|
26
|
+
console.log('\nCopying templates...');
|
|
27
|
+
const templateFiles = fs.readdirSync(sourceTemplatesDir);
|
|
28
|
+
for (const file of templateFiles) {
|
|
29
|
+
const sourcePath = path.join(sourceTemplatesDir, file);
|
|
30
|
+
const targetPath = path.join(templatesDir, file);
|
|
31
|
+
if (fs.statSync(sourcePath).isFile()) {
|
|
32
|
+
fs.copyFileSync(sourcePath, targetPath);
|
|
33
|
+
console.log(`- Copied: ${file}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.log('\nNo source templates directory found at root. Skipping template copy.');
|
|
39
|
+
}
|
|
40
|
+
console.log('\nPraxis project structure initialized successfully!');
|
|
41
|
+
console.log('You can now start defining intents in .praxis/intents/wip/');
|
|
42
|
+
}
|