# aify

> 市井玩味的人工智能框架，培养“人工智能学徒”，让它写代码去，就是这么AI

Latest version **0.7.9** (published 2019-08-11) · MIT license · 0 weekly downloads

## Install

```sh
npm install aify
pnpm add aify
yarn add aify
bun add aify
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.7.9 |
| Published | 2019-08-11 |
| First published | 2019-07-16 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 7 |
| Unpacked size | 193.3 KB |
| Known vulnerabilities | 0 (+1 in 1 direct dependencies) |
| Install scripts | yes |
| Author | 青松 |
| Maintainers | rpose |
| Keywords | aify, aifyskill, AI |

## Links

- npm: https://www.npmjs.com/package/aify
- Repository: https://github.com/gotoeasy/aify
- Homepage: https://github.com/gotoeasy/aify/blob/master/README.md
- Issues: https://github.com/gotoeasy/aify/issues
- npm.io page: https://npm.io/package/aify

## Dependencies (7)

- [fancy-log](https://npm.io/package/fancy-log.md) 1.3.*
- [@gotoeasy/os](https://npm.io/package/@gotoeasy/os.md) 0.1.*
- [libnpmsearch](https://npm.io/package/libnpmsearch.md) 2.0.*
- [@gotoeasy/btf](https://npm.io/package/@gotoeasy/btf.md) 1.2.*
- [@gotoeasy/npm](https://npm.io/package/@gotoeasy/npm.md) 0.1.*
- [@gotoeasy/file](https://npm.io/package/@gotoeasy/file.md) 0.1.*
- [git-pull-or-clone](https://npm.io/package/git-pull-or-clone.md) 1.3.*

## Alternatives

- [@expo/fingerprint](https://npm.io/package/@expo/fingerprint.md) — 6.2M weekly downloads
- [@azure/monitor-opentelemetry-exporter](https://npm.io/package/@azure/monitor-opentelemetry-exporter.md) — 850.0K weekly downloads
- [@azure/monitor-opentelemetry](https://npm.io/package/@azure/monitor-opentelemetry.md) — 624.0K weekly downloads
- [@posthog/ai](https://npm.io/package/@posthog/ai.md) — 423.3K weekly downloads
- [fakefilter](https://npm.io/package/fakefilter.md) — 63.9K weekly downloads

## Recent versions

- 0.7.9 (latest) — 2019-08-11
- 0.7.8 — 2019-08-06
- 0.7.7 — 2019-08-06
- 0.7.6 — 2019-07-26
- 0.7.5 — 2019-07-26
- 0.7.4 — 2019-07-26
- 0.7.3 — 2019-07-26
- 0.7.2 — 2019-07-25
- 0.7.1 — 2019-07-25
- 0.6.10 — 2019-07-25
- 0.6.9 — 2019-07-24
- 0.6.8 — 2019-07-24
- 0.6.7 — 2019-07-24
- 0.6.6 — 2019-07-24
- 0.6.5 — 2019-07-24
- … 44 more at https://npm.io/package/aify/versions

## README

# aify

[![NPM version](https://img.shields.io/npm/v/aify.svg)](https://www.npmjs.com/package/aify)
[![License](https://img.shields.io/badge/License-MIT-brightgreen.svg)](https://github.com/gotoeasy/aify/blob/master/LICENSE)
<br>

> \--------------------------------------<br>
> 培养`“人工智能学徒”`，让它写代码去<br>
> \--------------------------------------

<br>

一时无从谈起，即兴，查看`成长履历`吧



## 演示理想

1、安装
```
npm i aify
```

2、教学
```
let aify = require('aify');
aify.at('小程')
    .ai('自学')
    .ok();
```

3、应用
```
let aify = require('aify');
aify.at('小程')
    .ai('系统开发')
    .tip('使用java语言')
    .tip('百万日活量')
    .ok({'设计书目录': './doc'});
```


## 成长履历


<details>
<summary><strong>Ver 0.7.* 界面版</strong></summary> 
<br>

- [x] 暂且提供简陋WEB界面，方便管理查看技能、issues，更新技能的有效状态<br>
- [x] 打开或关闭技能时，顺便检查，自动打开或关闭相关issues<br>
- [x] 实现从指定git仓库自学<br>

> 开启WEB服务

1、安装 （不保证前后兼容）
```
npm i aify
```

2、开启WEB服务
```
let aify = require('aify');
aify.ai('Start-Web-Server')
    .ok(8080); // 端口号缺省时等同8080
```
可以浏览器打开看了<br>


#### API
同下


</details>


<details>
<summary><strong>Ver 0.6.* 善问版</strong></summary> 
<br>

- [x] 学习过程实现`勤学好问`，碰到容易混淆的新技能，必提issue<br>
      比如学了两个名称和关键词都一样，但函数不同的两个技能，这就很容易混淆<br>
      通常应该避免这样乱学，这时会提issue，等待人工介入调整<br>
- [x] 添加接口实现`issues查看`功能<br>
- [x] 所学新技能若和`天赋`有混淆，忽略，无issue，先天功能自动让贤，任你学<br>
      使用技能也是一样，后天所学优先使用，无技可施时才会求助先天`天赋`<br>
      这是仿意识行为的设计<br>
- [x] 技能运用实现`严谨决策`，对于容易引起误解的决策，输出警告提示<br>
      同名不同关键词的多个技能，筛选时会先评分，如果得分一样也会容易误解<br>
      这时默认会优先使用其中最早所学的技能，严谨起见，会输出警告提醒正确使用<br>

> 演示勤学好问

1、安装 （不保证前后兼容）
```
npm i aify
```

2、教写js版helloworld
```js
// demo-helloworld-1.skill
[name]
写helloworld

[keywords]
demo

[function]
module.exports = () => `
function hello(name){
    return 'hello ' + name;
}
`;
```

```js
let aify = require('aify');
aify.at('pg').learn('demo-helloworld-1.skill');
```

3、教写java版helloworld
```js
// demo-helloworld-2.skill
[name]
写helloworld

[keywords]
demo

[function]
module.exports = () => `
public class HelloWorld {

    public String hello(String name) {
        return "hello " + name;
    }
}
`;
```

```js
let aify = require('aify');
aify.at('pg').learn('demo-helloworld-2.skill');
```

4、叫写代码
```js
let aify = require('aify');
let rs = aify.at('pg')
             .ai('写helloworld')
             .tip('demo')
             .ok();
console.log(rs); // => 写的是js版helloworld
```
控制台可以看到有WARNING，这时如果本意是想写java版代码，那就好像是无解了<br>
所以，这种易混淆的技能应该避免，学到这种技能会主动提issue，这是它本分的事

5、查看issues
```js
let aify = require('aify');
let rs = aify.at('pg').issues();
console.log(rs); // => [ { name: '写helloworld', keywords: [ 'demo' ] } ]
```
是时候人工干预了<br>
考虑到可能重复学习，所以简单删除可能不是最好的方式，下次又学进来的话还得继续干预<br>
最简单粗暴的方式就是，复制技能并改用不同名称，然后继续学习再使用新技能<br>
目前版本无界面，只能手动


6、假如已人工介入调整了不同的基础分，就可以检查关闭issues了
```js
let aify = require('aify');
aify.at('pg').ai('issues').ok('check'); // 检查并关闭已解决的相关issue
let rs = aify.at('pg').issues();        // 再查看下issues，应该是没了
console.log(rs); // => []
```

<br>

#### API
* aify.at(name) - 呼唤某学徒，如果没有会自动招一个，返回学徒对象<br>
  name - 学徒名
* aify.learn(...fileOrPaths) - 对学徒aify进行填鸭式教学<br>
  fileOrPaths - 技能文件或目录，未传递时自动查找学习当前目录及skills目录内的技能文件
* aify.ai(name, ...keywords) - 指定学徒aify的技能名和特征关键词<br>
  name - 技能名<br>
  keywords - 技能特征关键词<br>
  返回Skill对象<br>
* aify.issues() - 取得指定学徒aify发的issues<br>
* Skill.tip(...keywords) - 提示特征，可以多次调用，重复提示无影响<br>
  keywords - 技能特征关键词<br>
* Skill.ok(...args) - 筛选出一个最匹配的技能，传入参数执行，返回执行结果<br>
  args - 参数<br>


</details>


<details>
<summary><strong>Ver 0.5.* 传授版</strong></summary> 
<br>

- [x] 实现`功力传授`，复制就等同传授啦，调整控制本领变得更加灵活方便<br>
- [x] 优化实现，目前框架js代码总共不足500行，我的天啊，难以置信的样子<br>
      实际上，功能的增强是通过技能学习运用实现，所以确实不需要多少代码<br>

> 演练倾囊相授

1、安装 （不保证前后兼容）
```
npm i aify
```

2、教学
```js
let aify = require('aify');
aify.at('小程')                   // 呼叫小程
    .ai('自学')                   // 到npm自学去
    .ok();                        // 干活吧
```
呼叫小程，令其自学<br>

3、检查学习成绩
```js
let aify = require('aify');
let rs = aify.at('小程').intro('倾囊相授');
console.log(rs);
```
可以看到小程已经学会了'倾囊相授'<br>

4、让‘小程’倾囊相授给‘小白’
```js
let aify = require('aify');
let rs = aify.at('小程')          // 呼叫小程
             .ai('倾囊相授')      // 慷慨得很
             .ok('小白');         // 开始把全部功力传给‘小白’
console.log(rs); // => true
```
通常‘小白’最好是不会武功的人才，不然可能会承受不住功力的灌输而无法自控<br>
也就是可能引起ai行为异常，或是传授前后ai行为不一致<br>
所以，安全起见，会检查接受者是否为零功力，必须是白纸一张，做到`非其人勿传`<br>

5、验证下‘小白’的功力
```js
let aify = require('aify');
aify.at('小白')                   // 呼叫‘小白’
    .ai('编写微服务基础组件')      // 很懂的样子
    .tip('greenwich', 'eureka')   // 必要时可以给些提示
    .ok({
         clean: true,             // 清空重写
         build: false,            // 写完就行不必编译打包
     });
```
很明显，瞬间‘小白’也会了<br>
<br>
'倾囊相授'，在想要控制学习本领的版本时会非常有用<br>
比如可以传授给‘小程1.0’、‘小程2.0’等等，在需要时又可以随时at唤出

<br>

#### API
同下

</details>


<details>
<summary><strong>Ver 0.4.* 智能版</strong></summary> 
<br>

- [x] 为了看起来更加`智能`，改API接口，然后，老版本就淘汰了<br>
      .skill() -> .ai()<br>
      .option() -> .tip()<br>
      .apply() -> .ok()<br>
- [x] 实现`选择性学习`，skill文件可指定aify的目标版本<br>
      为了避免消化不良，会放弃学习比框架版本还大的skill技能<br>
      仅比较大中版本，及`x.y.z`中的`x.y`<br>
- [x] 实现`自我介绍`，有什么本事必须要能被主人理解<br>
      否则乱学现用不可信任反成添乱<br>
- [x] 给`小程`起了个小名`pg`，at('pg')就是at('小程')，固化<br>
      如同`天使`也叫`angel`，这是小程的使命<br>
- [x] 改进`决策`标准，评分更全面<br>

> 让小程干点正事

1、安装 （这回完全不兼容）
```
npm i aify
```

2、教学
```js
let aify = require('aify');
aify.at('小程')                   // 呼叫小程
    .ai('自学')                   // 到npm自学去
    .ok();                        // 干活吧
```
呼叫小程，令其智能的去npm自学，至少看起来是很`AI`的，而不是以往的'skill'<br>

3、叫小程`自我介绍`
```js
let aify = require('aify');
let rs = aify.at('小程').intro(); // 罗列学到的全部本事
```
也可以传入名称进行查看，比如intro(name1, name2)<br>

4、叫小程写个微服务组件
```js
let aify = require('aify');
aify.at('小程')                   // 呼叫小程
    .ai('编写微服务基础组件')      // 很智能的样子
    .tip('greenwich', 'eureka')   // 必要时可以给小程点提示
    .ok({
         clean: true,             // 清空重写
         build: false,            // 不编译打包
     });
```
其中ok的参数有十多个，都是有缺省值可以省略的<br>
上面是随意写了两个，表示每次都重写，写完不编译打包<br>
瞬间，小程也就写好了<br>


5、已准备java、gradle环境、叫小程写完后并打包试试
```js
let aify = require('aify');
aify.at('小程')                   // 呼叫小程
    .ai('编写微服务基础组件')      // 很智能的样子
    .tip('greenwich', 'eureka')   // 必要时可以给学徒点提示
    .ok({
         clean: true,             // 清空重写
         build: true,             // 写完还要编译打包
         groupId: 'ai.xiaochen',  // 小程喜欢的域名
     });
```
恩，小程喜欢有自己的groupId，写好程序立马打包好greenwich-eureka-1.0.0.jar<br>
这样简单的java -jar greenwich-eureka-1.0.0.jar就可以跑起来了<br>


<br>

#### API
* aify.at(name) - 呼唤某学徒，如果没有会自动招一个，返回学徒对象<br>
  name - 学徒名
* aify.learn(...fileOrPaths) - 对学徒aify进行填鸭式教学<br>
  fileOrPaths - 技能文件或目录，未传递时自动查找学习当前目录及skills目录内的技能文件
* aify.ai(name, ...keywords) - 指定学徒aify的技能名和特征关键词<br>
  name - 技能名<br>
  keywords - 技能特征关键词<br>
  返回Skill对象<br>
* Skill.tip(...keywords) - 提示特征，可以多次调用，重复提示无影响<br>
  keywords - 技能特征关键词<br>
* Skill.ok(...args) - 筛选出一个最匹配的技能，传入参数执行，返回执行结果<br>
  args - 参数<br>


</details>


<details>
<summary><strong>Ver 0.3.* 集体版</strong></summary> 
<br>

- [x] 实现了`女娲造人`，不是为了男女搭配，而是多角色各司其职会更利于管理<br>
- [x] 内置实现一位`天使`，名叫`angel`，天使仅有天赋，天真无邪，不学人间术<br>
      天使会默默提供天赋服务大众，让大家认为好像是自己天生就会了那些技能一样<br>
      这是怕人乱教带坏，算是一种自我保护，总之，框架从此有了一位`天使`对象
- [x] 实现了`互相使唤`，能at来at去呼唤别人干活了<br>
      但不会打太极的话，呼来唤去，小心跳进死胡同<br>
- [x] 实现了`孟婆汤`，所有`记忆`按版本号区分不同目录存放，安装新版本后需要`重新学习`<br>
      但以往的`记忆`文件不会自动删除，以备万一想较方便的找回<br>

<br>

> 现在得像真的带他们一样，不然可能教错人

1、安装 （不保证兼容嘛）
```
npm i aify
```

2、令其(aify)自学
```js
let aify = require('aify');
let rs = aify.skill('自学').apply();
```
突然间，这位学徒就好像又懂了全部，这位同学是谁？<br>
你喂的一声，叫来的学徒总会是`aify`<br>

3、招个学徒令其自学
```js
let aify = require('aify');
let xiaochen = aify.at('小程');
xiaochen.skill('自学').apply();
```
这就是女娲造就`小程`了<br>
估计以后小程就是专职写程序<br>


4、叫小程写代码
```js
let aify = require('aify');
let src = aify.at('小程')
              .skill('写代码')
              .option('用 js 写个 helloworld')
	      .apply();
console.log(src); // => console.log('hello world');
```
这也算代码？呵呵，自学的吧


5、让aify叫小程写代码
```js
let aify = require('aify');
let src = aify.at('aify') // 这是aify
              .at('小程') // aify呼唤小程写代码
              .skill('写代码')
              .option('用 js 写个 helloworld')
	      .apply();
console.log(src); // => console.log('hello world');
```
看来，这往后学徒们的职责得分清，不然可能一直相互推辞

<br>

#### API
* aify.at(name) - 呼唤某学徒，如果没有会自动招一个<br>
  name - 学徒名
* aify.learn(...fileOrPaths) - 对学徒aify进行填鸭式教学<br>
  fileOrPaths - 技能文件或目录，未传递时自动查找学习当前目录及skills目录内的技能文件
* aify.skill(name, ...keywords) - 指定学徒aify的技能名和特征关键词<br>
  name - 技能名<br>
  keywords - 技能特征关键词<br>
  返回Skill对象<br>
* Skill.option(...keywords) - 指定特征关键词，可以多次调用，重复指定无影响<br>
  keywords - 技能特征关键词<br>
* Skill.apply(...args) - 筛选出一个最匹配的技能，传入参数执行<br>
  args - 参数<br>
  返回技能函数执行结果<br>

</details>


<details>
<summary><strong>Ver 0.2.* 天才版</strong></summary> 
<br>

- [x] 实现了`很有天赋`，添加skill文件，增加不少`天赋`了嘛，比如<br>
      `airequire` - 按需动态安装引用，不必事前npm install第三方包了<br>
      `自学` - 按关键字检索已发布的npm包，自觉下载学习他人技能<br>
- [x] 实现一项`学习技巧`，懂得下载指定npm包并学习其中技能了<br>
- [x] 实现了`自学`，会去检索含`aifyskill`关键字的npm包，挖掘学习他人技能<br>

<br>

> 现在能这样子教学了

1、安装
```
npm i aify
```

2、令其自学
```js
let aify = require('aify');
let rs = aify.skill('自学').apply();
```
突然间，这位学徒就好像懂了全部，潜质有点伟大的味道

3、试用自学本领
```js
let aify = require('aify');
aify.skill('cmd').apply('npm search aifyskill');
```
成功，学霸啊这是

<br>

#### API
同下


</details>


<details>
<summary><strong>Ver 0.1.* 装备版</strong></summary> 
<br>

- [x] 开始使用依赖，快速让小学徒拥有好装备<br>
- [x] 实现`不保证向前兼容、不保证向后兼容`，模仿人类，就像小孩吃奶玩耍而大人吃饭劳动一样，不保证兼容<br>
- [x] 实现`爱学习本能`，一安装好吃奶似的学起来<br>
- [x] 实现`天赋`，现在起，安装完就已经会helloworld了<br>
- [x] 实现`天赋可塑性`，就是框架实现了方便扩充天赋的能力，添加skill文件就行<br>

<br>

> 现学可以这样子

1、安装
```
npm i aify
```

2、运用helloworld天赋
```js
let aify = require('aify');
let rs = aify.skill('helloworld').apply('world');
console.log(rs); // -> hello world!
```
无师自通，很神奇的样子

<br>

#### API
同下

</details>

<details>
<summary><strong>Ver 0.0.* 概念版</strong></summary> 

- [x] 时间可以停止吗？可以的，看你怎么理解，所以，人工智能，你也可以...<br>为达原理演示效果，特意仅以数百行代码，零依赖的实现...一个`人工智能框架`<br>
- [x] 实现技能定义，一个技能就是一个`*.skill`文件<br>
- [x] 实现我们擅长的`填鸭式教学`<br>
- [x] 实现技能筛选，不是...是实现技能`决策`，以及技能运用<br>
- [x] 实现教啥会啥，常言道学坏容易学好难，小心别教坏了.<br>

<br>

> 现学现用helloworld

1.1、定义helloworld技能
```js
// helloworld.skill
[name] // 技能名称，忽略大小写
helloworld

[keywords] // 特征关键词，忽略大小写，用空格逗号分号顿号等分隔多个特征
sample

[function] // 一个技能就是一个函数
function hello(name){
    return 'hello ' + name;
}
```

1.2、填鸭式教学
```js
let aify = require('aify');
aify.learn('helloworld.skill');
```

1.3、技能运用
```js
let aify = require('aify');
let rs = aify.skill('helloworld').apply('world');
console.log(rs); // -> hello world
```
就是这样的三部曲，小学徒就好像会了helloworld一样

<br>

> 继续教它换个姿势打招呼


2.1、技能
```js
// hi.skill
[name]
helloworld

[keywords]
sample，hi

[function]
function hello(name){
    return 'hi ' + name;
}
```

2.2、教学
```js
let aify = require('aify');
aify.learn('hi.skill');
```

2.3、运用
```js
let aify = require('aify');
let rs = aify.skill('helloworld')
             .option('hi')
             .apply('ai');
console.log(rs); // -> hi ai
```
嗯 ... 孺子可教也

<br>

#### API
* aify.learn(...fileOrPaths) - 对学徒aify进行填鸭式教学<br>
  fileOrPaths - 技能文件或目录，未传递时自动查找学习当前目录及skills目录内的技能文件
* aify.skill(name, ...keywords) - 指定学徒aify的技能名和特征关键词<br>
  name - 技能名<br>
  keywords - 技能特征关键词<br>
  返回Skill对象<br>
* Skill.option(...keywords) - 指定特征关键词，可以多次调用，重复指定无影响<br>
  keywords - 技能特征关键词<br>
* Skill.apply(...args) - 筛选出一个最匹配的技能，传入参数执行<br>
  args - 参数<br>
  返回技能函数执行结果<br>


</details>

---
_Source: https://npm.io/package/aify · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
